From ff9ca059c7849695c17beda33b0cc30e95c2be9e Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sat, 29 Jul 2023 14:13:08 +1000 Subject: [PATCH] GS/DX11: Require feature level 11.0 Feature level 11.0 GPUs were first released in 2009, almost 14 years ago now. Older GPUs have not had drivers released in a long time, and are known to be buggy. None of us have hardware this old, so it's impossible for us to support it. --- bin/resources/shaders/common/fxaa.fx | 43 ++-------- bin/resources/shaders/dx11/convert.fx | 4 - bin/resources/shaders/dx11/interlace.fx | 4 - bin/resources/shaders/dx11/merge.fx | 3 - bin/resources/shaders/dx11/present.fx | 8 -- bin/resources/shaders/dx11/shadeboost.fx | 4 - pcsx2/GS/Renderers/DX11/D3D.cpp | 20 ++--- pcsx2/GS/Renderers/DX11/D3D11ShaderCache.cpp | 6 -- pcsx2/GS/Renderers/DX11/GSDevice11.cpp | 83 +++++++------------- pcsx2/GS/Renderers/DX11/GSDevice11.h | 4 +- pcsx2/GS/Renderers/DX11/GSTextureFX11.cpp | 4 +- pcsx2/GS/Renderers/DX12/D3D12ShaderCache.cpp | 6 -- pcsx2/GS/Renderers/DX12/GSDevice12.cpp | 34 +++----- pcsx2/GS/Renderers/DX12/GSDevice12.h | 2 +- pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp | 2 +- 15 files changed, 56 insertions(+), 171 deletions(-) diff --git a/bin/resources/shaders/common/fxaa.fx b/bin/resources/shaders/common/fxaa.fx index daed90fdf3..aa810d6954 100644 --- a/bin/resources/shaders/common/fxaa.fx +++ b/bin/resources/shaders/common/fxaa.fx @@ -13,14 +13,6 @@ * If not, see . */ -#if defined(SHADER_MODEL) || defined(FXAA_GLSL_130) || defined(FXAA_GLSL_VK) || defined(__METAL_VERSION__) - -#ifndef SHADER_MODEL - #define SHADER_MODEL 0 -#endif -#ifndef FXAA_HLSL_4 - #define FXAA_HLSL_4 0 -#endif #ifndef FXAA_HLSL_5 #define FXAA_HLSL_5 0 #endif @@ -51,7 +43,7 @@ layout(location = 0) in vec2 PSin_t; layout(location = 0) out vec4 SV_Target0; layout(set = 0, binding = 0) uniform sampler2D TextureSampler; -#elif (SHADER_MODEL >= 0x400) +#elif (FXAA_HLSL_5 == 1) Texture2D Texture : register(t0); SamplerState TextureSampler : register(s0); @@ -82,21 +74,7 @@ static constexpr sampler MAIN_SAMPLER(coord::normalized, address::clamp_to_edge, // We don't use gather4 for alpha/luminance because it would require an additional // pass to compute the values, which would be slower than the extra shader loads. - -#if (SHADER_MODEL >= 0x500) -#undef FXAA_HLSL_5 -#define FXAA_HLSL_5 1 -#define FXAA_GATHER4_ALPHA 0 - -#elif (SHADER_MODEL >= 0x400) -#undef FXAA_HLSL_4 -#define FXAA_HLSL_4 1 -#define FXAA_GATHER4_ALPHA 0 - -#elif (FXAA_GLSL_130 == 1 || FXAA_GLSL_VK == 1) -#define FXAA_GATHER4_ALPHA 0 - -#elif defined(__METAL_VERSION__) +#if (FXAA_HLSL_5 == 1 || FXAA_GLSL_130 == 1 || FXAA_GLSL_VK == 1) || !defined(__METAL_VERSION__) #define FXAA_GATHER4_ALPHA 0 #endif @@ -109,13 +87,6 @@ struct FxaaTex { SamplerState smpl; Texture2D tex; }; #define FxaaDiscard clip(-1) #define FxaaSat(x) saturate(x) -#elif (FXAA_HLSL_4 == 1) -struct FxaaTex { SamplerState smpl; Texture2D tex; }; -#define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0) -#define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o) -#define FxaaDiscard clip(-1) -#define FxaaSat(x) saturate(x) - #elif (FXAA_GLSL_130 == 1 || FXAA_GLSL_VK == 1) #define int2 ivec2 #define float2 vec2 @@ -518,14 +489,14 @@ float4 FxaaPixelShader(float2 pos, FxaaTex tex, float2 fxaaRcpFrame, float fxaaS #if (FXAA_GLSL_130 == 1 || FXAA_GLSL_VK == 1) float4 FxaaPass(float4 FxaaColor, float2 uv0) -#elif (SHADER_MODEL >= 0x400) +#elif (FXAA_HLSL_5 == 1) float4 FxaaPass(float4 FxaaColor : COLOR0, float2 uv0 : TEXCOORD0) #elif defined(__METAL_VERSION__) float4 FxaaPass(float4 FxaaColor, float2 uv0, texture2d tex) #endif { - #if (SHADER_MODEL >= 0x400) + #if (FXAA_HLSL_5 == 1) FxaaTex tex; tex.tex = Texture; tex.smpl = TextureSampler; @@ -559,8 +530,8 @@ void main() SV_Target0 = float4(color.rgb, 1.0); } -#elif (SHADER_MODEL >= 0x400) -PS_OUTPUT ps_main(VS_OUTPUT input) +#elif (FXAA_HLSL_5 == 1) +PS_OUTPUT main(VS_OUTPUT input) { PS_OUTPUT output; @@ -576,5 +547,3 @@ PS_OUTPUT ps_main(VS_OUTPUT input) // Metal main function in in fxaa.metal #endif - -#endif diff --git a/bin/resources/shaders/dx11/convert.fx b/bin/resources/shaders/dx11/convert.fx index d99686437b..2ef42082e1 100644 --- a/bin/resources/shaders/dx11/convert.fx +++ b/bin/resources/shaders/dx11/convert.fx @@ -13,8 +13,6 @@ * If not, see . */ -#ifdef SHADER_MODEL // make safe to include in resource file to enforce dependency - struct VS_INPUT { float4 p : POSITION; @@ -413,5 +411,3 @@ float ps_stencil_image_init_1(PS_INPUT input) : SV_Target c = float(0x7FFFFFFF); return c; } - -#endif diff --git a/bin/resources/shaders/dx11/interlace.fx b/bin/resources/shaders/dx11/interlace.fx index 2423b08e44..aa6417d692 100644 --- a/bin/resources/shaders/dx11/interlace.fx +++ b/bin/resources/shaders/dx11/interlace.fx @@ -13,8 +13,6 @@ * If not, see . */ -#ifdef SHADER_MODEL // make safe to include in resource file to enforce dependency - Texture2D Texture; SamplerState Sampler; @@ -195,5 +193,3 @@ float4 ps_main4(PS_INPUT input) : SV_Target0 return float4(0.0f, 0.0f, 0.0f, 0.0f); } - -#endif diff --git a/bin/resources/shaders/dx11/merge.fx b/bin/resources/shaders/dx11/merge.fx index 266fbd6baf..3d2f26d354 100644 --- a/bin/resources/shaders/dx11/merge.fx +++ b/bin/resources/shaders/dx11/merge.fx @@ -13,8 +13,6 @@ * If not, see . */ -#ifdef SHADER_MODEL // make safe to include in resource file to enforce dependency - Texture2D Texture; SamplerState Sampler; @@ -45,4 +43,3 @@ float4 ps_main1(PS_INPUT input) : SV_Target0 c.a = BGColor.a; return c; } -#endif diff --git a/bin/resources/shaders/dx11/present.fx b/bin/resources/shaders/dx11/present.fx index d52cde01f7..1be50bec6e 100644 --- a/bin/resources/shaders/dx11/present.fx +++ b/bin/resources/shaders/dx11/present.fx @@ -13,12 +13,6 @@ * If not, see . */ -#ifdef SHADER_MODEL // make safe to include in resource file to enforce dependency - -#ifndef PS_SCALE_FACTOR -#define PS_SCALE_FACTOR 1 -#endif - struct VS_INPUT { float4 p : POSITION; @@ -451,5 +445,3 @@ PS_OUTPUT ps_automagical_supersampling(PS_INPUT input) output.c = float4(col / div, 1); return output; } - -#endif diff --git a/bin/resources/shaders/dx11/shadeboost.fx b/bin/resources/shaders/dx11/shadeboost.fx index ad089ba6f2..ecee79e6d5 100644 --- a/bin/resources/shaders/dx11/shadeboost.fx +++ b/bin/resources/shaders/dx11/shadeboost.fx @@ -13,8 +13,6 @@ * If not, see . */ -#ifdef SHADER_MODEL // make safe to include in resource file to enforce dependency - Texture2D Texture; SamplerState Sampler; @@ -64,5 +62,3 @@ float4 ps_main(PS_INPUT input) : SV_Target0 float4 c = Texture.Sample(Sampler, input.t); return ContrastSaturationBrightness(c); } - -#endif diff --git a/pcsx2/GS/Renderers/DX11/D3D.cpp b/pcsx2/GS/Renderers/DX11/D3D.cpp index 6e9272d020..e0673c90fa 100644 --- a/pcsx2/GS/Renderers/DX11/D3D.cpp +++ b/pcsx2/GS/Renderers/DX11/D3D.cpp @@ -421,20 +421,6 @@ wil::com_ptr_nothrow D3D::CompileShader(D3D::ShaderType type, D3D_FEAT const char* target; switch (feature_level) { - case D3D_FEATURE_LEVEL_10_0: - { - static constexpr std::array targets = {{"vs_4_0", "ps_4_0", "cs_4_0"}}; - target = targets[static_cast(type)]; - } - break; - - case D3D_FEATURE_LEVEL_10_1: - { - static constexpr std::array targets = {{"vs_4_1", "ps_4_1", "cs_4_1"}}; - target = targets[static_cast(type)]; - } - break; - case D3D_FEATURE_LEVEL_11_0: { static constexpr std::array targets = {{"vs_5_0", "ps_5_0", "cs_5_0"}}; @@ -477,6 +463,12 @@ wil::com_ptr_nothrow D3D::CompileShader(D3D::ShaderType type, D3D_FEAT ofs << code; ofs << "\n\nCompile as " << target << " failed: " << hr << "\n"; ofs.write(error_string.c_str(), error_string.size()); + ofs << "\n"; + if (macros) + { + for (const D3D_SHADER_MACRO* macro = macros; macro->Name != nullptr; macro++) + ofs << "#define " << macro->Name << " " << macro->Definition << "\n"; + } ofs.close(); } diff --git a/pcsx2/GS/Renderers/DX11/D3D11ShaderCache.cpp b/pcsx2/GS/Renderers/DX11/D3D11ShaderCache.cpp index 9c6aba8bd3..9944eb401e 100644 --- a/pcsx2/GS/Renderers/DX11/D3D11ShaderCache.cpp +++ b/pcsx2/GS/Renderers/DX11/D3D11ShaderCache.cpp @@ -217,12 +217,6 @@ std::string D3D11ShaderCache::GetCacheBaseFileName(D3D_FEATURE_LEVEL feature_lev switch (feature_level) { - case D3D_FEATURE_LEVEL_10_0: - base_filename += "sm40"; - break; - case D3D_FEATURE_LEVEL_10_1: - base_filename += "sm41"; - break; case D3D_FEATURE_LEVEL_11_0: base_filename += "sm50"; break; diff --git a/pcsx2/GS/Renderers/DX11/GSDevice11.cpp b/pcsx2/GS/Renderers/DX11/GSDevice11.cpp index 7b0c179e20..63ce00fdf4 100644 --- a/pcsx2/GS/Renderers/DX11/GSDevice11.cpp +++ b/pcsx2/GS/Renderers/DX11/GSDevice11.cpp @@ -67,6 +67,7 @@ GSDevice11::GSDevice11() m_features.dual_source_blend = true; m_features.stencil_buffer = true; m_features.clip_control = true; + m_features.cas_sharpening = true; m_features.test_and_sample_depth = false; } @@ -92,8 +93,8 @@ bool GSDevice11::Create() wil::com_ptr_nothrow dxgi_adapter = D3D::GetAdapterByName(m_dxgi_factory.get(), GSConfig.Adapter); - static constexpr std::array requested_feature_levels = { - {D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0}}; + static constexpr std::array requested_feature_levels = { + {D3D_FEATURE_LEVEL_11_0}}; wil::com_ptr_nothrow temp_dev; wil::com_ptr_nothrow temp_ctx; @@ -103,15 +104,12 @@ bool GSDevice11::Create() nullptr, create_flags, requested_feature_levels.data(), static_cast(requested_feature_levels.size()), D3D11_SDK_VERSION, temp_dev.put(), nullptr, temp_ctx.put()); - if (FAILED(hr)) + if (FAILED(hr) || !temp_dev.try_query_to(&m_dev) || !temp_ctx.try_query_to(&m_ctx)) { - Console.Error("Failed to create D3D device: 0x%08X", hr); - return false; - } - - if (!temp_dev.try_query_to(&m_dev) || !temp_ctx.try_query_to(&m_ctx)) - { - Console.Error("Direct3D 11.1 is required and not supported."); + Host::ReportErrorAsync("GS", + fmt::format( + "Failed to create D3D device: 0x{:08X}. A GPU which supports Direct3D Feature Level 11.0 is required.", + hr)); return false; } @@ -166,17 +164,10 @@ bool GSDevice11::Create() if (GSConfig.UseDebugDevice) m_annotation = m_ctx.try_query(); level = m_dev->GetFeatureLevel(); - const bool support_feature_level_11_0 = (level >= D3D_FEATURE_LEVEL_11_0); if (!m_shader_cache.Open(m_dev->GetFeatureLevel(), GSConfig.UseDebugDevice)) Console.Warning("Shader cache failed to open."); - // Set maximum texture size limit based on supported feature level. - if (support_feature_level_11_0) - m_d3d_texsize = D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION; - else - m_d3d_texsize = D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION; - { // HACK: check AMD // Broken point sampler should be enabled only on AMD. @@ -205,20 +196,18 @@ bool GSDevice11::Create() {"COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 28, D3D11_INPUT_PER_VERTEX_DATA, 0}, }; - ShaderMacro sm_model(m_shader_cache.GetFeatureLevel()); - std::optional convert_hlsl = Host::ReadResourceFileToString("shaders/dx11/convert.fx"); if (!convert_hlsl.has_value()) return false; if (!m_shader_cache.GetVertexShaderAndInputLayout(m_dev.get(), m_convert.vs.put(), m_convert.il.put(), - il_convert, std::size(il_convert), *convert_hlsl, sm_model.GetPtr(), "vs_main")) + il_convert, std::size(il_convert), *convert_hlsl, nullptr, "vs_main")) { return false; } for (size_t i = 0; i < std::size(m_convert.ps); i++) { - m_convert.ps[i] = m_shader_cache.GetPixelShader(m_dev.get(), *convert_hlsl, sm_model.GetPtr(), shaderName(static_cast(i))); + m_convert.ps[i] = m_shader_cache.GetPixelShader(m_dev.get(), *convert_hlsl, nullptr, shaderName(static_cast(i))); if (!m_convert.ps[i]) return false; } @@ -227,14 +216,14 @@ bool GSDevice11::Create() if (!shader.has_value()) return false; if (!m_shader_cache.GetVertexShaderAndInputLayout(m_dev.get(), m_present.vs.put(), m_present.il.put(), - il_convert, std::size(il_convert), *shader, sm_model.GetPtr(), "vs_main")) + il_convert, std::size(il_convert), *shader, nullptr, "vs_main")) { return false; } for (size_t i = 0; i < std::size(m_present.ps); i++) { - m_present.ps[i] = m_shader_cache.GetPixelShader(m_dev.get(), *shader, sm_model.GetPtr(), shaderName(static_cast(i))); + m_present.ps[i] = m_shader_cache.GetPixelShader(m_dev.get(), *shader, nullptr, shaderName(static_cast(i))); if (!m_present.ps[i]) return false; } @@ -282,7 +271,7 @@ bool GSDevice11::Create() for (size_t i = 0; i < std::size(m_merge.ps); i++) { const std::string entry_point(StringUtil::StdStringFromFormat("ps_main%d", i)); - m_merge.ps[i] = m_shader_cache.GetPixelShader(m_dev.get(), *shader, sm_model.GetPtr(), entry_point.c_str()); + m_merge.ps[i] = m_shader_cache.GetPixelShader(m_dev.get(), *shader, nullptr, entry_point.c_str()); if (!m_merge.ps[i]) return false; } @@ -316,7 +305,7 @@ bool GSDevice11::Create() for (size_t i = 0; i < std::size(m_interlace.ps); i++) { const std::string entry_point(StringUtil::StdStringFromFormat("ps_main%d", i)); - m_interlace.ps[i] = m_shader_cache.GetPixelShader(m_dev.get(), *shader, sm_model.GetPtr(), entry_point.c_str()); + m_interlace.ps[i] = m_shader_cache.GetPixelShader(m_dev.get(), *shader, nullptr, entry_point.c_str()); if (!m_interlace.ps[i]) return false; } @@ -333,7 +322,7 @@ bool GSDevice11::Create() shader = Host::ReadResourceFileToString("shaders/dx11/shadeboost.fx"); if (!shader.has_value()) return false; - m_shadeboost.ps = m_shader_cache.GetPixelShader(m_dev.get(), *shader, sm_model.GetPtr(), "ps_main"); + m_shadeboost.ps = m_shader_cache.GetPixelShader(m_dev.get(), *shader, nullptr, "ps_main"); if (!m_shadeboost.ps) return false; @@ -466,12 +455,13 @@ bool GSDevice11::Create() for (size_t i = 0; i < std::size(m_date.primid_init_ps); i++) { const std::string entry_point(StringUtil::StdStringFromFormat("ps_stencil_image_init_%d", i)); - m_date.primid_init_ps[i] = m_shader_cache.GetPixelShader(m_dev.get(), *convert_hlsl, sm_model.GetPtr(), entry_point.c_str()); + m_date.primid_init_ps[i] = m_shader_cache.GetPixelShader(m_dev.get(), *convert_hlsl, nullptr, entry_point.c_str()); if (!m_date.primid_init_ps[i]) return false; } - m_features.cas_sharpening = support_feature_level_11_0 && CreateCASShaders(); + if (!CreateCASShaders()) + return false; if (!CreateImGuiResources()) return false; @@ -788,8 +778,6 @@ std::string GSDevice11::GetDriverInfo() const std::string ret = "Unknown Feature Level"; static constexpr std::array, 4> feature_level_names = {{ - {D3D_FEATURE_LEVEL_10_0, "D3D_FEATURE_LEVEL_10_0"}, - {D3D_FEATURE_LEVEL_10_0, "D3D_FEATURE_LEVEL_10_1"}, {D3D_FEATURE_LEVEL_11_0, "D3D_FEATURE_LEVEL_11_0"}, {D3D_FEATURE_LEVEL_11_1, "D3D_FEATURE_LEVEL_11_1"}, }}; @@ -1121,8 +1109,8 @@ GSTexture* GSDevice11::CreateSurface(GSTexture::Type type, int width, int height D3D11_TEXTURE2D_DESC desc = {}; // Texture limit for D3D10/11 min 1, max 8192 D3D10, max 16384 D3D11. - desc.Width = std::clamp(width, 1, m_d3d_texsize); - desc.Height = std::clamp(height, 1, m_d3d_texsize); + desc.Width = std::clamp(width, 1, D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION); + desc.Height = std::clamp(height, 1, D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION); desc.Format = GSTexture11::GetDXGIFormat(format); desc.MipLevels = levels; desc.ArraySize = 1; @@ -1551,16 +1539,14 @@ void GSDevice11::DoFXAA(GSTexture* sTex, GSTexture* dTex) return; } - ShaderMacro sm(m_shader_cache.GetFeatureLevel()); - m_fxaa_ps = m_shader_cache.GetPixelShader(m_dev.get(), *shader, sm.GetPtr(), "ps_main"); + ShaderMacro sm; + sm.AddMacro("FXAA_HLSL_5", "1"); + m_fxaa_ps = m_shader_cache.GetPixelShader(m_dev.get(), *shader, sm.GetPtr(), "main"); if (!m_fxaa_ps) return; } StretchRect(sTex, sRect, dTex, dRect, m_fxaa_ps.get(), nullptr, true); - - //sTex->Save("c:\\temp1\\1.bmp"); - //dTex->Save("c:\\temp1\\2.bmp"); } void GSDevice11::DoShadeBoost(GSTexture* sTex, GSTexture* dTex, const float params[4]) @@ -1593,9 +1579,11 @@ bool GSDevice11::CreateCASShaders() m_cas.cs_sharpen = m_shader_cache.GetComputeShader(m_dev.get(), cas_source.value(), sharpen_only_macros, "main"); m_cas.cs_upscale = m_shader_cache.GetComputeShader(m_dev.get(), cas_source.value(), nullptr, "main"); if (!m_cas.cs_sharpen || !m_cas.cs_upscale) + { + Console.Error("Failed to create CAS compute shaders."); return false; + } - m_features.cas_sharpening = true; return true; } @@ -2113,23 +2101,6 @@ void GSDevice11::SetScissor(const GSVector4i& scissor) } } -GSDevice11::ShaderMacro::ShaderMacro(D3D_FEATURE_LEVEL fl) -{ - switch (fl) - { - case D3D_FEATURE_LEVEL_10_0: - mlist.emplace_back("SHADER_MODEL", "0x400"); - break; - case D3D_FEATURE_LEVEL_10_1: - mlist.emplace_back("SHADER_MODEL", "0x401"); - break; - case D3D_FEATURE_LEVEL_11_0: - default: - mlist.emplace_back("SHADER_MODEL", "0x500"); - break; - } -} - void GSDevice11::ShaderMacro::AddMacro(const char* n, int d) { AddMacro(n, std::to_string(d)); @@ -2140,7 +2111,7 @@ void GSDevice11::ShaderMacro::AddMacro(const char* n, std::string d) mlist.emplace_back(n, std::move(d)); } -D3D_SHADER_MACRO* GSDevice11::ShaderMacro::GetPtr(void) +D3D_SHADER_MACRO* GSDevice11::ShaderMacro::GetPtr() { mout.clear(); diff --git a/pcsx2/GS/Renderers/DX11/GSDevice11.h b/pcsx2/GS/Renderers/DX11/GSDevice11.h index 08a655913f..f1f6741935 100644 --- a/pcsx2/GS/Renderers/DX11/GSDevice11.h +++ b/pcsx2/GS/Renderers/DX11/GSDevice11.h @@ -102,10 +102,9 @@ public: std::vector mout; public: - ShaderMacro(D3D_FEATURE_LEVEL fl); void AddMacro(const char* n, int d); void AddMacro(const char* n, std::string d); - D3D_SHADER_MACRO* GetPtr(void); + D3D_SHADER_MACRO* GetPtr(); }; private: @@ -156,7 +155,6 @@ private: u32 m_vb_pos = 0; // bytes u32 m_ib_pos = 0; // indices/sizeof(u32) u32 m_structured_vb_pos = 0; // bytes - int m_d3d_texsize = 0; bool m_allow_tearing_supported = false; bool m_using_flip_model_swap_chain = true; diff --git a/pcsx2/GS/Renderers/DX11/GSTextureFX11.cpp b/pcsx2/GS/Renderers/DX11/GSTextureFX11.cpp index 4677fb316c..0613c97c44 100644 --- a/pcsx2/GS/Renderers/DX11/GSTextureFX11.cpp +++ b/pcsx2/GS/Renderers/DX11/GSTextureFX11.cpp @@ -64,7 +64,7 @@ void GSDevice11::SetupVS(VSSelector sel, const GSHWDrawConfig::VSConstantBuffer* if (i == m_vs.end()) { - ShaderMacro sm(m_shader_cache.GetFeatureLevel()); + ShaderMacro sm; sm.AddMacro("VERTEX_SHADER", 1); sm.AddMacro("VS_TME", sel.tme); @@ -113,7 +113,7 @@ void GSDevice11::SetupPS(const PSSelector& sel, const GSHWDrawConfig::PSConstant if (i == m_ps.end()) { - ShaderMacro sm(m_shader_cache.GetFeatureLevel()); + ShaderMacro sm; sm.AddMacro("PIXEL_SHADER", 1); sm.AddMacro("PS_FST", sel.fst); diff --git a/pcsx2/GS/Renderers/DX12/D3D12ShaderCache.cpp b/pcsx2/GS/Renderers/DX12/D3D12ShaderCache.cpp index 8846678aae..59c479cbd7 100644 --- a/pcsx2/GS/Renderers/DX12/D3D12ShaderCache.cpp +++ b/pcsx2/GS/Renderers/DX12/D3D12ShaderCache.cpp @@ -275,12 +275,6 @@ std::string D3D12ShaderCache::GetCacheBaseFileName(const std::string_view& type, switch (feature_level) { - case D3D_FEATURE_LEVEL_10_0: - base_filename += "sm40"; - break; - case D3D_FEATURE_LEVEL_10_1: - base_filename += "sm41"; - break; case D3D_FEATURE_LEVEL_11_0: base_filename += "sm50"; break; diff --git a/pcsx2/GS/Renderers/DX12/GSDevice12.cpp b/pcsx2/GS/Renderers/DX12/GSDevice12.cpp index 60bcc8edd4..6e724abb94 100644 --- a/pcsx2/GS/Renderers/DX12/GSDevice12.cpp +++ b/pcsx2/GS/Renderers/DX12/GSDevice12.cpp @@ -66,21 +66,8 @@ static D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE GetLoadOpForTexture(GSTexture12* // clang-format on } -GSDevice12::ShaderMacro::ShaderMacro(D3D_FEATURE_LEVEL fl) +GSDevice12::ShaderMacro::ShaderMacro() { - switch (fl) - { - case D3D_FEATURE_LEVEL_10_0: - mlist.emplace_back("SHADER_MODEL", "0x400"); - break; - case D3D_FEATURE_LEVEL_10_1: - mlist.emplace_back("SHADER_MODEL", "0x401"); - break; - case D3D_FEATURE_LEVEL_11_0: - default: - mlist.emplace_back("SHADER_MODEL", "0x500"); - break; - } mlist.emplace_back("DX12", "1"); } @@ -999,8 +986,6 @@ std::string GSDevice12::GetDriverInfo() const std::string ret = "Unknown Feature Level"; static constexpr std::array, 4> feature_level_names = {{ - {D3D_FEATURE_LEVEL_10_0, "D3D_FEATURE_LEVEL_10_0"}, - {D3D_FEATURE_LEVEL_10_0, "D3D_FEATURE_LEVEL_10_1"}, {D3D_FEATURE_LEVEL_11_0, "D3D_FEATURE_LEVEL_11_0"}, {D3D_FEATURE_LEVEL_11_1, "D3D_FEATURE_LEVEL_11_1"}, }}; @@ -1151,6 +1136,7 @@ bool GSDevice12::CheckFeatures() m_features.dual_source_blend = true; m_features.clip_control = true; m_features.stencil_buffer = true; + m_features.cas_sharpening = true; m_features.test_and_sample_depth = false; m_features.vs_expand = !GSConfig.DisableVertexShaderExpand; @@ -1833,9 +1819,11 @@ bool GSDevice12::CompileCASPipelines() cpb.SetShader(cs_sharpen->GetBufferPointer(), cs_sharpen->GetBufferSize()); m_cas_sharpen_pipeline = cpb.Create(m_device.get(), m_shader_cache, false); if (!m_cas_upscale_pipeline || !m_cas_sharpen_pipeline) + { + Console.Error("Failed to create CAS pipelines"); return false; + } - m_features.cas_sharpening = true; return true; } @@ -2212,13 +2200,13 @@ static void AddUtilityVertexAttributes(D3D12::GraphicsPipelineBuilder& gpb) GSDevice12::ComPtr GSDevice12::GetUtilityVertexShader(const std::string& source, const char* entry_point) { - ShaderMacro sm_model(m_shader_cache.GetFeatureLevel()); + ShaderMacro sm_model; return m_shader_cache.GetVertexShader(source, sm_model.GetPtr(), entry_point); } GSDevice12::ComPtr GSDevice12::GetUtilityPixelShader(const std::string& source, const char* entry_point) { - ShaderMacro sm_model(m_shader_cache.GetFeatureLevel()); + ShaderMacro sm_model; return m_shader_cache.GetPixelShader(source, sm_model.GetPtr(), entry_point); } @@ -2595,7 +2583,9 @@ bool GSDevice12::CompilePostProcessingPipelines() return false; } - ComPtr ps(GetUtilityPixelShader(*shader, "ps_main")); + ShaderMacro sm; + sm.AddMacro("FXAA_HLSL_5", "1"); + ComPtr ps = m_shader_cache.GetPixelShader(*shader, sm.GetPtr()); if (!ps) return false; @@ -2710,7 +2700,7 @@ const ID3DBlob* GSDevice12::GetTFXVertexShader(GSHWDrawConfig::VSSelector sel) if (it != m_tfx_vertex_shaders.end()) return it->second.get(); - ShaderMacro sm(m_shader_cache.GetFeatureLevel()); + ShaderMacro sm; sm.AddMacro("VERTEX_SHADER", 1); sm.AddMacro("VS_TME", sel.tme); sm.AddMacro("VS_FST", sel.fst); @@ -2729,7 +2719,7 @@ const ID3DBlob* GSDevice12::GetTFXPixelShader(const GSHWDrawConfig::PSSelector& if (it != m_tfx_pixel_shaders.end()) return it->second.get(); - ShaderMacro sm(m_shader_cache.GetFeatureLevel()); + ShaderMacro sm; sm.AddMacro("PIXEL_SHADER", 1); sm.AddMacro("PS_FST", sel.fst); sm.AddMacro("PS_WMS", sel.wms); diff --git a/pcsx2/GS/Renderers/DX12/GSDevice12.h b/pcsx2/GS/Renderers/DX12/GSDevice12.h index d583c68aa5..258770f5bf 100644 --- a/pcsx2/GS/Renderers/DX12/GSDevice12.h +++ b/pcsx2/GS/Renderers/DX12/GSDevice12.h @@ -257,7 +257,7 @@ public: std::vector mout; public: - ShaderMacro(D3D_FEATURE_LEVEL fl); + ShaderMacro(); void AddMacro(const char* n, int d); void AddMacro(const char* n, std::string d); D3D_SHADER_MACRO* GetPtr(void); diff --git a/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp b/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp index 32c7d7280a..d8463c2dd7 100644 --- a/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp +++ b/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp @@ -1809,7 +1809,7 @@ bool GSDeviceOGL::CompileFXAAProgram() return false; } - const std::string ps(GetShaderSource("ps_main", GL_FRAGMENT_SHADER, shader->c_str(), fxaa_macro)); + const std::string ps(GetShaderSource("main", GL_FRAGMENT_SHADER, shader->c_str(), fxaa_macro)); std::optional prog = m_shader_cache.GetProgram(m_convert.vs, ps); if (!prog.has_value()) {