diff --git a/src/dxvk/meson.build b/src/dxvk/meson.build index d00e5d18b..819107cb4 100644 --- a/src/dxvk/meson.build +++ b/src/dxvk/meson.build @@ -30,6 +30,10 @@ dxvk_shaders = files([ 'shaders/dxvk_pack_d24s8.comp', 'shaders/dxvk_pack_d32s8.comp', + 'shaders/dxvk_unpack_d24s8_as_d32s8.comp', + 'shaders/dxvk_unpack_d24s8.comp', + 'shaders/dxvk_unpack_d32s8.comp', + 'hud/shaders/hud_line.frag', 'hud/shaders/hud_text.frag', 'hud/shaders/hud_vert.vert', diff --git a/src/dxvk/shaders/dxvk_unpack_d24s8.comp b/src/dxvk/shaders/dxvk_unpack_d24s8.comp new file mode 100644 index 000000000..c02714e90 --- /dev/null +++ b/src/dxvk/shaders/dxvk_unpack_d24s8.comp @@ -0,0 +1,36 @@ +#version 450 + +layout( + local_size_x = 64, + local_size_y = 1, + local_size_z = 1) in; + +layout(binding = 0, r32ui) writeonly uniform uimageBuffer u_depth; +layout(binding = 1, r8ui) writeonly uniform uimageBuffer u_stencil; + +layout(binding = 2) +readonly buffer s_buffer_t { + uint data[]; +} s_buffer; + +layout(push_constant) +uniform u_info_t { + uvec2 dst_extent; + uvec2 src_extent; +} u_info; + +void main() { + if (all(lessThan(gl_GlobalInvocationID.xy, u_info.dst_extent))) { + uint src_index = gl_GlobalInvocationID.x + + gl_GlobalInvocationID.y * u_info.src_extent.x + + gl_GlobalInvocationID.z * u_info.src_extent.y; + + uint dst_index = gl_GlobalInvocationID.x + + gl_GlobalInvocationID.y * u_info.dst_extent.x + + gl_GlobalInvocationID.z * u_info.dst_extent.y; + + uint src_data = s_buffer.data[src_index]; + imageStore(u_depth, int(dst_index), uvec4(src_data & 0xFFFFFF)); + imageStore(u_stencil, int(dst_index), uvec4(src_data >> 24)); + } +} \ No newline at end of file diff --git a/src/dxvk/shaders/dxvk_unpack_d24s8_as_d32s8.comp b/src/dxvk/shaders/dxvk_unpack_d24s8_as_d32s8.comp new file mode 100644 index 000000000..83aa6f547 --- /dev/null +++ b/src/dxvk/shaders/dxvk_unpack_d24s8_as_d32s8.comp @@ -0,0 +1,36 @@ +#version 450 + +layout( + local_size_x = 64, + local_size_y = 1, + local_size_z = 1) in; + +layout(binding = 0, r32f) writeonly uniform imageBuffer u_depth; +layout(binding = 1, r8ui) writeonly uniform uimageBuffer u_stencil; + +layout(binding = 2) +readonly buffer s_buffer_t { + uint data[]; +} s_buffer; + +layout(push_constant) +uniform u_info_t { + uvec2 dst_extent; + uvec2 src_extent; +} u_info; + +void main() { + if (all(lessThan(gl_GlobalInvocationID.xy, u_info.dst_extent))) { + uint src_index = gl_GlobalInvocationID.x + + gl_GlobalInvocationID.y * u_info.src_extent.x + + gl_GlobalInvocationID.z * u_info.src_extent.y; + + uint dst_index = gl_GlobalInvocationID.x + + gl_GlobalInvocationID.y * u_info.dst_extent.x + + gl_GlobalInvocationID.z * u_info.dst_extent.y; + + uint src_data = s_buffer.data[src_index]; + imageStore(u_depth, int(dst_index), vec4(float(src_data & 0xFFFFFF) / float(0xFFFFFF))); + imageStore(u_stencil, int(dst_index), uvec4(src_data >> 24)); + } +} \ No newline at end of file diff --git a/src/dxvk/shaders/dxvk_unpack_d32s8.comp b/src/dxvk/shaders/dxvk_unpack_d32s8.comp new file mode 100644 index 000000000..6b3054e12 --- /dev/null +++ b/src/dxvk/shaders/dxvk_unpack_d32s8.comp @@ -0,0 +1,41 @@ +#version 450 + +layout( + local_size_x = 64, + local_size_y = 1, + local_size_z = 1) in; + +struct d32s8_t { + float d32; + uint s8; +}; + +layout(binding = 0, r32f) writeonly uniform imageBuffer u_depth; +layout(binding = 1, r8ui) writeonly uniform uimageBuffer u_stencil; + +layout(binding = 2) +readonly buffer s_buffer_t { + d32s8_t data[]; +} s_buffer; + +layout(push_constant) +uniform u_info_t { + uvec2 dst_extent; + uvec2 src_extent; +} u_info; + +void main() { + if (all(lessThan(gl_GlobalInvocationID.xy, u_info.dst_extent))) { + uint src_index = gl_GlobalInvocationID.x + + gl_GlobalInvocationID.y * u_info.src_extent.x + + gl_GlobalInvocationID.z * u_info.src_extent.y; + + uint dst_index = gl_GlobalInvocationID.x + + gl_GlobalInvocationID.y * u_info.dst_extent.x + + gl_GlobalInvocationID.z * u_info.dst_extent.y; + + d32s8_t src_data = s_buffer.data[src_index]; + imageStore(u_depth, int(dst_index), vec4(src_data.d32)); + imageStore(u_stencil, int(dst_index), uvec4(src_data.s8)); + } +} \ No newline at end of file