diff --git a/src/video_core/host_shaders/astc_decoder.comp b/src/video_core/host_shaders/astc_decoder.comp index 939734668d..19eed36d8c 100644 --- a/src/video_core/host_shaders/astc_decoder.comp +++ b/src/video_core/host_shaders/astc_decoder.comp @@ -153,26 +153,31 @@ uint ReplicateBitTo9(uint value) { return value * 511; } +const uint mod6_table = 0 + | ((6 % 1) << (2 * 1)) | ((6 % 2) << (2 * 2)) + | ((6 % 3) << (2 * 3)) | ((6 % 4) << (2 * 4)) + | ((6 % 5) << (2 * 5)) | ((6 % 6) << (2 * 6)); +const uint mod8_table = 0 + | ((8 % 1) << (2 * 1)) | ((8 % 2) << (2 * 2)) + | ((8 % 3) << (2 * 3)) | ((8 % 4) << (2 * 4)) + | ((8 % 5) << (2 * 5)) | ((8 % 6) << (2 * 6)) + | ((8 % 7) << (2 * 7)) | ((8 % 8) << (2 * 8)); // Assumes num_bits < to_bit, num_bits and to_bit != 0 -uint ReplicateBits(uint value, uint num_bits, uint to_bit) { +uint ReplicateBits(uint value, uint num_bits, uint to_bit, uint table) { const uint repl = value & ((1 << num_bits) - 1); + const uint shift = (table >> (num_bits * 2)) & 3; uint v = repl; - v |= v << (num_bits << 0); // [ xxxx xxxr ] - v |= v << (num_bits << 1); // [ xxxx xxrr ] - v |= v << (num_bits << 2); // [ xxxx rrrr ] - v |= v << (num_bits << 3); // [ rrrr rrrr ] - const uint shift = (to_bit % num_bits); - v <<= shift; - v |= repl >> (num_bits - shift); + v |= v << (num_bits << 0); // [ xxxx xxrr ] + v |= v << (num_bits << 1); // [ xxxx rrrr ] + v |= v << (num_bits << 2); // [ rrrr rrrr ] + v = (v << shift) | repl >> (num_bits - shift); return v & ((1 << to_bit) - 1); } - uint FastReplicateTo8(uint value, uint num_bits) { - return ReplicateBits(value, num_bits, 8); + return ReplicateBits(value, num_bits, 8, mod8_table); } - uint FastReplicateTo6(uint value, uint num_bits) { - return ReplicateBits(value, num_bits, 6); + return ReplicateBits(value, num_bits, 6, mod6_table); } uint Hash52(uint p) {