Преглед изворни кода

Merge pull request #660 from Subv/depth_write

GPU: Always enable the depth write when clearing the depth buffer.
bunnei пре 8 година
родитељ
комит
81739a5448
1 измењених фајлова са 8 додато и 3 уклоњено
  1. 8 3
      src/video_core/renderer_opengl/gl_rasterizer.cpp

+ 8 - 3
src/video_core/renderer_opengl/gl_rasterizer.cpp

@@ -322,9 +322,6 @@ std::pair<Surface, Surface> RasterizerOpenGL::ConfigureFramebuffers(bool using_c
                                                                     bool using_depth_fb) {
     const auto& regs = Core::System().GetInstance().GPU().Maxwell3D().regs;
 
-    // Sync the depth test state before configuring the framebuffer surfaces.
-    SyncDepthTestState();
-
     // TODO(bunnei): Implement this
     const bool has_stencil = false;
 
@@ -389,6 +386,13 @@ void RasterizerOpenGL::Clear() {
     if (regs.clear_buffers.Z) {
         clear_mask |= GL_DEPTH_BUFFER_BIT;
         use_depth_fb = true;
+
+        // Always enable the depth write when clearing the depth buffer. The depth write mask is
+        // ignored when clearing the buffer in the Switch, but OpenGL obeys it so we set it to true.
+        state.depth.test_enabled = true;
+        state.depth.write_mask = GL_TRUE;
+        state.depth.test_func = GL_ALWAYS;
+        state.Apply();
     }
 
     if (clear_mask == 0)
@@ -423,6 +427,7 @@ void RasterizerOpenGL::DrawArrays() {
     auto [dirty_color_surface, dirty_depth_surface] =
         ConfigureFramebuffers(true, regs.zeta.Address() != 0);
 
+    SyncDepthTestState();
     SyncBlendState();
     SyncCullMode();