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