diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 38 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 9 |
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 | ||
| 894 | void 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 | |||
| 902 | void RasterizerOpenGL::SyncStencilWriteMask() { | ||
| 903 | const auto& regs = Pica::g_state.regs; | ||
| 904 | state.stencil.write_mask = regs.output_merger.stencil_test.write_mask; | ||
| 905 | } | ||
| 906 | |||
| 907 | void 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 | |||
| 884 | void RasterizerOpenGL::SyncStencilTest() { | 912 | void 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 | ||
| 909 | void RasterizerOpenGL::SyncCombinerColor() { | 931 | void 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 | ||