mirror of
https://github.com/RPCS3/rpcs3.git
synced 2026-03-10 15:38:08 +01:00
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:
parent
d3cd3e9650
commit
765e72dcb7
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue