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 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 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 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}