diff options
| author | 2019-12-29 19:23:40 -0300 | |
|---|---|---|
| committer | 2020-02-28 17:56:42 -0300 | |
| commit | b910a83a47a2b566a760dbd20ff5902f303044d4 (patch) | |
| tree | 8b8952cf2132b21bf6a5da304aaeeab9de4bfa8c /src | |
| parent | gl_state_tracker: Implement dirty flags for blending (diff) | |
| download | yuzu-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')
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 | ||
| 997 | void RasterizerOpenGL::SyncCullMode() { | 997 | void 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 | ||
| 1006 | void RasterizerOpenGL::SyncPrimitiveRestart() { | 1019 | void 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 | ||
| 147 | void SetupDirtyMisc(Tables& tables) { | 147 | void 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 | |||
| 123 | private: | 132 | private: |
| 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); |