rsx: Use 'format features' to drive BX2 texture sample remapping on the GPU

- Fixes problems with BX2 kicking in when it shouldn't
This commit is contained in:
kd-11 2026-02-10 02:58:51 +03:00 committed by kd-11
parent d3cd3e9650
commit 765e72dcb7
5 changed files with 34 additions and 7 deletions

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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;