فهرست منبع

Pica: Write depth value even when depth test is disabled

This has been confirmed on hardware. Fixes Etrian Odyssey IV.
Yuri Kunde Schlesner 10 سال پیش
والد
کامیت
c58bc25d5b
2فایلهای تغییر یافته به همراه12 افزوده شده و 10 حذف شده
  1. 8 8
      src/video_core/rasterizer.cpp
  2. 4 2
      src/video_core/renderer_opengl/gl_rasterizer.cpp

+ 8 - 8
src/video_core/rasterizer.cpp

@@ -858,12 +858,12 @@ static void ProcessTriangleInternal(const Shader::OutputVertex& v0,
                 }
             }
 
-            // TODO: Does depth indeed only get written even if depth testing is enabled?
+            unsigned num_bits = Regs::DepthBitsPerPixel(regs.framebuffer.depth_format);
+            u32 z = (u32)((v0.screenpos[2].ToFloat32() * w0 +
+                           v1.screenpos[2].ToFloat32() * w1 +
+                           v2.screenpos[2].ToFloat32() * w2) * ((1 << num_bits) - 1) / wsum);
+
             if (output_merger.depth_test_enable) {
-                unsigned num_bits = Regs::DepthBitsPerPixel(regs.framebuffer.depth_format);
-                u32 z = (u32)((v0.screenpos[2].ToFloat32() * w0 +
-                               v1.screenpos[2].ToFloat32() * w1 +
-                               v2.screenpos[2].ToFloat32() * w2) * ((1 << num_bits) - 1) / wsum);
                 u32 ref_z = GetDepth(x >> 4, y >> 4);
 
                 bool pass = false;
@@ -907,11 +907,11 @@ static void ProcessTriangleInternal(const Shader::OutputVertex& v0,
                         UpdateStencil(stencil_test.action_depth_fail);
                     continue;
                 }
-
-                if (output_merger.depth_write_enable)
-                    SetDepth(x >> 4, y >> 4, z);
             }
 
+            if (output_merger.depth_write_enable)
+                SetDepth(x >> 4, y >> 4, z);
+
             // The stencil depth_pass action is executed even if depth testing is disabled
             if (stencil_action_enable)
                 UpdateStencil(stencil_test.action_depth_pass);

+ 4 - 2
src/video_core/renderer_opengl/gl_rasterizer.cpp

@@ -887,8 +887,10 @@ void RasterizerOpenGL::SyncStencilTest() {
 
 void RasterizerOpenGL::SyncDepthTest() {
     const auto& regs = Pica::g_state.regs;
-    state.depth.test_enabled = (regs.output_merger.depth_test_enable == 1);
-    state.depth.test_func = PicaToGL::CompareFunc(regs.output_merger.depth_test_func);
+    state.depth.test_enabled = regs.output_merger.depth_test_enable  == 1 ||
+                               regs.output_merger.depth_write_enable == 1;
+    state.depth.test_func = regs.output_merger.depth_test_enable == 1 ?
+                            PicaToGL::CompareFunc(regs.output_merger.depth_test_func) : GL_ALWAYS;
     state.color_mask.red_enabled = regs.output_merger.red_enable;
     state.color_mask.green_enabled = regs.output_merger.green_enable;
     state.color_mask.blue_enabled = regs.output_merger.blue_enable;