summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2016-03-06 11:16:21 -0500
committerGravatar bunnei2016-03-06 11:16:21 -0500
commit6436d101b5d623aa7c5a854bf3b28fbefe2d5198 (patch)
tree7f3146a9a8062a7b29c11ab5c2499f81e9d2b1e6 /src
parentMerge pull request #1463 from yuriks/non-app-region (diff)
parentPica: Write depth value even when depth test is disabled (diff)
downloadyuzu-6436d101b5d623aa7c5a854bf3b28fbefe2d5198.tar.gz
yuzu-6436d101b5d623aa7c5a854bf3b28fbefe2d5198.tar.xz
yuzu-6436d101b5d623aa7c5a854bf3b28fbefe2d5198.zip
Merge pull request #1462 from yuriks/depth-test-write
Pica: Write depth value even when depth test is disabled
Diffstat (limited to 'src')
-rw-r--r--src/video_core/rasterizer.cpp16
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp6
2 files changed, 12 insertions, 10 deletions
diff --git a/src/video_core/rasterizer.cpp b/src/video_core/rasterizer.cpp
index dd1604a38..fd02aa652 100644
--- a/src/video_core/rasterizer.cpp
+++ b/src/video_core/rasterizer.cpp
@@ -858,12 +858,12 @@ static void ProcessTriangleInternal(const Shader::OutputVertex& v0,
858 } 858 }
859 } 859 }
860 860
861 // TODO: Does depth indeed only get written even if depth testing is enabled? 861 unsigned num_bits = Regs::DepthBitsPerPixel(regs.framebuffer.depth_format);
862 u32 z = (u32)((v0.screenpos[2].ToFloat32() * w0 +
863 v1.screenpos[2].ToFloat32() * w1 +
864 v2.screenpos[2].ToFloat32() * w2) * ((1 << num_bits) - 1) / wsum);
865
862 if (output_merger.depth_test_enable) { 866 if (output_merger.depth_test_enable) {
863 unsigned num_bits = Regs::DepthBitsPerPixel(regs.framebuffer.depth_format);
864 u32 z = (u32)((v0.screenpos[2].ToFloat32() * w0 +
865 v1.screenpos[2].ToFloat32() * w1 +
866 v2.screenpos[2].ToFloat32() * w2) * ((1 << num_bits) - 1) / wsum);
867 u32 ref_z = GetDepth(x >> 4, y >> 4); 867 u32 ref_z = GetDepth(x >> 4, y >> 4);
868 868
869 bool pass = false; 869 bool pass = false;
@@ -907,11 +907,11 @@ static void ProcessTriangleInternal(const Shader::OutputVertex& v0,
907 UpdateStencil(stencil_test.action_depth_fail); 907 UpdateStencil(stencil_test.action_depth_fail);
908 continue; 908 continue;
909 } 909 }
910
911 if (output_merger.depth_write_enable)
912 SetDepth(x >> 4, y >> 4, z);
913 } 910 }
914 911
912 if (output_merger.depth_write_enable)
913 SetDepth(x >> 4, y >> 4, z);
914
915 // The stencil depth_pass action is executed even if depth testing is disabled 915 // The stencil depth_pass action is executed even if depth testing is disabled
916 if (stencil_action_enable) 916 if (stencil_action_enable)
917 UpdateStencil(stencil_test.action_depth_pass); 917 UpdateStencil(stencil_test.action_depth_pass);
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 0f864b617..b3dc6aa19 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -887,8 +887,10 @@ void RasterizerOpenGL::SyncStencilTest() {
887 887
888void RasterizerOpenGL::SyncDepthTest() { 888void RasterizerOpenGL::SyncDepthTest() {
889 const auto& regs = Pica::g_state.regs; 889 const auto& regs = Pica::g_state.regs;
890 state.depth.test_enabled = (regs.output_merger.depth_test_enable == 1); 890 state.depth.test_enabled = regs.output_merger.depth_test_enable == 1 ||
891 state.depth.test_func = PicaToGL::CompareFunc(regs.output_merger.depth_test_func); 891 regs.output_merger.depth_write_enable == 1;
892 state.depth.test_func = regs.output_merger.depth_test_enable == 1 ?
893 PicaToGL::CompareFunc(regs.output_merger.depth_test_func) : GL_ALWAYS;
892 state.color_mask.red_enabled = regs.output_merger.red_enable; 894 state.color_mask.red_enabled = regs.output_merger.red_enable;
893 state.color_mask.green_enabled = regs.output_merger.green_enable; 895 state.color_mask.green_enabled = regs.output_merger.green_enable;
894 state.color_mask.blue_enabled = regs.output_merger.blue_enable; 896 state.color_mask.blue_enabled = regs.output_merger.blue_enable;