1 use crate::prelude::*; 2 use crate::vk; 3 use crate::{Device, Instance}; 4 use std::ffi::CStr; 5 use std::mem; 6 7 #[derive(Clone)] 8 pub struct ExternalMemoryFd { 9 handle: vk::Device, 10 fp: vk::KhrExternalMemoryFdFn, 11 } 12 13 impl ExternalMemoryFd { new(instance: &Instance, device: &Device) -> Self14 pub fn new(instance: &Instance, device: &Device) -> Self { 15 let handle = device.handle(); 16 let fp = vk::KhrExternalMemoryFdFn::load(|name| unsafe { 17 mem::transmute(instance.get_device_proc_addr(handle, name.as_ptr())) 18 }); 19 Self { handle, fp } 20 } 21 22 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetMemoryFdKHR.html> 23 #[inline] get_memory_fd(&self, get_fd_info: &vk::MemoryGetFdInfoKHR) -> VkResult<i32>24 pub unsafe fn get_memory_fd(&self, get_fd_info: &vk::MemoryGetFdInfoKHR) -> VkResult<i32> { 25 let mut fd = -1; 26 (self.fp.get_memory_fd_khr)(self.handle, get_fd_info, &mut fd).result_with_success(fd) 27 } 28 29 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetMemoryFdPropertiesKHR.html> 30 #[inline] get_memory_fd_properties( &self, handle_type: vk::ExternalMemoryHandleTypeFlags, fd: i32, ) -> VkResult<vk::MemoryFdPropertiesKHR>31 pub unsafe fn get_memory_fd_properties( 32 &self, 33 handle_type: vk::ExternalMemoryHandleTypeFlags, 34 fd: i32, 35 ) -> VkResult<vk::MemoryFdPropertiesKHR> { 36 let mut memory_fd_properties = Default::default(); 37 (self.fp.get_memory_fd_properties_khr)( 38 self.handle, 39 handle_type, 40 fd, 41 &mut memory_fd_properties, 42 ) 43 .result_with_success(memory_fd_properties) 44 } 45 46 #[inline] name() -> &'static CStr47 pub const fn name() -> &'static CStr { 48 vk::KhrExternalMemoryFdFn::name() 49 } 50 51 #[inline] fp(&self) -> &vk::KhrExternalMemoryFdFn52 pub fn fp(&self) -> &vk::KhrExternalMemoryFdFn { 53 &self.fp 54 } 55 56 #[inline] device(&self) -> vk::Device57 pub fn device(&self) -> vk::Device { 58 self.handle 59 } 60 } 61