mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-11-01 11:58:19 +00:00
[TEST] Changes on the ASTC enconding path
This commit is contained in:
@@ -964,35 +964,70 @@ void ComputeEndpoints(out uvec4 ep1, out uvec4 ep2, uint color_endpoint_mode, ui
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint UnquantizeTexelWeight(EncodingData val) {
|
uint UnquantizeTexelWeight(EncodingData val) {
|
||||||
uint encoding = Encoding(val), bitlen = NumBits(val), bitval = BitValue(val);
|
const uint encoding = Encoding(val);
|
||||||
if (encoding == JUST_BITS) {
|
const uint bitlen = NumBits(val);
|
||||||
return (bitlen >= 1 && bitlen <= 5)
|
const uint bitval = BitValue(val);
|
||||||
? uint(floor(0.5f + float(bitval) * 64.0f / float((1 << bitlen) - 1)))
|
const uint A = ReplicateBitTo7((bitval & 1));
|
||||||
: FastReplicateTo6(bitval, bitlen);
|
uint B = 0, C = 0, D = 0;
|
||||||
} else if (encoding == TRIT || encoding == QUINT) {
|
uint result = 0;
|
||||||
uint B = 0, C = 0, D = 0;
|
const uint bitlen_0_results[5] = {0, 16, 32, 48, 64};
|
||||||
uint b_mask = (0x3100 >> (bitlen * 4)) & 0xf;
|
switch (encoding) {
|
||||||
uint b = (bitval >> 1) & b_mask;
|
case JUST_BITS:
|
||||||
|
return FastReplicateTo6(bitval, bitlen);
|
||||||
|
case TRIT: {
|
||||||
D = QuintTritValue(val);
|
D = QuintTritValue(val);
|
||||||
if (encoding == TRIT) {
|
switch (bitlen) {
|
||||||
switch (bitlen) {
|
case 0:
|
||||||
case 0: return D * 32; //0,32,64
|
return bitlen_0_results[D * 2];
|
||||||
case 1: C = 50; break;
|
case 1: {
|
||||||
case 2: C = 23; B = (b << 6) | (b << 2) | b; break;
|
C = 50;
|
||||||
case 3: C = 11; B = (b << 5) | b; break;
|
break;
|
||||||
}
|
|
||||||
} else if (encoding == QUINT) {
|
|
||||||
switch (bitlen) {
|
|
||||||
case 0: return D * 16; //0, 16, 32, 48, 64
|
|
||||||
case 1: C = 28; break;
|
|
||||||
case 2: C = 13; B = (b << 6) | (b << 1); break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
uint A = ReplicateBitTo7(bitval & 1);
|
case 2: {
|
||||||
uint res = (A & 0x20) | (((D * C + B) ^ A) >> 2);
|
C = 23;
|
||||||
return res + (res > 32 ? 1 : 0);
|
const uint b = (bitval >> 1) & 1;
|
||||||
|
B = (b << 6) | (b << 2) | b;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 3: {
|
||||||
|
C = 11;
|
||||||
|
const uint cb = (bitval >> 1) & 3;
|
||||||
|
B = (cb << 5) | cb;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
case QUINT: {
|
||||||
|
D = QuintTritValue(val);
|
||||||
|
switch (bitlen) {
|
||||||
|
case 0:
|
||||||
|
return bitlen_0_results[D];
|
||||||
|
case 1: {
|
||||||
|
C = 28;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2: {
|
||||||
|
C = 13;
|
||||||
|
const uint b = (bitval >> 1) & 1;
|
||||||
|
B = (b << 6) | (b << 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (encoding != JUST_BITS && bitlen > 0) {
|
||||||
|
result = D * C + B;
|
||||||
|
result ^= A;
|
||||||
|
result = (A & 0x20) | (result >> 2);
|
||||||
|
}
|
||||||
|
if (result > 32) {
|
||||||
|
result += 1;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UnquantizeTexelWeights(uvec2 size, bool is_dual_plane) {
|
void UnquantizeTexelWeights(uvec2 size, bool is_dual_plane) {
|
||||||
@@ -1394,11 +1429,10 @@ void DecompressBlock(ivec3 coord) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint SwizzleOffset(uvec2 pos) {
|
uint SwizzleOffset(uvec2 pos) {
|
||||||
return ((pos.x & 32u) << 3u) |
|
const uint x = pos.x;
|
||||||
((pos.y & 6u) << 5u) |
|
const uint y = pos.y;
|
||||||
((pos.x & 16u) << 1u) |
|
return ((x % 64) / 32) * 256 + ((y % 8) / 2) * 64 +
|
||||||
((pos.y & 1u) << 4u) |
|
((x % 32) / 16) * 32 + (y % 2) * 16 + (x % 16);
|
||||||
(pos.x & 15u);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
|
|||||||
Reference in New Issue
Block a user