diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/host_shaders/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | src/video_core/host_shaders/vulkan_quad_array.comp | 28 | ||||
| -rw-r--r-- | src/video_core/host_shaders/vulkan_quad_indexed.comp | 41 | ||||
| -rw-r--r-- | src/video_core/host_shaders/vulkan_uint8.comp | 24 |
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 | ||
| 17 | find_program(GLSLANGVALIDATOR "glslangValidator" REQUIRED) | 20 | find_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 | |||
| 7 | layout (local_size_x = 1024) in; | ||
| 8 | |||
| 9 | layout (std430, set = 0, binding = 0) buffer OutputBuffer { | ||
| 10 | uint output_indexes[]; | ||
| 11 | }; | ||
| 12 | |||
| 13 | layout (push_constant) uniform PushConstants { | ||
| 14 | uint first; | ||
| 15 | }; | ||
| 16 | |||
| 17 | void 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 | |||
| 7 | layout (local_size_x = 1024) in; | ||
| 8 | |||
| 9 | layout (std430, set = 0, binding = 0) readonly buffer InputBuffer { | ||
| 10 | uint input_indexes[]; | ||
| 11 | }; | ||
| 12 | |||
| 13 | layout (std430, set = 0, binding = 1) writeonly buffer OutputBuffer { | ||
| 14 | uint output_indexes[]; | ||
| 15 | }; | ||
| 16 | |||
| 17 | layout (push_constant) uniform PushConstants { | ||
| 18 | uint base_vertex; | ||
| 19 | int index_shift; // 0: uint8, 1: uint16, 2: uint32 | ||
| 20 | }; | ||
| 21 | |||
| 22 | void 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 | |||
| 9 | layout (local_size_x = 1024) in; | ||
| 10 | |||
| 11 | layout (std430, set = 0, binding = 0) readonly buffer InputBuffer { | ||
| 12 | uint8_t input_indexes[]; | ||
| 13 | }; | ||
| 14 | |||
| 15 | layout (std430, set = 0, binding = 1) writeonly buffer OutputBuffer { | ||
| 16 | uint16_t output_indexes[]; | ||
| 17 | }; | ||
| 18 | |||
| 19 | void main() { | ||
| 20 | uint id = gl_GlobalInvocationID.x; | ||
| 21 | if (id < input_indexes.length()) { | ||
| 22 | output_indexes[id] = uint16_t(input_indexes[id]); | ||
| 23 | } | ||
| 24 | } | ||