Fix shader issues with D3D11 feature level 9

This commit is contained in:
Henrik Rydgard 2017-03-05 22:56:33 +01:00
parent bb3e211088
commit 5d5844632a
9 changed files with 24 additions and 26 deletions

View file

@ -25,6 +25,7 @@ enum ShaderLanguage {
GLSL_VULKAN,
HLSL_DX9,
HLSL_D3D11,
HLSL_D3D11_LEVEL9,
};
enum DebugShaderType {

View file

@ -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);
}

View file

@ -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);

View file

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

View file

@ -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);
}

View file

@ -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);

View file

@ -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");

View file

@ -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<float3> u_tess_pos_tex : register(t0);\n");
WRITE(p, "Texture1D<float3> u_tess_tex_tex : register(t1);\n");
WRITE(p, "Texture1D<float4> 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");

View file

@ -79,7 +79,6 @@ HRESULT D3D11Context::CreateTheDevice() {
if (SUCCEEDED(hr))
break;
}
return hr;
}