summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2019-12-29 19:23:40 -0300
committerGravatar ReinUsesLisp2020-02-28 17:56:42 -0300
commitb910a83a47a2b566a760dbd20ff5902f303044d4 (patch)
tree8b8952cf2132b21bf6a5da304aaeeab9de4bfa8c /src
parentgl_state_tracker: Implement dirty flags for blending (diff)
downloadyuzu-b910a83a47a2b566a760dbd20ff5902f303044d4.tar.gz
yuzu-b910a83a47a2b566a760dbd20ff5902f303044d4.tar.xz
yuzu-b910a83a47a2b566a760dbd20ff5902f303044d4.zip
gl_state_tracker: Implement dirty flags for front face and culling
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp21
-rw-r--r--src/video_core/renderer_opengl/gl_state_tracker.cpp9
-rw-r--r--src/video_core/renderer_opengl/gl_state_tracker.h13
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.cpp2
4 files changed, 38 insertions, 7 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index cedfe5db1..6d87b4e29 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -995,12 +995,25 @@ void RasterizerOpenGL::SyncClipCoef() {
995} 995}
996 996
997void RasterizerOpenGL::SyncCullMode() { 997void RasterizerOpenGL::SyncCullMode() {
998 const auto& regs = system.GPU().Maxwell3D().regs; 998 auto& gpu = system.GPU().Maxwell3D();
999 auto& flags = gpu.dirty.flags;
1000 const auto& regs = gpu.regs;
999 1001
1000 oglEnable(GL_CULL_FACE, regs.cull_test_enabled); 1002 if (flags[Dirty::CullTest]) {
1001 glCullFace(MaxwellToGL::CullFace(regs.cull_face)); 1003 flags[Dirty::CullTest] = false;
1002 1004
1003 glFrontFace(MaxwellToGL::FrontFace(regs.front_face)); 1005 if (regs.cull_test_enabled) {
1006 glEnable(GL_CULL_FACE);
1007 glCullFace(MaxwellToGL::CullFace(regs.cull_face));
1008 } else {
1009 glDisable(GL_CULL_FACE);
1010 }
1011 }
1012
1013 if (flags[Dirty::FrontFace]) {
1014 flags[Dirty::FrontFace] = false;
1015 glFrontFace(MaxwellToGL::FrontFace(regs.front_face));
1016 }
1004} 1017}
1005 1018
1006void RasterizerOpenGL::SyncPrimitiveRestart() { 1019void RasterizerOpenGL::SyncPrimitiveRestart() {
diff --git a/src/video_core/renderer_opengl/gl_state_tracker.cpp b/src/video_core/renderer_opengl/gl_state_tracker.cpp
index 2da1b65fc..05bba5d1d 100644
--- a/src/video_core/renderer_opengl/gl_state_tracker.cpp
+++ b/src/video_core/renderer_opengl/gl_state_tracker.cpp
@@ -145,7 +145,14 @@ void SetupDirtyBlend(Tables& tables) {
145} 145}
146 146
147void SetupDirtyMisc(Tables& tables) { 147void SetupDirtyMisc(Tables& tables) {
148 tables[0][OFF(clip_distance_enabled)] = ClipDistances; 148 auto& table = tables[0];
149
150 table[OFF(clip_distance_enabled)] = ClipDistances;
151
152 table[OFF(front_face)] = FrontFace;
153
154 table[OFF(cull_test_enabled)] = CullTest;
155 table[OFF(cull_face)] = CullTest;
149} 156}
150 157
151} // Anonymous namespace 158} // Anonymous namespace
diff --git a/src/video_core/renderer_opengl/gl_state_tracker.h b/src/video_core/renderer_opengl/gl_state_tracker.h
index a9b470eee..1d854f38e 100644
--- a/src/video_core/renderer_opengl/gl_state_tracker.h
+++ b/src/video_core/renderer_opengl/gl_state_tracker.h
@@ -56,9 +56,8 @@ enum : u8 {
56 Shaders, 56 Shaders,
57 ClipDistances, 57 ClipDistances,
58 58
59 CullTestEnable,
60 FrontFace, 59 FrontFace,
61 CullFace, 60 CullTest,
62 PrimitiveRestart, 61 PrimitiveRestart,
63 DepthTest, 62 DepthTest,
64 StencilTest, 63 StencilTest,
@@ -120,6 +119,16 @@ public:
120 flags[VideoCommon::Dirty::RenderTargets] = true; 119 flags[VideoCommon::Dirty::RenderTargets] = true;
121 } 120 }
122 121
122 void NotifyFrontFace() {
123 auto& flags = system.GPU().Maxwell3D().dirty.flags;
124 flags[OpenGL::Dirty::FrontFace] = true;
125 }
126
127 void NotifyCullTest() {
128 auto& flags = system.GPU().Maxwell3D().dirty.flags;
129 flags[OpenGL::Dirty::CullTest] = true;
130 }
131
123private: 132private:
124 Core::System& system; 133 Core::System& system;
125}; 134};
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp
index d81c68077..e21d7e7a3 100644
--- a/src/video_core/renderer_opengl/renderer_opengl.cpp
+++ b/src/video_core/renderer_opengl/renderer_opengl.cpp
@@ -582,6 +582,8 @@ void RendererOpenGL::DrawScreen(const Layout::FramebufferLayout& layout) {
582 state_tracker.NotifyColorMask0(); 582 state_tracker.NotifyColorMask0();
583 state_tracker.NotifyBlend0(); 583 state_tracker.NotifyBlend0();
584 state_tracker.NotifyFramebuffer(); 584 state_tracker.NotifyFramebuffer();
585 state_tracker.NotifyFrontFace();
586 state_tracker.NotifyCullTest();
585 587
586 program_manager.UseVertexShader(vertex_program.handle); 588 program_manager.UseVertexShader(vertex_program.handle);
587 program_manager.UseGeometryShader(0); 589 program_manager.UseGeometryShader(0);