From e76b6e3f278be567afcac3fc53311274e6f0ea55 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 26 Aug 2017 17:31:14 +0300 Subject: [PATCH] gl: Workaround for restrictive z range --- rpcs3/Emu/RSX/GL/GLGSRender.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index bc3bc5284b..fd5bc2ca4b 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -187,6 +187,21 @@ void GLGSRender::begin() if (gl_state.enable(rsx::method_registers.depth_test_enabled(), GL_DEPTH_TEST)) { gl_state.depth_func(comparison_op(rsx::method_registers.depth_func())); + + float range_near = rsx::method_registers.clip_min(); + float range_far = rsx::method_registers.clip_max(); + + if (g_cfg.video.strict_rendering_mode) + gl_state.depth_range(range_near, range_far); + else + { + //Workaround to preserve depth precision but respect z direction + //Ni no Kuni sets a very restricted z range (0.9x - 1.) and depth reads / tests are broken + if (range_near <= range_far) + gl_state.depth_range(0.f, 1.f); + else + gl_state.depth_range(1.f, 0.f); + } } if (glDepthBoundsEXT && (gl_state.enable(rsx::method_registers.depth_bounds_test_enabled(), GL_DEPTH_BOUNDS_TEST_EXT))) @@ -194,7 +209,6 @@ void GLGSRender::begin() gl_state.depth_bounds(rsx::method_registers.depth_bounds_min(), rsx::method_registers.depth_bounds_max()); } - gl_state.depth_range(rsx::method_registers.clip_min(), rsx::method_registers.clip_max()); gl_state.enable(rsx::method_registers.dither_enabled(), GL_DITHER); if (gl_state.enable(rsx::method_registers.blend_enabled(), GL_BLEND))