summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp38
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h9
2 files changed, 39 insertions, 8 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 5a97696bf..be29ceac1 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -153,6 +153,9 @@ void RasterizerOpenGL::Reset() {
153 SyncLogicOp(); 153 SyncLogicOp();
154 SyncStencilTest(); 154 SyncStencilTest();
155 SyncDepthTest(); 155 SyncDepthTest();
156 SyncColorWriteMask();
157 SyncStencilWriteMask();
158 SyncDepthWriteMask();
156 159
157 SetShader(); 160 SetShader();
158 161
@@ -268,16 +271,23 @@ void RasterizerOpenGL::NotifyPicaRegisterChanged(u32 id) {
268 state.draw.shader_dirty = true; 271 state.draw.shader_dirty = true;
269 break; 272 break;
270 273
271 // Stencil test 274 // Sync GL stencil test + stencil write mask
275 // (Pica stencil test function register also contains a stencil write mask)
272 case PICA_REG_INDEX(output_merger.stencil_test.raw_func): 276 case PICA_REG_INDEX(output_merger.stencil_test.raw_func):
277 SyncStencilTest();
278 SyncStencilWriteMask();
279 break;
273 case PICA_REG_INDEX(output_merger.stencil_test.raw_op): 280 case PICA_REG_INDEX(output_merger.stencil_test.raw_op):
274 case PICA_REG_INDEX(framebuffer.depth_format): 281 case PICA_REG_INDEX(framebuffer.depth_format):
275 SyncStencilTest(); 282 SyncStencilTest();
276 break; 283 break;
277 284
278 // Depth test 285 // Sync GL depth test + depth and color write mask
286 // (Pica depth test function register also contains a depth and color write mask)
279 case PICA_REG_INDEX(output_merger.depth_test_enable): 287 case PICA_REG_INDEX(output_merger.depth_test_enable):
280 SyncDepthTest(); 288 SyncDepthTest();
289 SyncDepthWriteMask();
290 SyncColorWriteMask();
281 break; 291 break;
282 292
283 // Logic op 293 // Logic op
@@ -881,13 +891,30 @@ void RasterizerOpenGL::SyncLogicOp() {
881 state.logic_op = PicaToGL::LogicOp(Pica::g_state.regs.output_merger.logic_op); 891 state.logic_op = PicaToGL::LogicOp(Pica::g_state.regs.output_merger.logic_op);
882} 892}
883 893
894void RasterizerOpenGL::SyncColorWriteMask() {
895 const auto& regs = Pica::g_state.regs;
896 state.color_mask.red_enabled = regs.output_merger.red_enable;
897 state.color_mask.green_enabled = regs.output_merger.green_enable;
898 state.color_mask.blue_enabled = regs.output_merger.blue_enable;
899 state.color_mask.alpha_enabled = regs.output_merger.alpha_enable;
900}
901
902void RasterizerOpenGL::SyncStencilWriteMask() {
903 const auto& regs = Pica::g_state.regs;
904 state.stencil.write_mask = regs.output_merger.stencil_test.write_mask;
905}
906
907void RasterizerOpenGL::SyncDepthWriteMask() {
908 const auto& regs = Pica::g_state.regs;
909 state.depth.write_mask = regs.output_merger.depth_write_enable ? GL_TRUE : GL_FALSE;
910}
911
884void RasterizerOpenGL::SyncStencilTest() { 912void RasterizerOpenGL::SyncStencilTest() {
885 const auto& regs = Pica::g_state.regs; 913 const auto& regs = Pica::g_state.regs;
886 state.stencil.test_enabled = regs.output_merger.stencil_test.enable && regs.framebuffer.depth_format == Pica::Regs::DepthFormat::D24S8; 914 state.stencil.test_enabled = regs.output_merger.stencil_test.enable && regs.framebuffer.depth_format == Pica::Regs::DepthFormat::D24S8;
887 state.stencil.test_func = PicaToGL::CompareFunc(regs.output_merger.stencil_test.func); 915 state.stencil.test_func = PicaToGL::CompareFunc(regs.output_merger.stencil_test.func);
888 state.stencil.test_ref = regs.output_merger.stencil_test.reference_value; 916 state.stencil.test_ref = regs.output_merger.stencil_test.reference_value;
889 state.stencil.test_mask = regs.output_merger.stencil_test.input_mask; 917 state.stencil.test_mask = regs.output_merger.stencil_test.input_mask;
890 state.stencil.write_mask = regs.output_merger.stencil_test.write_mask;
891 state.stencil.action_stencil_fail = PicaToGL::StencilOp(regs.output_merger.stencil_test.action_stencil_fail); 918 state.stencil.action_stencil_fail = PicaToGL::StencilOp(regs.output_merger.stencil_test.action_stencil_fail);
892 state.stencil.action_depth_fail = PicaToGL::StencilOp(regs.output_merger.stencil_test.action_depth_fail); 919 state.stencil.action_depth_fail = PicaToGL::StencilOp(regs.output_merger.stencil_test.action_depth_fail);
893 state.stencil.action_depth_pass = PicaToGL::StencilOp(regs.output_merger.stencil_test.action_depth_pass); 920 state.stencil.action_depth_pass = PicaToGL::StencilOp(regs.output_merger.stencil_test.action_depth_pass);
@@ -899,11 +926,6 @@ void RasterizerOpenGL::SyncDepthTest() {
899 regs.output_merger.depth_write_enable == 1; 926 regs.output_merger.depth_write_enable == 1;
900 state.depth.test_func = regs.output_merger.depth_test_enable == 1 ? 927 state.depth.test_func = regs.output_merger.depth_test_enable == 1 ?
901 PicaToGL::CompareFunc(regs.output_merger.depth_test_func) : GL_ALWAYS; 928 PicaToGL::CompareFunc(regs.output_merger.depth_test_func) : GL_ALWAYS;
902 state.color_mask.red_enabled = regs.output_merger.red_enable;
903 state.color_mask.green_enabled = regs.output_merger.green_enable;
904 state.color_mask.blue_enabled = regs.output_merger.blue_enable;
905 state.color_mask.alpha_enabled = regs.output_merger.alpha_enable;
906 state.depth.write_mask = regs.output_merger.depth_write_enable ? GL_TRUE : GL_FALSE;
907} 929}
908 930
909void RasterizerOpenGL::SyncCombinerColor() { 931void RasterizerOpenGL::SyncCombinerColor() {
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h
index fc85aa3ff..390349a0c 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer.h
@@ -344,6 +344,15 @@ private:
344 /// Syncs the logic op states to match the PICA register 344 /// Syncs the logic op states to match the PICA register
345 void SyncLogicOp(); 345 void SyncLogicOp();
346 346
347 /// Syncs the color write mask to match the PICA register state
348 void SyncColorWriteMask();
349
350 /// Syncs the stencil write mask to match the PICA register state
351 void SyncStencilWriteMask();
352
353 /// Syncs the depth write mask to match the PICA register state
354 void SyncDepthWriteMask();
355
347 /// Syncs the stencil test states to match the PICA register 356 /// Syncs the stencil test states to match the PICA register
348 void SyncStencilTest(); 357 void SyncStencilTest();
349 358