OGL: Handle cases where reversed depth is already used.

This commit is contained in:
Jules Blok 2016-08-21 17:47:24 +02:00
parent 92f165d756
commit a8a9348913
6 changed files with 32 additions and 3 deletions

View File

@ -72,6 +72,7 @@ void VideoBackend::InitBackendInfo()
g_Config.backend_info.bSupportsPaletteConversion = true;
g_Config.backend_info.bSupportsClipControl = true;
g_Config.backend_info.bSupportsDepthClamp = true;
g_Config.backend_info.bSupportsReversedDepthRange = false;
IDXGIFactory* factory;
IDXGIAdapter* ad;

View File

@ -75,6 +75,7 @@ void VideoBackend::InitBackendInfo()
g_Config.backend_info.bSupportsPaletteConversion = true;
g_Config.backend_info.bSupportsClipControl = true;
g_Config.backend_info.bSupportsDepthClamp = true;
g_Config.backend_info.bSupportsReversedDepthRange = false;
IDXGIFactory* factory;
IDXGIAdapter* ad;

View File

@ -1160,9 +1160,16 @@ void Renderer::SetViewport()
// 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(GX_MAX_DEPTH, 0.0f);
{
if (xfmem.viewport.zRange < 0.0f)
glDepthRangef(0.0f, GX_MAX_DEPTH);
else
glDepthRangef(GX_MAX_DEPTH, 0.0f);
}
else
{
glDepthRangef(GLFar, GLNear);
}
}
void Renderer::ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable,

View File

@ -102,6 +102,7 @@ void VideoBackend::InitBackendInfo()
g_Config.backend_info.bSupports3DVision = false;
g_Config.backend_info.bSupportsPostProcessing = true;
g_Config.backend_info.bSupportsSSAA = true;
g_Config.backend_info.bSupportsReversedDepthRange = true;
// Overwritten in Render.cpp later
g_Config.backend_info.bSupportsDualSourceBlend = true;

View File

@ -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.

View File

@ -172,6 +172,7 @@ struct VideoConfig final
bool bSupportsClipControl; // Needed by VertexShaderGen, so must stay in VideoCommon
bool bSupportsSSAA;
bool bSupportsDepthClamp; // Needed by VertexShaderGen, so must stay in VideoCommon
bool bSupportsReversedDepthRange;
} backend_info;
// Utility