diff --git a/Changelog.md b/Changelog.md index 78d73cdbb..0b4afe6f9 100644 --- a/Changelog.md +++ b/Changelog.md @@ -24,6 +24,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added new functions to `VK_KHR_swapchain`, available since Vulkan 1.1 (#629) - Added `VK_KHR_device_group_creation` instance extension (#630) - Added `VK_KHR_device_group` device extension (#631) +- Added `VK_EXT_mesh_shader` device extension (#657) ### Removed diff --git a/ash/src/extensions/ext/mesh_shader.rs b/ash/src/extensions/ext/mesh_shader.rs new file mode 100644 index 000000000..7d58f0c13 --- /dev/null +++ b/ash/src/extensions/ext/mesh_shader.rs @@ -0,0 +1,94 @@ +use crate::vk; +use crate::{Device, Instance}; +use std::ffi::CStr; +use std::mem; + +/// +#[derive(Clone)] +pub struct MeshShader { + fp: vk::ExtMeshShaderFn, +} + +impl MeshShader { + pub fn new(instance: &Instance, device: &Device) -> Self { + let fp = vk::ExtMeshShaderFn::load(|name| unsafe { + mem::transmute(instance.get_device_proc_addr(device.handle(), name.as_ptr())) + }); + Self { fp } + } + + /// + #[inline] + pub unsafe fn cmd_draw_mesh_tasks( + &self, + command_buffer: vk::CommandBuffer, + group_count_x: u32, + group_count_y: u32, + group_count_z: u32, + ) { + (self.fp.cmd_draw_mesh_tasks_ext)( + command_buffer, + group_count_x, + group_count_y, + group_count_z, + ); + } + + /// + /// + /// `buffer` contains `draw_count` [`vk::DrawMeshTasksIndirectCommandEXT`] structures starting at `offset` in bytes, holding the draw parameters. + #[inline] + pub unsafe fn cmd_draw_mesh_tasks_indirect( + &self, + command_buffer: vk::CommandBuffer, + buffer: vk::Buffer, + offset: vk::DeviceSize, + draw_count: u32, + stride: u32, + ) { + (self.fp.cmd_draw_mesh_tasks_indirect_ext)( + command_buffer, + buffer, + offset, + draw_count, + stride, + ); + } + + /// + /// + /// `buffer` contains a maximum of `max_draw_count` [`vk::DrawMeshTasksIndirectCommandEXT`] structures starting at `offset` in bytes, holding the draw parameters. + /// `count_buffer` is the buffer containing the draw count, starting at `count_buffer_offset` in bytes. + /// The actual number of executed draw calls is the minimum of the count specified in `count_buffer` and `max_draw_count`. + #[inline] + pub unsafe fn 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, + ) { + (self.fp.cmd_draw_mesh_tasks_indirect_count_ext)( + command_buffer, + buffer, + offset, + count_buffer, + count_buffer_offset, + max_draw_count, + stride, + ); + } + + #[inline] + pub const fn name() -> &'static CStr { + vk::ExtMeshShaderFn::name() + } + + #[inline] + pub fn fp(&self) -> &vk::ExtMeshShaderFn { + &self.fp + } +} diff --git a/ash/src/extensions/ext/mod.rs b/ash/src/extensions/ext/mod.rs index 477eb817a..93fca2f73 100644 --- a/ash/src/extensions/ext/mod.rs +++ b/ash/src/extensions/ext/mod.rs @@ -11,6 +11,7 @@ pub use self::full_screen_exclusive::FullScreenExclusive; pub use self::headless_surface::HeadlessSurface; pub use self::image_compression_control::ImageCompressionControl; pub use self::image_drm_format_modifier::ImageDrmFormatModifier; +pub use self::mesh_shader::MeshShader; pub use self::metal_surface::MetalSurface; pub use self::physical_device_drm::PhysicalDeviceDrm; pub use self::private_data::PrivateData; @@ -30,6 +31,7 @@ mod full_screen_exclusive; mod headless_surface; mod image_compression_control; mod image_drm_format_modifier; +mod mesh_shader; mod metal_surface; mod physical_device_drm; mod private_data;