1 use crate::vk;
2 use crate::{Device, Instance};
3 use std::ffi::CStr;
4 use std::mem;
5 
6 /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_mesh_shader.html>
7 #[derive(Clone)]
8 pub struct MeshShader {
9     fp: vk::ExtMeshShaderFn,
10 }
11 
12 impl MeshShader {
new(instance: &Instance, device: &Device) -> Self13     pub fn new(instance: &Instance, device: &Device) -> Self {
14         let fp = vk::ExtMeshShaderFn::load(|name| unsafe {
15             mem::transmute(instance.get_device_proc_addr(device.handle(), name.as_ptr()))
16         });
17         Self { fp }
18     }
19 
20     /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdDrawMeshTasksEXT.html>
21     #[inline]
cmd_draw_mesh_tasks( &self, command_buffer: vk::CommandBuffer, group_count_x: u32, group_count_y: u32, group_count_z: u32, )22     pub unsafe fn cmd_draw_mesh_tasks(
23         &self,
24         command_buffer: vk::CommandBuffer,
25         group_count_x: u32,
26         group_count_y: u32,
27         group_count_z: u32,
28     ) {
29         (self.fp.cmd_draw_mesh_tasks_ext)(
30             command_buffer,
31             group_count_x,
32             group_count_y,
33             group_count_z,
34         );
35     }
36 
37     /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdDrawMeshTasksIndirectEXT.html>
38     ///
39     /// `buffer` contains `draw_count` [`vk::DrawMeshTasksIndirectCommandEXT`] structures starting at `offset` in bytes, holding the draw parameters.
40     #[inline]
cmd_draw_mesh_tasks_indirect( &self, command_buffer: vk::CommandBuffer, buffer: vk::Buffer, offset: vk::DeviceSize, draw_count: u32, stride: u32, )41     pub unsafe fn cmd_draw_mesh_tasks_indirect(
42         &self,
43         command_buffer: vk::CommandBuffer,
44         buffer: vk::Buffer,
45         offset: vk::DeviceSize,
46         draw_count: u32,
47         stride: u32,
48     ) {
49         (self.fp.cmd_draw_mesh_tasks_indirect_ext)(
50             command_buffer,
51             buffer,
52             offset,
53             draw_count,
54             stride,
55         );
56     }
57 
58     /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdDrawMeshTasksIndirectCountEXT.html>
59     ///
60     /// `buffer` contains a maximum of `max_draw_count` [`vk::DrawMeshTasksIndirectCommandEXT`] structures starting at `offset` in bytes, holding the draw parameters.
61     /// `count_buffer` is the buffer containing the draw count, starting at `count_buffer_offset` in bytes.
62     /// The actual number of executed draw calls is the minimum of the count specified in `count_buffer` and `max_draw_count`.
63     #[inline]
cmd_draw_mesh_tasks_indirect_count( &self, command_buffer: vk::CommandBuffer, buffer: vk::Buffer, offset: vk::DeviceSize, count_buffer: vk::Buffer, count_buffer_offset: vk::DeviceSize, max_draw_count: u32, stride: u32, )64     pub unsafe fn cmd_draw_mesh_tasks_indirect_count(
65         &self,
66         command_buffer: vk::CommandBuffer,
67         buffer: vk::Buffer,
68         offset: vk::DeviceSize,
69         count_buffer: vk::Buffer,
70         count_buffer_offset: vk::DeviceSize,
71         max_draw_count: u32,
72         stride: u32,
73     ) {
74         (self.fp.cmd_draw_mesh_tasks_indirect_count_ext)(
75             command_buffer,
76             buffer,
77             offset,
78             count_buffer,
79             count_buffer_offset,
80             max_draw_count,
81             stride,
82         );
83     }
84 
85     #[inline]
name() -> &'static CStr86     pub const fn name() -> &'static CStr {
87         vk::ExtMeshShaderFn::name()
88     }
89 
90     #[inline]
fp(&self) -> &vk::ExtMeshShaderFn91     pub fn fp(&self) -> &vk::ExtMeshShaderFn {
92         &self.fp
93     }
94 }
95