From e77a9d73682c00ca30c000a78084501bb9f7c206 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 9 Nov 2020 09:07:52 +0100 Subject: [PATCH] Reorganize the end of the fragment shader generator. Thanks unknown. --- Common/GPU/Shader.cpp | 8 ++++++-- GPU/Common/FragmentShaderGenerator.cpp | 25 ++++++++++--------------- unittest/TestShaderGenerators.cpp | 7 ++----- 3 files changed, 18 insertions(+), 22 deletions(-) diff --git a/Common/GPU/Shader.cpp b/Common/GPU/Shader.cpp index 43943449cc..077ad92c21 100644 --- a/Common/GPU/Shader.cpp +++ b/Common/GPU/Shader.cpp @@ -58,8 +58,12 @@ void ShaderLanguageDesc::Init(ShaderLanguage lang) { break; case HLSL_D3D9: case HLSL_D3D11: - fragColor0 = "outfragment.target"; - fragColor1 = "outfragment.target1"; + if (lang == HLSL_D3D11) { + fragColor0 = "outfragment.target"; + fragColor1 = "outfragment.target1"; + } else { + fragColor0 = "target"; + } varying_fs = "in"; varying_vs = "out"; attribute = "in"; diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index 5e3f8623c1..1cbd02c1b9 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -427,6 +427,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu WRITE(p, " PS_OUT outfragment;\n"); } else if (compat.shaderLanguage == HLSL_D3D9) { WRITE(p, "vec4 main( PS_IN In ) : COLOR {\n"); + WRITE(p, " vec4 target;\n"); } else { WRITE(p, "void main() {\n"); } @@ -959,15 +960,16 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu switch (stencilToAlpha) { case REPLACE_ALPHA_DUALSOURCE: - // Handled at the end. + WRITE(p, " %s = vec4(v.rgb, %s);\n", compat.fragColor0, replacedAlpha); + WRITE(p, " %s = vec4(0.0, 0.0, 0.0, v.a);\n", compat.fragColor1); break; case REPLACE_ALPHA_YES: - WRITE(p, " v.a = %s;\n", replacedAlpha); + WRITE(p, " %s = vec4(v.rgb, %s);\n", compat.fragColor0, replacedAlpha); break; case REPLACE_ALPHA_NO: - // Nothing to do. + WRITE(p, " %s = v;\n", compat.fragColor0); break; default: @@ -979,10 +981,10 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu LogicOpReplaceType replaceLogicOpType = (LogicOpReplaceType)id.Bits(FS_BIT_REPLACE_LOGIC_OP_TYPE, 2); switch (replaceLogicOpType) { case LOGICOPTYPE_ONE: - WRITE(p, " v.rgb = splat3(1.0);\n"); + WRITE(p, " %s.rgb = splat3(1.0);\n", compat.fragColor0); break; case LOGICOPTYPE_INVERT: - WRITE(p, " v.rgb = splat3(1.0) - v.rgb;\n"); + WRITE(p, " %s.rgb = splat3(1.0) - %s.rgb;\n", compat.fragColor0, compat.fragColor0); break; case LOGICOPTYPE_NORMAL: break; @@ -996,11 +998,11 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu // TODO: Maybe optimize to only do math on the affected channels? // Or .. meh. if (colorWriteMask) { - WRITE(p, " highp uint v32 = packUnorm4x8(v);\n"); + WRITE(p, " highp uint v32 = packUnorm4x8(%s);\n", compat.fragColor0); WRITE(p, " highp uint d32 = packUnorm4x8(destColor);\n"); // Note that the mask has been flipped to the PC way - 1 means write. WRITE(p, " v32 = (v32 & u_colorWriteMask) | (d32 & ~u_colorWriteMask);\n"); - WRITE(p, " v = unpackUnorm4x8(v32);\n"); + WRITE(p, " %s = unpackUnorm4x8(v32);\n", compat.fragColor0); } if (gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT)) { @@ -1025,17 +1027,10 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu WRITE(p, " gl_FragDepth = gl_FragCoord.z;\n"); } - if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) { - WRITE(p, " %s = vec4(v.rgb, %s);\n", compat.fragColor0, replacedAlpha); - WRITE(p, " %s = vec4(0.0, 0.0, 0.0, v.a);\n", compat.fragColor1); - } else if (compat.shaderLanguage != HLSL_D3D9) { - WRITE(p, " %s = v;\n", compat.fragColor0); - } - if (compat.shaderLanguage == HLSL_D3D11) { WRITE(p, " return outfragment;\n"); } else if (compat.shaderLanguage == HLSL_D3D9) { - WRITE(p, " return v;\n"); + WRITE(p, " return target;\n"); } WRITE(p, "}\n"); diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index 6336b97662..88fa67f439 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -352,11 +352,11 @@ bool TestShaderGenerators() { init_glslang(); LoadD3DCompilerDynamic(); - if (!TestReinterpretShaders()) { + if (!TestFragmentShaders()) { return false; } - if (!TestFragmentShaders()) { + if (!TestReinterpretShaders()) { return false; } @@ -364,8 +364,5 @@ bool TestShaderGenerators() { return false; } - _CrtCheckMemory(); - - return true; }