Browse Source

bullshit global memory reads

lizzie/astc-mp4-improv
lizzie 1 month ago
committed by crueter
parent
commit
5a10e95188
  1. 21
      src/video_core/host_shaders/astc_decoder.comp

21
src/video_core/host_shaders/astc_decoder.comp

@ -81,7 +81,6 @@ uint result_vector[ARRAY_NUM_ELEMENTS * 2];
int result_index = 0; int result_index = 0;
uint result_vector_max_index; uint result_vector_max_index;
bool result_limit_reached = false;
// EncodingData helpers // EncodingData helpers
uint Encoding(EncodingData val) { uint Encoding(EncodingData val) {
@ -117,12 +116,10 @@ EncodingData CreateEncodingData(uint encoding, uint num_bits, uint bit_val, uint
void ResultEmplaceBack(EncodingData val) { 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; ++result_index;
} }
@ -383,7 +380,7 @@ void DecodeIntegerSequence(uint max_range, uint num_values) {
EncodingData val = EncodingData(encoding_values[max_range]); EncodingData val = EncodingData(encoding_values[max_range]);
const uint encoding = Encoding(val); const uint encoding = Encoding(val);
const uint num_bits = NumBits(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) { switch (encoding) {
case QUINT: case QUINT:
DecodeQuintBlock(num_bits); 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 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) { if ((transferred.x & 0x20) > 0) {
transferred.x -= 0x40; transferred.x -= 0x40;
} }
@ -999,7 +997,6 @@ void DecompressBlock(ivec3 coord) {
// Re-init vector variables for next decode phase // Re-init vector variables for next decode phase
result_index = 0; result_index = 0;
color_bitsread = 0; color_bitsread = 0;
result_limit_reached = false;
// The limit for the Unquantize phase, avoids decoding more data than needed. // The limit for the Unquantize phase, avoids decoding more data than needed.
result_vector_max_index = size_params.x * size_params.y; result_vector_max_index = size_params.x * size_params.y;

Loading…
Cancel
Save