diff --git a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp index ef2029c652..c00cef47e6 100644 --- a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp @@ -1192,7 +1192,7 @@ bool FragmentProgramDecompiler::handle_tex_srb(u32 opcode) if (dst.exp_tex) { properties.has_exp_tex_op = true; - AddCode("_enable_texture_expand();"); + AddCode("_enable_texture_expand($_i);"); } // Shadow proj diff --git a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp index 1421b179fc..8f7cc46e66 100644 --- a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp +++ b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp @@ -360,7 +360,11 @@ namespace glsl { "FILTERED_MAG_BIT", rsx::texture_control_bits::FILTERED_MAG }, { "FILTERED_MIN_BIT", rsx::texture_control_bits::FILTERED_MIN }, { "INT_COORDS_BIT ", rsx::texture_control_bits::UNNORMALIZED_COORDS }, - { "CLAMP_COORDS_BIT", rsx::texture_control_bits::CLAMP_TEXCOORDS_BIT } + { "CLAMP_COORDS_BIT", rsx::texture_control_bits::CLAMP_TEXCOORDS_BIT }, + + { "FORMAT_FEATURE_SIGNED_BIT", rsx::texture_control_bits::FF_SIGNED_BIT }, + { "FORMAT_FEATURE_GAMMA_BIT", rsx::texture_control_bits::FF_GAMMA_BIT }, + { "FORMAT_FEATURE_BIASED_RENORMALIZATION_BIT", rsx::texture_control_bits::FF_BIASED_RENORM_BIT } }); if (props.require_texture_expand) diff --git a/rpcs3/Emu/RSX/Program/GLSLCommon.h b/rpcs3/Emu/RSX/Program/GLSLCommon.h index 942374436e..b417947002 100644 --- a/rpcs3/Emu/RSX/Program/GLSLCommon.h +++ b/rpcs3/Emu/RSX/Program/GLSLCommon.h @@ -37,12 +37,16 @@ namespace rsx WRAP_S, WRAP_T, WRAP_R, + FF_SIGNED_BIT, + FF_BIASED_RENORM_BIT, + FF_GAMMA_BIT, GAMMA_CTRL_MASK = (1 << GAMMA_R) | (1 << GAMMA_G) | (1 << GAMMA_B) | (1 << GAMMA_A), EXPAND_MASK = (1 << EXPAND_R) | (1 << EXPAND_G) | (1 << EXPAND_B) | (1 << EXPAND_A), EXPAND_OFFSET = EXPAND_A, SEXT_MASK = (1 << SEXT_R) | (1 << SEXT_G) | (1 << SEXT_B) | (1 << SEXT_A), - SEXT_OFFSET = SEXT_A + SEXT_OFFSET = SEXT_A, + FORMAT_FEATURES_OFFSET = FF_SIGNED_BIT, }; enum ROP_control_bits : u32 diff --git a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl index 2f03cb7730..7e8e88533c 100644 --- a/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl +++ b/rpcs3/Emu/RSX/Program/GLSLSnippets/RSXProg/RSXFragmentTextureOps.glsl @@ -20,13 +20,30 @@ R"( #define SEXT_MASK (SEXT_R_MASK | SEXT_G_MASK | SEXT_B_MASK | SEXT_A_MASK) #define FILTERED_MASK (FILTERED_MAG_BIT | FILTERED_MIN_BIT) +#define FORMAT_FEATURE_SIGNED (1 << FORMAT_FEATURE_SIGNED_BIT) +#define FORMAT_FEATURE_GAMMA (1 << FORMAT_FEATURE_GAMMA_BIT) +#define FORMAT_FEATURE_BIASED_RENORMALIZATION (1 << FORMAT_FEATURE_BIASED_RENORMALIZATION_BIT) +#define FORMAT_FEATURE_MASK (FORMAT_FEATURE_SIGNED | FORMAT_FEATURE_GAMMA | FORMAT_FEATURE_BIASED_RENORMALIZATION) + #ifdef _ENABLE_TEXTURE_EXPAND + // NOTE: BX2 expansion overrides GAMMA correction uint _texture_flag_override = 0; - #define _enable_texture_expand() _texture_flag_override = SIGN_EXPAND_MASK - #define _disable_texture_expand() _texture_flag_override = 0 - #define TEX_FLAGS(index) (TEX_PARAM(index).flags | _texture_flag_override) + uint _texture_flag_erase = 0; + #define _enable_texture_expand(index) \ + do { \ + if (_test_bit(TEX_PARAM(index).flags, FORMAT_FEATURE_BIASED_RENORMALIZATION_BIT)) { \ + _texture_flag_override = SIGN_EXPAND_MASK; \ + _texture_flag_erase = GAMMA_CTRL_MASK; \ + } \ + } while (false) + #define _disable_texture_expand() \ + do { \ + _texture_flag_override = 0; \ + _texture_flag_erase = 0; \ + } while (false) + #define TEX_FLAGS(index) ((TEX_PARAM(index).flags & ~(FORMAT_FEATURE_MASK | _texture_flag_erase)) | _texture_flag_override) #else - #define TEX_FLAGS(index) TEX_PARAM(index).flags + #define TEX_FLAGS(index) (TEX_PARAM(index).flags & ~FORMAT_FEATURE_MASK) #endif #define TEX_NAME(index) tex##index diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 86edb7be9d..984f64afcd 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2361,6 +2361,8 @@ namespace rsx argb8_convert |= (argb8_signed << texture_control_bits::SEXT_OFFSET); argb8_convert |= (unsigned_remap << texture_control_bits::EXPAND_OFFSET); texture_control |= argb8_convert; + + texture_control |= format_features << texture_control_bits::FORMAT_FEATURES_OFFSET; } current_fragment_program.texture_params[i].control = texture_control;