diff options
| author | 2019-12-28 22:51:04 -0300 | |
|---|---|---|
| committer | 2020-02-28 17:56:42 -0300 | |
| commit | 6530144ccb0adccf101fcc443f9b21a027faa7a7 (patch) | |
| tree | 12fc3b2524e515f86812fb1155ba50dda9b9fbdc /src | |
| parent | gl_state_tracker: Implement dirty flags for scissors (diff) | |
| download | yuzu-6530144ccb0adccf101fcc443f9b21a027faa7a7.tar.gz yuzu-6530144ccb0adccf101fcc443f9b21a027faa7a7.tar.xz yuzu-6530144ccb0adccf101fcc443f9b21a027faa7a7.zip | |
gl_state_tracker: Implement dirty flags for color masks
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 39 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_state_tracker.cpp | 11 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_state_tracker.h | 11 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.cpp | 1 |
4 files changed, 53 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() { | |||
| 410 | } | 410 | } |
| 411 | if (use_color) { | 411 | if (use_color) { |
| 412 | // TODO: Signal state tracker about these changes | 412 | // TODO: Signal state tracker about these changes |
| 413 | glColorMaski(0, regs.clear_buffers.R, regs.clear_buffers.G, regs.clear_buffers.B, | 413 | state_tracker.NotifyColorMask0(); |
| 414 | regs.clear_buffers.A); | 414 | glColorMaski(0, regs.clear_buffers.R != 0, regs.clear_buffers.G != 0, |
| 415 | regs.clear_buffers.B != 0, regs.clear_buffers.A != 0); | ||
| 415 | 416 | ||
| 416 | SyncFramebufferSRGB(); | 417 | SyncFramebufferSRGB(); |
| 417 | // TODO(Rodrigo): Determine if clamping is used on clears | 418 | // TODO(Rodrigo): Determine if clamping is used on clears |
| @@ -1030,17 +1031,37 @@ void RasterizerOpenGL::SyncRasterizeEnable() { | |||
| 1030 | } | 1031 | } |
| 1031 | 1032 | ||
| 1032 | void RasterizerOpenGL::SyncColorMask() { | 1033 | void RasterizerOpenGL::SyncColorMask() { |
| 1033 | auto& maxwell3d = system.GPU().Maxwell3D(); | 1034 | auto& gpu = system.GPU().Maxwell3D(); |
| 1034 | const auto& regs = maxwell3d.regs; | 1035 | auto& flags = gpu.dirty.flags; |
| 1036 | if (!flags[Dirty::ColorMasks]) { | ||
| 1037 | return; | ||
| 1038 | } | ||
| 1039 | flags[Dirty::ColorMasks] = false; | ||
| 1040 | |||
| 1041 | const bool force = flags[Dirty::ColorMaskCommon]; | ||
| 1042 | flags[Dirty::ColorMaskCommon] = false; | ||
| 1035 | 1043 | ||
| 1044 | const auto& regs = gpu.regs; | ||
| 1036 | if (regs.color_mask_common) { | 1045 | if (regs.color_mask_common) { |
| 1046 | if (!force && !flags[Dirty::ColorMask0]) { | ||
| 1047 | return; | ||
| 1048 | } | ||
| 1049 | flags[Dirty::ColorMask0] = false; | ||
| 1050 | |||
| 1037 | auto& mask = regs.color_mask[0]; | 1051 | auto& mask = regs.color_mask[0]; |
| 1038 | glColorMask(mask.R, mask.B, mask.G, mask.A); | 1052 | glColorMask(mask.R != 0, mask.B != 0, mask.G != 0, mask.A != 0); |
| 1039 | } else { | 1053 | return; |
| 1040 | for (std::size_t i = 0; i < Maxwell::NumRenderTargets; ++i) { | 1054 | } |
| 1041 | const auto& mask = regs.color_mask[regs.color_mask_common ? 0 : i]; | 1055 | |
| 1042 | glColorMaski(static_cast<GLuint>(i), mask.R, mask.G, mask.B, mask.A); | 1056 | // Path without color_mask_common set |
| 1057 | for (std::size_t i = 0; i < Maxwell::NumRenderTargets; ++i) { | ||
| 1058 | if (!force && !flags[Dirty::ColorMask0 + i]) { | ||
| 1059 | continue; | ||
| 1043 | } | 1060 | } |
| 1061 | flags[Dirty::ColorMask0 + i] = false; | ||
| 1062 | |||
| 1063 | const auto& mask = regs.color_mask[i]; | ||
| 1064 | glColorMaski(static_cast<GLuint>(i), mask.R != 0, mask.G != 0, mask.B != 0, mask.A != 0); | ||
| 1044 | } | 1065 | } |
| 1045 | } | 1066 | } |
| 1046 | 1067 | ||
diff --git a/src/video_core/renderer_opengl/gl_state_tracker.cpp b/src/video_core/renderer_opengl/gl_state_tracker.cpp index 9e1db59ae..3c6231d58 100644 --- a/src/video_core/renderer_opengl/gl_state_tracker.cpp +++ b/src/video_core/renderer_opengl/gl_state_tracker.cpp | |||
| @@ -61,6 +61,16 @@ void SetupDirtyRenderTargets(Tables& tables) { | |||
| 61 | } | 61 | } |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | void SetupDirtyColorMasks(Tables& tables) { | ||
| 65 | tables[0][OFF(color_mask_common)] = ColorMaskCommon; | ||
| 66 | for (std::size_t rt = 0; rt < Regs::NumRenderTargets; ++rt) { | ||
| 67 | const std::size_t offset = OFF(color_mask) + rt * NUM(color_mask[0]); | ||
| 68 | FillBlock(tables[0], offset, NUM(color_mask[0]), ColorMask0 + rt); | ||
| 69 | } | ||
| 70 | |||
| 71 | FillBlock(tables[1], OFF(color_mask), NUM(color_mask), ColorMasks); | ||
| 72 | } | ||
| 73 | |||
| 64 | void SetupDirtyViewports(Tables& tables) { | 74 | void SetupDirtyViewports(Tables& tables) { |
| 65 | for (std::size_t i = 0; i < Regs::NumViewports; ++i) { | 75 | for (std::size_t i = 0; i < Regs::NumViewports; ++i) { |
| 66 | const std::size_t transf_offset = OFF(viewport_transform) + i * NUM(viewport_transform[0]); | 76 | const std::size_t transf_offset = OFF(viewport_transform) + i * NUM(viewport_transform[0]); |
| @@ -104,6 +114,7 @@ void StateTracker::Initialize() { | |||
| 104 | 114 | ||
| 105 | auto& tables = dirty.tables; | 115 | auto& tables = dirty.tables; |
| 106 | SetupDirtyRenderTargets(tables); | 116 | SetupDirtyRenderTargets(tables); |
| 117 | SetupDirtyColorMasks(tables); | ||
| 107 | SetupDirtyViewports(tables); | 118 | SetupDirtyViewports(tables); |
| 108 | SetupDirtyScissors(tables); | 119 | SetupDirtyScissors(tables); |
| 109 | } | 120 | } |
diff --git a/src/video_core/renderer_opengl/gl_state_tracker.h b/src/video_core/renderer_opengl/gl_state_tracker.h index 5153dc5d1..0ad7c349a 100644 --- a/src/video_core/renderer_opengl/gl_state_tracker.h +++ b/src/video_core/renderer_opengl/gl_state_tracker.h | |||
| @@ -38,6 +38,11 @@ enum : u8 { | |||
| 38 | Scissor0, | 38 | Scissor0, |
| 39 | Scissor15 = Scissor0 + 15, | 39 | Scissor15 = Scissor0 + 15, |
| 40 | 40 | ||
| 41 | ColorMaskCommon, | ||
| 42 | ColorMasks, | ||
| 43 | ColorMask0, | ||
| 44 | ColorMask7 = ColorMask0 + 7, | ||
| 45 | |||
| 41 | Shaders, | 46 | Shaders, |
| 42 | CullTestEnable, | 47 | CullTestEnable, |
| 43 | FrontFace, | 48 | FrontFace, |
| @@ -73,6 +78,12 @@ public: | |||
| 73 | flags[OpenGL::Dirty::Scissor0] = true; | 78 | flags[OpenGL::Dirty::Scissor0] = true; |
| 74 | } | 79 | } |
| 75 | 80 | ||
| 81 | void NotifyColorMask0() { | ||
| 82 | auto& flags = system.GPU().Maxwell3D().dirty.flags; | ||
| 83 | flags[OpenGL::Dirty::ColorMasks] = true; | ||
| 84 | flags[OpenGL::Dirty::ColorMask0] = true; | ||
| 85 | } | ||
| 86 | |||
| 76 | void NotifyFramebuffer() { | 87 | void NotifyFramebuffer() { |
| 77 | auto& flags = system.GPU().Maxwell3D().dirty.flags; | 88 | auto& flags = system.GPU().Maxwell3D().dirty.flags; |
| 78 | flags[VideoCommon::Dirty::RenderTargets] = true; | 89 | flags[VideoCommon::Dirty::RenderTargets] = true; |
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index f2b07ac81..3ff7c8fb1 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp | |||
| @@ -578,6 +578,7 @@ void RendererOpenGL::DrawScreen(const Layout::FramebufferLayout& layout) { | |||
| 578 | // TODO: Signal state tracker about these changes | 578 | // TODO: Signal state tracker about these changes |
| 579 | state_tracker.NotifyViewport0(); | 579 | state_tracker.NotifyViewport0(); |
| 580 | state_tracker.NotifyScissor0(); | 580 | state_tracker.NotifyScissor0(); |
| 581 | state_tracker.NotifyColorMask0(); | ||
| 581 | state_tracker.NotifyFramebuffer(); | 582 | state_tracker.NotifyFramebuffer(); |
| 582 | 583 | ||
| 583 | program_manager.UseVertexShader(vertex_program.handle); | 584 | program_manager.UseVertexShader(vertex_program.handle); |