|
@@ -0,0 +1,41 @@
|
|
|
|
|
+// Copyright 2020 yuzu Emulator Project
|
|
|
|
|
+// Licensed under GPLv2 or any later version
|
|
|
|
|
+// Refer to the license.txt file included.
|
|
|
|
|
+
|
|
|
|
|
+#version 460 core
|
|
|
|
|
+
|
|
|
|
|
+layout (local_size_x = 1024) in;
|
|
|
|
|
+
|
|
|
|
|
+layout (std430, set = 0, binding = 0) readonly buffer InputBuffer {
|
|
|
|
|
+ uint input_indexes[];
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+layout (std430, set = 0, binding = 1) writeonly buffer OutputBuffer {
|
|
|
|
|
+ uint output_indexes[];
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+layout (push_constant) uniform PushConstants {
|
|
|
|
|
+ uint base_vertex;
|
|
|
|
|
+ int index_shift; // 0: uint8, 1: uint16, 2: uint32
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+void main() {
|
|
|
|
|
+ int primitive = int(gl_GlobalInvocationID.x);
|
|
|
|
|
+ if (primitive * 6 >= output_indexes.length()) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ int index_size = 8 << index_shift;
|
|
|
|
|
+ int flipped_shift = 2 - index_shift;
|
|
|
|
|
+ int mask = (1 << flipped_shift) - 1;
|
|
|
|
|
+
|
|
|
|
|
+ const int quad_swizzle[6] = int[](0, 1, 2, 0, 2, 3);
|
|
|
|
|
+ for (uint vertex = 0; vertex < 6; ++vertex) {
|
|
|
|
|
+ int offset = primitive * 4 + quad_swizzle[vertex];
|
|
|
|
|
+ int int_offset = offset >> flipped_shift;
|
|
|
|
|
+ int bit_offset = (offset & mask) * index_size;
|
|
|
|
|
+ uint packed_input = input_indexes[int_offset];
|
|
|
|
|
+ uint index = bitfieldExtract(packed_input, bit_offset, index_size);
|
|
|
|
|
+ output_indexes[primitive * 6 + vertex] = index + base_vertex;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|