From 18d00b07186826ff76ff2bff23ab3faa9c6d9139 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 19 Dec 2022 09:49:35 +0100 Subject: [PATCH] Remove lmode flag bit from fragment and geometry shaders --- GPU/Common/FragmentShaderGenerator.cpp | 44 ++++++++++---------------- GPU/Common/GeometryShaderGenerator.cpp | 6 ++-- GPU/Common/ShaderId.cpp | 7 ---- GPU/Common/ShaderId.h | 5 ++- GPU/Common/VertexShaderGenerator.cpp | 20 +++++------- GPU/GLES/ShaderManagerGLES.cpp | 1 - GPU/Vulkan/ShaderManagerVulkan.cpp | 2 -- 7 files changed, 28 insertions(+), 57 deletions(-) diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index dbc2c7166c..64568fff86 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -96,7 +96,6 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu p.ApplySamplerMetadata(arrayTexture ? samplersStereo : samplersMono); - bool lmode = id.Bit(FS_BIT_LMODE); bool doTexture = id.Bit(FS_BIT_DO_TEXTURE); bool enableAlphaTest = id.Bit(FS_BIT_ALPHA_TEST); @@ -208,8 +207,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu // Note: the precision qualifiers must match the vertex shader! WRITE(p, "layout (location = 1) %s in lowp vec4 v_color0;\n", shading); - if (lmode) - WRITE(p, "layout (location = 2) %s in lowp vec3 v_color1;\n", shading); + WRITE(p, "layout (location = 2) %s in lowp vec3 v_color1;\n", shading); WRITE(p, "layout (location = 3) in highp float v_fogdepth;\n"); if (doTexture) { WRITE(p, "layout (location = 0) in highp vec3 v_texcoord;\n"); @@ -310,9 +308,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu } const char *colorInterpolation = doFlatShading && compat.shaderLanguage == HLSL_D3D11 ? "nointerpolation " : ""; WRITE(p, " %svec4 v_color0: COLOR0;\n", colorInterpolation); - if (lmode) { - WRITE(p, " vec3 v_color1: COLOR1;\n"); - } + WRITE(p, " vec3 v_color1: COLOR1;\n"); WRITE(p, " float v_fogdepth: TEXCOORD1;\n"); if (needFragCoord) { if (compat.shaderLanguage == HLSL_D3D11) { @@ -425,8 +421,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu } WRITE(p, "%s %s lowp vec4 v_color0;\n", shading, compat.varying_fs); - if (lmode) - WRITE(p, "%s %s lowp vec3 v_color1;\n", shading, compat.varying_fs); + WRITE(p, "%s %s lowp vec3 v_color1;\n", shading, compat.varying_fs); *uniformMask |= DIRTY_FOGCOLOR; WRITE(p, "uniform vec3 u_fogcolor;\n"); WRITE(p, "%s %s float v_fogdepth;\n", compat.varying_fs, highpFog ? "highp" : "mediump"); @@ -534,8 +529,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu if (compat.shaderLanguage == HLSL_D3D11 || compat.shaderLanguage == HLSL_D3D9) { WRITE(p, " vec4 v_color0 = In.v_color0;\n"); - if (lmode) - WRITE(p, " vec3 v_color1 = In.v_color1;\n"); + WRITE(p, " vec3 v_color1 = In.v_color1;\n"); WRITE(p, " float v_fogdepth = In.v_fogdepth;\n"); if (doTexture) { WRITE(p, " vec3 v_texcoord = In.v_texcoord;\n"); @@ -571,14 +565,8 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu // Clear mode does not allow any fancy shading. WRITE(p, " vec4 v = v_color0;\n"); } else { - const char *secondary = ""; // Secondary color for specular on top of texture - if (lmode) { - WRITE(p, " vec4 s = vec4(v_color1, 0.0);\n"); - secondary = " + s"; - } else { - secondary = ""; - } + WRITE(p, " vec4 s = vec4(v_color1, 0.0);\n"); if (doTexture) { char texcoord[64] = "v_texcoord"; @@ -835,26 +823,26 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu if (doTextureAlpha) { // texfmt == RGBA switch (texFunc) { case GE_TEXFUNC_MODULATE: - WRITE(p, " vec4 v = p * t%s;\n", secondary); + WRITE(p, " vec4 v = p * t + s\n;"); break; case GE_TEXFUNC_DECAL: - WRITE(p, " vec4 v = vec4(mix(p.rgb, t.rgb, t.a), p.a)%s;\n", secondary); + WRITE(p, " vec4 v = vec4(mix(p.rgb, t.rgb, t.a), p.a) + s;\n"); break; case GE_TEXFUNC_BLEND: - WRITE(p, " vec4 v = vec4(mix(p.rgb, u_texenv.rgb, t.rgb), p.a * t.a)%s;\n", secondary); + WRITE(p, " vec4 v = vec4(mix(p.rgb, u_texenv.rgb, t.rgb), p.a * t.a) + s;\n"); break; case GE_TEXFUNC_REPLACE: - WRITE(p, " vec4 v = t%s;\n", secondary); + WRITE(p, " vec4 v = t + s;\n"); break; case GE_TEXFUNC_ADD: case GE_TEXFUNC_UNKNOWN1: case GE_TEXFUNC_UNKNOWN2: case GE_TEXFUNC_UNKNOWN3: - WRITE(p, " vec4 v = vec4(p.rgb + t.rgb, p.a * t.a)%s;\n", secondary); + WRITE(p, " vec4 v = vec4(p.rgb + t.rgb, p.a * t.a) + s;\n"); break; default: WRITE(p, " vec4 v = p;\n"); break; @@ -862,26 +850,26 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu } else { // texfmt == RGB switch (texFunc) { case GE_TEXFUNC_MODULATE: - WRITE(p, " vec4 v = vec4(t.rgb * p.rgb, p.a)%s;\n", secondary); + WRITE(p, " vec4 v = vec4(t.rgb * p.rgb, p.a) + s;\n"); break; case GE_TEXFUNC_DECAL: - WRITE(p, " vec4 v = vec4(t.rgb, p.a)%s;\n", secondary); + WRITE(p, " vec4 v = vec4(t.rgb, p.a) + s;\n"); break; case GE_TEXFUNC_BLEND: - WRITE(p, " vec4 v = vec4(mix(p.rgb, u_texenv.rgb, t.rgb), p.a)%s;\n", secondary); + WRITE(p, " vec4 v = vec4(mix(p.rgb, u_texenv.rgb, t.rgb), p.a) + s;\n"); break; case GE_TEXFUNC_REPLACE: - WRITE(p, " vec4 v = vec4(t.rgb, p.a)%s;\n", secondary); + WRITE(p, " vec4 v = vec4(t.rgb, p.a) + s;\n"); break; case GE_TEXFUNC_ADD: case GE_TEXFUNC_UNKNOWN1: case GE_TEXFUNC_UNKNOWN2: case GE_TEXFUNC_UNKNOWN3: - WRITE(p, " vec4 v = vec4(p.rgb + t.rgb, p.a)%s;\n", secondary); break; + WRITE(p, " vec4 v = vec4(p.rgb + t.rgb, p.a) + s;\n"); break; default: WRITE(p, " vec4 v = p;\n"); break; } @@ -893,7 +881,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu } } else { // No texture mapping - WRITE(p, " vec4 v = v_color0 %s;\n", secondary); + WRITE(p, " vec4 v = v_color0 + s;\n"); } WRITE(p, " float fogCoef = clamp(v_fogdepth, 0.0, 1.0);\n"); diff --git a/GPU/Common/GeometryShaderGenerator.cpp b/GPU/Common/GeometryShaderGenerator.cpp index d09775cf76..3f564dc012 100644 --- a/GPU/Common/GeometryShaderGenerator.cpp +++ b/GPU/Common/GeometryShaderGenerator.cpp @@ -74,10 +74,8 @@ bool GenerateGeometryShader(const GShaderID &id, char *buffer, const ShaderLangu } varyings.push_back(VaryingDef{ "vec4", "v_color0", Draw::SEM_COLOR0, 1, "lowp" }); outVaryings.push_back(VaryingDef{ "vec4", "v_color0Out", Draw::SEM_COLOR0, 1, "lowp" }); - if (id.Bit(GS_BIT_LMODE)) { - varyings.push_back(VaryingDef{ "vec3", "v_color1", Draw::SEM_COLOR1, 2, "lowp" }); - outVaryings.push_back(VaryingDef{ "vec3", "v_color1Out", Draw::SEM_COLOR1, 2, "lowp" }); - } + varyings.push_back(VaryingDef{ "vec3", "v_color1", Draw::SEM_COLOR1, 2, "lowp" }); + outVaryings.push_back(VaryingDef{ "vec3", "v_color1Out", Draw::SEM_COLOR1, 2, "lowp" }); varyings.push_back(VaryingDef{ "float", "v_fogdepth", Draw::SEM_TEXCOORD1, 3, "highp" }); outVaryings.push_back(VaryingDef{ "float", "v_fogdepthOut", Draw::SEM_TEXCOORD1, 3, "highp" }); diff --git a/GPU/Common/ShaderId.cpp b/GPU/Common/ShaderId.cpp index d11cac5859..dc21d59113 100644 --- a/GPU/Common/ShaderId.cpp +++ b/GPU/Common/ShaderId.cpp @@ -189,7 +189,6 @@ std::string FragmentShaderDesc(const FShaderID &id) { if (id.Bit(FS_BIT_DO_TEXTURE_PROJ)) desc << "TexProj "; if (id.Bit(FS_BIT_TEXALPHA)) desc << "TexAlpha "; if (id.Bit(FS_BIT_TEXTURE_AT_OFFSET)) desc << "TexOffs "; - if (id.Bit(FS_BIT_LMODE)) desc << "LM "; if (id.Bit(FS_BIT_COLOR_DOUBLE)) desc << "2x "; if (id.Bit(FS_BIT_FLATSHADE)) desc << "Flat "; if (id.Bit(FS_BIT_BGRA_TEXTURE)) desc << "BGRA "; @@ -281,7 +280,6 @@ void ComputeFragmentShaderID(FShaderID *id_out, const ComputedPipelineState &pip id.SetBit(FS_BIT_CLEARMODE); } else { bool isModeThrough = gstate.isModeThrough(); - bool lmode = gstate.isUsingSecondaryColor() && gstate.isLightingEnabled() && !isModeThrough; bool enableFog = gstate.isFogEnabled() && !isModeThrough; bool enableAlphaTest = gstate.isAlphaTestEnabled() && !IsAlphaTestTriviallyTrue(); bool enableColorTest = gstate.isColorTestEnabled() && !IsColorTestTriviallyTrue(); @@ -322,7 +320,6 @@ void ComputeFragmentShaderID(FShaderID *id_out, const ComputedPipelineState &pip id.SetBit(FS_BIT_3D_TEXTURE, gstate_c.curTextureIs3D); } - id.SetBit(FS_BIT_LMODE, lmode); if (enableAlphaTest) { // 5 bits total. id.SetBit(FS_BIT_ALPHA_TEST); @@ -405,7 +402,6 @@ std::string GeometryShaderDesc(const GShaderID &id) { desc << StringFromFormat("%08x:%08x ", id.d[1], id.d[0]); if (id.Bit(GS_BIT_ENABLED)) desc << "ENABLED "; if (id.Bit(GS_BIT_DO_TEXTURE)) desc << "TEX "; - if (id.Bit(GS_BIT_LMODE)) desc << "LMODE "; return desc.str(); } @@ -437,9 +433,6 @@ void ComputeGeometryShaderID(GShaderID *id_out, const Draw::Bugs &bugs, int prim if (gstate.isModeClear()) { // No attribute bits. } else { - bool lmode = gstate.isUsingSecondaryColor() && gstate.isLightingEnabled() && !isModeThrough; - - id.SetBit(GS_BIT_LMODE, lmode); if (gstate.isTextureMapEnabled()) { id.SetBit(GS_BIT_DO_TEXTURE); } diff --git a/GPU/Common/ShaderId.h b/GPU/Common/ShaderId.h index f71eee7555..e03b27f214 100644 --- a/GPU/Common/ShaderId.h +++ b/GPU/Common/ShaderId.h @@ -74,7 +74,7 @@ enum FShaderBit : uint8_t { FS_BIT_CLAMP_S = 8, FS_BIT_CLAMP_T = 9, FS_BIT_TEXTURE_AT_OFFSET = 10, - FS_BIT_LMODE = 11, + // 1 bit free FS_BIT_ALPHA_TEST = 12, FS_BIT_ALPHA_TEST_FUNC = 13, // 3 bits FS_BIT_ALPHA_AGAINST_ZERO = 16, @@ -111,8 +111,7 @@ static inline FShaderBit operator +(FShaderBit bit, int i) { enum GShaderBit : uint8_t { GS_BIT_ENABLED = 0, // If not set, we don't use a geo shader. GS_BIT_DO_TEXTURE = 1, // presence of texcoords - GS_BIT_LMODE = 2, // presence of specular color (regular color always present) - GS_BIT_CURVE = 3, // curve, which means don't do range culling. + GS_BIT_CURVE = 2, // curve, which means don't do range culling. }; static inline GShaderBit operator +(GShaderBit bit, int i) { diff --git a/GPU/Common/VertexShaderGenerator.cpp b/GPU/Common/VertexShaderGenerator.cpp index 504c854d46..0f233ce9cf 100644 --- a/GPU/Common/VertexShaderGenerator.cpp +++ b/GPU/Common/VertexShaderGenerator.cpp @@ -285,9 +285,7 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag } WRITE(p, "layout (location = 1) %sout lowp vec4 v_color0;\n", shading); - if (lmode) { - WRITE(p, "layout (location = 2) %sout lowp vec3 v_color1;\n", shading); - } + WRITE(p, "layout (location = 2) %sout lowp vec3 v_color1;\n", shading); if (doTexture) { WRITE(p, "layout (location = 0) out highp vec3 v_texcoord;\n"); @@ -423,8 +421,7 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag } const char *colorInterpolation = doFlatShading && compat.shaderLanguage == HLSL_D3D11 ? "nointerpolation " : ""; WRITE(p, " %svec4 v_color0 : COLOR0;\n", colorInterpolation); - if (lmode) - WRITE(p, " vec3 v_color1 : COLOR1;\n"); + WRITE(p, " vec3 v_color1 : COLOR1;\n"); WRITE(p, " float v_fogdepth : TEXCOORD1;\n"); if (compat.shaderLanguage == HLSL_D3D9) { @@ -595,9 +592,7 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag } WRITE(p, "%s%s lowp vec4 v_color0;\n", shading, compat.varying_vs); - if (lmode) { - WRITE(p, "%s%s lowp vec3 v_color1;\n", shading, compat.varying_vs); - } + WRITE(p, "%s%s lowp vec3 v_color1;\n", shading, compat.varying_vs); if (doTexture) { WRITE(p, "%s %s vec3 v_texcoord;\n", compat.varying_vs, highpTexcoord ? "highp" : "mediump"); @@ -838,10 +833,11 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag WRITE(p, " %sv_color0 = color0;\n", compat.vsOutPrefix); if (lmode) WRITE(p, " %sv_color1 = color1;\n", compat.vsOutPrefix); + else + WRITE(p, " %sv_color1 = splat3(0.0);\n", compat.vsOutPrefix); } else { WRITE(p, " %sv_color0 = u_matambientalpha;\n", compat.vsOutPrefix); - if (lmode) - WRITE(p, " %sv_color1 = splat3(0.0);\n", compat.vsOutPrefix); + WRITE(p, " %sv_color1 = splat3(0.0);\n", compat.vsOutPrefix); } WRITE(p, " %sv_fogdepth = fog;\n", compat.vsOutPrefix); if (isModeThrough) { @@ -1171,6 +1167,7 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag } else { WRITE(p, " %sv_color0 = clamp(clamp(lightSum0, 0.0, 1.0) + vec4(lightSum1, 0.0), 0.0, 1.0);\n", compat.vsOutPrefix); } + WRITE(p, " %sv_color1 = splat3(0.0);\n", compat.vsOutPrefix); } } else { // Lighting doesn't affect color. @@ -1185,8 +1182,7 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag WRITE(p, " %sv_color0.r += 0.000001;\n", compat.vsOutPrefix); } } - if (lmode) - WRITE(p, " %sv_color1 = splat3(0.0);\n", compat.vsOutPrefix); + WRITE(p, " %sv_color1 = splat3(0.0);\n", compat.vsOutPrefix); } bool scaleUV = !isModeThrough && (uvGenMode == GE_TEXMAP_TEXTURE_COORDS || uvGenMode == GE_TEXMAP_UNKNOWN); diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index 80713cb14b..70ae00dfba 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -849,7 +849,6 @@ LinkedShader *ShaderManagerGLES::ApplyFragmentShader(VShaderID VSID, Shader *vs, shaderSwitchDirtyUniforms_ = 0; if (ls == nullptr) { - _dbg_assert_(FSID.Bit(FS_BIT_LMODE) == VSID.Bit(VS_BIT_LMODE)); _dbg_assert_(FSID.Bit(FS_BIT_DO_TEXTURE) == VSID.Bit(VS_BIT_DO_TEXTURE)); _dbg_assert_(FSID.Bit(FS_BIT_FLATSHADE) == VSID.Bit(VS_BIT_FLATSHADE)); diff --git a/GPU/Vulkan/ShaderManagerVulkan.cpp b/GPU/Vulkan/ShaderManagerVulkan.cpp index 3d6fd307fb..f2672a86a9 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.cpp +++ b/GPU/Vulkan/ShaderManagerVulkan.cpp @@ -320,12 +320,10 @@ void ShaderManagerVulkan::GetShaders(int prim, VertexDecoder *decoder, VulkanVer GSID = lastGSID_; } - _dbg_assert_(FSID.Bit(FS_BIT_LMODE) == VSID.Bit(VS_BIT_LMODE)); _dbg_assert_(FSID.Bit(FS_BIT_DO_TEXTURE) == VSID.Bit(VS_BIT_DO_TEXTURE)); _dbg_assert_(FSID.Bit(FS_BIT_FLATSHADE) == VSID.Bit(VS_BIT_FLATSHADE)); if (GSID.Bit(GS_BIT_ENABLED)) { - _dbg_assert_(GSID.Bit(GS_BIT_LMODE) == VSID.Bit(VS_BIT_LMODE)); _dbg_assert_(GSID.Bit(GS_BIT_DO_TEXTURE) == VSID.Bit(VS_BIT_DO_TEXTURE)); }