ash/extensions/nv/
mesh_shader.rs

1use crate::vk;
2use crate::{Device, Instance};
3use std::ffi::CStr;
4use std::mem;
5
6#[derive(Clone)]
7pub struct MeshShader {
8    fp: vk::NvMeshShaderFn,
9}
10
11impl MeshShader {
12    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]
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]
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]
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]
73    pub const fn name() -> &'static CStr {
74        vk::NvMeshShaderFn::name()
75    }
76
77    #[inline]
78    pub fn fp(&self) -> &vk::NvMeshShaderFn {
79        &self.fp
80    }
81}