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::KhrBufferDeviceAddressFn, 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::KhrBufferDeviceAddressFn::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/vkGetBufferDeviceAddressKHR.html> 22 #[inline] get_buffer_device_address( &self, info: &vk::BufferDeviceAddressInfoKHR, ) -> vk::DeviceAddress23 pub unsafe fn get_buffer_device_address( 24 &self, 25 info: &vk::BufferDeviceAddressInfoKHR, 26 ) -> vk::DeviceAddress { 27 (self.fp.get_buffer_device_address_khr)(self.handle, info) 28 } 29 30 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetBufferOpaqueCaptureAddressKHR.html> 31 #[inline] get_buffer_opaque_capture_address( &self, info: &vk::BufferDeviceAddressInfoKHR, ) -> u6432 pub unsafe fn get_buffer_opaque_capture_address( 33 &self, 34 info: &vk::BufferDeviceAddressInfoKHR, 35 ) -> u64 { 36 (self.fp.get_buffer_opaque_capture_address_khr)(self.handle, info) 37 } 38 39 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetDeviceMemoryOpaqueCaptureAddressKHR.html> 40 #[inline] get_device_memory_opaque_capture_address( &self, info: &vk::DeviceMemoryOpaqueCaptureAddressInfoKHR, ) -> u6441 pub unsafe fn get_device_memory_opaque_capture_address( 42 &self, 43 info: &vk::DeviceMemoryOpaqueCaptureAddressInfoKHR, 44 ) -> u64 { 45 (self.fp.get_device_memory_opaque_capture_address_khr)(self.handle, info) 46 } 47 48 #[inline] name() -> &'static CStr49 pub const fn name() -> &'static CStr { 50 vk::KhrBufferDeviceAddressFn::name() 51 } 52 53 #[inline] fp(&self) -> &vk::KhrBufferDeviceAddressFn54 pub fn fp(&self) -> &vk::KhrBufferDeviceAddressFn { 55 &self.fp 56 } 57 58 #[inline] device(&self) -> vk::Device59 pub fn device(&self) -> vk::Device { 60 self.handle 61 } 62 } 63