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_semaphore_win32.html> 9 #[derive(Clone)] 10 pub struct ExternalSemaphoreWin32 { 11 handle: vk::Device, 12 fp: vk::KhrExternalSemaphoreWin32Fn, 13 } 14 15 impl ExternalSemaphoreWin32 { new(instance: &Instance, device: &Device) -> Self16 pub fn new(instance: &Instance, device: &Device) -> Self { 17 let handle = device.handle(); 18 let fp = vk::KhrExternalSemaphoreWin32Fn::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/vkImportSemaphoreWin32HandleKHR.html> 25 #[inline] import_semaphore_win32_handle( &self, import_info: &vk::ImportSemaphoreWin32HandleInfoKHR, ) -> VkResult<()>26 pub unsafe fn import_semaphore_win32_handle( 27 &self, 28 import_info: &vk::ImportSemaphoreWin32HandleInfoKHR, 29 ) -> VkResult<()> { 30 (self.fp.import_semaphore_win32_handle_khr)(self.handle, import_info).result() 31 } 32 33 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetSemaphoreWin32HandleKHR.html> 34 #[inline] get_semaphore_win32_handle( &self, get_info: &vk::SemaphoreGetWin32HandleInfoKHR, ) -> VkResult<vk::HANDLE>35 pub unsafe fn get_semaphore_win32_handle( 36 &self, 37 get_info: &vk::SemaphoreGetWin32HandleInfoKHR, 38 ) -> VkResult<vk::HANDLE> { 39 let mut handle = ptr::null_mut(); 40 (self.fp.get_semaphore_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::KhrExternalSemaphoreWin32Fn::name() 47 } 48 49 #[inline] fp(&self) -> &vk::KhrExternalSemaphoreWin32Fn50 pub fn fp(&self) -> &vk::KhrExternalSemaphoreWin32Fn { 51 &self.fp 52 } 53 54 #[inline] device(&self) -> vk::Device55 pub fn device(&self) -> vk::Device { 56 self.handle 57 } 58 } 59