ash/extensions/khr/
external_fence_fd.rs

1use crate::prelude::*;
2use crate::vk;
3use crate::{Device, Instance};
4use std::ffi::CStr;
5use std::mem;
6
7#[derive(Clone)]
8pub struct ExternalFenceFd {
9    handle: vk::Device,
10    fp: vk::KhrExternalFenceFdFn,
11}
12
13impl ExternalFenceFd {
14    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]
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]
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]
36    pub const fn name() -> &'static CStr {
37        vk::KhrExternalFenceFdFn::name()
38    }
39
40    #[inline]
41    pub fn fp(&self) -> &vk::KhrExternalFenceFdFn {
42        &self.fp
43    }
44
45    #[inline]
46    pub fn device(&self) -> vk::Device {
47        self.handle
48    }
49}