summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2019-12-29 22:56:21 -0300
committerGravatar ReinUsesLisp2020-02-28 17:56:42 -0300
commit40a2c57df5459ff965f1ea507bbca0e36ab17c94 (patch)
tree264b74193808efb987305fae4743109d2db33eb4 /src
parentgl_state_tracker: Implement dirty flags for front face and culling (diff)
downloadyuzu-40a2c57df5459ff965f1ea507bbca0e36ab17c94.tar.gz
yuzu-40a2c57df5459ff965f1ea507bbca0e36ab17c94.tar.xz
yuzu-40a2c57df5459ff965f1ea507bbca0e36ab17c94.zip
gl_state_tracker: Implement depth dirty flags
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp20
-rw-r--r--src/video_core/renderer_opengl/gl_state_tracker.cpp8
-rw-r--r--src/video_core/renderer_opengl/gl_state_tracker.h8
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.cpp1
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
1026void RasterizerOpenGL::SyncDepthTestState() { 1026void 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
132void 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
132void SetupDirtyBlend(Tables& tables) { 139void 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
132private: 138private:
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);