Finish BlueToAlpha functionality

This commit is contained in:
Henrik Rydgård 2022-04-24 22:54:08 +02:00
parent 0c66087cc7
commit 6b2dec91b5
4 changed files with 6 additions and 4 deletions

View file

@ -858,7 +858,9 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu
WRITE(p, " v.rgb = v.rgb * 2.0;\n"); WRITE(p, " v.rgb = v.rgb * 2.0;\n");
} }
if (replaceBlend == REPLACE_BLEND_PRE_SRC || replaceBlend == REPLACE_BLEND_PRE_SRC_2X_ALPHA) { // In some cases we need to replicate the first half of the blend equation here.
// In case of blue-to-alpha, it's since we overwrite alpha with blue before the actual blend equation runs.
if (replaceBlend == REPLACE_BLEND_PRE_SRC || replaceBlend == REPLACE_BLEND_PRE_SRC_2X_ALPHA || replaceBlend == REPLACE_BLEND_BLUE_TO_ALPHA) {
const char *srcFactor = "ERROR"; const char *srcFactor = "ERROR";
switch (replaceBlendFuncA) { switch (replaceBlendFuncA) {
case GE_SRCBLEND_DSTCOLOR: srcFactor = "ERROR"; break; case GE_SRCBLEND_DSTCOLOR: srcFactor = "ERROR"; break;

View file

@ -1332,7 +1332,7 @@ void ConvertBlendState(GenericBlendState &blendState, bool allowFramebufferRead,
break; break;
} }
} else if (blueToAlpha) { } else if (blueToAlpha) {
blendState.setFactors(BlendFactor::ZERO, BlendFactor::ZERO, glBlendFuncA, glBlendFuncB); blendState.setFactors(BlendFactor::ZERO, BlendFactor::ZERO, BlendFactor::ONE, glBlendFuncB);
blendState.setEquation(BlendEq::ADD, colorEq); blendState.setEquation(BlendEq::ADD, colorEq);
return; return;
} else { } else {

View file

@ -190,7 +190,7 @@ std::string FragmentShaderDesc(const FShaderID &id) {
if (blendBits) { if (blendBits) {
switch (blendBits) { switch (blendBits) {
case ReplaceBlendType::REPLACE_BLEND_BLUE_TO_ALPHA: case ReplaceBlendType::REPLACE_BLEND_BLUE_TO_ALPHA:
desc << "BlueToAlpha"; desc << "BlueToAlpha_" << "A:" << id.Bits(FS_BIT_BLENDFUNC_A, 4);
break; break;
default: default:
desc << "ReplaceBlend_" << id.Bits(FS_BIT_REPLACE_BLEND, 3) desc << "ReplaceBlend_" << id.Bits(FS_BIT_REPLACE_BLEND, 3)
@ -325,6 +325,7 @@ void ComputeFragmentShaderID(FShaderID *id_out, const Draw::Bugs &bugs) {
// If replaceBlend == REPLACE_BLEND_STANDARD (or REPLACE_BLEND_NO) nothing is done, so we kill these bits. // If replaceBlend == REPLACE_BLEND_STANDARD (or REPLACE_BLEND_NO) nothing is done, so we kill these bits.
if (replaceBlend == REPLACE_BLEND_BLUE_TO_ALPHA) { if (replaceBlend == REPLACE_BLEND_BLUE_TO_ALPHA) {
id.SetBits(FS_BIT_REPLACE_BLEND, 3, replaceBlend); id.SetBits(FS_BIT_REPLACE_BLEND, 3, replaceBlend);
id.SetBits(FS_BIT_BLENDFUNC_A, 4, gstate.getBlendFuncA());
} else if (replaceBlend > REPLACE_BLEND_STANDARD) { } else if (replaceBlend > REPLACE_BLEND_STANDARD) {
// 3 bits. // 3 bits.
id.SetBits(FS_BIT_REPLACE_BLEND, 3, replaceBlend); id.SetBits(FS_BIT_REPLACE_BLEND, 3, replaceBlend);

View file

@ -995,7 +995,6 @@ ULES01402 = true
ULUS10513 = true ULUS10513 = true
ULJM05812 = true ULJM05812 = true
NPJH50371 = true NPJH50371 = true
# Some games render first to RGB of a 4444 texture, then they switch to 565 and render masked to blue, # Some games render first to RGB of a 4444 texture, then they switch to 565 and render masked to blue,
# just to be able to render to the alpha channel of the 4444. We can detect that and reroute rendering # just to be able to render to the alpha channel of the 4444. We can detect that and reroute rendering
# to avoid problems. # to avoid problems.