mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	gl_state: Remove scissor test tracking
This commit is contained in:
		
							parent
							
								
									0914c70b7f
								
							
						
					
					
						commit
						7c16b3551b
					
				@ -467,12 +467,10 @@ void RasterizerOpenGL::Clear() {
 | 
				
			|||||||
    SyncViewport(clear_state);
 | 
					    SyncViewport(clear_state);
 | 
				
			||||||
    SyncRasterizeEnable(clear_state);
 | 
					    SyncRasterizeEnable(clear_state);
 | 
				
			||||||
    if (regs.clear_flags.scissor) {
 | 
					    if (regs.clear_flags.scissor) {
 | 
				
			||||||
        SyncScissorTest(clear_state);
 | 
					        SyncScissorTest();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (regs.clear_flags.viewport) {
 | 
					    UNIMPLEMENTED_IF(regs.clear_flags.viewport);
 | 
				
			||||||
        clear_state.EmulateViewportWithScissor();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    clear_state.Apply();
 | 
					    clear_state.Apply();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -508,7 +506,7 @@ void RasterizerOpenGL::Draw(bool is_indexed, bool is_instanced) {
 | 
				
			|||||||
    SyncLogicOpState();
 | 
					    SyncLogicOpState();
 | 
				
			||||||
    SyncCullMode();
 | 
					    SyncCullMode();
 | 
				
			||||||
    SyncPrimitiveRestart();
 | 
					    SyncPrimitiveRestart();
 | 
				
			||||||
    SyncScissorTest(state);
 | 
					    SyncScissorTest();
 | 
				
			||||||
    SyncTransformFeedback();
 | 
					    SyncTransformFeedback();
 | 
				
			||||||
    SyncPointState();
 | 
					    SyncPointState();
 | 
				
			||||||
    SyncPolygonOffset();
 | 
					    SyncPolygonOffset();
 | 
				
			||||||
@ -1140,25 +1138,13 @@ void RasterizerOpenGL::SyncLogicOpState() {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void RasterizerOpenGL::SyncScissorTest(OpenGLState& current_state) {
 | 
					void RasterizerOpenGL::SyncScissorTest() {
 | 
				
			||||||
    const auto& regs = system.GPU().Maxwell3D().regs;
 | 
					    const auto& regs = system.GPU().Maxwell3D().regs;
 | 
				
			||||||
    const bool geometry_shaders_enabled =
 | 
					    for (std::size_t index = 0; index < Maxwell::NumViewports; ++index) {
 | 
				
			||||||
        regs.IsShaderConfigEnabled(static_cast<size_t>(Maxwell::ShaderProgram::Geometry));
 | 
					        const auto& src = regs.scissor_test[index];
 | 
				
			||||||
    const std::size_t viewport_count =
 | 
					        oglEnablei(GL_SCISSOR_TEST, src.enable, static_cast<GLuint>(index));
 | 
				
			||||||
        geometry_shaders_enabled ? Tegra::Engines::Maxwell3D::Regs::NumViewports : 1;
 | 
					        glScissorIndexed(static_cast<GLuint>(index), src.min_x, src.min_y, src.max_x - src.min_x,
 | 
				
			||||||
    for (std::size_t i = 0; i < viewport_count; i++) {
 | 
					                         src.max_y - src.min_y);
 | 
				
			||||||
        const auto& src = regs.scissor_test[i];
 | 
					 | 
				
			||||||
        auto& dst = current_state.viewports[i].scissor;
 | 
					 | 
				
			||||||
        dst.enabled = (src.enable != 0);
 | 
					 | 
				
			||||||
        if (dst.enabled == 0) {
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        const u32 width = src.max_x - src.min_x;
 | 
					 | 
				
			||||||
        const u32 height = src.max_y - src.min_y;
 | 
					 | 
				
			||||||
        dst.x = src.min_x;
 | 
					 | 
				
			||||||
        dst.y = src.min_y;
 | 
					 | 
				
			||||||
        dst.width = width;
 | 
					 | 
				
			||||||
        dst.height = height;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -167,7 +167,7 @@ private:
 | 
				
			|||||||
    void SyncMultiSampleState();
 | 
					    void SyncMultiSampleState();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Syncs the scissor test state to match the guest state
 | 
					    /// Syncs the scissor test state to match the guest state
 | 
				
			||||||
    void SyncScissorTest(OpenGLState& current_state);
 | 
					    void SyncScissorTest();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Syncs the transform feedback state to match the guest state
 | 
					    /// Syncs the transform feedback state to match the guest state
 | 
				
			||||||
    void SyncTransformFeedback();
 | 
					    void SyncTransformFeedback();
 | 
				
			||||||
 | 
				
			|||||||
@ -171,19 +171,6 @@ void OpenGLState::ApplyViewport() {
 | 
				
			|||||||
            current.depth_range_far = updated.depth_range_far;
 | 
					            current.depth_range_far = updated.depth_range_far;
 | 
				
			||||||
            glDepthRangeIndexed(i, updated.depth_range_near, updated.depth_range_far);
 | 
					            glDepthRangeIndexed(i, updated.depth_range_near, updated.depth_range_far);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        Enable(GL_SCISSOR_TEST, i, current.scissor.enabled, updated.scissor.enabled);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (current.scissor.x != updated.scissor.x || current.scissor.y != updated.scissor.y ||
 | 
					 | 
				
			||||||
            current.scissor.width != updated.scissor.width ||
 | 
					 | 
				
			||||||
            current.scissor.height != updated.scissor.height) {
 | 
					 | 
				
			||||||
            current.scissor.x = updated.scissor.x;
 | 
					 | 
				
			||||||
            current.scissor.y = updated.scissor.y;
 | 
					 | 
				
			||||||
            current.scissor.width = updated.scissor.width;
 | 
					 | 
				
			||||||
            current.scissor.height = updated.scissor.height;
 | 
					 | 
				
			||||||
            glScissorIndexed(i, updated.scissor.x, updated.scissor.y, updated.scissor.width,
 | 
					 | 
				
			||||||
                             updated.scissor.height);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -306,28 +293,6 @@ void OpenGLState::Apply() {
 | 
				
			|||||||
    ApplyRenderBuffer();
 | 
					    ApplyRenderBuffer();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void OpenGLState::EmulateViewportWithScissor() {
 | 
					 | 
				
			||||||
    auto& current = viewports[0];
 | 
					 | 
				
			||||||
    if (current.scissor.enabled) {
 | 
					 | 
				
			||||||
        const GLint left = std::max(current.x, current.scissor.x);
 | 
					 | 
				
			||||||
        const GLint right =
 | 
					 | 
				
			||||||
            std::max(current.x + current.width, current.scissor.x + current.scissor.width);
 | 
					 | 
				
			||||||
        const GLint bottom = std::max(current.y, current.scissor.y);
 | 
					 | 
				
			||||||
        const GLint top =
 | 
					 | 
				
			||||||
            std::max(current.y + current.height, current.scissor.y + current.scissor.height);
 | 
					 | 
				
			||||||
        current.scissor.x = std::max(left, 0);
 | 
					 | 
				
			||||||
        current.scissor.y = std::max(bottom, 0);
 | 
					 | 
				
			||||||
        current.scissor.width = std::max(right - left, 0);
 | 
					 | 
				
			||||||
        current.scissor.height = std::max(top - bottom, 0);
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        current.scissor.enabled = true;
 | 
					 | 
				
			||||||
        current.scissor.x = current.x;
 | 
					 | 
				
			||||||
        current.scissor.y = current.y;
 | 
					 | 
				
			||||||
        current.scissor.width = current.width;
 | 
					 | 
				
			||||||
        current.scissor.height = current.height;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
OpenGLState& OpenGLState::UnbindTexture(GLuint handle) {
 | 
					OpenGLState& OpenGLState::UnbindTexture(GLuint handle) {
 | 
				
			||||||
    for (auto& texture : textures) {
 | 
					    for (auto& texture : textures) {
 | 
				
			||||||
        if (texture == handle) {
 | 
					        if (texture == handle) {
 | 
				
			||||||
 | 
				
			|||||||
@ -63,13 +63,6 @@ public:
 | 
				
			|||||||
        GLint height = 0;
 | 
					        GLint height = 0;
 | 
				
			||||||
        GLfloat depth_range_near = 0.0f; // GL_DEPTH_RANGE
 | 
					        GLfloat depth_range_near = 0.0f; // GL_DEPTH_RANGE
 | 
				
			||||||
        GLfloat depth_range_far = 1.0f;  // GL_DEPTH_RANGE
 | 
					        GLfloat depth_range_far = 1.0f;  // GL_DEPTH_RANGE
 | 
				
			||||||
        struct {
 | 
					 | 
				
			||||||
            bool enabled = false; // GL_SCISSOR_TEST
 | 
					 | 
				
			||||||
            GLint x = 0;
 | 
					 | 
				
			||||||
            GLint y = 0;
 | 
					 | 
				
			||||||
            GLsizei width = 0;
 | 
					 | 
				
			||||||
            GLsizei height = 0;
 | 
					 | 
				
			||||||
        } scissor;
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    std::array<Viewport, Tegra::Engines::Maxwell3D::Regs::NumViewports> viewports;
 | 
					    std::array<Viewport, Tegra::Engines::Maxwell3D::Regs::NumViewports> viewports;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -117,9 +110,6 @@ public:
 | 
				
			|||||||
    OpenGLState& ResetFramebuffer(GLuint handle);
 | 
					    OpenGLState& ResetFramebuffer(GLuint handle);
 | 
				
			||||||
    OpenGLState& ResetRenderbuffer(GLuint handle);
 | 
					    OpenGLState& ResetRenderbuffer(GLuint handle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Viewport does not affects glClearBuffer so emulate viewport using scissor test
 | 
					 | 
				
			||||||
    void EmulateViewportWithScissor();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
    static OpenGLState cur_state;
 | 
					    static OpenGLState cur_state;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -536,6 +536,7 @@ void TextureCacheOpenGL::ImageBlit(View& src_view, View& dst_view,
 | 
				
			|||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        glDisable(GL_FRAMEBUFFER_SRGB);
 | 
					        glDisable(GL_FRAMEBUFFER_SRGB);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    glDisablei(GL_SCISSOR_TEST, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    u32 buffers{};
 | 
					    u32 buffers{};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -568,6 +568,7 @@ void RendererOpenGL::DrawScreenTriangles(const ScreenInfo& screen_info, float x,
 | 
				
			|||||||
    glDisable(GL_ALPHA_TEST);
 | 
					    glDisable(GL_ALPHA_TEST);
 | 
				
			||||||
    glDisable(GL_DEPTH_TEST);
 | 
					    glDisable(GL_DEPTH_TEST);
 | 
				
			||||||
    glDisable(GL_POLYGON_OFFSET_FILL);
 | 
					    glDisable(GL_POLYGON_OFFSET_FILL);
 | 
				
			||||||
 | 
					    glDisablei(GL_SCISSOR_TEST, 0);
 | 
				
			||||||
    glCullFace(GL_BACK);
 | 
					    glCullFace(GL_BACK);
 | 
				
			||||||
    glFrontFace(GL_CW);
 | 
					    glFrontFace(GL_CW);
 | 
				
			||||||
    glColorMaski(0, GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
 | 
					    glColorMaski(0, GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user