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