diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index efa17e6500..b433284ddf 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -264,8 +264,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu if (texFunc == GE_TEXFUNC_BLEND) { WRITE(p, "float3 u_texenv : register(c%i);\n", CONST_PS_TEXENV); } - WRITE(p, "float u_texNoAlpha : register(c%i);\n", CONST_PS_TEX_NO_ALPHA); - WRITE(p, "float u_texMul : register(c%i);\n", CONST_PS_TEX_MUL); + WRITE(p, "float2 u_texNoAlphaMul : register(c%i);\n", CONST_PS_TEX_NO_ALPHA_MUL); } if (enableFog) { WRITE(p, "float3 u_fogcolor : register(c%i);\n", CONST_PS_FOGCOLOR); @@ -364,8 +363,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu WRITE(p, "uniform sampler2D tex;\n"); } *uniformMask |= DIRTY_TEX_ALPHA_MUL; - WRITE(p, "uniform float u_texNoAlpha;\n"); - WRITE(p, "uniform float u_texMul;\n"); + WRITE(p, "uniform vec2 u_texNoAlphaMul;\n"); } if (readFramebufferTex) { @@ -844,7 +842,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu WRITE(p, " vec4 p = v_color0;\n"); if (texFunc != GE_TEXFUNC_REPLACE) { - WRITE(p, " t.a = max(t.a, u_texNoAlpha);\n"); + WRITE(p, " t.a = max(t.a, u_texNoAlphaMul.x);\n"); } switch (texFunc) { @@ -859,7 +857,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu break; case GE_TEXFUNC_REPLACE: WRITE(p, " vec4 r = t;\n"); - WRITE(p, " r.a = mix(r.a, p.a, u_texNoAlpha);\n"); + WRITE(p, " r.a = mix(r.a, p.a, u_texNoAlphaMul.x);\n"); WRITE(p, " vec4 v = r%s;\n", secondary); break; case GE_TEXFUNC_ADD: @@ -879,9 +877,9 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu // We only need a clamp if the color will be further processed. Otherwise the hardware color conversion will clamp for us. if (enableFog || enableColorTest || replaceBlend != REPLACE_BLEND_NO || simulateLogicOpType != LOGICOPTYPE_NORMAL || colorWriteMask || blueToAlpha) { - WRITE(p, " v.rgb = clamp(v.rgb * u_texMul, 0.0, 1.0);\n"); + WRITE(p, " v.rgb = clamp(v.rgb * u_texNoAlphaMul.y, 0.0, 1.0);\n"); } else { - WRITE(p, " v.rgb *= u_texMul;\n"); + WRITE(p, " v.rgb *= u_texNoAlphaMul.y;\n"); } } else { // No texture mapping diff --git a/GPU/Common/FragmentShaderGenerator.h b/GPU/Common/FragmentShaderGenerator.h index abfa97ff11..31923d0006 100644 --- a/GPU/Common/FragmentShaderGenerator.h +++ b/GPU/Common/FragmentShaderGenerator.h @@ -36,8 +36,7 @@ struct FShaderID; #define CONST_PS_TEXCLAMP 8 #define CONST_PS_TEXCLAMPOFF 9 #define CONST_PS_MIPBIAS 10 -#define CONST_PS_TEX_NO_ALPHA 11 -#define CONST_PS_TEX_MUL 12 +#define CONST_PS_TEX_NO_ALPHA_MUL 11 // For stencil upload #define BCONST_PS_STENCILVALUE 13 diff --git a/GPU/Common/ShaderUniforms.h b/GPU/Common/ShaderUniforms.h index cd9120d8ef..176524e3d7 100644 --- a/GPU/Common/ShaderUniforms.h +++ b/GPU/Common/ShaderUniforms.h @@ -66,7 +66,7 @@ R"( mat4 u_proj; vec4 u_texclamp; vec2 u_texclampoff; vec2 u_fogcoef; - float u_texNoAlpha; float u_texMul; float pad1; float pad2; + vec2 u_texNoAlphaMul; float pad1; float pad2; )"; // 512 bytes. Would like to shrink more. Some colors only have 8-bit precision and we expand diff --git a/GPU/Directx9/ShaderManagerDX9.cpp b/GPU/Directx9/ShaderManagerDX9.cpp index 845984e342..9582989017 100644 --- a/GPU/Directx9/ShaderManagerDX9.cpp +++ b/GPU/Directx9/ShaderManagerDX9.cpp @@ -291,8 +291,8 @@ void ShaderManagerDX9::PSUpdateUniforms(u64 dirtyUniforms) { doTextureAlpha = false; } // NOTE: Reversed value, more efficient in shader. - PSSetFloat(CONST_PS_TEX_NO_ALPHA, doTextureAlpha ? 0.0f : 1.0f); - PSSetFloat(CONST_PS_TEX_MUL, gstate.isColorDoublingEnabled() ? 2.0f : 1.0f); + float noAlphaMul[2] = { doTextureAlpha ? 0.0f : 1.0f, gstate.isColorDoublingEnabled() ? 2.0f : 1.0f }; + PSSetFloatArray(CONST_PS_TEX_NO_ALPHA_MUL, noAlphaMul, 2); } if (dirtyUniforms & DIRTY_SHADERBLEND) { PSSetColorUniform3(CONST_PS_BLENDFIXA, gstate.getFixA()); diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index 248347a07b..1a08c7a724 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -154,8 +154,7 @@ LinkedShader::LinkedShader(GLRenderManager *render, VShaderID VSID, Shader *vs, queries.push_back({ &u_uvscaleoffset, "u_uvscaleoffset" }); queries.push_back({ &u_texclamp, "u_texclamp" }); queries.push_back({ &u_texclampoff, "u_texclampoff" }); - queries.push_back({ &u_texNoAlpha, "u_texNoAlpha" }); - queries.push_back({ &u_texMul, "u_texMul" }); + queries.push_back({ &u_texNoAlphaMul, "u_texNoAlphaMul" }); queries.push_back({ &u_lightControl, "u_lightControl" }); for (int i = 0; i < 4; i++) { @@ -466,8 +465,8 @@ void LinkedShader::UpdateUniforms(const ShaderID &vsid, bool useBufferedRenderin if (gstate_c.textureFullAlpha && gstate.getTextureFunction() != GE_TEXFUNC_REPLACE) { doTextureAlpha = false; } - render_->SetUniformF1(&u_texNoAlpha, doTextureAlpha ? 0.0f : 1.0f); - render_->SetUniformF1(&u_texMul, gstate.isColorDoublingEnabled() ? 2.0f : 1.0f); + float noAlphaMul[2] = { doTextureAlpha ? 0.0f : 1.0f, gstate.isColorDoublingEnabled() ? 2.0f : 1.0f }; + render_->SetUniformF(&u_texNoAlphaMul, 2, noAlphaMul); } if (dirty & DIRTY_ALPHACOLORREF) { if (shaderLanguage.bitwiseOps) { diff --git a/GPU/GLES/ShaderManagerGLES.h b/GPU/GLES/ShaderManagerGLES.h index ff9478ca24..cac2865cc3 100644 --- a/GPU/GLES/ShaderManagerGLES.h +++ b/GPU/GLES/ShaderManagerGLES.h @@ -102,8 +102,7 @@ public: int u_uvscaleoffset; int u_texclamp; int u_texclampoff; - int u_texNoAlpha; - int u_texMul; + int u_texNoAlphaMul; // Lighting int u_lightControl;