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 ExternalSemaphoreFd { 9 handle: vk::Device, 10 fp: vk::KhrExternalSemaphoreFdFn, 11 } 12 13 impl ExternalSemaphoreFd { new(instance: &Instance, device: &Device) -> Self14 pub fn new(instance: &Instance, device: &Device) -> Self { 15 let handle = device.handle(); 16 let fp = vk::KhrExternalSemaphoreFdFn::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/vkImportSemaphoreFdKHR.html> 23 #[inline] import_semaphore_fd( &self, import_info: &vk::ImportSemaphoreFdInfoKHR, ) -> VkResult<()>24 pub unsafe fn import_semaphore_fd( 25 &self, 26 import_info: &vk::ImportSemaphoreFdInfoKHR, 27 ) -> VkResult<()> { 28 (self.fp.import_semaphore_fd_khr)(self.handle, import_info).result() 29 } 30 31 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetSemaphoreFdKHR.html> 32 #[inline] get_semaphore_fd(&self, get_info: &vk::SemaphoreGetFdInfoKHR) -> VkResult<i32>33 pub unsafe fn get_semaphore_fd(&self, get_info: &vk::SemaphoreGetFdInfoKHR) -> VkResult<i32> { 34 let mut fd = -1; 35 (self.fp.get_semaphore_fd_khr)(self.handle, get_info, &mut fd).result_with_success(fd) 36 } 37 38 #[inline] name() -> &'static CStr39 pub const fn name() -> &'static CStr { 40 vk::KhrExternalSemaphoreFdFn::name() 41 } 42 43 #[inline] fp(&self) -> &vk::KhrExternalSemaphoreFdFn44 pub fn fp(&self) -> &vk::KhrExternalSemaphoreFdFn { 45 &self.fp 46 } 47 48 #[inline] device(&self) -> vk::Device49 pub fn device(&self) -> vk::Device { 50 self.handle 51 } 52 } 53