diff options
| author | Jules Blok <jules.blok@gmail.com> | 2016-08-21 17:47:24 +0200 |
|---|---|---|
| committer | Jules Blok <jules.blok@gmail.com> | 2016-08-23 15:54:04 +0200 |
| commit | a8a93489133188f221d079e4d28f6ceb56d2fb83 (patch) | |
| tree | 949db3973ee0e7b6f81077bdf27791659ac21b76 /Source/Core/VideoCommon/VertexShaderManager.cpp | |
| parent | 92f165d75693e54285294bb666f33d003d1ab174 (diff) | |
OGL: Handle cases where reversed depth is already used.
Diffstat (limited to 'Source/Core/VideoCommon/VertexShaderManager.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/VertexShaderManager.cpp | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/Source/Core/VideoCommon/VertexShaderManager.cpp b/Source/Core/VideoCommon/VertexShaderManager.cpp index 5f9f4affdc..e8f82d0bf5 100644 --- a/Source/Core/VideoCommon/VertexShaderManager.cpp +++ b/Source/Core/VideoCommon/VertexShaderManager.cpp @@ -392,8 +392,26 @@ void VertexShaderManager::SetConstants() // because the standard depth range equation pushes all depth values towards // the back of the depth buffer where conventionally depth buffers have the // least precision. - constants.pixelcentercorrection[2] = xfmem.viewport.zRange / 16777215.0f; - constants.pixelcentercorrection[3] = 1.0f - xfmem.viewport.farZ / 16777215.0f; + if (g_ActiveConfig.backend_info.bSupportsReversedDepthRange) + { + // For backends that support reversing the depth range we also support cases + // where the console also uses reversed depth with the same accuracy. We need + // to make sure the depth range is positive here and then reverse the depth in + // the backend viewport. + constants.pixelcentercorrection[2] = abs(xfmem.viewport.zRange) / 16777215.0f; + if (xfmem.viewport.zRange < 0.0f) + constants.pixelcentercorrection[3] = xfmem.viewport.farZ / 16777215.0f; + else + constants.pixelcentercorrection[3] = 1.0f - xfmem.viewport.farZ / 16777215.0f; + } + else + { + // For backends that don't support reversing the depth range we can still render + // cases where the console uses reversed depth correctly. But we simply can't + // provide the same accuracy as the console. + constants.pixelcentercorrection[2] = xfmem.viewport.zRange / 16777215.0f; + constants.pixelcentercorrection[3] = 1.0f - xfmem.viewport.farZ / 16777215.0f; + } dirty = true; // This is so implementation-dependent that we can't have it here. |
