mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 08:59:03 -06:00 
			
		
		
		
	gl_state: Remove stencil test tracking
This commit is contained in:
		@@ -427,32 +427,6 @@ void RasterizerOpenGL::Clear() {
 | 
			
		||||
    if (regs.clear_buffers.S) {
 | 
			
		||||
        ASSERT_MSG(regs.zeta_enable != 0, "Tried to clear stencil but buffer is not enabled!");
 | 
			
		||||
        use_stencil = true;
 | 
			
		||||
        clear_state.stencil.test_enabled = true;
 | 
			
		||||
 | 
			
		||||
        if (regs.clear_flags.stencil) {
 | 
			
		||||
            // Stencil affects the clear so fill it with the used masks
 | 
			
		||||
            clear_state.stencil.front.test_func = GL_ALWAYS;
 | 
			
		||||
            clear_state.stencil.front.test_mask = regs.stencil_front_func_mask;
 | 
			
		||||
            clear_state.stencil.front.action_stencil_fail = GL_KEEP;
 | 
			
		||||
            clear_state.stencil.front.action_depth_fail = GL_KEEP;
 | 
			
		||||
            clear_state.stencil.front.action_depth_pass = GL_KEEP;
 | 
			
		||||
            clear_state.stencil.front.write_mask = regs.stencil_front_mask;
 | 
			
		||||
            if (regs.stencil_two_side_enable) {
 | 
			
		||||
                clear_state.stencil.back.test_func = GL_ALWAYS;
 | 
			
		||||
                clear_state.stencil.back.test_mask = regs.stencil_back_func_mask;
 | 
			
		||||
                clear_state.stencil.back.action_stencil_fail = GL_KEEP;
 | 
			
		||||
                clear_state.stencil.back.action_depth_fail = GL_KEEP;
 | 
			
		||||
                clear_state.stencil.back.action_depth_pass = GL_KEEP;
 | 
			
		||||
                clear_state.stencil.back.write_mask = regs.stencil_back_mask;
 | 
			
		||||
            } else {
 | 
			
		||||
                clear_state.stencil.back.test_func = GL_ALWAYS;
 | 
			
		||||
                clear_state.stencil.back.test_mask = 0xFFFFFFFF;
 | 
			
		||||
                clear_state.stencil.back.write_mask = 0xFFFFFFFF;
 | 
			
		||||
                clear_state.stencil.back.action_stencil_fail = GL_KEEP;
 | 
			
		||||
                clear_state.stencil.back.action_depth_fail = GL_KEEP;
 | 
			
		||||
                clear_state.stencil.back.action_depth_pass = GL_KEEP;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!use_color && !use_depth && !use_stencil) {
 | 
			
		||||
@@ -1011,35 +985,30 @@ void RasterizerOpenGL::SyncDepthTestState() {
 | 
			
		||||
void RasterizerOpenGL::SyncStencilTestState() {
 | 
			
		||||
    auto& maxwell3d = system.GPU().Maxwell3D();
 | 
			
		||||
    const auto& regs = maxwell3d.regs;
 | 
			
		||||
    state.stencil.test_enabled = regs.stencil_enable != 0;
 | 
			
		||||
 | 
			
		||||
    oglEnable(GL_STENCIL_TEST, regs.stencil_enable);
 | 
			
		||||
    if (!regs.stencil_enable) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    state.stencil.front.test_func = MaxwellToGL::ComparisonOp(regs.stencil_front_func_func);
 | 
			
		||||
    state.stencil.front.test_ref = regs.stencil_front_func_ref;
 | 
			
		||||
    state.stencil.front.test_mask = regs.stencil_front_func_mask;
 | 
			
		||||
    state.stencil.front.action_stencil_fail = MaxwellToGL::StencilOp(regs.stencil_front_op_fail);
 | 
			
		||||
    state.stencil.front.action_depth_fail = MaxwellToGL::StencilOp(regs.stencil_front_op_zfail);
 | 
			
		||||
    state.stencil.front.action_depth_pass = MaxwellToGL::StencilOp(regs.stencil_front_op_zpass);
 | 
			
		||||
    state.stencil.front.write_mask = regs.stencil_front_mask;
 | 
			
		||||
    glStencilFuncSeparate(GL_FRONT, MaxwellToGL::ComparisonOp(regs.stencil_front_func_func),
 | 
			
		||||
                          regs.stencil_front_func_ref, regs.stencil_front_func_mask);
 | 
			
		||||
    glStencilOpSeparate(GL_FRONT, MaxwellToGL::StencilOp(regs.stencil_front_op_fail),
 | 
			
		||||
                        MaxwellToGL::StencilOp(regs.stencil_front_op_zfail),
 | 
			
		||||
                        MaxwellToGL::StencilOp(regs.stencil_front_op_zpass));
 | 
			
		||||
    glStencilMaskSeparate(GL_FRONT, regs.stencil_front_mask);
 | 
			
		||||
 | 
			
		||||
    if (regs.stencil_two_side_enable) {
 | 
			
		||||
        state.stencil.back.test_func = MaxwellToGL::ComparisonOp(regs.stencil_back_func_func);
 | 
			
		||||
        state.stencil.back.test_ref = regs.stencil_back_func_ref;
 | 
			
		||||
        state.stencil.back.test_mask = regs.stencil_back_func_mask;
 | 
			
		||||
        state.stencil.back.action_stencil_fail = MaxwellToGL::StencilOp(regs.stencil_back_op_fail);
 | 
			
		||||
        state.stencil.back.action_depth_fail = MaxwellToGL::StencilOp(regs.stencil_back_op_zfail);
 | 
			
		||||
        state.stencil.back.action_depth_pass = MaxwellToGL::StencilOp(regs.stencil_back_op_zpass);
 | 
			
		||||
        state.stencil.back.write_mask = regs.stencil_back_mask;
 | 
			
		||||
        glStencilFuncSeparate(GL_BACK, MaxwellToGL::ComparisonOp(regs.stencil_back_func_func),
 | 
			
		||||
                              regs.stencil_back_func_ref, regs.stencil_back_func_mask);
 | 
			
		||||
        glStencilOpSeparate(GL_BACK, MaxwellToGL::StencilOp(regs.stencil_back_op_fail),
 | 
			
		||||
                            MaxwellToGL::StencilOp(regs.stencil_back_op_zfail),
 | 
			
		||||
                            MaxwellToGL::StencilOp(regs.stencil_back_op_zpass));
 | 
			
		||||
        glStencilMaskSeparate(GL_BACK, regs.stencil_back_mask);
 | 
			
		||||
    } else {
 | 
			
		||||
        state.stencil.back.test_func = GL_ALWAYS;
 | 
			
		||||
        state.stencil.back.test_ref = 0;
 | 
			
		||||
        state.stencil.back.test_mask = 0xFFFFFFFF;
 | 
			
		||||
        state.stencil.back.write_mask = 0xFFFFFFFF;
 | 
			
		||||
        state.stencil.back.action_stencil_fail = GL_KEEP;
 | 
			
		||||
        state.stencil.back.action_depth_fail = GL_KEEP;
 | 
			
		||||
        state.stencil.back.action_depth_pass = GL_KEEP;
 | 
			
		||||
        glStencilFuncSeparate(GL_BACK, GL_ALWAYS, 0, 0xFFFFFFFF);
 | 
			
		||||
        glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_KEEP);
 | 
			
		||||
        glStencilMaskSeparate(GL_BACK, 0xFFFFFFFF);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -106,35 +106,6 @@ void OpenGLState::ApplyProgramPipeline() {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OpenGLState::ApplyStencilTest() {
 | 
			
		||||
    Enable(GL_STENCIL_TEST, cur_state.stencil.test_enabled, stencil.test_enabled);
 | 
			
		||||
 | 
			
		||||
    const auto ConfigStencil = [](GLenum face, const auto& config, auto& current) {
 | 
			
		||||
        if (current.test_func != config.test_func || current.test_ref != config.test_ref ||
 | 
			
		||||
            current.test_mask != config.test_mask) {
 | 
			
		||||
            current.test_func = config.test_func;
 | 
			
		||||
            current.test_ref = config.test_ref;
 | 
			
		||||
            current.test_mask = config.test_mask;
 | 
			
		||||
            glStencilFuncSeparate(face, config.test_func, config.test_ref, config.test_mask);
 | 
			
		||||
        }
 | 
			
		||||
        if (current.action_depth_fail != config.action_depth_fail ||
 | 
			
		||||
            current.action_depth_pass != config.action_depth_pass ||
 | 
			
		||||
            current.action_stencil_fail != config.action_stencil_fail) {
 | 
			
		||||
            current.action_depth_fail = config.action_depth_fail;
 | 
			
		||||
            current.action_depth_pass = config.action_depth_pass;
 | 
			
		||||
            current.action_stencil_fail = config.action_stencil_fail;
 | 
			
		||||
            glStencilOpSeparate(face, config.action_stencil_fail, config.action_depth_fail,
 | 
			
		||||
                                config.action_depth_pass);
 | 
			
		||||
        }
 | 
			
		||||
        if (current.write_mask != config.write_mask) {
 | 
			
		||||
            current.write_mask = config.write_mask;
 | 
			
		||||
            glStencilMaskSeparate(face, config.write_mask);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    ConfigStencil(GL_FRONT, stencil.front, cur_state.stencil.front);
 | 
			
		||||
    ConfigStencil(GL_BACK, stencil.back, cur_state.stencil.back);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OpenGLState::ApplyGlobalBlending() {
 | 
			
		||||
    const Blend& updated = blend[0];
 | 
			
		||||
    Blend& current = cur_state.blend[0];
 | 
			
		||||
@@ -235,7 +206,6 @@ void OpenGLState::Apply() {
 | 
			
		||||
    ApplyFramebufferState();
 | 
			
		||||
    ApplyShaderProgram();
 | 
			
		||||
    ApplyProgramPipeline();
 | 
			
		||||
    ApplyStencilTest();
 | 
			
		||||
    ApplyBlending();
 | 
			
		||||
    ApplyTextures();
 | 
			
		||||
    ApplySamplers();
 | 
			
		||||
 
 | 
			
		||||
@@ -13,19 +13,6 @@ namespace OpenGL {
 | 
			
		||||
 | 
			
		||||
class OpenGLState {
 | 
			
		||||
public:
 | 
			
		||||
    struct {
 | 
			
		||||
        bool test_enabled = false; // GL_STENCIL_TEST
 | 
			
		||||
        struct {
 | 
			
		||||
            GLenum test_func = GL_ALWAYS;         // GL_STENCIL_FUNC
 | 
			
		||||
            GLint test_ref = 0;                   // GL_STENCIL_REF
 | 
			
		||||
            GLuint test_mask = 0xFFFFFFFF;        // GL_STENCIL_VALUE_MASK
 | 
			
		||||
            GLuint write_mask = 0xFFFFFFFF;       // GL_STENCIL_WRITEMASK
 | 
			
		||||
            GLenum action_stencil_fail = GL_KEEP; // GL_STENCIL_FAIL
 | 
			
		||||
            GLenum action_depth_fail = GL_KEEP;   // GL_STENCIL_PASS_DEPTH_FAIL
 | 
			
		||||
            GLenum action_depth_pass = GL_KEEP;   // GL_STENCIL_PASS_DEPTH_PASS
 | 
			
		||||
        } front, back;
 | 
			
		||||
    } stencil;
 | 
			
		||||
 | 
			
		||||
    struct Blend {
 | 
			
		||||
        bool enabled = false;              // GL_BLEND
 | 
			
		||||
        GLenum rgb_equation = GL_FUNC_ADD; // GL_BLEND_EQUATION_RGB
 | 
			
		||||
@@ -69,7 +56,6 @@ public:
 | 
			
		||||
    void ApplyFramebufferState();
 | 
			
		||||
    void ApplyShaderProgram();
 | 
			
		||||
    void ApplyProgramPipeline();
 | 
			
		||||
    void ApplyStencilTest();
 | 
			
		||||
    void ApplyTargetBlending(std::size_t target, bool force);
 | 
			
		||||
    void ApplyGlobalBlending();
 | 
			
		||||
    void ApplyBlending();
 | 
			
		||||
 
 | 
			
		||||
@@ -579,6 +579,7 @@ void RendererOpenGL::DrawScreen(const Layout::FramebufferLayout& layout) {
 | 
			
		||||
    glDisable(GL_COLOR_LOGIC_OP);
 | 
			
		||||
    glDisable(GL_ALPHA_TEST);
 | 
			
		||||
    glDisable(GL_DEPTH_TEST);
 | 
			
		||||
    glDisable(GL_STENCIL_TEST);
 | 
			
		||||
    glDisable(GL_POLYGON_OFFSET_FILL);
 | 
			
		||||
    glDisable(GL_RASTERIZER_DISCARD);
 | 
			
		||||
    glDisablei(GL_SCISSOR_TEST, 0);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user