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    pub unsafe fn cmd_draw_mesh_tasks(
21        &self,
22        command_buffer: vk::CommandBuffer,
23        task_count: u32,
24        first_task: u32,
25    ) {
26        (self.fp.cmd_draw_mesh_tasks_nv)(command_buffer, task_count, first_task);
27    }
28
29    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdDrawMeshTasksIndirectNV.html>
30    pub unsafe fn cmd_draw_mesh_tasks_indirect(
31        &self,
32        command_buffer: vk::CommandBuffer,
33        buffer: vk::Buffer,
34        offset: vk::DeviceSize,
35        draw_count: u32,
36        stride: u32,
37    ) {
38        (self.fp.cmd_draw_mesh_tasks_indirect_nv)(
39            command_buffer,
40            buffer,
41            offset,
42            draw_count,
43            stride,
44        );
45    }
46
47    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdDrawMeshTasksIndirectCountNV.html>
48    pub unsafe fn cmd_draw_mesh_tasks_indirect_count(
49        &self,
50        command_buffer: vk::CommandBuffer,
51        buffer: vk::Buffer,
52        offset: vk::DeviceSize,
53        count_buffer: vk::Buffer,
54        count_buffer_offset: vk::DeviceSize,
55        max_draw_count: u32,
56        stride: u32,
57    ) {
58        (self.fp.cmd_draw_mesh_tasks_indirect_count_nv)(
59            command_buffer,
60            buffer,
61            offset,
62            count_buffer,
63            count_buffer_offset,
64            max_draw_count,
65            stride,
66        );
67    }
68
69    pub const fn name() -> &'static CStr {
70        vk::NvMeshShaderFn::name()
71    }
72
73    pub fn fp(&self) -> &vk::NvMeshShaderFn {
74        &self.fp
75    }
76}