mirror of https://github.com/PCSX2/pcsx2.git
gsdx-ogl: add support of clip_control (depth only)
* replace the [-1;1] depth range of openGL with the DX range [0;1].
This commit is contained in:
parent
104688e3ee
commit
4659184cc1
|
@ -307,6 +307,25 @@ bool GSDeviceOGL::Create(GSWnd* wnd)
|
||||||
// m_date.bs->SetMask(false, false, false, false);
|
// m_date.bs->SetMask(false, false, false, false);
|
||||||
//#endif
|
//#endif
|
||||||
|
|
||||||
|
// ****************************************************************
|
||||||
|
// Use DX coordinate convention
|
||||||
|
// ****************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
// VS gl_position.z => [-1,-1]
|
||||||
|
// FS depth => [0, 1]
|
||||||
|
// because of -1 we loose lot of precision for small GS value
|
||||||
|
// This extension allow FS depth to range from -1 to 1. So
|
||||||
|
// gl_position.z could range from [0, 1]
|
||||||
|
#ifndef ENABLE_GLES
|
||||||
|
if (GLLoader::found_GL_ARB_clip_control) {
|
||||||
|
// Change depth convention
|
||||||
|
gl_ClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE);
|
||||||
|
} else if (GLLoader::found_GL_NV_depth_buffer_float) {
|
||||||
|
gl_DepthRangedNV(-1.0f, 1.0f);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// ****************************************************************
|
// ****************************************************************
|
||||||
// HW renderer shader
|
// HW renderer shader
|
||||||
// ****************************************************************
|
// ****************************************************************
|
||||||
|
|
|
@ -403,9 +403,8 @@ std::string GSShaderOGL::GenGlslHeader(const std::string& entry, GLenum type, co
|
||||||
header += "#define ENABLE_BINDLESS_TEX\n";
|
header += "#define ENABLE_BINDLESS_TEX\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GLLoader::found_GL_NV_depth_buffer_float) {
|
if (GLLoader::found_GL_NV_depth_buffer_float || GLLoader::found_GL_ARB_clip_control) {
|
||||||
// Specific nvidia extension that seem to help for z fighting
|
header += "#define ZERO_TO_ONE_DEPTH\n";
|
||||||
header += "#define NV_DEPTH\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -59,17 +59,6 @@ void GSDeviceOGL::CreateTextureFX()
|
||||||
|
|
||||||
// Help to debug FS in apitrace
|
// Help to debug FS in apitrace
|
||||||
m_apitrace = CompilePS(PSSelector());
|
m_apitrace = CompilePS(PSSelector());
|
||||||
|
|
||||||
// VS gl_position.z => [-1,-1]
|
|
||||||
// FS depth => [0, 1]
|
|
||||||
// because of -1 we loose lot of precision for small GS value
|
|
||||||
// This extension allow FS depth to range from -1 to 1. So
|
|
||||||
// gl_position.z could range from [0, 1]
|
|
||||||
#ifndef ENABLE_GLES
|
|
||||||
if (GLLoader::found_GL_NV_depth_buffer_float) {
|
|
||||||
gl_DepthRangedNV(-1.0f, 1.0f);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GSDepthStencilOGL* GSDeviceOGL::CreateDepthStencil(OMDepthStencilSelector dssel)
|
GSDepthStencilOGL* GSDeviceOGL::CreateDepthStencil(OMDepthStencilSelector dssel)
|
||||||
|
|
|
@ -664,8 +664,11 @@ static const char* tfx_glsl =
|
||||||
" vec2 TextureScale;\n"
|
" vec2 TextureScale;\n"
|
||||||
"};\n"
|
"};\n"
|
||||||
"\n"
|
"\n"
|
||||||
|
"#ifdef ZERO_TO_ONE_DEPTH\n"
|
||||||
"const float exp_min32 = exp2(-32.0f);\n"
|
"const float exp_min32 = exp2(-32.0f);\n"
|
||||||
|
"#else\n"
|
||||||
"const float exp_min31 = exp2(-31.0f);\n"
|
"const float exp_min31 = exp2(-31.0f);\n"
|
||||||
|
"#endif\n"
|
||||||
"\n"
|
"\n"
|
||||||
"#ifdef SUBROUTINE_GL40\n"
|
"#ifdef SUBROUTINE_GL40\n"
|
||||||
"// Function pointer type\n"
|
"// Function pointer type\n"
|
||||||
|
@ -740,7 +743,7 @@ static const char* tfx_glsl =
|
||||||
" p.xy = vec2(i_p) - vec2(0.05f, 0.05f);\n"
|
" p.xy = vec2(i_p) - vec2(0.05f, 0.05f);\n"
|
||||||
" p.xy = p.xy * VertexScale - VertexOffset;\n"
|
" p.xy = p.xy * VertexScale - VertexOffset;\n"
|
||||||
" p.w = 1.0f;\n"
|
" p.w = 1.0f;\n"
|
||||||
"#ifdef NV_DEPTH\n"
|
"#ifdef ZERO_TO_ONE_DEPTH\n"
|
||||||
" if(VS_LOGZ == 1) {\n"
|
" if(VS_LOGZ == 1) {\n"
|
||||||
" p.z = log2(float(1u+z)) / 32.0f;\n"
|
" p.z = log2(float(1u+z)) / 32.0f;\n"
|
||||||
" } else {\n"
|
" } else {\n"
|
||||||
|
|
|
@ -105,8 +105,11 @@ layout(std140, binding = 20) uniform cb20
|
||||||
vec2 TextureScale;
|
vec2 TextureScale;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef ZERO_TO_ONE_DEPTH
|
||||||
const float exp_min32 = exp2(-32.0f);
|
const float exp_min32 = exp2(-32.0f);
|
||||||
|
#else
|
||||||
const float exp_min31 = exp2(-31.0f);
|
const float exp_min31 = exp2(-31.0f);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef SUBROUTINE_GL40
|
#ifdef SUBROUTINE_GL40
|
||||||
// Function pointer type
|
// Function pointer type
|
||||||
|
@ -181,7 +184,7 @@ void vs_main()
|
||||||
p.xy = vec2(i_p) - vec2(0.05f, 0.05f);
|
p.xy = vec2(i_p) - vec2(0.05f, 0.05f);
|
||||||
p.xy = p.xy * VertexScale - VertexOffset;
|
p.xy = p.xy * VertexScale - VertexOffset;
|
||||||
p.w = 1.0f;
|
p.w = 1.0f;
|
||||||
#ifdef NV_DEPTH
|
#ifdef ZERO_TO_ONE_DEPTH
|
||||||
if(VS_LOGZ == 1) {
|
if(VS_LOGZ == 1) {
|
||||||
p.z = log2(float(1u+z)) / 32.0f;
|
p.z = log2(float(1u+z)) / 32.0f;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue