summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2019-12-28 22:51:04 -0300
committerGravatar ReinUsesLisp2020-02-28 17:56:42 -0300
commit6530144ccb0adccf101fcc443f9b21a027faa7a7 (patch)
tree12fc3b2524e515f86812fb1155ba50dda9b9fbdc /src
parentgl_state_tracker: Implement dirty flags for scissors (diff)
downloadyuzu-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.cpp39
-rw-r--r--src/video_core/renderer_opengl/gl_state_tracker.cpp11
-rw-r--r--src/video_core/renderer_opengl/gl_state_tracker.h11
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.cpp1
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
1032void RasterizerOpenGL::SyncColorMask() { 1033void 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
64void 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
64void SetupDirtyViewports(Tables& tables) { 74void 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);