diff options
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 65 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_state.cpp | 30 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_state.h | 14 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.cpp | 1 | 
4 files changed, 18 insertions, 92 deletions
| diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 8f9bb4c93..573f14cab 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -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);      }  } diff --git a/src/video_core/renderer_opengl/gl_state.cpp b/src/video_core/renderer_opengl/gl_state.cpp index 69a8a4eb1..d62a55b2f 100644 --- a/src/video_core/renderer_opengl/gl_state.cpp +++ b/src/video_core/renderer_opengl/gl_state.cpp @@ -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(); diff --git a/src/video_core/renderer_opengl/gl_state.h b/src/video_core/renderer_opengl/gl_state.h index 6ea625c56..18f36da08 100644 --- a/src/video_core/renderer_opengl/gl_state.h +++ b/src/video_core/renderer_opengl/gl_state.h @@ -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(); diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index a4cf6a489..fcadc09d9 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp @@ -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); | 
