From 3df370a7e62cec29a7516b24d826006ec2e6558e Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 10 Feb 2026 01:41:57 +0300 Subject: [PATCH] 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 --- .../RSXProg/RSXFragmentTextureOps.glsl | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl index f0457f0034..b95105e410 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl @@ -210,25 +210,29 @@ vec4 _process_texel(in vec4 rgba, const in uint control_bits) uvec4 mask; vec4 convert; - uint op_mask = control_bits & uint(SIGN_EXPAND_MASK); - 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))); - } + uint op_mask = control_bits & uint(SEXT_MASK); + uint ch_mask = 0xFu; - op_mask = control_bits & uint(SEXT_MASK); if (op_mask != 0u) { // Sign-extend the input signal mask = uvec4(op_mask) & uvec4(SEXT_R_MASK, SEXT_G_MASK, SEXT_B_MASK, SEXT_A_MASK); convert = _sext_unorm8x4(rgba); 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) { // Gamma correction