Explorar o código

GPU: Set up the depth test state on every draw.

Subv %!s(int64=8) %!d(string=hai) anos
pai
achega
18c8ae7750

+ 11 - 0
src/video_core/renderer_opengl/gl_rasterizer.cpp

@@ -304,6 +304,9 @@ void RasterizerOpenGL::DrawArrays() {
     MICROPROFILE_SCOPE(OpenGL_Drawing);
     const auto& regs = Core::System().GetInstance().GPU().Maxwell3D().regs;
 
+    // Sync the depth test state before configuring the framebuffer surfaces.
+    SyncDepthTestState();
+
     // TODO(bunnei): Implement these
     const bool has_stencil = false;
     const bool using_color_fb = true;
@@ -719,6 +722,14 @@ void RasterizerOpenGL::SyncDepthOffset() {
     UNREACHABLE();
 }
 
+void RasterizerOpenGL::SyncDepthTestState() {
+    const auto& regs = Core::System().GetInstance().GPU().Maxwell3D().regs;
+
+    state.depth.test_enabled = regs.depth_test_enable != 0;
+    state.depth.write_mask = regs.depth_write_enabled ? GL_TRUE : GL_FALSE;
+    state.depth.test_func = MaxwellToGL::ComparisonOp(regs.depth_test_func);
+}
+
 void RasterizerOpenGL::SyncBlendState() {
     const auto& regs = Core::System().GetInstance().GPU().Maxwell3D().regs;
 

+ 3 - 0
src/video_core/renderer_opengl/gl_rasterizer.h

@@ -126,6 +126,9 @@ private:
     /// Syncs the depth offset to match the guest state
     void SyncDepthOffset();
 
+    /// Syncs the depth test state to match the guest state
+    void SyncDepthTestState();
+
     /// Syncs the blend state to match the guest state
     void SyncBlendState();