rsx: Value remapping can only happen to a texel lane once per sample

- Avoids double operation if for example BX2 and SNORM/SEXT are active concurrently
This commit is contained in:
kd-11
2026-02-10 01:41:57 +03:00
committed by kd-11
parent dd490fc725
commit 3df370a7e6
@@ -210,25 +210,29 @@ vec4 _process_texel(in vec4 rgba, const in uint control_bits)
uvec4 mask; uvec4 mask;
vec4 convert; vec4 convert;
uint op_mask = control_bits & uint(SIGN_EXPAND_MASK); uint op_mask = control_bits & uint(SEXT_MASK);
if (op_mask != 0u) uint ch_mask = 0xFu;
{
// Expand to signed normalized by decompressing the signal
mask = uvec4(op_mask) & uvec4(EXPAND_R_MASK, EXPAND_G_MASK, EXPAND_B_MASK, EXPAND_A_MASK);
convert = (rgba * 2.f - 1.f);
rgba = _select(rgba, convert, notEqual(mask, uvec4(0)));
}
op_mask = control_bits & uint(SEXT_MASK);
if (op_mask != 0u) if (op_mask != 0u)
{ {
// Sign-extend the input signal // Sign-extend the input signal
mask = uvec4(op_mask) & uvec4(SEXT_R_MASK, SEXT_G_MASK, SEXT_B_MASK, SEXT_A_MASK); mask = uvec4(op_mask) & uvec4(SEXT_R_MASK, SEXT_G_MASK, SEXT_B_MASK, SEXT_A_MASK);
convert = _sext_unorm8x4(rgba); convert = _sext_unorm8x4(rgba);
rgba = _select(rgba, convert, notEqual(mask, uvec4(0))); rgba = _select(rgba, convert, notEqual(mask, uvec4(0)));
ch_mask &= ~(op_mask >> SEXT_R_BIT);
} }
op_mask = control_bits & uint(GAMMA_CTRL_MASK); op_mask = control_bits & uint(SIGN_EXPAND_MASK) & (ch_mask << EXPAND_R_BIT);
if (op_mask != 0u)
{
// Expand to signed normalized by decompressing the signal
mask = uvec4(op_mask) & uvec4(EXPAND_R_MASK, EXPAND_G_MASK, EXPAND_B_MASK, EXPAND_A_MASK);
convert = (rgba * 2.f - 1.f);
rgba = _select(rgba, convert, notEqual(mask, uvec4(0)));
ch_mask &= ~(op_mask >> EXPAND_R_BIT);
}
op_mask = control_bits & uint(GAMMA_CTRL_MASK) & (ch_mask << GAMMA_R_BIT);
if (op_mask != 0u) if (op_mask != 0u)
{ {
// Gamma correction // Gamma correction