This commit is contained in:
lizzie 2026-01-28 05:21:13 +00:00 committed by crueter
parent d44ce7b93b
commit 39ae39293f
1 changed files with 18 additions and 23 deletions

View File

@ -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) {