summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/host_shaders/CMakeLists.txt3
-rw-r--r--src/video_core/host_shaders/vulkan_quad_array.comp28
-rw-r--r--src/video_core/host_shaders/vulkan_quad_indexed.comp41
-rw-r--r--src/video_core/host_shaders/vulkan_uint8.comp24
4 files changed, 96 insertions, 0 deletions
diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt
index 7059c2d2a..4c7399d5a 100644
--- a/src/video_core/host_shaders/CMakeLists.txt
+++ b/src/video_core/host_shaders/CMakeLists.txt
@@ -12,6 +12,9 @@ set(SHADER_FILES
12 vulkan_blit_depth_stencil.frag 12 vulkan_blit_depth_stencil.frag
13 vulkan_present.frag 13 vulkan_present.frag
14 vulkan_present.vert 14 vulkan_present.vert
15 vulkan_quad_array.comp
16 vulkan_quad_indexed.comp
17 vulkan_uint8.comp
15) 18)
16 19
17find_program(GLSLANGVALIDATOR "glslangValidator" REQUIRED) 20find_program(GLSLANGVALIDATOR "glslangValidator" REQUIRED)
diff --git a/src/video_core/host_shaders/vulkan_quad_array.comp b/src/video_core/host_shaders/vulkan_quad_array.comp
new file mode 100644
index 000000000..212f4e998
--- /dev/null
+++ b/src/video_core/host_shaders/vulkan_quad_array.comp
@@ -0,0 +1,28 @@
1// Copyright 2019 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#version 460 core
6
7layout (local_size_x = 1024) in;
8
9layout (std430, set = 0, binding = 0) buffer OutputBuffer {
10 uint output_indexes[];
11};
12
13layout (push_constant) uniform PushConstants {
14 uint first;
15};
16
17void main() {
18 uint primitive = gl_GlobalInvocationID.x;
19 if (primitive * 6 >= output_indexes.length()) {
20 return;
21 }
22
23 const uint quad_map[6] = uint[](0, 1, 2, 0, 2, 3);
24 for (uint vertex = 0; vertex < 6; ++vertex) {
25 uint index = first + primitive * 4 + quad_map[vertex];
26 output_indexes[primitive * 6 + vertex] = index;
27 }
28}
diff --git a/src/video_core/host_shaders/vulkan_quad_indexed.comp b/src/video_core/host_shaders/vulkan_quad_indexed.comp
new file mode 100644
index 000000000..8655591d0
--- /dev/null
+++ b/src/video_core/host_shaders/vulkan_quad_indexed.comp
@@ -0,0 +1,41 @@
1// Copyright 2020 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#version 460 core
6
7layout (local_size_x = 1024) in;
8
9layout (std430, set = 0, binding = 0) readonly buffer InputBuffer {
10 uint input_indexes[];
11};
12
13layout (std430, set = 0, binding = 1) writeonly buffer OutputBuffer {
14 uint output_indexes[];
15};
16
17layout (push_constant) uniform PushConstants {
18 uint base_vertex;
19 int index_shift; // 0: uint8, 1: uint16, 2: uint32
20};
21
22void main() {
23 int primitive = int(gl_GlobalInvocationID.x);
24 if (primitive * 6 >= output_indexes.length()) {
25 return;
26 }
27
28 int index_size = 8 << index_shift;
29 int flipped_shift = 2 - index_shift;
30 int mask = (1 << flipped_shift) - 1;
31
32 const int quad_swizzle[6] = int[](0, 1, 2, 0, 2, 3);
33 for (uint vertex = 0; vertex < 6; ++vertex) {
34 int offset = primitive * 4 + quad_swizzle[vertex];
35 int int_offset = offset >> flipped_shift;
36 int bit_offset = (offset & mask) * index_size;
37 uint packed_input = input_indexes[int_offset];
38 uint index = bitfieldExtract(packed_input, bit_offset, index_size);
39 output_indexes[primitive * 6 + vertex] = index + base_vertex;
40 }
41}
diff --git a/src/video_core/host_shaders/vulkan_uint8.comp b/src/video_core/host_shaders/vulkan_uint8.comp
new file mode 100644
index 000000000..ad74d7af9
--- /dev/null
+++ b/src/video_core/host_shaders/vulkan_uint8.comp
@@ -0,0 +1,24 @@
1// Copyright 2019 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#version 460 core
6#extension GL_EXT_shader_16bit_storage : require
7#extension GL_EXT_shader_8bit_storage : require
8
9layout (local_size_x = 1024) in;
10
11layout (std430, set = 0, binding = 0) readonly buffer InputBuffer {
12 uint8_t input_indexes[];
13};
14
15layout (std430, set = 0, binding = 1) writeonly buffer OutputBuffer {
16 uint16_t output_indexes[];
17};
18
19void main() {
20 uint id = gl_GlobalInvocationID.x;
21 if (id < input_indexes.length()) {
22 output_indexes[id] = uint16_t(input_indexes[id]);
23 }
24}