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 ExternalFenceFd {
9     handle: vk::Device,
10     fp: vk::KhrExternalFenceFdFn,
11 }
12 
13 impl ExternalFenceFd {
new(instance: &Instance, device: &Device) -> Self14     pub fn new(instance: &Instance, device: &Device) -> Self {
15         let handle = device.handle();
16         let fp = vk::KhrExternalFenceFdFn::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/vkImportFenceFdKHR.html>
23     #[inline]
import_fence_fd(&self, import_info: &vk::ImportFenceFdInfoKHR) -> VkResult<()>24     pub unsafe fn import_fence_fd(&self, import_info: &vk::ImportFenceFdInfoKHR) -> VkResult<()> {
25         (self.fp.import_fence_fd_khr)(self.handle, import_info).result()
26     }
27 
28     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetFenceFdKHR.html>
29     #[inline]
get_fence_fd(&self, get_info: &vk::FenceGetFdInfoKHR) -> VkResult<i32>30     pub unsafe fn get_fence_fd(&self, get_info: &vk::FenceGetFdInfoKHR) -> VkResult<i32> {
31         let mut fd = -1;
32         (self.fp.get_fence_fd_khr)(self.handle, get_info, &mut fd).result_with_success(fd)
33     }
34 
35     #[inline]
name() -> &'static CStr36     pub const fn name() -> &'static CStr {
37         vk::KhrExternalFenceFdFn::name()
38     }
39 
40     #[inline]
fp(&self) -> &vk::KhrExternalFenceFdFn41     pub fn fp(&self) -> &vk::KhrExternalFenceFdFn {
42         &self.fp
43     }
44 
45     #[inline]
device(&self) -> vk::Device46     pub fn device(&self) -> vk::Device {
47         self.handle
48     }
49 }
50