diff options
| author | 2019-12-29 22:56:21 -0300 | |
|---|---|---|
| committer | 2020-02-28 17:56:42 -0300 | |
| commit | 40a2c57df5459ff965f1ea507bbca0e36ab17c94 (patch) | |
| tree | 264b74193808efb987305fae4743109d2db33eb4 /src | |
| parent | gl_state_tracker: Implement dirty flags for front face and culling (diff) | |
| download | yuzu-40a2c57df5459ff965f1ea507bbca0e36ab17c94.tar.gz yuzu-40a2c57df5459ff965f1ea507bbca0e36ab17c94.tar.xz yuzu-40a2c57df5459ff965f1ea507bbca0e36ab17c94.zip | |
gl_state_tracker: Implement depth dirty flags
Diffstat (limited to 'src')
4 files changed, 31 insertions, 6 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 6d87b4e29..d747e29ad 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -1024,13 +1024,23 @@ void RasterizerOpenGL::SyncPrimitiveRestart() { | |||
| 1024 | } | 1024 | } |
| 1025 | 1025 | ||
| 1026 | void RasterizerOpenGL::SyncDepthTestState() { | 1026 | void RasterizerOpenGL::SyncDepthTestState() { |
| 1027 | const auto& regs = system.GPU().Maxwell3D().regs; | 1027 | auto& gpu = system.GPU().Maxwell3D(); |
| 1028 | auto& flags = gpu.dirty.flags; | ||
| 1028 | 1029 | ||
| 1029 | glDepthMask(regs.depth_write_enabled ? GL_TRUE : GL_FALSE); | 1030 | const auto& regs = gpu.regs; |
| 1031 | if (flags[Dirty::DepthMask]) { | ||
| 1032 | flags[Dirty::DepthMask] = false; | ||
| 1033 | glDepthMask(regs.depth_write_enabled ? GL_TRUE : GL_FALSE); | ||
| 1034 | } | ||
| 1030 | 1035 | ||
| 1031 | oglEnable(GL_DEPTH_TEST, regs.depth_test_enable); | 1036 | if (flags[Dirty::DepthTest]) { |
| 1032 | if (regs.depth_test_enable) { | 1037 | flags[Dirty::DepthTest] = false; |
| 1033 | glDepthFunc(MaxwellToGL::ComparisonOp(regs.depth_test_func)); | 1038 | if (regs.depth_test_enable) { |
| 1039 | glEnable(GL_DEPTH_TEST); | ||
| 1040 | glDepthFunc(MaxwellToGL::ComparisonOp(regs.depth_test_func)); | ||
| 1041 | } else { | ||
| 1042 | glDisable(GL_DEPTH_TEST); | ||
| 1043 | } | ||
| 1034 | } | 1044 | } |
| 1035 | } | 1045 | } |
| 1036 | 1046 | ||
diff --git a/src/video_core/renderer_opengl/gl_state_tracker.cpp b/src/video_core/renderer_opengl/gl_state_tracker.cpp index 05bba5d1d..999440656 100644 --- a/src/video_core/renderer_opengl/gl_state_tracker.cpp +++ b/src/video_core/renderer_opengl/gl_state_tracker.cpp | |||
| @@ -129,6 +129,13 @@ void SetupDirtyShaders(Tables& tables) { | |||
| 129 | Shaders); | 129 | Shaders); |
| 130 | } | 130 | } |
| 131 | 131 | ||
| 132 | void SetupDirtyDepthTest(Tables& tables) { | ||
| 133 | auto& table = tables[0]; | ||
| 134 | table[OFF(depth_test_enable)] = DepthTest; | ||
| 135 | table[OFF(depth_write_enabled)] = DepthMask; | ||
| 136 | table[OFF(depth_test_func)] = DepthTest; | ||
| 137 | } | ||
| 138 | |||
| 132 | void SetupDirtyBlend(Tables& tables) { | 139 | void SetupDirtyBlend(Tables& tables) { |
| 133 | FillBlock(tables[0], OFF(blend_color), NUM(blend_color), BlendColor); | 140 | FillBlock(tables[0], OFF(blend_color), NUM(blend_color), BlendColor); |
| 134 | 141 | ||
| @@ -169,6 +176,7 @@ void StateTracker::Initialize() { | |||
| 169 | SetupDirtyVertexArrays(tables); | 176 | SetupDirtyVertexArrays(tables); |
| 170 | SetupDirtyVertexFormat(tables); | 177 | SetupDirtyVertexFormat(tables); |
| 171 | SetupDirtyShaders(tables); | 178 | SetupDirtyShaders(tables); |
| 179 | SetupDirtyDepthTest(tables); | ||
| 172 | SetupDirtyBlend(tables); | 180 | SetupDirtyBlend(tables); |
| 173 | SetupDirtyMisc(tables); | 181 | SetupDirtyMisc(tables); |
| 174 | 182 | ||
diff --git a/src/video_core/renderer_opengl/gl_state_tracker.h b/src/video_core/renderer_opengl/gl_state_tracker.h index 1d854f38e..dd6cfe02a 100644 --- a/src/video_core/renderer_opengl/gl_state_tracker.h +++ b/src/video_core/renderer_opengl/gl_state_tracker.h | |||
| @@ -58,8 +58,9 @@ enum : u8 { | |||
| 58 | 58 | ||
| 59 | FrontFace, | 59 | FrontFace, |
| 60 | CullTest, | 60 | CullTest, |
| 61 | PrimitiveRestart, | 61 | DepthMask, |
| 62 | DepthTest, | 62 | DepthTest, |
| 63 | PrimitiveRestart, | ||
| 63 | StencilTest, | 64 | StencilTest, |
| 64 | ColorMask, | 65 | ColorMask, |
| 65 | PolygonOffset, | 66 | PolygonOffset, |
| @@ -129,6 +130,11 @@ public: | |||
| 129 | flags[OpenGL::Dirty::CullTest] = true; | 130 | flags[OpenGL::Dirty::CullTest] = true; |
| 130 | } | 131 | } |
| 131 | 132 | ||
| 133 | void NotifyDepthTest() { | ||
| 134 | auto& flags = system.GPU().Maxwell3D().dirty.flags; | ||
| 135 | flags[OpenGL::Dirty::DepthTest] = true; | ||
| 136 | } | ||
| 137 | |||
| 132 | private: | 138 | private: |
| 133 | Core::System& system; | 139 | Core::System& system; |
| 134 | }; | 140 | }; |
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index e21d7e7a3..8fa4ecb28 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp | |||
| @@ -584,6 +584,7 @@ void RendererOpenGL::DrawScreen(const Layout::FramebufferLayout& layout) { | |||
| 584 | state_tracker.NotifyFramebuffer(); | 584 | state_tracker.NotifyFramebuffer(); |
| 585 | state_tracker.NotifyFrontFace(); | 585 | state_tracker.NotifyFrontFace(); |
| 586 | state_tracker.NotifyCullTest(); | 586 | state_tracker.NotifyCullTest(); |
| 587 | state_tracker.NotifyDepthTest(); | ||
| 587 | 588 | ||
| 588 | program_manager.UseVertexShader(vertex_program.handle); | 589 | program_manager.UseVertexShader(vertex_program.handle); |
| 589 | program_manager.UseGeometryShader(0); | 590 | program_manager.UseGeometryShader(0); |