1 use crate::vk; 2 use crate::{Device, Instance}; 3 use std::ffi::CStr; 4 use std::mem; 5 6 /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_mesh_shader.html> 7 #[derive(Clone)] 8 pub struct MeshShader { 9 fp: vk::ExtMeshShaderFn, 10 } 11 12 impl MeshShader { new(instance: &Instance, device: &Device) -> Self13 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 /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdDrawMeshTasksEXT.html> 21 #[inline] cmd_draw_mesh_tasks( &self, command_buffer: vk::CommandBuffer, group_count_x: u32, group_count_y: u32, group_count_z: u32, )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 /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdDrawMeshTasksIndirectEXT.html> 38 /// 39 /// `buffer` contains `draw_count` [`vk::DrawMeshTasksIndirectCommandEXT`] structures starting at `offset` in bytes, holding the draw parameters. 40 #[inline] cmd_draw_mesh_tasks_indirect( &self, command_buffer: vk::CommandBuffer, buffer: vk::Buffer, offset: vk::DeviceSize, draw_count: u32, stride: u32, )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 /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdDrawMeshTasksIndirectCountEXT.html> 59 /// 60 /// `buffer` contains a maximum of `max_draw_count` [`vk::DrawMeshTasksIndirectCommandEXT`] structures starting at `offset` in bytes, holding the draw parameters. 61 /// `count_buffer` is the buffer containing the draw count, starting at `count_buffer_offset` in bytes. 62 /// The actual number of executed draw calls is the minimum of the count specified in `count_buffer` and `max_draw_count`. 63 #[inline] cmd_draw_mesh_tasks_indirect_count( &self, command_buffer: vk::CommandBuffer, buffer: vk::Buffer, offset: vk::DeviceSize, count_buffer: vk::Buffer, count_buffer_offset: vk::DeviceSize, max_draw_count: u32, stride: u32, )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] name() -> &'static CStr86 pub const fn name() -> &'static CStr { 87 vk::ExtMeshShaderFn::name() 88 } 89 90 #[inline] fp(&self) -> &vk::ExtMeshShaderFn91 pub fn fp(&self) -> &vk::ExtMeshShaderFn { 92 &self.fp 93 } 94 } 95