From b910a83a47a2b566a760dbd20ff5902f303044d4 Mon Sep 17 00:00:00 2001 From: ReinUsesLisp Date: Sun, 29 Dec 2019 19:23:40 -0300 Subject: gl_state_tracker: Implement dirty flags for front face and culling --- src/video_core/renderer_opengl/gl_rasterizer.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'src/video_core/renderer_opengl/gl_rasterizer.cpp') 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() { } void RasterizerOpenGL::SyncCullMode() { - const auto& regs = system.GPU().Maxwell3D().regs; + auto& gpu = system.GPU().Maxwell3D(); + auto& flags = gpu.dirty.flags; + const auto& regs = gpu.regs; - oglEnable(GL_CULL_FACE, regs.cull_test_enabled); - glCullFace(MaxwellToGL::CullFace(regs.cull_face)); + if (flags[Dirty::CullTest]) { + flags[Dirty::CullTest] = false; - glFrontFace(MaxwellToGL::FrontFace(regs.front_face)); + if (regs.cull_test_enabled) { + glEnable(GL_CULL_FACE); + glCullFace(MaxwellToGL::CullFace(regs.cull_face)); + } else { + glDisable(GL_CULL_FACE); + } + } + + if (flags[Dirty::FrontFace]) { + flags[Dirty::FrontFace] = false; + glFrontFace(MaxwellToGL::FrontFace(regs.front_face)); + } } void RasterizerOpenGL::SyncPrimitiveRestart() { -- cgit v1.2.3