1 use crate::vk;
2 use crate::{Device, Instance};
3 use std::ffi::CStr;
4 use std::mem;
5 
6 #[derive(Clone)]
7 pub struct MeshShader {
8     fp: vk::NvMeshShaderFn,
9 }
10 
11 impl MeshShader {
new(instance: &Instance, device: &Device) -> Self12     pub fn new(instance: &Instance, device: &Device) -> Self {
13         let fp = vk::NvMeshShaderFn::load(|name| unsafe {
14             mem::transmute(instance.get_device_proc_addr(device.handle(), name.as_ptr()))
15         });
16         Self { fp }
17     }
18 
19     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdDrawMeshTasksNV.html>
20     #[inline]
cmd_draw_mesh_tasks( &self, command_buffer: vk::CommandBuffer, task_count: u32, first_task: u32, )21     pub unsafe fn cmd_draw_mesh_tasks(
22         &self,
23         command_buffer: vk::CommandBuffer,
24         task_count: u32,
25         first_task: u32,
26     ) {
27         (self.fp.cmd_draw_mesh_tasks_nv)(command_buffer, task_count, first_task);
28     }
29 
30     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdDrawMeshTasksIndirectNV.html>
31     #[inline]
cmd_draw_mesh_tasks_indirect( &self, command_buffer: vk::CommandBuffer, buffer: vk::Buffer, offset: vk::DeviceSize, draw_count: u32, stride: u32, )32     pub unsafe fn cmd_draw_mesh_tasks_indirect(
33         &self,
34         command_buffer: vk::CommandBuffer,
35         buffer: vk::Buffer,
36         offset: vk::DeviceSize,
37         draw_count: u32,
38         stride: u32,
39     ) {
40         (self.fp.cmd_draw_mesh_tasks_indirect_nv)(
41             command_buffer,
42             buffer,
43             offset,
44             draw_count,
45             stride,
46         );
47     }
48 
49     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdDrawMeshTasksIndirectCountNV.html>
50     #[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, )51     pub unsafe fn cmd_draw_mesh_tasks_indirect_count(
52         &self,
53         command_buffer: vk::CommandBuffer,
54         buffer: vk::Buffer,
55         offset: vk::DeviceSize,
56         count_buffer: vk::Buffer,
57         count_buffer_offset: vk::DeviceSize,
58         max_draw_count: u32,
59         stride: u32,
60     ) {
61         (self.fp.cmd_draw_mesh_tasks_indirect_count_nv)(
62             command_buffer,
63             buffer,
64             offset,
65             count_buffer,
66             count_buffer_offset,
67             max_draw_count,
68             stride,
69         );
70     }
71 
72     #[inline]
name() -> &'static CStr73     pub const fn name() -> &'static CStr {
74         vk::NvMeshShaderFn::name()
75     }
76 
77     #[inline]
fp(&self) -> &vk::NvMeshShaderFn78     pub fn fp(&self) -> &vk::NvMeshShaderFn {
79         &self.fp
80     }
81 }
82