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