diff --git a/src/video_core/host_shaders/astc_decoder.comp b/src/video_core/host_shaders/astc_decoder.comp index 2248a92a46..58dccb545f 100644 --- a/src/video_core/host_shaders/astc_decoder.comp +++ b/src/video_core/host_shaders/astc_decoder.comp @@ -296,14 +296,19 @@ uint ExtractBits(uvec4 payload, int offset, int bits) { if (bits > 32) { return 0; } - const int last_offset = offset + bits - 1; + if (offset >= 128) { + return 0; + } + const int avail_bits = min(bits, 128 - offset); + const int last_offset = offset + avail_bits - 1; const int shifted_offset = offset >> 5; if ((last_offset >> 5) == shifted_offset) { - return bitfieldExtract(payload[shifted_offset], offset & 31, bits); + return bitfieldExtract(payload[shifted_offset], offset & 31, avail_bits); } const int first_bits = 32 - (offset & 31); const int result_first = int(bitfieldExtract(payload[shifted_offset], offset & 31, first_bits)); - const int result_second = int(bitfieldExtract(payload[shifted_offset + 1], 0, bits - first_bits)); + const int result_second = + int(bitfieldExtract(payload[shifted_offset + 1], 0, avail_bits - first_bits)); return result_first | (result_second << first_bits); } diff --git a/src/video_core/texture_cache/util.cpp b/src/video_core/texture_cache/util.cpp index e55d0752ec..25cf6e33b1 100644 --- a/src/video_core/texture_cache/util.cpp +++ b/src/video_core/texture_cache/util.cpp @@ -950,7 +950,7 @@ void ConvertImage(std::span input, const ImageInfo& info, std::span input, const ImageInfo& info, std::span