diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl index b95105e410..2f03cb7730 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl @@ -219,26 +219,26 @@ vec4 _process_texel(in vec4 rgba, const in uint control_bits) 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); + ch_mask &= ~(op_mask >> SEXT_A_BIT); } - op_mask = control_bits & uint(SIGN_EXPAND_MASK) & (ch_mask << EXPAND_R_BIT); + op_mask = control_bits & uint(GAMMA_CTRL_MASK) & (ch_mask << GAMMA_A_BIT); + if (op_mask != 0u) + { + // Gamma correction + mask = uvec4(op_mask) & uvec4(GAMMA_R_MASK, GAMMA_G_MASK, GAMMA_B_MASK, GAMMA_A_MASK); + convert = srgb_to_linear(rgba); + rgba = _select(rgba, convert, notEqual(mask, uvec4(0))); + ch_mask &= ~(op_mask >> GAMMA_A_BIT); + } + + op_mask = control_bits & uint(SIGN_EXPAND_MASK) & (ch_mask << EXPAND_A_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 - mask = uvec4(op_mask) & uvec4(GAMMA_R_MASK, GAMMA_G_MASK, GAMMA_B_MASK, GAMMA_A_MASK); - convert = srgb_to_linear(rgba); - return _select(rgba, convert, notEqual(mask, uvec4(0))); } return rgba;