From a5c456e5578426b6c39e23cf712dbcc98a7939d2 Mon Sep 17 00:00:00 2001 From: Nils Hasenbanck Date: Sun, 25 Jan 2026 08:50:14 +0100 Subject: [PATCH] Add support for VK_EXT_descriptor_heap --- ash/src/extensions/ext/descriptor_heap.rs | 153 ++++++++++++++++++++++ ash/src/extensions/ext/mod.rs | 1 + 2 files changed, 154 insertions(+) create mode 100644 ash/src/extensions/ext/descriptor_heap.rs diff --git a/ash/src/extensions/ext/descriptor_heap.rs b/ash/src/extensions/ext/descriptor_heap.rs new file mode 100644 index 000000000..011e69d24 --- /dev/null +++ b/ash/src/extensions/ext/descriptor_heap.rs @@ -0,0 +1,153 @@ +//! + +use crate::vk; +use crate::VkResult; + +impl crate::ext::descriptor_heap::Device { + /// + #[inline] + pub unsafe fn write_sampler_descriptors( + &self, + samplers: &[vk::SamplerCreateInfo<'_>], + descriptors: &[vk::HostAddressRangeEXT<'_>], + ) -> VkResult<()> { + assert_eq!(samplers.len(), descriptors.len()); + unsafe { + (self.fp.write_sampler_descriptors_ext)( + self.handle, + samplers.len() as u32, + samplers.as_ptr(), + descriptors.as_ptr(), + ) + } + .result() + } + + /// + #[inline] + pub unsafe fn write_resource_descriptors( + &self, + resources: &[vk::ResourceDescriptorInfoEXT<'_>], + descriptors: &[vk::HostAddressRangeEXT<'_>], + ) -> VkResult<()> { + assert_eq!(resources.len(), descriptors.len()); + unsafe { + (self.fp.write_resource_descriptors_ext)( + self.handle, + resources.len() as u32, + resources.as_ptr(), + descriptors.as_ptr(), + ) + } + .result() + } + + /// + #[inline] + pub unsafe fn cmd_bind_sampler_heap( + &self, + command_buffer: vk::CommandBuffer, + bind_info: &vk::BindHeapInfoEXT<'_>, + ) { + unsafe { (self.fp.cmd_bind_sampler_heap_ext)(command_buffer, bind_info) } + } + + /// + #[inline] + pub unsafe fn cmd_bind_resource_heap( + &self, + command_buffer: vk::CommandBuffer, + bind_info: &vk::BindHeapInfoEXT<'_>, + ) { + unsafe { (self.fp.cmd_bind_resource_heap_ext)(command_buffer, bind_info) } + } + + /// + #[inline] + pub unsafe fn cmd_push_data( + &self, + command_buffer: vk::CommandBuffer, + push_data_info: &vk::PushDataInfoEXT<'_>, + ) { + unsafe { (self.fp.cmd_push_data_ext)(command_buffer, push_data_info) } + } + + /// + #[inline] + pub unsafe fn get_image_opaque_capture_data( + &self, + images: &[vk::Image], + datas: &mut [vk::HostAddressRangeEXT<'_>], + ) -> VkResult<()> { + assert_eq!(images.len(), datas.len()); + unsafe { + (self.fp.get_image_opaque_capture_data_ext)( + self.handle, + images.len() as u32, + images.as_ptr(), + datas.as_mut_ptr(), + ) + .result() + } + } + + /// + #[inline] + pub unsafe fn register_custom_border_color( + &self, + border_color: &vk::SamplerCustomBorderColorCreateInfoEXT<'_>, + index: Option, + ) -> VkResult { + let request_index = index.is_some() as u32; + let mut index = index.unwrap_or_default(); + unsafe { + (self.fp.register_custom_border_color_ext)( + self.handle, + border_color, + request_index, + &mut index, + ) + .result()?; + } + Ok(index) + } + + /// + #[inline] + pub unsafe fn unregister_custom_border_color(&self, index: u32) { + unsafe { (self.fp.unregister_custom_border_color_ext)(self.handle, index) } + } + + /// + #[inline] + pub unsafe fn get_tensor_opaque_capture_data_arm( + &self, + tensors: &[vk::TensorARM], + datas: &mut [vk::HostAddressRangeEXT<'_>], + ) -> VkResult<()> { + assert_eq!(tensors.len(), datas.len()); + unsafe { + (self.fp.get_tensor_opaque_capture_data_arm)( + self.handle, + tensors.len() as u32, + tensors.as_ptr(), + datas.as_mut_ptr(), + ) + .result() + } + } +} + +impl crate::ext::descriptor_heap::Instance { + /// + #[inline] + pub unsafe fn get_physical_device_descriptor_size( + &self, + physical_device: vk::PhysicalDevice, + descriptor_type: vk::DescriptorType, + ) -> vk::DeviceSize { + unsafe { + (self.fp.get_physical_device_descriptor_size_ext)(physical_device, descriptor_type) + } + } +} diff --git a/ash/src/extensions/ext/mod.rs b/ash/src/extensions/ext/mod.rs index 3f923b227..558f61c51 100644 --- a/ash/src/extensions/ext/mod.rs +++ b/ash/src/extensions/ext/mod.rs @@ -7,6 +7,7 @@ pub mod debug_marker; pub mod debug_report; pub mod debug_utils; pub mod descriptor_buffer; +pub mod descriptor_heap; pub mod extended_dynamic_state; pub mod extended_dynamic_state2; pub mod extended_dynamic_state3;