summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp34
1 files changed, 28 insertions, 6 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index be29ceac1..6ca9f45e2 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -290,6 +290,19 @@ void RasterizerOpenGL::NotifyPicaRegisterChanged(u32 id) {
290 SyncColorWriteMask(); 290 SyncColorWriteMask();
291 break; 291 break;
292 292
293 // Sync GL depth and stencil write mask
294 // (This is a dedicated combined depth / stencil write-enable register)
295 case PICA_REG_INDEX(framebuffer.allow_depth_stencil_write):
296 SyncDepthWriteMask();
297 SyncStencilWriteMask();
298 break;
299
300 // Sync GL color write mask
301 // (This is a dedicated color write-enable register)
302 case PICA_REG_INDEX(framebuffer.allow_color_write):
303 SyncColorWriteMask();
304 break;
305
293 // Logic op 306 // Logic op
294 case PICA_REG_INDEX(output_merger.logic_op): 307 case PICA_REG_INDEX(output_merger.logic_op):
295 SyncLogicOp(); 308 SyncLogicOp();
@@ -893,20 +906,29 @@ void RasterizerOpenGL::SyncLogicOp() {
893 906
894void RasterizerOpenGL::SyncColorWriteMask() { 907void RasterizerOpenGL::SyncColorWriteMask() {
895 const auto& regs = Pica::g_state.regs; 908 const auto& regs = Pica::g_state.regs;
896 state.color_mask.red_enabled = regs.output_merger.red_enable; 909
897 state.color_mask.green_enabled = regs.output_merger.green_enable; 910 auto IsColorWriteEnabled = [&](u32 value) {
898 state.color_mask.blue_enabled = regs.output_merger.blue_enable; 911 return (regs.framebuffer.allow_color_write != 0 && value != 0) ? GL_TRUE : GL_FALSE;
899 state.color_mask.alpha_enabled = regs.output_merger.alpha_enable; 912 };
913
914 state.color_mask.red_enabled = IsColorWriteEnabled(regs.output_merger.red_enable);
915 state.color_mask.green_enabled = IsColorWriteEnabled(regs.output_merger.green_enable);
916 state.color_mask.blue_enabled = IsColorWriteEnabled(regs.output_merger.blue_enable);
917 state.color_mask.alpha_enabled = IsColorWriteEnabled(regs.output_merger.alpha_enable);
900} 918}
901 919
902void RasterizerOpenGL::SyncStencilWriteMask() { 920void RasterizerOpenGL::SyncStencilWriteMask() {
903 const auto& regs = Pica::g_state.regs; 921 const auto& regs = Pica::g_state.regs;
904 state.stencil.write_mask = regs.output_merger.stencil_test.write_mask; 922 state.stencil.write_mask = (regs.framebuffer.allow_depth_stencil_write != 0)
923 ? static_cast<GLuint>(regs.output_merger.stencil_test.write_mask)
924 : 0;
905} 925}
906 926
907void RasterizerOpenGL::SyncDepthWriteMask() { 927void RasterizerOpenGL::SyncDepthWriteMask() {
908 const auto& regs = Pica::g_state.regs; 928 const auto& regs = Pica::g_state.regs;
909 state.depth.write_mask = regs.output_merger.depth_write_enable ? GL_TRUE : GL_FALSE; 929 state.depth.write_mask = (regs.framebuffer.allow_depth_stencil_write != 0 && regs.output_merger.depth_write_enable)
930 ? GL_TRUE
931 : GL_FALSE;
910} 932}
911 933
912void RasterizerOpenGL::SyncStencilTest() { 934void RasterizerOpenGL::SyncStencilTest() {