mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-02-04 02:51:18 +01:00
pressure to NOT use global mem
This commit is contained in:
@@ -82,8 +82,6 @@ const uint encoding_values[22] = uint[](
|
||||
|
||||
// Input ASTC texture globals
|
||||
uint total_bitsread = 0;
|
||||
uvec4 local_buff;
|
||||
|
||||
// Color data globals
|
||||
uvec4 color_endpoint_data;
|
||||
uint color_bitsread = 0;
|
||||
@@ -239,7 +237,7 @@ uint ExtractBits(uvec4 payload, uint offset, uint bits) {
|
||||
| (bitfieldExtract(next[shifted_offset], 0, int(bits - first_bits)) << first_bits);
|
||||
}
|
||||
|
||||
uint StreamBits(uint num_bits) {
|
||||
uint StreamBits(uvec4 local_buff, uint num_bits) {
|
||||
const uint ret = ExtractBits(local_buff, total_bitsread, num_bits);
|
||||
total_bitsread += num_bits;
|
||||
return ret;
|
||||
@@ -751,13 +749,13 @@ void FillError(ivec3 coord) {
|
||||
}
|
||||
}
|
||||
|
||||
void FillVoidExtentLDR(ivec3 coord) {
|
||||
void FillVoidExtentLDR(uvec4 local_buff, ivec3 coord) {
|
||||
// TODO: If you do extract bits, remember that it may be 11, or OTHER
|
||||
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 uint r_u = StreamBits(local_buff, 16);
|
||||
const uint g_u = StreamBits(local_buff, 16);
|
||||
const uint b_u = StreamBits(local_buff, 16);
|
||||
const uint a_u = StreamBits(local_buff, 16);
|
||||
const float a = float(a_u) / 65535.0f;
|
||||
const float r = float(r_u) / 65535.0f;
|
||||
const float g = float(g_u) / 65535.0f;
|
||||
@@ -769,13 +767,13 @@ void FillVoidExtentLDR(ivec3 coord) {
|
||||
}
|
||||
}
|
||||
|
||||
bool IsError(uint mode) {
|
||||
bool IsError(uvec4 local_buff, uint mode) {
|
||||
if ((mode & 0x1ff) == 0x1fc) {
|
||||
if ((mode & 0x200) != 0) {
|
||||
// params.void_extent_hdr = true;
|
||||
return true;
|
||||
}
|
||||
if ((mode & 0x400) == 0 || StreamBits(1) == 0) {
|
||||
if ((mode & 0x400) == 0 || StreamBits(local_buff, 1) == 0) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -868,18 +866,18 @@ uint DecodeMaxWeight(uint mode_layout, uint mode) {
|
||||
+ (6 & cmp_add6) - 1;
|
||||
}
|
||||
|
||||
void DecompressBlock(ivec3 coord) {
|
||||
uint mode = StreamBits(11);
|
||||
if (IsError(mode)) {
|
||||
void DecompressBlock(uvec4 local_buff, ivec3 coord) {
|
||||
uint mode = StreamBits(local_buff, 11);
|
||||
if (IsError(local_buff, mode)) {
|
||||
FillError(coord);
|
||||
return;
|
||||
}
|
||||
if ((mode & 0x1ff) == 0x1fc) {
|
||||
// params.void_extent_ldr = true;
|
||||
FillVoidExtentLDR(coord);
|
||||
FillVoidExtentLDR(local_buff, coord);
|
||||
return;
|
||||
}
|
||||
const uint num_partitions = StreamBits(2) + 1;
|
||||
const uint num_partitions = StreamBits(local_buff, 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);
|
||||
@@ -893,11 +891,11 @@ void DecompressBlock(ivec3 coord) {
|
||||
uint ced_pointer = 0;
|
||||
uint base_cem = 0;
|
||||
if (num_partitions == 1) {
|
||||
color_endpoint_mode.x = StreamBits(4);
|
||||
color_endpoint_mode.x = StreamBits(local_buff, 4);
|
||||
partition_index = 0;
|
||||
} else {
|
||||
partition_index = StreamBits(10);
|
||||
base_cem = StreamBits(6);
|
||||
partition_index = StreamBits(local_buff, 10);
|
||||
base_cem = StreamBits(local_buff, 6);
|
||||
}
|
||||
const uint base_mode = base_cem & 3;
|
||||
const uint max_weight = DecodeMaxWeight(mode_layout, mode);
|
||||
@@ -916,16 +914,16 @@ void DecompressBlock(ivec3 coord) {
|
||||
const uint color_data_bits = remaining_bits;
|
||||
while (remaining_bits > 0) {
|
||||
const int nb = int(min(remaining_bits, 32U));
|
||||
color_endpoint_data[ced_pointer] = StreamBits(nb);
|
||||
color_endpoint_data[ced_pointer] = StreamBits(local_buff, nb);
|
||||
++ced_pointer;
|
||||
remaining_bits -= nb;
|
||||
}
|
||||
|
||||
// color_endpoint_mode assumed to be 0 on invalids/out of "range"
|
||||
const uint plane_index = uint(StreamBits(plane_selector_bits));
|
||||
const uint plane_index = uint(StreamBits(local_buff, plane_selector_bits));
|
||||
const uvec4 cem_mask = (uvec4(0, 1, 2, 3) - num_partitions) >> 8;
|
||||
if (base_mode > 0) {
|
||||
const uint extra_cem = StreamBits(extra_cem_bits);
|
||||
const uint extra_cem = StreamBits(local_buff, extra_cem_bits);
|
||||
const uint cem = ((extra_cem << 6) | base_cem) >> 2;
|
||||
const uint c0 = cem & ((1 << num_partitions) - 1);
|
||||
const uint c1 = (cem >> num_partitions) & ((1 << (num_partitions << 1)) - 1);
|
||||
@@ -1003,6 +1001,5 @@ void main() {
|
||||
if (any(greaterThanEqual(coord, imageSize(dest_image)))) {
|
||||
return;
|
||||
}
|
||||
local_buff = astc_data[offset >> 4];
|
||||
DecompressBlock(coord);
|
||||
DecompressBlock(astc_data[offset >> 4], coord);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user