From 94927f360feb1989a7b63ec4d583f45a5767aa3b Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Fri, 12 Aug 2016 15:06:26 +0200 Subject: [PATCH] VideoCommon: Add a user-defined far clipping plane. --- Source/Core/VideoBackends/OGL/Render.cpp | 7 +++++++ Source/Core/VideoCommon/GeometryShaderGen.cpp | 5 ++++- Source/Core/VideoCommon/ShaderGenCommon.h | 6 ++++-- Source/Core/VideoCommon/VertexShaderGen.cpp | 8 ++++++-- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index 0bcf262cac..658cc29b3c 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -734,6 +734,7 @@ Renderer::Renderer() if (g_ActiveConfig.backend_info.bSupportsDepthClamp) { glEnable(GL_CLIP_DISTANCE0); + glEnable(GL_CLIP_DISTANCE1); glEnable(GL_DEPTH_CLAMP); } @@ -1664,7 +1665,10 @@ void Renderer::ResetAPIState() if (GLInterface->GetMode() == GLInterfaceMode::MODE_OPENGL) glDisable(GL_COLOR_LOGIC_OP); if (g_ActiveConfig.backend_info.bSupportsDepthClamp) + { glDisable(GL_CLIP_DISTANCE0); + glDisable(GL_CLIP_DISTANCE1); + } glDepthMask(GL_FALSE); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } @@ -1674,7 +1678,10 @@ void Renderer::RestoreAPIState() // Gets us back into a more game-like state. glEnable(GL_SCISSOR_TEST); if (g_ActiveConfig.backend_info.bSupportsDepthClamp) + { glEnable(GL_CLIP_DISTANCE0); + glEnable(GL_CLIP_DISTANCE1); + } SetGenerationMode(); BPFunctions::SetScissor(); SetColorMask(); diff --git a/Source/Core/VideoCommon/GeometryShaderGen.cpp b/Source/Core/VideoCommon/GeometryShaderGen.cpp index 03979d0bbe..2630a422fa 100644 --- a/Source/Core/VideoCommon/GeometryShaderGen.cpp +++ b/Source/Core/VideoCommon/GeometryShaderGen.cpp @@ -313,7 +313,10 @@ static void EmitVertex(ShaderCode& out, const geometry_shader_uid_data* uid_data { out.Write("\tgl_Position = %s.pos;\n", vertex); if (g_ActiveConfig.backend_info.bSupportsDepthClamp) - out.Write("\tgl_ClipDistance[0] = %s.clipDist;\n", vertex); + { + out.Write("\tgl_ClipDistance[0] = %s.clipDist0;\n", vertex); + out.Write("\tgl_ClipDistance[1] = %s.clipDist1;\n", vertex); + } AssignVSOutputMembers(out, "ps", vertex, uid_data->numTexGens, uid_data->pixel_lighting); } else diff --git a/Source/Core/VideoCommon/ShaderGenCommon.h b/Source/Core/VideoCommon/ShaderGenCommon.h index 434099e85e..97c63ae2ea 100644 --- a/Source/Core/VideoCommon/ShaderGenCommon.h +++ b/Source/Core/VideoCommon/ShaderGenCommon.h @@ -197,7 +197,8 @@ inline void GenerateVSOutputMembers(T& object, APIType api_type, u32 texgens, texgens + 2); } - DefineOutputMember(object, api_type, qualifier, "float", "clipDist", -1, "SV_ClipDistance"); + DefineOutputMember(object, api_type, qualifier, "float", "clipDist", 0, "SV_ClipDistance", 0); + DefineOutputMember(object, api_type, qualifier, "float", "clipDist", 1, "SV_ClipDistance", 1); } template @@ -219,7 +220,8 @@ inline void AssignVSOutputMembers(T& object, const char* a, const char* b, u32 t object.Write("\t%s.WorldPos = %s.WorldPos;\n", a, b); } - object.Write("\t%s.clipDist = %s.clipDist;\n", a, b); + object.Write("\t%s.clipDist0 = %s.clipDist0;\n", a, b); + object.Write("\t%s.clipDist1 = %s.clipDist1;\n", a, b); } // We use the flag "centroid" to fix some MSAA rendering bugs. With MSAA, the diff --git a/Source/Core/VideoCommon/VertexShaderGen.cpp b/Source/Core/VideoCommon/VertexShaderGen.cpp index 85359ac6ee..5d0f838843 100644 --- a/Source/Core/VideoCommon/VertexShaderGen.cpp +++ b/Source/Core/VideoCommon/VertexShaderGen.cpp @@ -403,7 +403,8 @@ ShaderCode GenerateVertexShaderCode(APIType api_type, const vertex_shader_uid_da { // Since we're adjusting z for the depth range before the perspective divide, we have to do our // own clipping. - out.Write("o.clipDist = o.pos.z + o.pos.w;\n"); + out.Write("o.clipDist0 = o.pos.z + o.pos.w;\n"); + out.Write("o.clipDist1 = o.pos.w * -o.pos.z;\n"); // We have to handle the depth range in the vertex shader, because some games will use a depth range beyond // the normal depth range of 0..1. @@ -467,7 +468,10 @@ ShaderCode GenerateVertexShaderCode(APIType api_type, const vertex_shader_uid_da } if (g_ActiveConfig.backend_info.bSupportsDepthClamp) - out.Write("gl_ClipDistance[0] = o.clipDist;\n"); + { + out.Write("gl_ClipDistance[0] = o.clipDist0;\n"); + out.Write("gl_ClipDistance[1] = o.clipDist1;\n"); + } out.Write("gl_Position = o.pos;\n"); } else // D3D