dc1
This commit is contained in:
parent
d44ce7b93b
commit
39ae39293f
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue