1 use crate::vk;
2 use crate::{Device, Instance};
3 use std::ffi::CStr;
4 use std::mem;
5 
6 #[derive(Clone)]
7 pub struct BufferDeviceAddress {
8     handle: vk::Device,
9     fp: vk::ExtBufferDeviceAddressFn,
10 }
11 
12 impl BufferDeviceAddress {
new(instance: &Instance, device: &Device) -> Self13     pub fn new(instance: &Instance, device: &Device) -> Self {
14         let handle = device.handle();
15         let fp = vk::ExtBufferDeviceAddressFn::load(|name| unsafe {
16             mem::transmute(instance.get_device_proc_addr(handle, name.as_ptr()))
17         });
18         Self { handle, fp }
19     }
20 
21     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetBufferDeviceAddressEXT.html>
22     #[inline]
get_buffer_device_address( &self, info: &vk::BufferDeviceAddressInfoEXT, ) -> vk::DeviceAddress23     pub unsafe fn get_buffer_device_address(
24         &self,
25         info: &vk::BufferDeviceAddressInfoEXT,
26     ) -> vk::DeviceAddress {
27         (self.fp.get_buffer_device_address_ext)(self.handle, info)
28     }
29 
30     #[inline]
name() -> &'static CStr31     pub const fn name() -> &'static CStr {
32         vk::ExtBufferDeviceAddressFn::name()
33     }
34 
35     #[inline]
fp(&self) -> &vk::ExtBufferDeviceAddressFn36     pub fn fp(&self) -> &vk::ExtBufferDeviceAddressFn {
37         &self.fp
38     }
39 
40     #[inline]
device(&self) -> vk::Device41     pub fn device(&self) -> vk::Device {
42         self.handle
43     }
44 }
45