From 5d5844632a5812bcc3df05216f235498000e009d Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sun, 5 Mar 2017 22:56:33 +0100 Subject: [PATCH] Fix shader issues with D3D11 feature level 9 --- GPU/Common/ShaderCommon.h | 1 + GPU/D3D11/FragmentShaderGeneratorD3D11.cpp | 4 ++-- GPU/D3D11/FragmentShaderGeneratorD3D11.h | 2 +- GPU/D3D11/ShaderManagerD3D11.cpp | 4 ++-- GPU/D3D11/VertexShaderGeneratorD3D11.cpp | 4 ++-- GPU/D3D11/VertexShaderGeneratorD3D11.h | 2 +- GPU/Directx9/PixelShaderGeneratorDX9.cpp | 22 ++++++++++------------ GPU/Directx9/VertexShaderGeneratorDX9.cpp | 10 +++++----- Windows/GPU/D3D11Context.cpp | 1 - 9 files changed, 24 insertions(+), 26 deletions(-) diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index 5cf3c05c14..460316557f 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -25,6 +25,7 @@ enum ShaderLanguage { GLSL_VULKAN, HLSL_DX9, HLSL_D3D11, + HLSL_D3D11_LEVEL9, }; enum DebugShaderType { diff --git a/GPU/D3D11/FragmentShaderGeneratorD3D11.cpp b/GPU/D3D11/FragmentShaderGeneratorD3D11.cpp index 49340df4b1..123eaf19a5 100644 --- a/GPU/D3D11/FragmentShaderGeneratorD3D11.cpp +++ b/GPU/D3D11/FragmentShaderGeneratorD3D11.cpp @@ -19,6 +19,6 @@ #include "GPU/D3D11/FragmentShaderGeneratorD3D11.h" #include "GPU/Directx9/PixelShaderGeneratorDX9.h" -void GenerateFragmentShaderD3D11(const ShaderID &id, char *buffer) { - DX9::GenerateFragmentShaderHLSL(id, buffer, HLSL_D3D11); +void GenerateFragmentShaderD3D11(const ShaderID &id, char *buffer, ShaderLanguage lang) { + DX9::GenerateFragmentShaderHLSL(id, buffer, lang); } diff --git a/GPU/D3D11/FragmentShaderGeneratorD3D11.h b/GPU/D3D11/FragmentShaderGeneratorD3D11.h index c7d49c0c9d..ac714bf534 100644 --- a/GPU/D3D11/FragmentShaderGeneratorD3D11.h +++ b/GPU/D3D11/FragmentShaderGeneratorD3D11.h @@ -19,4 +19,4 @@ #include "GPU/Common/ShaderId.h" -void GenerateFragmentShaderD3D11(const ShaderID &id, char *buffer); +void GenerateFragmentShaderD3D11(const ShaderID &id, char *buffer, ShaderLanguage lang); diff --git a/GPU/D3D11/ShaderManagerD3D11.cpp b/GPU/D3D11/ShaderManagerD3D11.cpp index 0de84218e1..449daa05bb 100644 --- a/GPU/D3D11/ShaderManagerD3D11.cpp +++ b/GPU/D3D11/ShaderManagerD3D11.cpp @@ -200,7 +200,7 @@ void ShaderManagerD3D11::GetShaders(int prim, u32 vertType, D3D11VertexShader ** if (vsIter == vsCache_.end()) { // Vertex shader not in cache. Let's compile it. bool usesLighting; - GenerateVertexShaderD3D11(VSID, codeBuffer_, &usesLighting); + GenerateVertexShaderD3D11(VSID, codeBuffer_, &usesLighting, featureLevel_ <= D3D_FEATURE_LEVEL_9_3 ? HLSL_D3D11_LEVEL9 : HLSL_D3D11); vs = new D3D11VertexShader(device_, featureLevel_, VSID, codeBuffer_, vertType, useHWTransform, usesLighting); vsCache_[VSID] = vs; } else { @@ -212,7 +212,7 @@ void ShaderManagerD3D11::GetShaders(int prim, u32 vertType, D3D11VertexShader ** D3D11FragmentShader *fs; if (fsIter == fsCache_.end()) { // Fragment shader not in cache. Let's compile it. - GenerateFragmentShaderD3D11(FSID, codeBuffer_); + GenerateFragmentShaderD3D11(FSID, codeBuffer_, featureLevel_ <= D3D_FEATURE_LEVEL_9_3 ? HLSL_D3D11_LEVEL9 : HLSL_D3D11); fs = new D3D11FragmentShader(device_, featureLevel_, FSID, codeBuffer_, useHWTransform); fsCache_[FSID] = fs; } else { diff --git a/GPU/D3D11/VertexShaderGeneratorD3D11.cpp b/GPU/D3D11/VertexShaderGeneratorD3D11.cpp index d069225b3b..c5749310ff 100644 --- a/GPU/D3D11/VertexShaderGeneratorD3D11.cpp +++ b/GPU/D3D11/VertexShaderGeneratorD3D11.cpp @@ -19,7 +19,7 @@ #include "GPU/D3D11/VertexShaderGeneratorD3D11.h" #include "GPU/Directx9/VertexShaderGeneratorDX9.h" -void GenerateVertexShaderD3D11(const ShaderID &id, char *buffer, bool *usesLighting) { +void GenerateVertexShaderD3D11(const ShaderID &id, char *buffer, bool *usesLighting, ShaderLanguage lang) { *usesLighting = true; - DX9::GenerateVertexShaderHLSL(id, buffer, HLSL_D3D11); + DX9::GenerateVertexShaderHLSL(id, buffer, lang); } diff --git a/GPU/D3D11/VertexShaderGeneratorD3D11.h b/GPU/D3D11/VertexShaderGeneratorD3D11.h index d8936e9722..c9913f86d7 100644 --- a/GPU/D3D11/VertexShaderGeneratorD3D11.h +++ b/GPU/D3D11/VertexShaderGeneratorD3D11.h @@ -19,4 +19,4 @@ #include "GPU/Common/ShaderId.h" -void GenerateVertexShaderD3D11(const ShaderID &id, char *buffer, bool *usesLighting); +void GenerateVertexShaderD3D11(const ShaderID &id, char *buffer, bool *usesLighting, ShaderLanguage lang); diff --git a/GPU/Directx9/PixelShaderGeneratorDX9.cpp b/GPU/Directx9/PixelShaderGeneratorDX9.cpp index c5a1b81952..a38a40999a 100644 --- a/GPU/Directx9/PixelShaderGeneratorDX9.cpp +++ b/GPU/Directx9/PixelShaderGeneratorDX9.cpp @@ -117,8 +117,9 @@ bool GenerateFragmentShaderHLSL(const ShaderID &id, char *buffer, ShaderLanguage if (enableAlphaTest) { if (lang == HLSL_D3D11) { - WRITE(p, "uint roundAndScaleTo255i(float x) { return uint(floor(x * 255.0f + 0.5f)); }\n"); + WRITE(p, "int roundAndScaleTo255i(float x) { return uint(floor(x * 255.0f + 0.5f)); }\n"); } else { + // D3D11 level 9 gets to take this path. WRITE(p, "float roundAndScaleTo255f(float x) { return floor(x * 255.0f + 0.5f); }\n"); } } @@ -141,7 +142,7 @@ bool GenerateFragmentShaderHLSL(const ShaderID &id, char *buffer, ShaderLanguage if (enableFog) { WRITE(p, " float v_fogdepth: TEXCOORD1;\n"); } - if (lang == HLSL_D3D11 && ((replaceBlend == REPLACE_BLEND_COPY_FBO) || gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT))) { + if ((lang == HLSL_D3D11 || lang == HLSL_D3D11_LEVEL9) && ((replaceBlend == REPLACE_BLEND_COPY_FBO) || gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT))) { WRITE(p, " float4 pixelPos : SV_POSITION;\n"); } WRITE(p, "};\n"); @@ -213,7 +214,7 @@ bool GenerateFragmentShaderHLSL(const ShaderID &id, char *buffer, ShaderLanguage doTextureProjection = false; } - if (lang == HLSL_D3D11) { + if (lang == HLSL_D3D11 || lang == HLSL_D3D11_LEVEL9) { if (doTextureProjection) { WRITE(p, " float4 t = tex.Sample(samp, In.v_texcoord.xy / In.v_texcoord.z)%s;\n", bgraTexture ? ".bgra" : ""); } else { @@ -296,10 +297,7 @@ bool GenerateFragmentShaderHLSL(const ShaderID &id, char *buffer, ShaderLanguage } } else { // This means NEVER. See above. - if (lang == HLSL_D3D11) - WRITE(p, " discard;\n"); - else - WRITE(p, " clip(-1);\n"); + WRITE(p, lang == HLSL_DX9 ? " clip(-1);\n" : " discard;\n"); } } } @@ -315,7 +313,7 @@ bool GenerateFragmentShaderHLSL(const ShaderID &id, char *buffer, ShaderLanguage } else { // NEVER has been logged as used by games, although it makes little sense - statically failing. // Maybe we could discard the drawcall, but it's pretty rare. Let's just statically discard here. - WRITE(p, " clip(-1);\n"); + WRITE(p, lang == HLSL_DX9 ? " clip(-1);\n" : " discard;\n"); } } else { const char *colorTestFuncs[] = { "#", "#", " != ", " == " }; // never/always don't make sense @@ -330,7 +328,7 @@ bool GenerateFragmentShaderHLSL(const ShaderID &id, char *buffer, ShaderLanguage } } else { - WRITE(p, " clip(-1);\n"); + WRITE(p, lang == HLSL_DX9 ? " clip(-1);\n" : " discard;\n"); } } } @@ -369,7 +367,7 @@ bool GenerateFragmentShaderHLSL(const ShaderID &id, char *buffer, ShaderLanguage WRITE(p, " v.rgb = v.rgb * %s;\n", srcFactor); } - if (lang == HLSL_D3D11 && replaceBlend == REPLACE_BLEND_COPY_FBO) { + if ((lang == HLSL_D3D11 || lang == HLSL_D3D11_LEVEL9) && replaceBlend == REPLACE_BLEND_COPY_FBO) { WRITE(p, " float4 destColor = fboTex.Load(int3((int)In.pixelPos.x, (int)In.pixelPos.y, 0));\n"); const char *srcFactor = "float3(1.0)"; @@ -439,7 +437,7 @@ bool GenerateFragmentShaderHLSL(const ShaderID &id, char *buffer, ShaderLanguage if (stencilToAlpha != REPLACE_ALPHA_NO) { switch (replaceAlphaWithStencilType) { case STENCIL_VALUE_UNIFORM: - replacedAlpha = lang == HLSL_D3D11 ? "u_fogcoef_stencilreplace.z" : "u_stencilReplaceValue"; + replacedAlpha = (lang == HLSL_D3D11 || lang == HLSL_D3D11_LEVEL9) ? "u_fogcoef_stencilreplace.z" : "u_stencilReplaceValue"; break; case STENCIL_VALUE_ZERO: @@ -512,7 +510,7 @@ bool GenerateFragmentShaderHLSL(const ShaderID &id, char *buffer, ShaderLanguage WRITE(p, " outfragment.depth = z;\n"); } - if (lang == HLSL_D3D11) { + if (lang == HLSL_D3D11 || lang == HLSL_D3D11_LEVEL9) { if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) { WRITE(p, " outfragment.target = float4(v.rgb, %s);\n", replacedAlpha.c_str()); WRITE(p, " outfragment.target1 = float4(0.0, 0.0, 0.0, v.a);\n"); diff --git a/GPU/Directx9/VertexShaderGeneratorDX9.cpp b/GPU/Directx9/VertexShaderGeneratorDX9.cpp index 03bcef0562..01fd322a5e 100644 --- a/GPU/Directx9/VertexShaderGeneratorDX9.cpp +++ b/GPU/Directx9/VertexShaderGeneratorDX9.cpp @@ -264,7 +264,7 @@ void GenerateVertexShaderHLSL(const ShaderID &id, char *buffer, ShaderLanguage l // Hardware tessellation if (doSpline || doBezier) { - if (lang == HLSL_D3D11) { + if (lang == HLSL_D3D11 || lang == HLSL_D3D11_LEVEL9) { WRITE(p, "Texture1D u_tess_pos_tex : register(t0);\n"); WRITE(p, "Texture1D u_tess_tex_tex : register(t1);\n"); WRITE(p, "Texture1D u_tess_col_tex : register(t2);\n"); @@ -367,7 +367,7 @@ void GenerateVertexShaderHLSL(const ShaderID &id, char *buffer, ShaderLanguage l if (enableFog) { WRITE(p, " Out.v_fogdepth = In.position.w;\n"); } - if (lang == HLSL_D3D11) { + if (lang == HLSL_D3D11 || lang == HLSL_D3D11_LEVEL9) { if (gstate.isModeThrough()) { WRITE(p, " Out.gl_Position = mul(u_proj_through, float4(In.position.xyz, 1.0));\n"); } else { @@ -528,7 +528,7 @@ void GenerateVertexShaderHLSL(const ShaderID &id, char *buffer, ShaderLanguage l } #else - if (lang == HLSL_D3D11) { + if (lang == HLSL_D3D11 || lang == HLSL_D3D11_LEVEL9) { if (numBoneWeights == 1) WRITE(p, " float4x3 skinMatrix = mul(In.a_w1, u_bone[0])"); else @@ -571,7 +571,7 @@ void GenerateVertexShaderHLSL(const ShaderID &id, char *buffer, ShaderLanguage l WRITE(p, " float4 viewPos = float4(mul(float4(worldpos, 1.0), u_view), 1.0);\n"); - if (lang == HLSL_D3D11) { + if (lang == HLSL_D3D11 || lang == HLSL_D3D11_LEVEL9) { // Final view and projection transforms. if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { WRITE(p, " Out.gl_Position = depthRoundZVP(mul(u_proj, viewPos));\n"); @@ -795,7 +795,7 @@ void GenerateVertexShaderHLSL(const ShaderID &id, char *buffer, ShaderLanguage l // Compute fogdepth if (enableFog) { - if (lang == HLSL_D3D11) { + if (lang == HLSL_D3D11 || lang == HLSL_D3D11_LEVEL9) { WRITE(p, " Out.v_fogdepth = (viewPos.z + u_fogcoef_stencilreplace.x) * u_fogcoef_stencilreplace.y;\n"); } else { WRITE(p, " Out.v_fogdepth = (viewPos.z + u_fogcoef.x) * u_fogcoef.y;\n"); diff --git a/Windows/GPU/D3D11Context.cpp b/Windows/GPU/D3D11Context.cpp index 0811e02141..e391082772 100644 --- a/Windows/GPU/D3D11Context.cpp +++ b/Windows/GPU/D3D11Context.cpp @@ -79,7 +79,6 @@ HRESULT D3D11Context::CreateTheDevice() { if (SUCCEEDED(hr)) break; } - return hr; }