diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 34 |
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 | ||
| 894 | void RasterizerOpenGL::SyncColorWriteMask() { | 907 | void 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 | ||
| 902 | void RasterizerOpenGL::SyncStencilWriteMask() { | 920 | void 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 | ||
| 907 | void RasterizerOpenGL::SyncDepthWriteMask() { | 927 | void 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 | ||
| 912 | void RasterizerOpenGL::SyncStencilTest() { | 934 | void RasterizerOpenGL::SyncStencilTest() { |