From c223bd47b9b2a83ed53201964e4912e2faec3d66 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Wed, 3 Aug 2016 02:01:36 +0200 Subject: VideoCommon: Implement depth range equation in vertex shader. --- Source/Core/VideoBackends/OGL/Render.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/Render.cpp') diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index bde616deac..26f1c8cc21 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -1115,12 +1115,6 @@ void Renderer::SetViewport() (float)scissorYOff); float Width = EFBToScaledXf(2.0f * xfmem.viewport.wd); float Height = EFBToScaledYf(-2.0f * xfmem.viewport.ht); - float GLNear = MathUtil::Clamp( - xfmem.viewport.farZ - - MathUtil::Clamp(xfmem.viewport.zRange, -16777216.0f, 16777216.0f), - 0.0f, 16777215.0f) / - 16777216.0f; - float GLFar = MathUtil::Clamp(xfmem.viewport.farZ, 0.0f, 16777215.0f) / 16777216.0f; if (Width < 0) { X += Width; @@ -1142,7 +1136,7 @@ void Renderer::SetViewport() auto iceilf = [](float f) { return static_cast(ceilf(f)); }; glViewport(iceilf(X), iceilf(Y), iceilf(Width), iceilf(Height)); } - glDepthRangef(GLFar, GLNear); + glDepthRangef(0.0f, 1.0f); } void Renderer::ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable, -- cgit v1.2.3 From b1ed7e80fb689da5a4679e5c178f91391e55a6ff Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Thu, 4 Aug 2016 14:09:35 +0200 Subject: VertexShaderGen: Clip z using user-defined clipping planes. --- Source/Core/VideoBackends/OGL/Render.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'Source/Core/VideoBackends/OGL/Render.cpp') diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index 26f1c8cc21..13a34ce2e1 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -724,6 +724,7 @@ Renderer::Renderer() glClearDepthf(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); + glEnable(GL_CLIP_DISTANCE0); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment -- cgit v1.2.3 From e9e81ece6538c6676054dbc0e9d156fcc59801c9 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Wed, 3 Aug 2016 21:54:22 +0200 Subject: VideoBackends: Enable depth clamping. --- Source/Core/VideoBackends/OGL/Render.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/Render.cpp') diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index 13a34ce2e1..fb40705279 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -725,6 +725,7 @@ Renderer::Renderer() glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glEnable(GL_CLIP_DISTANCE0); + glEnable(GL_DEPTH_CLAMP); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment @@ -1137,7 +1138,7 @@ void Renderer::SetViewport() auto iceilf = [](float f) { return static_cast(ceilf(f)); }; glViewport(iceilf(X), iceilf(Y), iceilf(Width), iceilf(Height)); } - glDepthRangef(0.0f, 1.0f); + glDepthRangef(0.0f, 16777215.0f / 16777216.0f); } void Renderer::ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable, -- cgit v1.2.3 From 4582853af48f67047e57b997bf923488bf444931 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Sat, 6 Aug 2016 03:40:45 +0200 Subject: VertexShaderGen: Use reversed depth range. --- Source/Core/VideoBackends/OGL/Render.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/Render.cpp') diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index fb40705279..692bf36e51 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -1138,7 +1138,7 @@ void Renderer::SetViewport() auto iceilf = [](float f) { return static_cast(ceilf(f)); }; glViewport(iceilf(X), iceilf(Y), iceilf(Width), iceilf(Height)); } - glDepthRangef(0.0f, 16777215.0f / 16777216.0f); + glDepthRangef(16777215.0f / 16777216.0f, 0.0f); } void Renderer::ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable, -- cgit v1.2.3 From a141e91dd226885fc767d009938ca61a22f86558 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Fri, 5 Aug 2016 22:31:34 +0200 Subject: OGL: Check for GL_DEPTH_CLAMP support. It's not available in OpenGL ES and officially it's not supported on OpenGL 3.0/3.1. Fallback to old depth range code if there is no method to disable depth clipping. It's more important to have correct clipping than to have accurate depth values. Inaccurate depth values can be fixed by slow depth. --- Source/Core/VideoBackends/OGL/Render.cpp | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/Render.cpp') diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index 692bf36e51..5af9407763 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -481,6 +481,9 @@ Renderer::Renderer() g_Config.backend_info.bSupportsBindingLayout = GLExtensions::Supports("GL_ARB_shading_language_420pack"); + // Clip distance support is useless without a method to clamp the depth range + g_Config.backend_info.bSupportsDepthClamp = GLExtensions::Supports("GL_ARB_depth_clamp"); + g_ogl_config.bSupportsGLSLCache = GLExtensions::Supports("GL_ARB_get_program_binary"); g_ogl_config.bSupportsGLPinnedMemory = GLExtensions::Supports("GL_AMD_pinned_memory"); g_ogl_config.bSupportsGLSync = GLExtensions::Supports("GL_ARB_sync"); @@ -520,6 +523,9 @@ Renderer::Renderer() g_ogl_config.bSupportsGLSLCache = true; g_ogl_config.bSupportsGLSync = true; + // TODO: Implement support for GL_EXT_clip_cull_distance when there is an extension for depth clamping. + g_Config.backend_info.bSupportsDepthClamp = false; + if (strstr(g_ogl_config.glsl_version, "3.0")) { g_ogl_config.eSupportedGLSLVersion = GLSLES_300; @@ -669,7 +675,7 @@ Renderer::Renderer() g_ogl_config.gl_renderer, g_ogl_config.gl_version), 5000); - WARN_LOG(VIDEO, "Missing OGL Extensions: %s%s%s%s%s%s%s%s%s%s%s%s%s", + WARN_LOG(VIDEO, "Missing OGL Extensions: %s%s%s%s%s%s%s%s%s%s%s%s%s%s", g_ActiveConfig.backend_info.bSupportsDualSourceBlend ? "" : "DualSourceBlend ", g_ActiveConfig.backend_info.bSupportsPrimitiveRestart ? "" : "PrimitiveRestart ", g_ActiveConfig.backend_info.bSupportsEarlyZ ? "" : "EarlyZ ", @@ -681,7 +687,8 @@ Renderer::Renderer() g_ActiveConfig.backend_info.bSupportsSSAA ? "" : "SSAA ", g_ActiveConfig.backend_info.bSupportsGSInstancing ? "" : "GSInstancing ", g_ActiveConfig.backend_info.bSupportsClipControl ? "" : "ClipControl ", - g_ogl_config.bSupportsCopySubImage ? "" : "CopyImageSubData "); + g_ogl_config.bSupportsCopySubImage ? "" : "CopyImageSubData ", + g_ActiveConfig.backend_info.bSupportsDepthClamp ? "" : "DepthClamp "); s_last_multisamples = g_ActiveConfig.iMultisamples; s_MSAASamples = s_last_multisamples; @@ -724,8 +731,11 @@ Renderer::Renderer() glClearDepthf(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); - glEnable(GL_CLIP_DISTANCE0); - glEnable(GL_DEPTH_CLAMP); + if (g_ActiveConfig.backend_info.bSupportsDepthClamp) + { + glEnable(GL_CLIP_DISTANCE0); + glEnable(GL_DEPTH_CLAMP); + } glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment @@ -1117,6 +1127,12 @@ void Renderer::SetViewport() (float)scissorYOff); float Width = EFBToScaledXf(2.0f * xfmem.viewport.wd); float Height = EFBToScaledYf(-2.0f * xfmem.viewport.ht); + float GLNear = MathUtil::Clamp( + xfmem.viewport.farZ - + MathUtil::Clamp(xfmem.viewport.zRange, -16777216.0f, 16777216.0f), + 0.0f, 16777215.0f) / + 16777216.0f; + float GLFar = MathUtil::Clamp(xfmem.viewport.farZ, 0.0f, 16777215.0f) / 16777216.0f; if (Width < 0) { X += Width; @@ -1138,7 +1154,11 @@ void Renderer::SetViewport() auto iceilf = [](float f) { return static_cast(ceilf(f)); }; glViewport(iceilf(X), iceilf(Y), iceilf(Width), iceilf(Height)); } - glDepthRangef(16777215.0f / 16777216.0f, 0.0f); + + if (g_ActiveConfig.backend_info.bSupportsDepthClamp) + glDepthRangef(16777215.0f / 16777216.0f, 0.0f); + else + glDepthRangef(GLFar, GLNear); } void Renderer::ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable, -- cgit v1.2.3 From 6e2052fae6844da702cbfe0c5ddd4c42f4ad6fbd Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Thu, 11 Aug 2016 21:03:56 +0200 Subject: OGL: Disable clip distance on when not in a game-like state. --- Source/Core/VideoBackends/OGL/Render.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'Source/Core/VideoBackends/OGL/Render.cpp') diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index 5af9407763..0bcf262cac 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -1663,6 +1663,8 @@ void Renderer::ResetAPIState() glDisable(GL_BLEND); if (GLInterface->GetMode() == GLInterfaceMode::MODE_OPENGL) glDisable(GL_COLOR_LOGIC_OP); + if (g_ActiveConfig.backend_info.bSupportsDepthClamp) + glDisable(GL_CLIP_DISTANCE0); glDepthMask(GL_FALSE); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } @@ -1671,6 +1673,8 @@ 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); SetGenerationMode(); BPFunctions::SetScissor(); SetColorMask(); -- cgit v1.2.3 From 94927f360feb1989a7b63ec4d583f45a5767aa3b Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Fri, 12 Aug 2016 15:06:26 +0200 Subject: VideoCommon: Add a user-defined far clipping plane. --- Source/Core/VideoBackends/OGL/Render.cpp | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'Source/Core/VideoBackends/OGL/Render.cpp') 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(); -- cgit v1.2.3 From afa251af427514510e3b2bf90255305716a9dac6 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Fri, 12 Aug 2016 13:42:18 +0200 Subject: DriverDetails: Add bug for broken gl_ClipDistance on i965. --- Source/Core/VideoBackends/OGL/Render.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/Render.cpp') diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index 658cc29b3c..77e3356255 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -482,7 +482,8 @@ Renderer::Renderer() GLExtensions::Supports("GL_ARB_shading_language_420pack"); // Clip distance support is useless without a method to clamp the depth range - g_Config.backend_info.bSupportsDepthClamp = GLExtensions::Supports("GL_ARB_depth_clamp"); + g_Config.backend_info.bSupportsDepthClamp = GLExtensions::Supports("GL_ARB_depth_clamp") && + !DriverDetails::HasBug(DriverDetails::BUG_BROKENCLIPDISTANCE); g_ogl_config.bSupportsGLSLCache = GLExtensions::Supports("GL_ARB_get_program_binary"); g_ogl_config.bSupportsGLPinnedMemory = GLExtensions::Supports("GL_AMD_pinned_memory"); -- cgit v1.2.3 From 8c1c7fc2da65eea1a8244ce196d94313f7fdfb1b Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Fri, 12 Aug 2016 13:55:35 +0200 Subject: Cosmetics. --- Source/Core/VideoBackends/OGL/Render.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/Render.cpp') diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index 77e3356255..a47f0c1e40 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -482,8 +482,9 @@ Renderer::Renderer() GLExtensions::Supports("GL_ARB_shading_language_420pack"); // Clip distance support is useless without a method to clamp the depth range - g_Config.backend_info.bSupportsDepthClamp = GLExtensions::Supports("GL_ARB_depth_clamp") && - !DriverDetails::HasBug(DriverDetails::BUG_BROKENCLIPDISTANCE); + g_Config.backend_info.bSupportsDepthClamp = + GLExtensions::Supports("GL_ARB_depth_clamp") && + !DriverDetails::HasBug(DriverDetails::BUG_BROKENCLIPDISTANCE); g_ogl_config.bSupportsGLSLCache = GLExtensions::Supports("GL_ARB_get_program_binary"); g_ogl_config.bSupportsGLPinnedMemory = GLExtensions::Supports("GL_AMD_pinned_memory"); @@ -524,7 +525,8 @@ Renderer::Renderer() g_ogl_config.bSupportsGLSLCache = true; g_ogl_config.bSupportsGLSync = true; - // TODO: Implement support for GL_EXT_clip_cull_distance when there is an extension for depth clamping. + // TODO: Implement support for GL_EXT_clip_cull_distance when there is an extension for + // depth clamping. g_Config.backend_info.bSupportsDepthClamp = false; if (strstr(g_ogl_config.glsl_version, "3.0")) -- cgit v1.2.3 From 7078216b61777ff89350d1bdc66c7c032b0b2296 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Mon, 15 Aug 2016 15:25:50 +0200 Subject: Improve documentation. --- Source/Core/VideoBackends/OGL/Render.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'Source/Core/VideoBackends/OGL/Render.cpp') diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index a47f0c1e40..78d5d106b7 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -1159,8 +1159,12 @@ void Renderer::SetViewport() glViewport(iceilf(X), iceilf(Y), iceilf(Width), iceilf(Height)); } + // Set the reversed depth range. If we do depth clipping and depth range in the + // vertex shader we only need to ensure depth values don't exceed the maximum + // value supported by the console GPU. If not, we simply clamp the near/far values + // themselves to the maximum value as done above. if (g_ActiveConfig.backend_info.bSupportsDepthClamp) - glDepthRangef(16777215.0f / 16777216.0f, 0.0f); + glDepthRangef(GX_MAX_DEPTH, 0.0f); else glDepthRangef(GLFar, GLNear); } -- cgit v1.2.3 From e86d7cbc999223ca113af7b4c0aac6850c1854fe Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Wed, 17 Aug 2016 20:12:44 +0200 Subject: OGL: Workaround gl_ClipDistance bug on Mesa i965. --- Source/Core/VideoBackends/OGL/Render.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'Source/Core/VideoBackends/OGL/Render.cpp') diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index 78d5d106b7..d637c308ca 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -482,9 +482,7 @@ Renderer::Renderer() GLExtensions::Supports("GL_ARB_shading_language_420pack"); // Clip distance support is useless without a method to clamp the depth range - g_Config.backend_info.bSupportsDepthClamp = - GLExtensions::Supports("GL_ARB_depth_clamp") && - !DriverDetails::HasBug(DriverDetails::BUG_BROKENCLIPDISTANCE); + g_Config.backend_info.bSupportsDepthClamp = GLExtensions::Supports("GL_ARB_depth_clamp"); g_ogl_config.bSupportsGLSLCache = GLExtensions::Supports("GL_ARB_get_program_binary"); g_ogl_config.bSupportsGLPinnedMemory = GLExtensions::Supports("GL_AMD_pinned_memory"); -- cgit v1.2.3