ash/extensions/ext/
private_data.rs
1use 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 pub unsafe fn create_private_data_slot(
26 &self,
27 create_info: &vk::PrivateDataSlotCreateInfoEXT,
28 allocation_callbacks: Option<&vk::AllocationCallbacks>,
29 ) -> VkResult<vk::PrivateDataSlotEXT> {
30 let mut private_data_slot = mem::zeroed();
31 (self.fp.create_private_data_slot_ext)(
32 self.handle,
33 create_info,
34 allocation_callbacks.as_raw_ptr(),
35 &mut private_data_slot,
36 )
37 .result_with_success(private_data_slot)
38 }
39
40 pub unsafe fn destroy_private_data_slot(
42 &self,
43 private_data_slot: vk::PrivateDataSlotEXT,
44 allocation_callbacks: Option<&vk::AllocationCallbacks>,
45 ) {
46 (self.fp.destroy_private_data_slot_ext)(
47 self.handle,
48 private_data_slot,
49 allocation_callbacks.as_raw_ptr(),
50 )
51 }
52
53 pub unsafe fn set_private_data<T: vk::Handle>(
55 &self,
56 object: T,
57 private_data_slot: vk::PrivateDataSlotEXT,
58 data: u64,
59 ) -> VkResult<()> {
60 (self.fp.set_private_data_ext)(
61 self.handle,
62 T::TYPE,
63 object.as_raw(),
64 private_data_slot,
65 data,
66 )
67 .result()
68 }
69
70 pub unsafe fn get_private_data<T: vk::Handle>(
72 &self,
73 object: T,
74 private_data_slot: vk::PrivateDataSlotEXT,
75 ) -> u64 {
76 let mut data = mem::zeroed();
77 (self.fp.get_private_data_ext)(
78 self.handle,
79 T::TYPE,
80 object.as_raw(),
81 private_data_slot,
82 &mut data,
83 );
84 data
85 }
86
87 pub const fn name() -> &'static CStr {
88 vk::ExtPrivateDataFn::name()
89 }
90
91 pub fn fp(&self) -> &vk::ExtPrivateDataFn {
92 &self.fp
93 }
94
95 pub fn device(&self) -> vk::Device {
96 self.handle
97 }
98}