ash/extensions/nv/
mesh_shader.rs1use 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 #[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 #[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 #[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}