From 5a10e951881ec9ed4dfd202e04a125c0ba97918f Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 29 Jan 2026 20:46:16 +0000 Subject: [PATCH] bullshit global memory reads --- src/video_core/host_shaders/astc_decoder.comp | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/video_core/host_shaders/astc_decoder.comp b/src/video_core/host_shaders/astc_decoder.comp index e62fc677ec..aa2468846e 100644 --- a/src/video_core/host_shaders/astc_decoder.comp +++ b/src/video_core/host_shaders/astc_decoder.comp @@ -81,7 +81,6 @@ uint result_vector[ARRAY_NUM_ELEMENTS * 2]; int result_index = 0; uint result_vector_max_index; -bool result_limit_reached = false; // EncodingData helpers uint Encoding(EncodingData val) { @@ -117,12 +116,10 @@ EncodingData CreateEncodingData(uint encoding, uint num_bits, uint bit_val, uint void ResultEmplaceBack(EncodingData val) { - if (result_index >= result_vector_max_index) { - // Alert callers to avoid decoding more than needed by this phase - result_limit_reached = true; - return; - } - result_vector[result_index] = val.data; + // A = result_index, B = result_vector_max_index + // A >= B -> A - B >= 0 + // A < B -> A - B < 0 + result_vector[min(32U, result_index)] = val.data; // 0 if not set ++result_index; } @@ -383,7 +380,7 @@ void DecodeIntegerSequence(uint max_range, uint num_values) { EncodingData val = EncodingData(encoding_values[max_range]); const uint encoding = Encoding(val); const uint num_bits = NumBits(val); - for (uint vals_decoded = 0; vals_decoded < num_values && !result_limit_reached; ) { + for (uint vals_decoded = 0; vals_decoded < num_values && result_index < result_vector_max_index; ) { switch (encoding) { case QUINT: DecodeQuintBlock(num_bits); @@ -515,9 +512,10 @@ void DecodeColorValues(uvec4 modes, uint num_partitions, uint color_data_bits, o } ivec2 BitTransferSigned(int a, int b) { - ivec2 transferred; - transferred.x = (a >> 1) & 0x3F; - transferred.y = (b >> 1) | (a & 0x80); + ivec2 transferred = ivec2( + (a >> 1) & 0x3F, + (b >> 1) | (a & 0x80) + ); if ((transferred.x & 0x20) > 0) { transferred.x -= 0x40; } @@ -999,7 +997,6 @@ void DecompressBlock(ivec3 coord) { // Re-init vector variables for next decode phase result_index = 0; color_bitsread = 0; - result_limit_reached = false; // The limit for the Unquantize phase, avoids decoding more data than needed. result_vector_max_index = size_params.x * size_params.y;