1
0
Fork 0
forked from suyu/suyu

flatten color_values

This commit is contained in:
Ameer J 2023-08-09 18:45:52 -04:00
parent 0f7220c9c8
commit 5c25712af9

View file

@ -457,8 +457,7 @@ void DecodeIntegerSequence(uint max_range, uint num_values) {
} }
} }
uvec4 color_values[8]; void DecodeColorValues(uvec4 modes, uint num_partitions, uint color_data_bits, out uint color_values[32]) {
void DecodeColorValues(uvec4 modes, uint num_partitions, uint color_data_bits) {
uint num_values = 0; uint num_values = 0;
for (uint i = 0; i < num_partitions; i++) { for (uint i = 0; i < num_partitions; i++) {
num_values += ((modes[i] >> 2) + 1) << 1; num_values += ((modes[i] >> 2) + 1) << 1;
@ -486,8 +485,7 @@ void DecodeColorValues(uvec4 modes, uint num_partitions, uint color_data_bits) {
A = ReplicateBitTo9((bitval & 1)); A = ReplicateBitTo9((bitval & 1));
switch (encoding) { switch (encoding) {
case JUST_BITS: case JUST_BITS:
color_values[out_index / 4][out_index % 4] = FastReplicateTo8(bitval, bitlen); color_values[++out_index] = FastReplicateTo8(bitval, bitlen);
++out_index;
break; break;
case TRIT: { case TRIT: {
D = QuintTritValue(val); D = QuintTritValue(val);
@ -566,8 +564,7 @@ void DecodeColorValues(uvec4 modes, uint num_partitions, uint color_data_bits) {
uint T = (D * C) + B; uint T = (D * C) + B;
T ^= A; T ^= A;
T = (A & 0x80) | (T >> 2); T = (A & 0x80) | (T >> 2);
color_values[out_index / 4][out_index % 4] = T; color_values[++out_index] = T;
++out_index;
} }
} }
} }
@ -592,19 +589,17 @@ ivec4 BlueContract(int a, int r, int g, int b) {
return ivec4(a, (r + b) >> 1, (g + b) >> 1, b); return ivec4(a, (r + b) >> 1, (g + b) >> 1, b);
} }
void ComputeEndpoints(out uvec4 ep1, out uvec4 ep2, uint color_endpoint_mode, void ComputeEndpoints(out uvec4 ep1, out uvec4 ep2, uint color_endpoint_mode, uint color_values[32],
inout uint colvals_index) { inout uint colvals_index) {
#define READ_UINT_VALUES(N) \ #define READ_UINT_VALUES(N) \
uvec4 V[2]; \ uvec4 V[2]; \
for (uint i = 0; i < N; i++) { \ for (uint i = 0; i < N; i++) { \
V[i / 4][i % 4] = color_values[colvals_index / 4][colvals_index % 4]; \ V[i / 4][i % 4] = color_values[++colvals_index]; \
++colvals_index; \
} }
#define READ_INT_VALUES(N) \ #define READ_INT_VALUES(N) \
ivec4 V[2]; \ ivec4 V[2]; \
for (uint i = 0; i < N; i++) { \ for (uint i = 0; i < N; i++) { \
V[i / 4][i % 4] = int(color_values[colvals_index / 4][colvals_index % 4]); \ V[i / 4][i % 4] = int(color_values[++colvals_index]); \
++colvals_index; \
} }
switch (color_endpoint_mode) { switch (color_endpoint_mode) {
@ -1111,11 +1106,11 @@ void DecompressBlock(ivec3 coord) {
{ {
// This decode phase should at most push 32 elements into the vector // This decode phase should at most push 32 elements into the vector
result_vector_max_index = 32; result_vector_max_index = 32;
uint color_values[32];
uint colvals_index = 0; uint colvals_index = 0;
DecodeColorValues(color_endpoint_mode, num_partitions, color_data_bits); DecodeColorValues(color_endpoint_mode, num_partitions, color_data_bits, color_values);
for (uint i = 0; i < num_partitions; i++) { for (uint i = 0; i < num_partitions; i++) {
ComputeEndpoints(endpoints0[i], endpoints1[i], color_endpoint_mode[i], ComputeEndpoints(endpoints0[i], endpoints1[i], color_endpoint_mode[i], color_values,
colvals_index); colvals_index);
} }
} }