From 39ae39293fbebeb1b13d8bd4c28c1bd6ca0c2889 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 28 Jan 2026 05:21:13 +0000 Subject: [PATCH] dc1 --- src/video_core/host_shaders/astc_decoder.comp | 41 ++++++++----------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/src/video_core/host_shaders/astc_decoder.comp b/src/video_core/host_shaders/astc_decoder.comp index edf761bdd3..5f9c215d39 100644 --- a/src/video_core/host_shaders/astc_decoder.comp +++ b/src/video_core/host_shaders/astc_decoder.comp @@ -270,10 +270,7 @@ uint Select2DPartition(uint seed, uint x, uint y, uint partition_count) { } uint ExtractBits(uvec4 payload, int offset, int bits) { - if (bits <= 0) { - return 0; - } - if (bits > 32) { + if (bits <= 0 || bits > 32) { return 0; } const int last_offset = offset + bits - 1; @@ -282,9 +279,9 @@ uint ExtractBits(uvec4 payload, int offset, int bits) { return bitfieldExtract(payload[shifted_offset], offset & 31, 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)); - return result_first | (result_second << first_bits); + const uvec4 next = uvec4(payload.yzw, 0); + return bitfieldExtract(payload[shifted_offset], offset & 31, first_bits) + | (bitfieldExtract(next[shifted_offset], 0, bits - first_bits) << first_bits); } uint StreamBits(uint num_bits) { @@ -837,15 +834,14 @@ void FillError(ivec3 coord) { } void FillVoidExtentLDR(ivec3 coord) { - SkipBits(52); - const uint r_u = StreamBits(16); - const uint g_u = StreamBits(16); - const uint b_u = StreamBits(16); - const uint a_u = StreamBits(16); - const float a = float(a_u) / 65535.0f; + const uint r_u = ExtractBits(local_buff, 11 + 52 + 16 * 0, 16); + const uint g_u = ExtractBits(local_buff, 11 + 52 + 16 * 1, 16); + const uint b_u = ExtractBits(local_buff, 11 + 52 + 16 * 2, 16); + const uint a_u = ExtractBits(local_buff, 11 + 52 + 16 * 3, 16); const float r = float(r_u) / 65535.0f; const float g = float(g_u) / 65535.0f; const float b = float(b_u) / 65535.0f; + const float a = float(a_u) / 65535.0f; for (uint j = 0; j < block_dims.y; j++) { for (uint i = 0; i < block_dims.x; i++) { imageStore(dest_image, coord + ivec3(i, j, 0), vec4(r, g, b, a)); @@ -904,9 +900,9 @@ int FindLayout(uint mode) { return 5; } -uvec2 DecodeBlockSize(uint layout, uint mode) { +uvec2 DecodeBlockSize(uint mode_layout, uint mode) { uint A, B; - switch (layout) { + switch (mode_layout) { case 0: A = (mode >> 5) & 0x3; B = (mode >> 7) & 0x3; @@ -963,11 +959,6 @@ uint DecodeMaxWeight(uint mode) { void DecompressBlock(ivec3 coord) { uint mode = StreamBits(11); - const uint num_partitions = StreamBits(2) + 1; - const uint mode_layout = FindLayout(mode); - const bool dual_plane = (mode_layout != 9) && ((mode & 0x400) != 0); - const uvec2 size_params = DecodeBlockSize(mode_layout, mode); - if (IsError(mode)) { FillError(coord); return; @@ -977,8 +968,12 @@ void DecompressBlock(ivec3 coord) { FillVoidExtentLDR(coord); return; } - if (((size_params.x > block_dims.x) || (size_params.y > block_dims.y)) - || (num_partitions > 4 || (num_partitions == 4 && dual_plane))) { + const uint num_partitions = StreamBits(2) + 1; + const uint mode_layout = FindLayout(mode); + const bool dual_plane = (mode_layout != 9) && ((mode & 0x400) != 0); + const uvec2 size_params = DecodeBlockSize(mode_layout, mode); + if (size_params.x > block_dims.x || size_params.y > block_dims.y + || num_partitions > 4 || (num_partitions == 4 && dual_plane)) { FillError(coord); return; } @@ -998,7 +993,7 @@ void DecompressBlock(ivec3 coord) { const uint weight_bits = GetPackedBitSize(size_params, dual_plane, max_weight); const uint extra_cem_bits = base_mode > 0 ? ((0x85200 >> (num_partitions * 4)) & 0x0f) : 0; const uint plane_selector_bits = dual_plane ? 2 : 0; - const uint remaining_bits = 128 - weight_bits - total_bitsread; + uint remaining_bits = 128 - weight_bits - total_bitsread; remaining_bits -= extra_cem_bits; remaining_bits -= plane_selector_bits; if (remaining_bits > 128) {