1 use crate::prelude::*; 2 use crate::vk; 3 use crate::{Device, Instance}; 4 use std::ffi::CStr; 5 use std::mem; 6 use std::ptr; 7 8 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_KHR_external_fence_win32.html> 9 #[derive(Clone)] 10 pub struct ExternalFenceWin32 { 11 handle: vk::Device, 12 fp: vk::KhrExternalFenceWin32Fn, 13 } 14 15 impl ExternalFenceWin32 { new(instance: &Instance, device: &Device) -> Self16 pub fn new(instance: &Instance, device: &Device) -> Self { 17 let handle = device.handle(); 18 let fp = vk::KhrExternalFenceWin32Fn::load(|name| unsafe { 19 mem::transmute(instance.get_device_proc_addr(handle, name.as_ptr())) 20 }); 21 Self { handle, fp } 22 } 23 24 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkImportFenceWin32HandleKHR.html> 25 #[inline] import_fence_win32_handle( &self, import_info: &vk::ImportFenceWin32HandleInfoKHR, ) -> VkResult<()>26 pub unsafe fn import_fence_win32_handle( 27 &self, 28 import_info: &vk::ImportFenceWin32HandleInfoKHR, 29 ) -> VkResult<()> { 30 (self.fp.import_fence_win32_handle_khr)(self.handle, import_info).result() 31 } 32 33 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetFenceWin32HandleKHR.html> 34 #[inline] get_fence_win32_handle( &self, get_info: &vk::FenceGetWin32HandleInfoKHR, ) -> VkResult<vk::HANDLE>35 pub unsafe fn get_fence_win32_handle( 36 &self, 37 get_info: &vk::FenceGetWin32HandleInfoKHR, 38 ) -> VkResult<vk::HANDLE> { 39 let mut handle = ptr::null_mut(); 40 (self.fp.get_fence_win32_handle_khr)(self.handle, get_info, &mut handle) 41 .result_with_success(handle) 42 } 43 44 #[inline] name() -> &'static CStr45 pub const fn name() -> &'static CStr { 46 vk::KhrExternalFenceWin32Fn::name() 47 } 48 49 #[inline] fp(&self) -> &vk::KhrExternalFenceWin32Fn50 pub fn fp(&self) -> &vk::KhrExternalFenceWin32Fn { 51 &self.fp 52 } 53 54 #[inline] device(&self) -> vk::Device55 pub fn device(&self) -> vk::Device { 56 self.handle 57 } 58 } 59