From 69d3d479017fd67009eb0a41c258d3f95914f81a Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 12 Jun 2017 19:18:06 +0300 Subject: [PATCH] gl: Fix clip-space -> depth conversion. Fixes remaining depth read issues - Also set some default values for samplers in a cleaner way using their 'natural' float values --- rpcs3/Emu/RSX/GL/GLGSRender.cpp | 1 - rpcs3/Emu/RSX/GL/GLProcTable.h | 1 + rpcs3/Emu/RSX/GL/GLTexture.cpp | 8 ++++---- rpcs3/Emu/RSX/RSXThread.cpp | 14 +++++++++++++- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 76ffb94a54..ae3eb11970 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -205,7 +205,6 @@ void GLGSRender::begin() if (__glcheck enable(rsx::method_registers.depth_test_enabled(), GL_DEPTH_TEST)) { __glcheck glDepthFunc(comparison_op(rsx::method_registers.depth_func())); - __glcheck glDepthMask(rsx::method_registers.depth_write_enabled()); } if (glDepthBoundsEXT && (__glcheck enable(rsx::method_registers.depth_bounds_test_enabled(), GL_DEPTH_BOUNDS_TEST_EXT))) diff --git a/rpcs3/Emu/RSX/GL/GLProcTable.h b/rpcs3/Emu/RSX/GL/GLProcTable.h index 517138bcf5..e2f2160590 100644 --- a/rpcs3/Emu/RSX/GL/GLProcTable.h +++ b/rpcs3/Emu/RSX/GL/GLProcTable.h @@ -178,6 +178,7 @@ OPENGL_PROC(PFNGLGENSAMPLERSPROC, GenSamplers); OPENGL_PROC(PFNGLDELETESAMPLERSPROC, DeleteSamplers); OPENGL_PROC(PFNGLBINDSAMPLERPROC, BindSampler); OPENGL_PROC(PFNGLSAMPLERPARAMETERIPROC, SamplerParameteri); +OPENGL_PROC(PFNGLSAMPLERPARAMETERFPROC, SamplerParameterf); OPENGL_PROC(PFNGLSAMPLERPARAMETERFVPROC, SamplerParameterfv); //Texture Buffers diff --git a/rpcs3/Emu/RSX/GL/GLTexture.cpp b/rpcs3/Emu/RSX/GL/GLTexture.cpp index 9306bf54b8..e76c7c109c 100644 --- a/rpcs3/Emu/RSX/GL/GLTexture.cpp +++ b/rpcs3/Emu/RSX/GL/GLTexture.cpp @@ -162,14 +162,14 @@ namespace gl } glSamplerParameteri(samplerHandle, GL_TEXTURE_MIN_FILTER, min_filter); - glSamplerParameteri(samplerHandle, GL_TEXTURE_LOD_BIAS, 0.); - glSamplerParameteri(samplerHandle, GL_TEXTURE_MIN_LOD, 0); - glSamplerParameteri(samplerHandle, GL_TEXTURE_MAX_LOD, 0); + glSamplerParameterf(samplerHandle, GL_TEXTURE_LOD_BIAS, 0.f); + glSamplerParameterf(samplerHandle, GL_TEXTURE_MIN_LOD, -1000.f); + glSamplerParameterf(samplerHandle, GL_TEXTURE_MAX_LOD, 1000.f); } else { glSamplerParameteri(samplerHandle, GL_TEXTURE_MIN_FILTER, tex_min_filter(tex.min_filter())); - glSamplerParameteri(samplerHandle, GL_TEXTURE_LOD_BIAS, tex.bias()); + glSamplerParameterf(samplerHandle, GL_TEXTURE_LOD_BIAS, tex.bias()); glSamplerParameteri(samplerHandle, GL_TEXTURE_MIN_LOD, (tex.min_lod() >> 8)); glSamplerParameteri(samplerHandle, GL_TEXTURE_MAX_LOD, (tex.max_lod() >> 8)); } diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 9e2e30d4e8..c9b295fad4 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -523,7 +523,19 @@ namespace rsx float scale_z = rsx::method_registers.viewport_scale_z(); float offset_z = rsx::method_registers.viewport_offset_z(); - if (symmetrical_z) offset_z -= .5; + + if (symmetrical_z) + { + //Since our clip_space is symetrical [-1, 1] we map it to linear space using the eqn: + //ln = (clip * 2) - 1 to fully utilize the 0-1 range of the depth buffer + //RSX matrices passed already map to the [0, 1] range but mapping to classic OGL + //Requires that we undo this step + //This can be made unnecessary using the call glClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE). + //However, ClipControl only made it to opengl core in ver 4.5 though, so this is a workaround. + + offset_z -= 1.f; + scale_z *= 2.f; + } float one = 1.f;