rsx: Handle 16-bit format remapping

This commit is contained in:
kd-11
2026-02-12 02:22:34 +03:00
committed by kd-11
parent 2f5a66581f
commit 49029c9b98
5 changed files with 49 additions and 28 deletions
+4 -2
View File
@@ -1231,9 +1231,11 @@ namespace rsx
return RSX_FORMAT_FEATURE_BIASED_NORMALIZATION; return RSX_FORMAT_FEATURE_BIASED_NORMALIZATION;
case CELL_GCM_TEXTURE_X16: case CELL_GCM_TEXTURE_X16:
// X16 - GAMMA causes hangs. ARGB8_SIGNED is ignored. UNSIGNED_REMAP=BIASED works.
return RSX_FORMAT_FEATURE_BIASED_NORMALIZATION | RSX_FORMAT_FEATURE_16BIT_CHANNELS;
case CELL_GCM_TEXTURE_Y16_X16: case CELL_GCM_TEXTURE_Y16_X16:
// X16 | Y16 - GAMMA causes hangs. ARGB8_SIGNED is ignored. UNSIGNED_REMAP=BIASED works. // X16 | Y16 - GAMMA causes hangs. ARGB8_SIGNED works. UNSIGNED_REMAP=BIASED also works.
return RSX_FORMAT_FEATURE_BIASED_NORMALIZATION; return RSX_FORMAT_FEATURE_SIGNED_COMPONENTS | RSX_FORMAT_FEATURE_BIASED_NORMALIZATION | RSX_FORMAT_FEATURE_16BIT_CHANNELS;
case CELL_GCM_TEXTURE_COMPRESSED_HILO8: case CELL_GCM_TEXTURE_COMPRESSED_HILO8:
// GAMMA causes GPU hangs. ARGB8_SIGNED is ignored. UNSIGNED_REMAP=BIASED works. // GAMMA causes GPU hangs. ARGB8_SIGNED is ignored. UNSIGNED_REMAP=BIASED works.
+1
View File
@@ -132,6 +132,7 @@ namespace rsx
RSX_FORMAT_FEATURE_SIGNED_COMPONENTS = (1 << 0), RSX_FORMAT_FEATURE_SIGNED_COMPONENTS = (1 << 0),
RSX_FORMAT_FEATURE_BIASED_NORMALIZATION = (1 << 1), RSX_FORMAT_FEATURE_BIASED_NORMALIZATION = (1 << 1),
RSX_FORMAT_FEATURE_GAMMA_CORRECTION = (1 << 2), RSX_FORMAT_FEATURE_GAMMA_CORRECTION = (1 << 2),
RSX_FORMAT_FEATURE_16BIT_CHANNELS = (1 << 3), // Complements RSX_FORMAT_FEATURE_SIGNED_COMPONENTS
}; };
using enum format_features; using enum format_features;
+14 -13
View File
@@ -337,18 +337,18 @@ namespace glsl
// Declare special texture control flags // Declare special texture control flags
program_common::define_glsl_constants<rsx::texture_control_bits>(OS, program_common::define_glsl_constants<rsx::texture_control_bits>(OS,
{ {
{ "GAMMA_R_BIT " , rsx::texture_control_bits::GAMMA_R }, { "GAMMA_R_BIT ", rsx::texture_control_bits::GAMMA_R },
{ "GAMMA_G_BIT " , rsx::texture_control_bits::GAMMA_G }, { "GAMMA_G_BIT ", rsx::texture_control_bits::GAMMA_G },
{ "GAMMA_B_BIT " , rsx::texture_control_bits::GAMMA_B }, { "GAMMA_B_BIT ", rsx::texture_control_bits::GAMMA_B },
{ "GAMMA_A_BIT " , rsx::texture_control_bits::GAMMA_A }, { "GAMMA_A_BIT ", rsx::texture_control_bits::GAMMA_A },
{ "EXPAND_R_BIT" , rsx::texture_control_bits::EXPAND_R }, { "EXPAND_R_BIT", rsx::texture_control_bits::EXPAND_R },
{ "EXPAND_G_BIT" , rsx::texture_control_bits::EXPAND_G }, { "EXPAND_G_BIT", rsx::texture_control_bits::EXPAND_G },
{ "EXPAND_B_BIT" , rsx::texture_control_bits::EXPAND_B }, { "EXPAND_B_BIT", rsx::texture_control_bits::EXPAND_B },
{ "EXPAND_A_BIT" , rsx::texture_control_bits::EXPAND_A }, { "EXPAND_A_BIT", rsx::texture_control_bits::EXPAND_A },
{ "SEXT_R_BIT" , rsx::texture_control_bits::SEXT_R }, { "SEXT_R_BIT", rsx::texture_control_bits::SEXT_R },
{ "SEXT_G_BIT" , rsx::texture_control_bits::SEXT_G }, { "SEXT_G_BIT", rsx::texture_control_bits::SEXT_G },
{ "SEXT_B_BIT" , rsx::texture_control_bits::SEXT_B }, { "SEXT_B_BIT", rsx::texture_control_bits::SEXT_B },
{ "SEXT_A_BIT" , rsx::texture_control_bits::SEXT_A }, { "SEXT_A_BIT", rsx::texture_control_bits::SEXT_A },
{ "WRAP_S_BIT", rsx::texture_control_bits::WRAP_S }, { "WRAP_S_BIT", rsx::texture_control_bits::WRAP_S },
{ "WRAP_T_BIT", rsx::texture_control_bits::WRAP_T }, { "WRAP_T_BIT", rsx::texture_control_bits::WRAP_T },
{ "WRAP_R_BIT", rsx::texture_control_bits::WRAP_R }, { "WRAP_R_BIT", rsx::texture_control_bits::WRAP_R },
@@ -364,7 +364,8 @@ namespace glsl
{ "FORMAT_FEATURE_SIGNED_BIT", rsx::texture_control_bits::FF_SIGNED_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_GAMMA_BIT", rsx::texture_control_bits::FF_GAMMA_BIT },
{ "FORMAT_FEATURE_BIASED_RENORMALIZATION_BIT", rsx::texture_control_bits::FF_BIASED_RENORM_BIT } { "FORMAT_FEATURE_BIASED_RENORMALIZATION_BIT", rsx::texture_control_bits::FF_BIASED_RENORM_BIT },
{ "FORMAT_FEATURE_16BIT_CHANNELS_BIT", rsx::texture_control_bits::FF_16BIT_CHANNELS_BIT }
}); });
if (props.require_texture_expand) if (props.require_texture_expand)
+1
View File
@@ -40,6 +40,7 @@ namespace rsx
FF_SIGNED_BIT, FF_SIGNED_BIT,
FF_BIASED_RENORM_BIT, FF_BIASED_RENORM_BIT,
FF_GAMMA_BIT, FF_GAMMA_BIT,
FF_16BIT_CHANNELS_BIT,
GAMMA_CTRL_MASK = (1 << GAMMA_R) | (1 << GAMMA_G) | (1 << GAMMA_B) | (1 << GAMMA_A), 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_MASK = (1 << EXPAND_R) | (1 << EXPAND_G) | (1 << EXPAND_B) | (1 << EXPAND_A),
@@ -23,7 +23,8 @@ R"(
#define FORMAT_FEATURE_SIGNED (1 << FORMAT_FEATURE_SIGNED_BIT) #define FORMAT_FEATURE_SIGNED (1 << FORMAT_FEATURE_SIGNED_BIT)
#define FORMAT_FEATURE_GAMMA (1 << FORMAT_FEATURE_GAMMA_BIT) #define FORMAT_FEATURE_GAMMA (1 << FORMAT_FEATURE_GAMMA_BIT)
#define FORMAT_FEATURE_BIASED_RENORMALIZATION (1 << FORMAT_FEATURE_BIASED_RENORMALIZATION_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) #define FORMAT_FEATURE_16BIT_CHANNELS (1 << FORMAT_FEATURE_16BIT_CHANNELS_BIT)
#define FORMAT_FEATURE_MASK (FORMAT_FEATURE_SIGNED | FORMAT_FEATURE_GAMMA | FORMAT_FEATURE_BIASED_RENORMALIZATION | FORMAT_FEATURE_16BIT_CHANNELS)
#ifdef _ENABLE_TEXTURE_EXPAND #ifdef _ENABLE_TEXTURE_EXPAND
// NOTE: BX2 expansion overrides GAMMA correction // NOTE: BX2 expansion overrides GAMMA correction
@@ -44,9 +45,9 @@ R"(
_texture_flag_erase = 0; \ _texture_flag_erase = 0; \
_texture_bx2_active = false; \ _texture_bx2_active = false; \
} while (false) } while (false)
#define TEX_FLAGS(index) ((TEX_PARAM(index).flags & ~(FORMAT_FEATURE_MASK | _texture_flag_erase)) | _texture_flag_override) #define TEX_FLAGS(index) ((TEX_PARAM(index).flags & ~(_texture_flag_erase)) | _texture_flag_override)
#else #else
#define TEX_FLAGS(index) (TEX_PARAM(index).flags & ~FORMAT_FEATURE_MASK) #define TEX_FLAGS(index) (TEX_PARAM(index).flags)
#endif #endif
#define TEX_NAME(index) tex##index #define TEX_NAME(index) tex##index
@@ -195,10 +196,19 @@ vec4 _texcoord_xform_shadow(const in vec4 coord4, const in sampler_info params)
vec4 _sext_unorm8x4(const in vec4 x) vec4 _sext_unorm8x4(const in vec4 x)
{ {
// TODO: Handle clamped sign-extension // TODO: Handle clamped sign-extension
const vec4 bits = floor(fma(x, vec4(255.f), vec4(0.5f))); const uint shift = 32 - 8; // sext 8-bit value into 32-bit container
const bvec4 sign_check = lessThan(bits, vec4(128.f)); const uvec4 ubits = uvec4(floor(fma(x, vec4(255.f), vec4(0.5f))));
const vec4 ret = _select(bits - 256.f, bits, sign_check); const ivec4 ibits = ivec4(ubits << shift);
return ret / 127.f; return (ibits >> shift) / 127.f;
}
vec4 _sext_unorm16x4(const in vec4 x)
{
// TODO: Handle clamped sign-extension
const uint shift = 32 - 16; // sext 16-bit value into 32-bit container
const uvec4 ubits = uvec4(floor(fma(x, vec4(65535.f), vec4(0.5f))));
const ivec4 ibits = ivec4(ubits << shift);
return (ibits >> shift) / 32767.f;
} }
vec4 _process_texel(in vec4 rgba, const in uint control_bits) vec4 _process_texel(in vec4 rgba, const in uint control_bits)
@@ -237,6 +247,9 @@ vec4 _process_texel(in vec4 rgba, const in uint control_bits)
{ {
// Sign-extend the input signal // Sign-extend the input signal
mask = uvec4(op_mask) & uvec4(SEXT_R_MASK, SEXT_G_MASK, SEXT_B_MASK, SEXT_A_MASK); mask = uvec4(op_mask) & uvec4(SEXT_R_MASK, SEXT_G_MASK, SEXT_B_MASK, SEXT_A_MASK);
if (_test_bit(control_bits, FORMAT_FEATURE_16BIT_CHANNELS_BIT))
convert = _sext_unorm16x4(rgba);
else
convert = _sext_unorm8x4(rgba); convert = _sext_unorm8x4(rgba);
rgba = _select(rgba, convert, notEqual(mask, uvec4(0))); rgba = _select(rgba, convert, notEqual(mask, uvec4(0)));
ch_mask &= ~(op_mask >> SEXT_A_BIT); ch_mask &= ~(op_mask >> SEXT_A_BIT);
@@ -262,6 +275,9 @@ vec4 _process_texel(in vec4 rgba, const in uint control_bits)
convert = (rgba * 2.f - 1.f); convert = (rgba * 2.f - 1.f);
else else
#endif #endif
if (_test_bit(control_bits, FORMAT_FEATURE_16BIT_CHANNELS_BIT))
convert = (floor(fma(rgba, vec4(65535.f), vec4(0.5f))) - 32768.f) / 32767.f;
else
convert = (floor(fma(rgba, vec4(255.f), vec4(0.5f))) - 128.f) / 127.f; convert = (floor(fma(rgba, vec4(255.f), vec4(0.5f))) - 128.f) / 127.f;
rgba = _select(rgba, convert, notEqual(mask, uvec4(0))); rgba = _select(rgba, convert, notEqual(mask, uvec4(0)));
} }