1 use crate::prelude::*; 2 use crate::vk; 3 use crate::RawPtr; 4 use crate::{Device, Instance}; 5 use std::ffi::CStr; 6 use std::mem; 7 8 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_EXT_private_data.html> 9 #[derive(Clone)] 10 pub struct PrivateData { 11 handle: vk::Device, 12 fp: vk::ExtPrivateDataFn, 13 } 14 15 impl PrivateData { new(instance: &Instance, device: &Device) -> Self16 pub fn new(instance: &Instance, device: &Device) -> Self { 17 let handle = device.handle(); 18 let fp = vk::ExtPrivateDataFn::load(|name| unsafe { 19 mem::transmute(instance.get_device_proc_addr(handle, name.as_ptr())) 20 }); 21 Self { handle, fp } 22 } 23 24 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCreatePrivateDataSlotEXT.html> 25 #[inline] create_private_data_slot( &self, create_info: &vk::PrivateDataSlotCreateInfoEXT, allocation_callbacks: Option<&vk::AllocationCallbacks>, ) -> VkResult<vk::PrivateDataSlotEXT>26 pub unsafe fn create_private_data_slot( 27 &self, 28 create_info: &vk::PrivateDataSlotCreateInfoEXT, 29 allocation_callbacks: Option<&vk::AllocationCallbacks>, 30 ) -> VkResult<vk::PrivateDataSlotEXT> { 31 let mut private_data_slot = mem::zeroed(); 32 (self.fp.create_private_data_slot_ext)( 33 self.handle, 34 create_info, 35 allocation_callbacks.as_raw_ptr(), 36 &mut private_data_slot, 37 ) 38 .result_with_success(private_data_slot) 39 } 40 41 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkDestroyPrivateDataSlotEXT.html> 42 #[inline] destroy_private_data_slot( &self, private_data_slot: vk::PrivateDataSlotEXT, allocation_callbacks: Option<&vk::AllocationCallbacks>, )43 pub unsafe fn destroy_private_data_slot( 44 &self, 45 private_data_slot: vk::PrivateDataSlotEXT, 46 allocation_callbacks: Option<&vk::AllocationCallbacks>, 47 ) { 48 (self.fp.destroy_private_data_slot_ext)( 49 self.handle, 50 private_data_slot, 51 allocation_callbacks.as_raw_ptr(), 52 ) 53 } 54 55 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkSetPrivateDataEXT.html> 56 #[inline] set_private_data<T: vk::Handle>( &self, object: T, private_data_slot: vk::PrivateDataSlotEXT, data: u64, ) -> VkResult<()>57 pub unsafe fn set_private_data<T: vk::Handle>( 58 &self, 59 object: T, 60 private_data_slot: vk::PrivateDataSlotEXT, 61 data: u64, 62 ) -> VkResult<()> { 63 (self.fp.set_private_data_ext)( 64 self.handle, 65 T::TYPE, 66 object.as_raw(), 67 private_data_slot, 68 data, 69 ) 70 .result() 71 } 72 73 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPrivateDataEXT.html> 74 #[inline] get_private_data<T: vk::Handle>( &self, object: T, private_data_slot: vk::PrivateDataSlotEXT, ) -> u6475 pub unsafe fn get_private_data<T: vk::Handle>( 76 &self, 77 object: T, 78 private_data_slot: vk::PrivateDataSlotEXT, 79 ) -> u64 { 80 let mut data = mem::zeroed(); 81 (self.fp.get_private_data_ext)( 82 self.handle, 83 T::TYPE, 84 object.as_raw(), 85 private_data_slot, 86 &mut data, 87 ); 88 data 89 } 90 91 #[inline] name() -> &'static CStr92 pub const fn name() -> &'static CStr { 93 vk::ExtPrivateDataFn::name() 94 } 95 96 #[inline] fp(&self) -> &vk::ExtPrivateDataFn97 pub fn fp(&self) -> &vk::ExtPrivateDataFn { 98 &self.fp 99 } 100 101 #[inline] device(&self) -> vk::Device102 pub fn device(&self) -> vk::Device { 103 self.handle 104 } 105 } 106