diff options
author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-12-29 02:51:04 +0100 |
---|---|---|
committer | ReinUsesLisp <reinuseslisp@airmail.cc> | 2020-02-28 21:56:42 +0100 |
commit | 6530144ccb0adccf101fcc443f9b21a027faa7a7 (patch) | |
tree | 12fc3b2524e515f86812fb1155ba50dda9b9fbdc /src/video_core/renderer_opengl/gl_rasterizer.cpp | |
parent | gl_state_tracker: Implement dirty flags for scissors (diff) | |
download | yuzu-6530144ccb0adccf101fcc443f9b21a027faa7a7.tar yuzu-6530144ccb0adccf101fcc443f9b21a027faa7a7.tar.gz yuzu-6530144ccb0adccf101fcc443f9b21a027faa7a7.tar.bz2 yuzu-6530144ccb0adccf101fcc443f9b21a027faa7a7.tar.lz yuzu-6530144ccb0adccf101fcc443f9b21a027faa7a7.tar.xz yuzu-6530144ccb0adccf101fcc443f9b21a027faa7a7.tar.zst yuzu-6530144ccb0adccf101fcc443f9b21a027faa7a7.zip |
Diffstat (limited to 'src/video_core/renderer_opengl/gl_rasterizer.cpp')
-rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 2ec4c9f55..b4cec274d 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -410,8 +410,9 @@ void RasterizerOpenGL::Clear() { } if (use_color) { // TODO: Signal state tracker about these changes - glColorMaski(0, regs.clear_buffers.R, regs.clear_buffers.G, regs.clear_buffers.B, - regs.clear_buffers.A); + state_tracker.NotifyColorMask0(); + glColorMaski(0, regs.clear_buffers.R != 0, regs.clear_buffers.G != 0, + regs.clear_buffers.B != 0, regs.clear_buffers.A != 0); SyncFramebufferSRGB(); // TODO(Rodrigo): Determine if clamping is used on clears @@ -1030,17 +1031,37 @@ void RasterizerOpenGL::SyncRasterizeEnable() { } void RasterizerOpenGL::SyncColorMask() { - auto& maxwell3d = system.GPU().Maxwell3D(); - const auto& regs = maxwell3d.regs; + auto& gpu = system.GPU().Maxwell3D(); + auto& flags = gpu.dirty.flags; + if (!flags[Dirty::ColorMasks]) { + return; + } + flags[Dirty::ColorMasks] = false; + + const bool force = flags[Dirty::ColorMaskCommon]; + flags[Dirty::ColorMaskCommon] = false; + const auto& regs = gpu.regs; if (regs.color_mask_common) { + if (!force && !flags[Dirty::ColorMask0]) { + return; + } + flags[Dirty::ColorMask0] = false; + auto& mask = regs.color_mask[0]; - glColorMask(mask.R, mask.B, mask.G, mask.A); - } else { - for (std::size_t i = 0; i < Maxwell::NumRenderTargets; ++i) { - const auto& mask = regs.color_mask[regs.color_mask_common ? 0 : i]; - glColorMaski(static_cast<GLuint>(i), mask.R, mask.G, mask.B, mask.A); + glColorMask(mask.R != 0, mask.B != 0, mask.G != 0, mask.A != 0); + return; + } + + // Path without color_mask_common set + for (std::size_t i = 0; i < Maxwell::NumRenderTargets; ++i) { + if (!force && !flags[Dirty::ColorMask0 + i]) { + continue; } + flags[Dirty::ColorMask0 + i] = false; + + const auto& mask = regs.color_mask[i]; + glColorMaski(static_cast<GLuint>(i), mask.R != 0, mask.G != 0, mask.B != 0, mask.A != 0); } } |