diff options
Diffstat (limited to 'src/video_core')
4 files changed, 29 insertions, 3 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index d747e29ad..bc4542b69 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -1045,14 +1045,20 @@ void RasterizerOpenGL::SyncDepthTestState() { | |||
| 1045 | } | 1045 | } |
| 1046 | 1046 | ||
| 1047 | void RasterizerOpenGL::SyncStencilTestState() { | 1047 | void RasterizerOpenGL::SyncStencilTestState() { |
| 1048 | auto& maxwell3d = system.GPU().Maxwell3D(); | 1048 | auto& gpu = system.GPU().Maxwell3D(); |
| 1049 | const auto& regs = maxwell3d.regs; | 1049 | auto& flags = gpu.dirty.flags; |
| 1050 | if (!flags[Dirty::StencilTest]) { | ||
| 1051 | return; | ||
| 1052 | } | ||
| 1053 | flags[Dirty::StencilTest] = false; | ||
| 1050 | 1054 | ||
| 1051 | oglEnable(GL_STENCIL_TEST, regs.stencil_enable); | 1055 | const auto& regs = gpu.regs; |
| 1052 | if (!regs.stencil_enable) { | 1056 | if (!regs.stencil_enable) { |
| 1057 | glDisable(GL_STENCIL_TEST); | ||
| 1053 | return; | 1058 | return; |
| 1054 | } | 1059 | } |
| 1055 | 1060 | ||
| 1061 | glEnable(GL_STENCIL_TEST); | ||
| 1056 | glStencilFuncSeparate(GL_FRONT, MaxwellToGL::ComparisonOp(regs.stencil_front_func_func), | 1062 | glStencilFuncSeparate(GL_FRONT, MaxwellToGL::ComparisonOp(regs.stencil_front_func_func), |
| 1057 | regs.stencil_front_func_ref, regs.stencil_front_func_mask); | 1063 | regs.stencil_front_func_ref, regs.stencil_front_func_mask); |
| 1058 | glStencilOpSeparate(GL_FRONT, MaxwellToGL::StencilOp(regs.stencil_front_op_fail), | 1064 | glStencilOpSeparate(GL_FRONT, MaxwellToGL::StencilOp(regs.stencil_front_op_fail), |
diff --git a/src/video_core/renderer_opengl/gl_state_tracker.cpp b/src/video_core/renderer_opengl/gl_state_tracker.cpp index 999440656..eae47827b 100644 --- a/src/video_core/renderer_opengl/gl_state_tracker.cpp +++ b/src/video_core/renderer_opengl/gl_state_tracker.cpp | |||
| @@ -136,6 +136,19 @@ void SetupDirtyDepthTest(Tables& tables) { | |||
| 136 | table[OFF(depth_test_func)] = DepthTest; | 136 | table[OFF(depth_test_func)] = DepthTest; |
| 137 | } | 137 | } |
| 138 | 138 | ||
| 139 | void SetupDirtyStencilTest(Tables& tables) { | ||
| 140 | static constexpr std::array offsets = { | ||
| 141 | OFF(stencil_enable), OFF(stencil_front_func_func), OFF(stencil_front_func_ref), | ||
| 142 | OFF(stencil_front_func_mask), OFF(stencil_front_op_fail), OFF(stencil_front_op_zfail), | ||
| 143 | OFF(stencil_front_op_zpass), OFF(stencil_front_mask), OFF(stencil_two_side_enable), | ||
| 144 | OFF(stencil_back_func_func), OFF(stencil_back_func_ref), OFF(stencil_back_func_mask), | ||
| 145 | OFF(stencil_back_op_fail), OFF(stencil_back_op_zfail), OFF(stencil_back_op_zpass), | ||
| 146 | OFF(stencil_back_mask)}; | ||
| 147 | for (const auto offset : offsets) { | ||
| 148 | tables[0][offset] = StencilTest; | ||
| 149 | } | ||
| 150 | } | ||
| 151 | |||
| 139 | void SetupDirtyBlend(Tables& tables) { | 152 | void SetupDirtyBlend(Tables& tables) { |
| 140 | FillBlock(tables[0], OFF(blend_color), NUM(blend_color), BlendColor); | 153 | FillBlock(tables[0], OFF(blend_color), NUM(blend_color), BlendColor); |
| 141 | 154 | ||
| @@ -177,6 +190,7 @@ void StateTracker::Initialize() { | |||
| 177 | SetupDirtyVertexFormat(tables); | 190 | SetupDirtyVertexFormat(tables); |
| 178 | SetupDirtyShaders(tables); | 191 | SetupDirtyShaders(tables); |
| 179 | SetupDirtyDepthTest(tables); | 192 | SetupDirtyDepthTest(tables); |
| 193 | SetupDirtyStencilTest(tables); | ||
| 180 | SetupDirtyBlend(tables); | 194 | SetupDirtyBlend(tables); |
| 181 | SetupDirtyMisc(tables); | 195 | SetupDirtyMisc(tables); |
| 182 | 196 | ||
diff --git a/src/video_core/renderer_opengl/gl_state_tracker.h b/src/video_core/renderer_opengl/gl_state_tracker.h index dd6cfe02a..2eaec2a0d 100644 --- a/src/video_core/renderer_opengl/gl_state_tracker.h +++ b/src/video_core/renderer_opengl/gl_state_tracker.h | |||
| @@ -135,6 +135,11 @@ public: | |||
| 135 | flags[OpenGL::Dirty::DepthTest] = true; | 135 | flags[OpenGL::Dirty::DepthTest] = true; |
| 136 | } | 136 | } |
| 137 | 137 | ||
| 138 | void NotifyStencilTest() { | ||
| 139 | auto& flags = system.GPU().Maxwell3D().dirty.flags; | ||
| 140 | flags[OpenGL::Dirty::StencilTest] = true; | ||
| 141 | } | ||
| 142 | |||
| 138 | private: | 143 | private: |
| 139 | Core::System& system; | 144 | Core::System& system; |
| 140 | }; | 145 | }; |
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index 8fa4ecb28..2449e28ac 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp | |||
| @@ -585,6 +585,7 @@ void RendererOpenGL::DrawScreen(const Layout::FramebufferLayout& layout) { | |||
| 585 | state_tracker.NotifyFrontFace(); | 585 | state_tracker.NotifyFrontFace(); |
| 586 | state_tracker.NotifyCullTest(); | 586 | state_tracker.NotifyCullTest(); |
| 587 | state_tracker.NotifyDepthTest(); | 587 | state_tracker.NotifyDepthTest(); |
| 588 | state_tracker.NotifyStencilTest(); | ||
| 588 | 589 | ||
| 589 | program_manager.UseVertexShader(vertex_program.handle); | 590 | program_manager.UseVertexShader(vertex_program.handle); |
| 590 | program_manager.UseGeometryShader(0); | 591 | program_manager.UseGeometryShader(0); |