ash/extensions/ext/
private_data.rs1use crate::prelude::*;
2use crate::vk;
3use crate::RawPtr;
4use crate::{Device, Instance};
5use std::ffi::CStr;
6use std::mem;
7
8#[derive(Clone)]
10pub struct PrivateData {
11 handle: vk::Device,
12 fp: vk::ExtPrivateDataFn,
13}
14
15impl PrivateData {
16 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 #[inline]
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 #[inline]
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 #[inline]
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 #[inline]
75 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]
92 pub const fn name() -> &'static CStr {
93 vk::ExtPrivateDataFn::name()
94 }
95
96 #[inline]
97 pub fn fp(&self) -> &vk::ExtPrivateDataFn {
98 &self.fp
99 }
100
101 #[inline]
102 pub fn device(&self) -> vk::Device {
103 self.handle
104 }
105}