diff --git a/bin/resources/shaders/dx11/tfx.fx b/bin/resources/shaders/dx11/tfx.fx index 0aaff8b508..8996688c5c 100644 --- a/bin/resources/shaders/dx11/tfx.fx +++ b/bin/resources/shaders/dx11/tfx.fx @@ -139,8 +139,12 @@ struct PS_OUTPUT #endif #endif #endif -#if PS_ZCLAMP || PS_ZFLOOR - float depth : SV_DepthLessEqual; +#if (PS_ZFLOOR || PS_ZCLAMP) + #if PS_HAS_CONSERVATIVE_DEPTH + float depth : SV_DepthLessEqual; + #else + float depth : SV_Depth; + #endif #endif }; diff --git a/bin/resources/shaders/opengl/tfx_fs.glsl b/bin/resources/shaders/opengl/tfx_fs.glsl index 3b0ea99095..3d8f69c7d6 100644 --- a/bin/resources/shaders/opengl/tfx_fs.glsl +++ b/bin/resources/shaders/opengl/tfx_fs.glsl @@ -113,7 +113,7 @@ layout(binding = 3) uniform sampler2D img_prim_min; //layout(pixel_center_integer) in vec4 gl_FragCoord; #endif -#if (PS_ZFLOOR || PS_ZCLAMP) && HAS_CONSERVATIVE_DEPTH +#if (PS_ZFLOOR || PS_ZCLAMP) && PS_HAS_CONSERVATIVE_DEPTH layout(depth_less) out float gl_FragDepth; #endif diff --git a/pcsx2/GS/Renderers/DX11/GSDevice11.cpp b/pcsx2/GS/Renderers/DX11/GSDevice11.cpp index 4a0f732614..195e7b3c60 100644 --- a/pcsx2/GS/Renderers/DX11/GSDevice11.cpp +++ b/pcsx2/GS/Renderers/DX11/GSDevice11.cpp @@ -599,6 +599,8 @@ void GSDevice11::SetFeatures(IDXGIAdapter1* adapter) m_max_texture_size = (m_feature_level >= D3D_FEATURE_LEVEL_11_0) ? D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION : D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION; + + m_conservative_depth = (m_feature_level >= D3D_FEATURE_LEVEL_11_0); } bool GSDevice11::HasSurface() const @@ -1721,6 +1723,7 @@ void GSDevice11::SetupPS(const PSSelector& sel, const GSHWDrawConfig::PSConstant ShaderMacro sm; sm.AddMacro("PIXEL_SHADER", 1); + sm.AddMacro("PS_HAS_CONSERVATIVE_DEPTH", m_conservative_depth); sm.AddMacro("PS_FST", sel.fst); sm.AddMacro("PS_WMS", sel.wms); sm.AddMacro("PS_WMT", sel.wmt); diff --git a/pcsx2/GS/Renderers/DX11/GSDevice11.h b/pcsx2/GS/Renderers/DX11/GSDevice11.h index 52284097e0..f25e8482c7 100644 --- a/pcsx2/GS/Renderers/DX11/GSDevice11.h +++ b/pcsx2/GS/Renderers/DX11/GSDevice11.h @@ -136,6 +136,7 @@ private: bool m_using_flip_model_swap_chain = true; bool m_using_allow_tearing = false; bool m_is_exclusive_fullscreen = false; + bool m_conservative_depth = false; struct { diff --git a/pcsx2/GS/Renderers/DX12/GSDevice12.cpp b/pcsx2/GS/Renderers/DX12/GSDevice12.cpp index 7ac4fd30c9..b574425fe7 100644 --- a/pcsx2/GS/Renderers/DX12/GSDevice12.cpp +++ b/pcsx2/GS/Renderers/DX12/GSDevice12.cpp @@ -3048,6 +3048,7 @@ const ID3DBlob* GSDevice12::GetTFXPixelShader(const GSHWDrawConfig::PSSelector& ShaderMacro sm; sm.AddMacro("PIXEL_SHADER", 1); + sm.AddMacro("PS_HAS_CONSERVATIVE_DEPTH", 1); sm.AddMacro("PS_FST", sel.fst); sm.AddMacro("PS_WMS", sel.wms); sm.AddMacro("PS_WMT", sel.wmt); diff --git a/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp b/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp index 9e08ac771f..98317798b5 100644 --- a/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp +++ b/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp @@ -1301,11 +1301,11 @@ std::string GSDeviceOGL::GenGlslHeader(const std::string_view entry, GLenum type if (GLAD_GL_ARB_conservative_depth) { header += "#extension GL_ARB_conservative_depth : enable\n"; - header += "#define HAS_CONSERVATIVE_DEPTH 1\n"; + header += "#define PS_HAS_CONSERVATIVE_DEPTH 1\n"; } else { - header += "#define HAS_CONSERVATIVE_DEPTH 0\n"; + header += "#define PS_HAS_CONSERVATIVE_DEPTH 0\n"; } // Allow to puts several shader in 1 files diff --git a/pcsx2/ShaderCacheVersion.h b/pcsx2/ShaderCacheVersion.h index d659752037..f2b527b719 100644 --- a/pcsx2/ShaderCacheVersion.h +++ b/pcsx2/ShaderCacheVersion.h @@ -3,4 +3,4 @@ /// Version number for GS and other shaders. Increment whenever any of the contents of the /// shaders change, to invalidate the cache. -static constexpr u32 SHADER_CACHE_VERSION = 81; +static constexpr u32 SHADER_CACHE_VERSION = 82;