mirror of
https://github.com/yuzu-emu/yuzu-android.git
synced 2024-12-29 12:45:34 +00:00
host_shaders: Add Vulkan assembler compute shaders
This commit is contained in:
parent
87ff58b1d7
commit
21b18057f7
|
@ -12,6 +12,9 @@ set(SHADER_FILES
|
||||||
vulkan_blit_depth_stencil.frag
|
vulkan_blit_depth_stencil.frag
|
||||||
vulkan_present.frag
|
vulkan_present.frag
|
||||||
vulkan_present.vert
|
vulkan_present.vert
|
||||||
|
vulkan_quad_array.comp
|
||||||
|
vulkan_quad_indexed.comp
|
||||||
|
vulkan_uint8.comp
|
||||||
)
|
)
|
||||||
|
|
||||||
find_program(GLSLANGVALIDATOR "glslangValidator" REQUIRED)
|
find_program(GLSLANGVALIDATOR "glslangValidator" REQUIRED)
|
||||||
|
|
28
src/video_core/host_shaders/vulkan_quad_array.comp
Normal file
28
src/video_core/host_shaders/vulkan_quad_array.comp
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
// Copyright 2019 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) buffer OutputBuffer {
|
||||||
|
uint output_indexes[];
|
||||||
|
};
|
||||||
|
|
||||||
|
layout (push_constant) uniform PushConstants {
|
||||||
|
uint first;
|
||||||
|
};
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
uint primitive = gl_GlobalInvocationID.x;
|
||||||
|
if (primitive * 6 >= output_indexes.length()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint quad_map[6] = uint[](0, 1, 2, 0, 2, 3);
|
||||||
|
for (uint vertex = 0; vertex < 6; ++vertex) {
|
||||||
|
uint index = first + primitive * 4 + quad_map[vertex];
|
||||||
|
output_indexes[primitive * 6 + vertex] = index;
|
||||||
|
}
|
||||||
|
}
|
41
src/video_core/host_shaders/vulkan_quad_indexed.comp
Normal file
41
src/video_core/host_shaders/vulkan_quad_indexed.comp
Normal file
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
24
src/video_core/host_shaders/vulkan_uint8.comp
Normal file
24
src/video_core/host_shaders/vulkan_uint8.comp
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
// Copyright 2019 yuzu Emulator Project
|
||||||
|
// Licensed under GPLv2 or any later version
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#version 460 core
|
||||||
|
#extension GL_EXT_shader_16bit_storage : require
|
||||||
|
#extension GL_EXT_shader_8bit_storage : require
|
||||||
|
|
||||||
|
layout (local_size_x = 1024) in;
|
||||||
|
|
||||||
|
layout (std430, set = 0, binding = 0) readonly buffer InputBuffer {
|
||||||
|
uint8_t input_indexes[];
|
||||||
|
};
|
||||||
|
|
||||||
|
layout (std430, set = 0, binding = 1) writeonly buffer OutputBuffer {
|
||||||
|
uint16_t output_indexes[];
|
||||||
|
};
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
uint id = gl_GlobalInvocationID.x;
|
||||||
|
if (id < input_indexes.length()) {
|
||||||
|
output_indexes[id] = uint16_t(input_indexes[id]);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue