GS/HW: Decorrect Ad on sw blend in tfx shader.

Otherwise if we do decorrection in covert shader we add more copies.

Also make sure to decorrect for fbmask, tex is fb.
This commit is contained in:
lightningterror 2024-02-24 21:19:38 +00:00
parent fff4aea076
commit 71376ff4e6
5 changed files with 51 additions and 27 deletions

View File

@ -848,11 +848,10 @@ void ps_blend(inout float4 Color, inout float4 As_rgba, float2 pos_xy)
return;
}
float4 RT = SW_BLEND_NEEDS_RT ? trunc(RtTexture.Load(int3(pos_xy, 0)) * 255.0f + 0.1f) : (float4)0.0f;
float4 RT = SW_BLEND_NEEDS_RT ? RtTexture.Load(int3(pos_xy, 0)) : (float4)0.0f;
float Ad = RT.a / 128.0f;
float3 Cd = RT.rgb;
float Ad = PS_RTA_CORRECTION ? trunc(RT.a * 127.5f + 0.05f) / 128.0f : trunc(RT.a * 255.0f + 0.1f) / 128.0f;
float3 Cd = trunc(RT.rgb * 255.0f + 0.1f);
float3 Cs = Color.rgb;
float3 A = (PS_BLEND_A == 0) ? Cs : ((PS_BLEND_A == 1) ? Cd : (float3)0.0f);
@ -966,10 +965,10 @@ PS_OUTPUT ps_main(PS_INPUT input)
C.a = 128.0f;
}
float4 alpha_blend;
float4 alpha_blend = (float4)0.0f;
if (SW_AD_TO_HW)
{
float4 RT = trunc(RtTexture.Load(int3(input.p.xy, 0)) * 255.0f + 0.1f);
float4 RT = PS_RTA_CORRECTION ? trunc(RtTexture.Load(int3(input.p.xy, 0)) * 127.5f + 0.05f) : trunc(RtTexture.Load(int3(input.p.xy, 0)) * 255.0f + 0.1f);
alpha_blend = (float4)(RT.a / 128.0f);
}
else

View File

@ -796,17 +796,20 @@ float As = As_rgba.a;
#endif
#if SW_BLEND_NEEDS_RT
vec4 RT = trunc(fetch_rt() * 255.0f + 0.1f);
vec4 RT = fetch_rt();
#else
// Not used, but we define it to make the selection below simpler.
vec4 RT = vec4(0.0f);
#endif
// FIXME FMT_16 case
// FIXME Ad or Ad * 2?
float Ad = RT.a / 128.0f;
#if PS_RTA_CORRECTION
float Ad = trunc(RT.a * 127.5f + 0.05f) / 128.0f;
#else
float Ad = trunc(RT.a * 255.0f + 0.1f) / 128.0f;
#endif
// Let the compiler do its jobs !
vec3 Cd = RT.rgb;
vec3 Cd = trunc(RT.rgb * 255.0f + 0.1f);
vec3 Cs = Color.rgb;
#if PS_BLEND_A == 0
@ -972,7 +975,12 @@ void ps_main()
#endif
#if SW_AD_TO_HW
vec4 RT = trunc(fetch_rt() * 255.0f + 0.1f);
#if PS_RTA_CORRECTION
vec4 RT = trunc(fetch_rt() * 127.5f + 0.05f);
#else
vec4 RT = trunc(fetch_rt() * 255.0f + 0.1f);
#endif
vec4 alpha_blend = vec4(RT.a / 128.0f);
#else
vec4 alpha_blend = vec4(C.a / 128.0f);

View File

@ -1049,18 +1049,20 @@ void ps_blend(inout vec4 Color, inout vec4 As_rgba)
#endif
#if PS_FEEDBACK_LOOP_IS_NEEDED
vec4 RT = trunc(sample_from_rt() * 255.0f + 0.1f);
vec4 RT = sample_from_rt();
#else
// Not used, but we define it to make the selection below simpler.
vec4 RT = vec4(0.0f);
#endif
// FIXME FMT_16 case
// FIXME Ad or Ad * 2?
float Ad = RT.a / 128.0f;
#if PS_RTA_CORRECTION
float Ad = trunc(RT.a * 127.5f + 0.05f) / 128.0f;
#else
float Ad = trunc(RT.a * 255.0f + 0.1f) / 128.0f;
#endif
// Let the compiler do its jobs !
vec3 Cd = RT.rgb;
vec3 Cd = trunc(RT.rgb * 255.0f + 0.1f);
vec3 Cs = Color.rgb;
#if PS_BLEND_A == 0
@ -1223,8 +1225,13 @@ void main()
C.a = 128.0f;
#endif
#if (SW_AD_TO_HW)
vec4 RT = trunc(sample_from_rt() * 255.0f + 0.1f);
#if SW_AD_TO_HW
#if PS_RTA_CORRECTION
vec4 RT = trunc(sample_from_rt() * 127.5f + 0.05f);
#else
vec4 RT = trunc(sample_from_rt() * 255.0f + 0.1f);
#endif
vec4 alpha_blend = vec4(RT.a / 128.0f);
#else
vec4 alpha_blend = vec4(C.a / 128.0f);

View File

@ -4302,12 +4302,12 @@ void GSRendererHW::EmulateBlending(int rt_alpha_min, int rt_alpha_max, bool& DAT
m_conf.ps.blend_d = 0;
// TODO: Make it work on DATE, switch to new shaders with Ad doubled.
const bool rta_decorrection = m_channel_shuffle || m_texture_shuffle || rt_alpha_max > 128;
const bool rta_decorrection = m_channel_shuffle || m_texture_shuffle || rt_alpha_max > 128 || m_conf.ps.fbmask || m_conf.ps.tex_is_fb;
const bool rta_correction = !rta_decorrection && !m_cached_ctx.TEST.DATE && !blend_ad_alpha_masked && m_conf.ps.blend_c == 1 && !(blend_flag & BLEND_A_MAX);
if (rta_correction)
{
rt->RTACorrect(rt);
m_conf.ps.rta_correction = rt->m_rt_alpha_scale && m_conf.colormask.wa;
m_conf.ps.rta_correction = rt->m_rt_alpha_scale;
m_conf.rt = rt->m_texture;
}
@ -5303,15 +5303,17 @@ __ri void GSRendererHW::DrawPrims(GSTextureCache::Target* rt, GSTextureCache::Ta
}
}
if (rt)
{
const bool rta_decorrection = m_cached_ctx.TEST.DATE || m_channel_shuffle || m_texture_shuffle || blend_alpha_max > 128;
if (rt && rta_decorrection)
const bool rta_decorrection = m_channel_shuffle || m_texture_shuffle || std::max(blend_alpha_max, rt->m_alpha_max) > 128 || m_conf.ps.fbmask || m_conf.ps.tex_is_fb;
if (rta_decorrection)
{
rt->RTADecorrect(rt);
m_conf.rt = rt->m_texture;
}
else if (rt)
m_conf.ps.rta_correction = rt->m_rt_alpha_scale && m_conf.colormask.wa;
m_conf.ps.rta_correction = rt->m_rt_alpha_scale;
}
bool blending_alpha_pass = false;

View File

@ -915,7 +915,7 @@ struct PSMain
return;
}
float Ad = trunc(current_color.a * 255.5f) / 128.f;
float Ad = PS_RTA_CORRECTION ? trunc(current_color.a * 127.75f) / 128.f : trunc(current_color.a * 255.5f) / 128.f;
float3 Cd = trunc(current_color.rgb * 255.5f);
float3 Cs = Color.rgb;
@ -1044,7 +1044,15 @@ struct PSMain
C.a = 128.0f;
}
float4 alpha_blend = SW_AD_TO_HW ? float4(trunc(current_color.a * 255.5f) / 128.f) : float4(C.a / 128.f);
float4 alpha_blend = float4(0.f);
if (SW_AD_TO_HW)
{
alpha_blend = PS_RTA_CORRECTION ? float4(trunc(current_color.a * 127.75f) / 128.f) : float4(trunc(current_color.a * 255.5f) / 128.f);
}
else
{
alpha_blend = float4(C.a / 128.f);
}
if (PS_DST_FMT == FMT_16)
{