ash/extensions/ext/
mesh_shader.rs1use crate::vk;
2use crate::{Device, Instance};
3use std::ffi::CStr;
4use std::mem;
5
6#[derive(Clone)]
8pub struct MeshShader {
9 fp: vk::ExtMeshShaderFn,
10}
11
12impl MeshShader {
13 pub fn new(instance: &Instance, device: &Device) -> Self {
14 let fp = vk::ExtMeshShaderFn::load(|name| unsafe {
15 mem::transmute(instance.get_device_proc_addr(device.handle(), name.as_ptr()))
16 });
17 Self { fp }
18 }
19
20 #[inline]
22 pub unsafe fn cmd_draw_mesh_tasks(
23 &self,
24 command_buffer: vk::CommandBuffer,
25 group_count_x: u32,
26 group_count_y: u32,
27 group_count_z: u32,
28 ) {
29 (self.fp.cmd_draw_mesh_tasks_ext)(
30 command_buffer,
31 group_count_x,
32 group_count_y,
33 group_count_z,
34 );
35 }
36
37 #[inline]
41 pub unsafe fn cmd_draw_mesh_tasks_indirect(
42 &self,
43 command_buffer: vk::CommandBuffer,
44 buffer: vk::Buffer,
45 offset: vk::DeviceSize,
46 draw_count: u32,
47 stride: u32,
48 ) {
49 (self.fp.cmd_draw_mesh_tasks_indirect_ext)(
50 command_buffer,
51 buffer,
52 offset,
53 draw_count,
54 stride,
55 );
56 }
57
58 #[inline]
64 pub unsafe fn cmd_draw_mesh_tasks_indirect_count(
65 &self,
66 command_buffer: vk::CommandBuffer,
67 buffer: vk::Buffer,
68 offset: vk::DeviceSize,
69 count_buffer: vk::Buffer,
70 count_buffer_offset: vk::DeviceSize,
71 max_draw_count: u32,
72 stride: u32,
73 ) {
74 (self.fp.cmd_draw_mesh_tasks_indirect_count_ext)(
75 command_buffer,
76 buffer,
77 offset,
78 count_buffer,
79 count_buffer_offset,
80 max_draw_count,
81 stride,
82 );
83 }
84
85 #[inline]
86 pub const fn name() -> &'static CStr {
87 vk::ExtMeshShaderFn::name()
88 }
89
90 #[inline]
91 pub fn fp(&self) -> &vk::ExtMeshShaderFn {
92 &self.fp
93 }
94}