GS: When CoverageAlpha is used set Alpha min max to 128.

This commit is contained in:
lightningterror 2022-10-08 21:19:16 +02:00
parent 5227bc9167
commit 1c308b2710
1 changed files with 65 additions and 55 deletions

View File

@ -3594,68 +3594,78 @@ void GSState::CalcAlphaMinMax()
if (m_vt.m_alpha.valid) if (m_vt.m_alpha.valid)
return; return;
const GSDrawingContext* context = m_context; int min = 0, max = 0;
GSVector4i a = m_vt.m_min.c.uph32(m_vt.m_max.c).zzww(); if (IsCoverageAlpha())
if (PRIM->TME && context->TEX0.TCC)
{ {
const GSDrawingEnvironment& env = m_env; min = 128;
max = 128;
switch (GSLocalMemory::m_psm[context->TEX0.PSM].fmt) }
else
{
const GSDrawingContext* context = m_context;
GSVector4i a = m_vt.m_min.c.uph32(m_vt.m_max.c).zzww();
if (PRIM->TME && context->TEX0.TCC)
{ {
case 0: const GSDrawingEnvironment& env = m_env;
a.y = 0;
a.w = 0xff;
break;
case 1:
a.y = env.TEXA.AEM ? 0 : env.TEXA.TA0;
a.w = env.TEXA.TA0;
break;
case 2:
a.y = env.TEXA.AEM ? 0 : std::min(env.TEXA.TA0, env.TEXA.TA1);
a.w = std::max(env.TEXA.TA0, env.TEXA.TA1);
break;
case 3:
m_mem.m_clut.GetAlphaMinMax32(a.y, a.w);
break;
default:
__assume(0);
}
switch (context->TEX0.TFX) switch (GSLocalMemory::m_psm[context->TEX0.PSM].fmt)
{ {
case TFX_MODULATE: case 0:
a.x = (a.x * a.y) >> 7; a.y = 0;
a.z = (a.z * a.w) >> 7; a.w = 0xff;
if (a.x > 0xff) break;
a.x = 0xff; case 1:
if (a.z > 0xff) a.y = env.TEXA.AEM ? 0 : env.TEXA.TA0;
a.z = 0xff; a.w = env.TEXA.TA0;
break; break;
case TFX_DECAL: case 2:
a.x = a.y; a.y = env.TEXA.AEM ? 0 : std::min(env.TEXA.TA0, env.TEXA.TA1);
a.z = a.w; a.w = std::max(env.TEXA.TA0, env.TEXA.TA1);
break; break;
case TFX_HIGHLIGHT: case 3:
a.x = a.x + a.y; m_mem.m_clut.GetAlphaMinMax32(a.y, a.w);
a.z = a.z + a.w; break;
if (a.x > 0xff) default:
a.x = 0xff; __assume(0);
if (a.z > 0xff) }
a.z = 0xff;
break; switch (context->TEX0.TFX)
case TFX_HIGHLIGHT2: {
a.x = a.y; case TFX_MODULATE:
a.z = a.w; a.x = (a.x * a.y) >> 7;
break; a.z = (a.z * a.w) >> 7;
default: if (a.x > 0xff)
__assume(0); a.x = 0xff;
if (a.z > 0xff)
a.z = 0xff;
break;
case TFX_DECAL:
a.x = a.y;
a.z = a.w;
break;
case TFX_HIGHLIGHT:
a.x = a.x + a.y;
a.z = a.z + a.w;
if (a.x > 0xff)
a.x = 0xff;
if (a.z > 0xff)
a.z = 0xff;
break;
case TFX_HIGHLIGHT2:
a.x = a.y;
a.z = a.w;
break;
default:
__assume(0);
}
} }
min = a.x;
max = a.z;
} }
m_vt.m_alpha.min = a.x; m_vt.m_alpha.min = min;
m_vt.m_alpha.max = a.z; m_vt.m_alpha.max = max;
m_vt.m_alpha.valid = true; m_vt.m_alpha.valid = true;
} }