mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 02:47:02 +02:00
Add GPU tilers/tests
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
layout(local_size_x = 64) in;
|
||||
|
||||
layout(set = 0, binding = 0, std430) readonly buffer Input { uint data[]; } input_buffer;
|
||||
layout(set = 0, binding = 1, std430) buffer Output { uint data[]; } output_buffer;
|
||||
|
||||
layout(push_constant) uniform Push {
|
||||
uint src_base;
|
||||
uint dst_base;
|
||||
uint width;
|
||||
uint height;
|
||||
uint depth;
|
||||
uint surface_z;
|
||||
uint pitch_bytes;
|
||||
uint slice_bytes;
|
||||
uint blocks_per_row;
|
||||
uint blocks_per_slice;
|
||||
uint tail_x;
|
||||
uint tail_y;
|
||||
uint tail;
|
||||
uint first;
|
||||
uint count;
|
||||
} params;
|
||||
|
||||
void copy_element(uint src, uint dst) {
|
||||
if (ELEMENT_BYTES >= 4) {
|
||||
for (uint i = 0; i < ELEMENT_BYTES; i += 4) {
|
||||
output_buffer.data[(dst + i) >> 2] = input_buffer.data[(src + i) >> 2];
|
||||
}
|
||||
} else {
|
||||
uint mask = ELEMENT_BYTES == 1 ? 0xffu : 0xffffu;
|
||||
uint value = (input_buffer.data[src >> 2] >> ((src & 3u) * 8u)) & mask;
|
||||
atomicOr(output_buffer.data[dst >> 2], value << ((dst & 3u) * 8u));
|
||||
}
|
||||
}
|
||||
|
||||
void main() {
|
||||
uint index = gl_GlobalInvocationID.x;
|
||||
if (index >= params.count) {
|
||||
return;
|
||||
}
|
||||
|
||||
uint element = params.first + index;
|
||||
uint plane = params.width * params.height;
|
||||
uvec3 p;
|
||||
p.z = element / plane;
|
||||
element -= p.z * plane;
|
||||
p.y = element / params.width;
|
||||
p.x = element - p.y * params.width;
|
||||
|
||||
uvec3 extent = block_extent();
|
||||
uvec3 swizzle = p;
|
||||
uvec3 block = uvec3(0);
|
||||
if (params.tail != 0) {
|
||||
swizzle.xy += uvec2(params.tail_x, params.tail_y);
|
||||
} else {
|
||||
block = p / extent;
|
||||
}
|
||||
|
||||
uint block_index = block.z * params.blocks_per_slice +
|
||||
block.y * params.blocks_per_row + block.x;
|
||||
uint tiled = block_index * BLOCK_BYTES +
|
||||
block_offset(uvec3(swizzle.xy, swizzle.z + params.surface_z));
|
||||
uint linear = p.z * params.slice_bytes + p.y * params.pitch_bytes +
|
||||
p.x * ELEMENT_BYTES;
|
||||
if (TILE == 0) {
|
||||
copy_element(params.src_base + tiled, params.dst_base + linear);
|
||||
} else {
|
||||
copy_element(params.src_base + linear, params.dst_base + tiled);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
#version 450
|
||||
#extension GL_GOOGLE_include_directive : require
|
||||
layout(constant_id = 0) const uint ELEMENT_BYTES = 4u;
|
||||
layout(constant_id = 1) const uint TILE = 0u;
|
||||
const uint BLOCK_BYTES = 65536u;
|
||||
uvec3 block_extent() {
|
||||
uint width = ELEMENT_BYTES <= 2 ? 256u : 128u;
|
||||
return uvec3(width, BLOCK_BYTES / (width * ELEMENT_BYTES), 1u);
|
||||
}
|
||||
uint block_offset(uvec3 p) {
|
||||
uint x = p.x, y = p.y;
|
||||
uint z = ((p.z & 8u) << 5) ^ ((p.z & 4u) << 7) ^
|
||||
((p.z & 2u) << 9) ^ ((p.z & 1u) << 11);
|
||||
switch (ELEMENT_BYTES) {
|
||||
case 1: return z ^ (x & 1u) ^ ((x << 1) & 0x004u) ^ ((x << 2) & 0x010u) ^
|
||||
((x << 3) & 0x040u) ^ ((x << 5) & 0x300u) ^
|
||||
((x << 4) & 0x400u) ^ ((x << 6) & 0x800u) ^
|
||||
((x << 7) & 0x2000u) ^ ((x << 8) & 0x8000u) ^
|
||||
((y << 1) & 0x002u) ^ ((y << 2) & 0x008u) ^
|
||||
((y << 3) & 0x0a0u) ^ ((y << 5) & 0xf00u) ^
|
||||
((y << 6) & 0x1000u) ^ ((y << 7) & 0x4000u);
|
||||
case 2: return z ^ ((x << 1) & 0x002u) ^ ((x << 2) & 0x008u) ^
|
||||
((x << 3) & 0x020u) ^ ((x << 4) & 0x480u) ^
|
||||
((x << 5) & 0x300u) ^ ((x << 6) & 0x800u) ^
|
||||
((x << 7) & 0x2000u) ^ ((x << 8) & 0x8000u) ^
|
||||
((y << 2) & 0x004u) ^ ((y << 3) & 0x010u) ^
|
||||
((y << 4) & 0x040u) ^ ((y << 5) & 0xf00u) ^ ((y << 8) & 0x5000u);
|
||||
case 4: return z ^ ((x << 2) & 0x004u) ^ ((x << 3) & 0x010u) ^
|
||||
((x << 4) & 0x440u) ^ ((x << 5) & 0x300u) ^
|
||||
((x << 6) & 0x800u) ^ ((x << 9) & 0xa000u) ^
|
||||
((y << 3) & 0x008u) ^ ((y << 4) & 0x020u) ^
|
||||
((y << 5) & 0xf80u) ^ ((y << 9) & 0x1000u) ^
|
||||
((y << 8) & 0x4000u);
|
||||
default: return z ^ ((x << 3) & 0x008u) ^ ((x << 4) & 0x420u) ^
|
||||
((x << 5) & 0x380u) ^ ((x << 6) & 0x800u) ^
|
||||
((x << 10) & 0x2000u) ^ ((x << 9) & 0x8000u) ^
|
||||
((y << 4) & 0x010u) ^ ((y << 5) & 0xf40u) ^
|
||||
((y << 10) & 0x5000u);
|
||||
}
|
||||
}
|
||||
#include "gpu_tiler_common.inc"
|
||||
@@ -0,0 +1,20 @@
|
||||
#version 450
|
||||
#extension GL_GOOGLE_include_directive : require
|
||||
layout(constant_id = 0) const uint ELEMENT_BYTES = 4u;
|
||||
layout(constant_id = 1) const uint TILE = 0u;
|
||||
const uint BLOCK_BYTES = 65536u;
|
||||
#include "gpu_tiler_standard64.inc"
|
||||
uvec3 block_extent() {
|
||||
uint width = ELEMENT_BYTES <= 2 ? 256u : (ELEMENT_BYTES <= 8 ? 128u : 64u);
|
||||
return uvec3(width, BLOCK_BYTES / (width * ELEMENT_BYTES), 1u);
|
||||
}
|
||||
uint block_offset(uvec3 p) {
|
||||
uvec4 s = ELEMENT_BYTES == 1 ? uvec4(7, 7, 6, 6) :
|
||||
ELEMENT_BYTES == 2 ? uvec4(7, 6, 6, 5) :
|
||||
ELEMENT_BYTES == 4 ? uvec4(6, 6, 5, 5) :
|
||||
ELEMENT_BYTES == 8 ? uvec4(6, 5, 5, 4) : uvec4(5, 5, 4, 4);
|
||||
uint delta = (((p.x >> s.x) & 1u) << 8) ^ (((p.y >> s.y) & 1u) << 9) ^
|
||||
(((p.x >> s.z) & 1u) << 10) ^ (((p.y >> s.w) & 1u) << 11);
|
||||
return standard64_offset(p.xy) ^ delta;
|
||||
}
|
||||
#include "gpu_tiler_common.inc"
|
||||
@@ -0,0 +1,17 @@
|
||||
#version 450
|
||||
#extension GL_GOOGLE_include_directive : require
|
||||
layout(constant_id = 0) const uint ELEMENT_BYTES = 4u;
|
||||
layout(constant_id = 1) const uint TILE = 0u;
|
||||
const uint BLOCK_BYTES = 65536u;
|
||||
#include "gpu_tiler_standard64_3d.inc"
|
||||
uvec3 block_extent() { return standard64_3d_extent(); }
|
||||
uint block_offset(uvec3 p) {
|
||||
uvec4 s = ELEMENT_BYTES == 1 ? uvec4(4, 5, 4, 4) :
|
||||
ELEMENT_BYTES == 2 ? uvec4(4, 4, 3, 4) :
|
||||
ELEMENT_BYTES == 4 ? uvec4(4, 4, 3, 3) :
|
||||
ELEMENT_BYTES == 8 ? uvec4(3, 4, 3, 3) : uvec4(3, 3, 2, 3);
|
||||
uint delta = (((p.y >> s.x) & 1u) << 10) ^ (((p.x >> s.y) & 1u) << 10) ^
|
||||
(((p.x >> s.z) & 1u) << 11) ^ (((p.z >> s.w) & 1u) << 11);
|
||||
return standard64_3d_offset(p) ^ delta;
|
||||
}
|
||||
#include "gpu_tiler_common.inc"
|
||||
@@ -0,0 +1,42 @@
|
||||
#version 450
|
||||
#extension GL_GOOGLE_include_directive : require
|
||||
layout(constant_id = 0) const uint ELEMENT_BYTES = 4u;
|
||||
layout(constant_id = 1) const uint TILE = 0u;
|
||||
const uint BLOCK_BYTES = 65536u;
|
||||
uvec3 block_extent() {
|
||||
uint width = ELEMENT_BYTES <= 2 ? 256u : (ELEMENT_BYTES <= 8 ? 128u : 64u);
|
||||
return uvec3(width, BLOCK_BYTES / (width * ELEMENT_BYTES), 1u);
|
||||
}
|
||||
uint rt_offset(uint x, uint y) {
|
||||
switch (ELEMENT_BYTES) {
|
||||
case 1: return ((y << 2) & 0x008u) ^ ((y << 4) & 0x010u) ^
|
||||
((y << 3) & 0x0a0u) ^ ((y << 5) & 0xf00u) ^
|
||||
((y << 6) & 0x1000u) ^ ((y << 7) & 0x4000u) ^ (x & 7u) ^
|
||||
((x << 3) & 0x040u) ^ ((x << 5) & 0x300u) ^
|
||||
((x << 4) & 0x400u) ^ ((x << 6) & 0x800u) ^
|
||||
((x << 7) & 0x2000u) ^ ((x << 8) & 0x8000u);
|
||||
case 2: return ((y << 4) & 0x070u) ^ ((y << 5) & 0xf00u) ^
|
||||
((y << 8) & 0x5000u) ^ ((x << 1) & 0x00eu) ^
|
||||
((x << 4) & 0x480u) ^ ((x << 5) & 0x300u) ^
|
||||
((x << 6) & 0x800u) ^ ((x << 7) & 0x2000u) ^
|
||||
((x << 8) & 0x8000u);
|
||||
case 4: return ((y << 4) & 0x070u) ^ ((y << 5) & 0xf00u) ^
|
||||
((y << 9) & 0x1000u) ^ ((y << 8) & 0x4000u) ^
|
||||
((x << 2) & 0x00cu) ^ ((x << 5) & 0x380u) ^
|
||||
((x << 4) & 0x400u) ^ ((x << 6) & 0x800u) ^ ((x << 9) & 0xa000u);
|
||||
case 8: return ((y << 4) & 0x010u) ^ ((y << 6) & 0x080u) ^
|
||||
((y << 5) & 0xf00u) ^ ((y << 10) & 0x5000u) ^
|
||||
((x << 3) & 0x008u) ^ ((x << 4) & 0x460u) ^
|
||||
((x << 5) & 0x300u) ^ ((x << 6) & 0x800u) ^
|
||||
((x << 10) & 0x2000u) ^ ((x << 9) & 0x8000u);
|
||||
default: return ((x << 4) & 0x410u) ^ ((x << 5) & 0x340u) ^
|
||||
((x << 6) & 0x800u) ^ ((x << 11) & 0xa000u) ^
|
||||
((y << 5) & 0xf20u) ^ ((y << 6) & 0x080u) ^
|
||||
((y << 10) & 0x1000u) ^ ((y << 11) & 0x4000u);
|
||||
}
|
||||
}
|
||||
uint volume_z(uint z) {
|
||||
return ((z & 8u) << 5) ^ ((z & 4u) << 7) ^ ((z & 2u) << 9) ^ ((z & 1u) << 11);
|
||||
}
|
||||
uint block_offset(uvec3 p) { return rt_offset(p.x, p.y) ^ volume_z(p.z); }
|
||||
#include "gpu_tiler_common.inc"
|
||||
@@ -0,0 +1,18 @@
|
||||
uint standard_offset(uvec2 p) {
|
||||
uint x = p.x, y = p.y;
|
||||
switch (ELEMENT_BYTES) {
|
||||
case 1: return ((y << 4) & 0x1f0u) ^ ((y << 5) & 0x400u) ^ (x & 0x00fu) ^
|
||||
((x << 5) & 0x200u) ^ ((x << 6) & 0x800u);
|
||||
case 2: return ((y << 4) & 0x070u) ^ ((y << 5) & 0x100u) ^ ((y << 6) & 0x400u) ^
|
||||
((x << 1) & 0x00eu) ^ ((x << 4) & 0x080u) ^
|
||||
((x << 5) & 0x200u) ^ ((x << 6) & 0x800u);
|
||||
case 4: return ((y << 4) & 0x070u) ^ ((y << 5) & 0x100u) ^ ((y << 6) & 0x400u) ^
|
||||
((x << 2) & 0x00cu) ^ ((x << 5) & 0x080u) ^
|
||||
((x << 6) & 0x200u) ^ ((x << 7) & 0x800u);
|
||||
case 8: return ((y << 4) & 0x030u) ^ ((y << 6) & 0x100u) ^ ((y << 7) & 0x400u) ^
|
||||
((x << 3) & 0x008u) ^ ((x << 5) & 0x0c0u) ^
|
||||
((x << 6) & 0x200u) ^ ((x << 7) & 0x800u);
|
||||
default: return ((y << 4) & 0x030u) ^ ((y << 6) & 0x100u) ^ ((y << 7) & 0x400u) ^
|
||||
((x << 6) & 0x0c0u) ^ ((x << 7) & 0x200u) ^ ((x << 8) & 0x800u);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
#version 450
|
||||
#extension GL_GOOGLE_include_directive : require
|
||||
layout(constant_id = 0) const uint ELEMENT_BYTES = 4u;
|
||||
layout(constant_id = 1) const uint TILE = 0u;
|
||||
const uint BLOCK_BYTES = 256u;
|
||||
#include "gpu_tiler_standard.inc"
|
||||
uvec3 block_extent() {
|
||||
uint width = ELEMENT_BYTES <= 2 ? 16u : (ELEMENT_BYTES <= 8 ? 8u : 4u);
|
||||
return uvec3(width, BLOCK_BYTES / (width * ELEMENT_BYTES), 1u);
|
||||
}
|
||||
uint block_offset(uvec3 p) { return standard_offset(p.xy) & 0xffu; }
|
||||
#include "gpu_tiler_common.inc"
|
||||
@@ -0,0 +1,12 @@
|
||||
#version 450
|
||||
#extension GL_GOOGLE_include_directive : require
|
||||
layout(constant_id = 0) const uint ELEMENT_BYTES = 4u;
|
||||
layout(constant_id = 1) const uint TILE = 0u;
|
||||
const uint BLOCK_BYTES = 4096u;
|
||||
#include "gpu_tiler_standard.inc"
|
||||
uvec3 block_extent() {
|
||||
uint width = ELEMENT_BYTES <= 2 ? 64u : (ELEMENT_BYTES <= 8 ? 32u : 16u);
|
||||
return uvec3(width, BLOCK_BYTES / (width * ELEMENT_BYTES), 1u);
|
||||
}
|
||||
uint block_offset(uvec3 p) { return standard_offset(p.xy); }
|
||||
#include "gpu_tiler_common.inc"
|
||||
@@ -0,0 +1,15 @@
|
||||
#version 450
|
||||
#extension GL_GOOGLE_include_directive : require
|
||||
layout(constant_id = 0) const uint ELEMENT_BYTES = 4u;
|
||||
layout(constant_id = 1) const uint TILE = 0u;
|
||||
const uint BLOCK_BYTES = 4096u;
|
||||
#include "gpu_tiler_standard4_3d.inc"
|
||||
uvec3 block_extent() {
|
||||
if (ELEMENT_BYTES == 1) return uvec3(16, 16, 16);
|
||||
if (ELEMENT_BYTES == 2) return uvec3(8, 16, 16);
|
||||
if (ELEMENT_BYTES == 4) return uvec3(8, 16, 8);
|
||||
if (ELEMENT_BYTES == 8) return uvec3(8, 8, 8);
|
||||
return uvec3(4, 8, 8);
|
||||
}
|
||||
uint block_offset(uvec3 p) { return standard3d_offset(p); }
|
||||
#include "gpu_tiler_common.inc"
|
||||
@@ -0,0 +1,22 @@
|
||||
uint standard3d_offset(uvec3 p) {
|
||||
uint x = p.x, y = p.y, z = p.z;
|
||||
if (ELEMENT_BYTES == 1)
|
||||
return (x & 3u) ^ ((x << 4) & 0x40u) ^ ((x << 6) & 0x200u) ^
|
||||
((y << 3) & 8u) ^ ((y << 4) & 0x20u) ^ ((y << 6) & 0x100u) ^
|
||||
((y << 8) & 0x800u) ^ ((z << 2) & 4u) ^ ((z << 3) & 0x10u) ^
|
||||
((z << 5) & 0x80u) ^ ((z << 7) & 0x400u);
|
||||
if (ELEMENT_BYTES == 2)
|
||||
return ((x << 1) & 2u) ^ ((x << 5) & 0x40u) ^ ((x << 7) & 0x200u) ^
|
||||
((y << 3) & 8u) ^ ((y << 4) & 0x20u) ^ ((y << 6) & 0x100u) ^
|
||||
((y << 8) & 0x800u) ^ ((z << 2) & 4u) ^ ((z << 3) & 0x10u) ^
|
||||
((z << 5) & 0x80u) ^ ((z << 7) & 0x400u);
|
||||
uint z_part = ((z << 4) & 0x10u) ^ ((z << 6) & 0x80u) ^ ((z << 8) & 0x400u);
|
||||
if (ELEMENT_BYTES == 4)
|
||||
return ((x << 2) & 4u) ^ ((x << 5) & 0x40u) ^ ((x << 7) & 0x200u) ^
|
||||
((y << 3) & 8u) ^ ((y << 4) & 0x20u) ^ ((y << 6) & 0x100u) ^
|
||||
((y << 8) & 0x800u) ^ z_part;
|
||||
uint y_part = ((y << 5) & 0x20u) ^ ((y << 7) & 0x100u) ^ ((y << 9) & 0x800u);
|
||||
if (ELEMENT_BYTES == 8)
|
||||
return ((x << 3) & 8u) ^ ((x << 5) & 0x40u) ^ ((x << 7) & 0x200u) ^ y_part ^ z_part;
|
||||
return ((x << 6) & 0x40u) ^ ((x << 8) & 0x200u) ^ y_part ^ z_part;
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
#version 450
|
||||
#extension GL_GOOGLE_include_directive : require
|
||||
layout(constant_id = 0) const uint ELEMENT_BYTES = 4u;
|
||||
layout(constant_id = 1) const uint TILE = 0u;
|
||||
const uint BLOCK_BYTES = 65536u;
|
||||
#include "gpu_tiler_standard64.inc"
|
||||
uvec3 block_extent() {
|
||||
uint width = ELEMENT_BYTES <= 2 ? 256u : (ELEMENT_BYTES <= 8 ? 128u : 64u);
|
||||
return uvec3(width, BLOCK_BYTES / (width * ELEMENT_BYTES), 1u);
|
||||
}
|
||||
uint block_offset(uvec3 p) { return standard64_offset(p.xy); }
|
||||
#include "gpu_tiler_common.inc"
|
||||
@@ -0,0 +1,29 @@
|
||||
uint standard64_offset(uvec2 p) {
|
||||
uint x = p.x, y = p.y;
|
||||
switch (ELEMENT_BYTES) {
|
||||
case 1: return (x & 0x0fu) ^ ((x << 5) & 0x200u) ^ ((x << 6) & 0x800u) ^
|
||||
((x << 7) & 0x2000u) ^ ((x << 8) & 0x8000u) ^
|
||||
((y << 4) & 0x1f0u) ^ ((y << 5) & 0x400u) ^
|
||||
((y << 6) & 0x1000u) ^ ((y << 7) & 0x4000u);
|
||||
case 2: return ((x << 1) & 0x00eu) ^ ((x << 4) & 0x080u) ^
|
||||
((x << 5) & 0x200u) ^ ((x << 6) & 0x800u) ^
|
||||
((x << 7) & 0x2000u) ^ ((x << 8) & 0x8000u) ^
|
||||
((y << 4) & 0x070u) ^ ((y << 5) & 0x100u) ^
|
||||
((y << 6) & 0x400u) ^ ((y << 7) & 0x1000u) ^ ((y << 8) & 0x4000u);
|
||||
case 4: return ((x << 2) & 0x00cu) ^ ((x << 5) & 0x080u) ^
|
||||
((x << 6) & 0x200u) ^ ((x << 7) & 0x800u) ^
|
||||
((x << 8) & 0x2000u) ^ ((x << 9) & 0x8000u) ^
|
||||
((y << 4) & 0x070u) ^ ((y << 5) & 0x100u) ^
|
||||
((y << 6) & 0x400u) ^ ((y << 7) & 0x1000u) ^ ((y << 8) & 0x4000u);
|
||||
case 8: return ((x << 3) & 0x008u) ^ ((x << 5) & 0x0c0u) ^
|
||||
((x << 6) & 0x200u) ^ ((x << 7) & 0x800u) ^
|
||||
((x << 8) & 0x2000u) ^ ((x << 9) & 0x8000u) ^
|
||||
((y << 4) & 0x030u) ^ ((y << 6) & 0x100u) ^
|
||||
((y << 7) & 0x400u) ^ ((y << 8) & 0x1000u) ^ ((y << 9) & 0x4000u);
|
||||
default: return ((x << 6) & 0x0c0u) ^ ((x << 7) & 0x200u) ^
|
||||
((x << 8) & 0x800u) ^ ((x << 9) & 0x2000u) ^
|
||||
((x << 10) & 0x8000u) ^ ((y << 4) & 0x030u) ^
|
||||
((y << 6) & 0x100u) ^ ((y << 7) & 0x400u) ^
|
||||
((y << 8) & 0x1000u) ^ ((y << 9) & 0x4000u);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
#version 450
|
||||
#extension GL_GOOGLE_include_directive : require
|
||||
layout(constant_id = 0) const uint ELEMENT_BYTES = 4u;
|
||||
layout(constant_id = 1) const uint TILE = 0u;
|
||||
const uint BLOCK_BYTES = 65536u;
|
||||
#include "gpu_tiler_standard64_3d.inc"
|
||||
uvec3 block_extent() { return standard64_3d_extent(); }
|
||||
uint block_offset(uvec3 p) { return standard64_3d_offset(p); }
|
||||
#include "gpu_tiler_common.inc"
|
||||
@@ -0,0 +1,17 @@
|
||||
#include "gpu_tiler_standard4_3d.inc"
|
||||
uvec3 standard64_3d_extent() {
|
||||
if (ELEMENT_BYTES == 1) return uvec3(64, 32, 32);
|
||||
if (ELEMENT_BYTES == 2) return uvec3(32, 32, 32);
|
||||
if (ELEMENT_BYTES == 4) return uvec3(32, 32, 16);
|
||||
if (ELEMENT_BYTES == 8) return uvec3(32, 16, 16);
|
||||
return uvec3(16, 16, 16);
|
||||
}
|
||||
uint standard64_3d_offset(uvec3 p) {
|
||||
uvec4 s = ELEMENT_BYTES == 1 ? uvec4(4, 4, 4, 5) :
|
||||
ELEMENT_BYTES == 2 ? uvec4(3, 4, 4, 4) :
|
||||
ELEMENT_BYTES == 4 ? uvec4(3, 3, 4, 4) :
|
||||
ELEMENT_BYTES == 8 ? uvec4(3, 3, 3, 4) : uvec4(2, 3, 3, 3);
|
||||
return standard3d_offset(p) ^ (((p.x >> s.x) & 1u) << 12) ^
|
||||
(((p.z >> s.y) & 1u) << 13) ^ (((p.y >> s.z) & 1u) << 14) ^
|
||||
(((p.x >> s.w) & 1u) << 15);
|
||||
}
|
||||
Reference in New Issue
Block a user