diff --git a/Changelog.md b/Changelog.md index 2e73552..dc060ff 100644 --- a/Changelog.md +++ b/Changelog.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- Added `VK_EXT_private_data` device extension (#570) - Added conversions from `Extent2D` to `Extent3D` and `Rect2D` (#557) ## [0.35.1] - 2022-01-18 diff --git a/ash/src/extensions/ext/mod.rs b/ash/src/extensions/ext/mod.rs index 529358f..22f142a 100644 --- a/ash/src/extensions/ext/mod.rs +++ b/ash/src/extensions/ext/mod.rs @@ -9,6 +9,7 @@ pub use self::extended_dynamic_state::ExtendedDynamicState; pub use self::full_screen_exclusive::FullScreenExclusive; pub use self::metal_surface::MetalSurface; pub use self::physical_device_drm::PhysicalDeviceDrm; +pub use self::private_data::PrivateData; pub use self::tooling_info::ToolingInfo; mod buffer_device_address; @@ -22,4 +23,5 @@ mod extended_dynamic_state; mod full_screen_exclusive; mod metal_surface; mod physical_device_drm; +mod private_data; mod tooling_info; diff --git a/ash/src/extensions/ext/private_data.rs b/ash/src/extensions/ext/private_data.rs new file mode 100644 index 0000000..5cb3e56 --- /dev/null +++ b/ash/src/extensions/ext/private_data.rs @@ -0,0 +1,100 @@ +use crate::prelude::*; +use crate::vk; +use crate::RawPtr; +use crate::{Device, Instance}; +use std::ffi::CStr; +use std::mem; + +/// +#[derive(Clone)] +pub struct PrivateData { + handle: vk::Device, + fp: vk::ExtPrivateDataFn, +} + +impl PrivateData { + pub fn new(instance: &Instance, device: &Device) -> Self { + let handle = device.handle(); + let fp = vk::ExtPrivateDataFn::load(|name| unsafe { + mem::transmute(instance.get_device_proc_addr(handle, name.as_ptr())) + }); + Self { handle, fp } + } + + /// + pub unsafe fn create_private_data_slot( + &self, + create_info: &vk::PrivateDataSlotCreateInfoEXT, + allocation_callbacks: Option<&vk::AllocationCallbacks>, + ) -> VkResult { + let mut private_data_slot = mem::zeroed(); + self.fp + .create_private_data_slot_ext( + self.handle, + create_info, + allocation_callbacks.as_raw_ptr(), + &mut private_data_slot, + ) + .result_with_success(private_data_slot) + } + + /// + pub unsafe fn destroy_private_data_slot( + &self, + private_data_slot: vk::PrivateDataSlotEXT, + allocation_callbacks: Option<&vk::AllocationCallbacks>, + ) { + self.fp.destroy_private_data_slot_ext( + self.handle, + private_data_slot, + allocation_callbacks.as_raw_ptr(), + ) + } + + /// + pub unsafe fn set_private_data( + &self, + object: T, + private_data_slot: vk::PrivateDataSlotEXT, + data: u64, + ) -> VkResult<()> { + self.fp + .set_private_data_ext( + self.handle, + T::TYPE, + object.as_raw(), + private_data_slot, + data, + ) + .result() + } + + /// + pub unsafe fn get_private_data( + &self, + object: T, + private_data_slot: vk::PrivateDataSlotEXT, + ) -> u64 { + let mut data = mem::zeroed(); + self.fp.get_private_data_ext( + self.handle, + T::TYPE, + object.as_raw(), + private_data_slot, + &mut data, + ); + data + } + + pub fn name() -> &'static CStr { + vk::ExtPrivateDataFn::name() + } + + pub fn fp(&self) -> &vk::ExtPrivateDataFn { + &self.fp + } + + pub fn device(&self) -> vk::Device { + self.handle + } +}