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