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_memory_win32.html> 9 #[derive(Clone)] 10 pub struct ExternalMemoryWin32 { 11 handle: vk::Device, 12 fp: vk::KhrExternalMemoryWin32Fn, 13 } 14 15 impl ExternalMemoryWin32 { new(instance: &Instance, device: &Device) -> Self16 pub fn new(instance: &Instance, device: &Device) -> Self { 17 let handle = device.handle(); 18 let fp = vk::KhrExternalMemoryWin32Fn::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/vkGetMemoryWin32HandleKHR.html> 25 #[inline] get_memory_win32_handle( &self, create_info: &vk::MemoryGetWin32HandleInfoKHR, ) -> VkResult<vk::HANDLE>26 pub unsafe fn get_memory_win32_handle( 27 &self, 28 create_info: &vk::MemoryGetWin32HandleInfoKHR, 29 ) -> VkResult<vk::HANDLE> { 30 let mut handle = ptr::null_mut(); 31 (self.fp.get_memory_win32_handle_khr)(self.handle, create_info, &mut handle) 32 .result_with_success(handle) 33 } 34 35 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetMemoryWin32HandlePropertiesKHR.html> 36 #[inline] get_memory_win32_handle_properties( &self, handle_type: vk::ExternalMemoryHandleTypeFlags, handle: vk::HANDLE, ) -> VkResult<vk::MemoryWin32HandlePropertiesKHR>37 pub unsafe fn get_memory_win32_handle_properties( 38 &self, 39 handle_type: vk::ExternalMemoryHandleTypeFlags, 40 handle: vk::HANDLE, 41 ) -> VkResult<vk::MemoryWin32HandlePropertiesKHR> { 42 let mut memory_win32_handle_properties = Default::default(); 43 (self.fp.get_memory_win32_handle_properties_khr)( 44 self.handle, 45 handle_type, 46 handle, 47 &mut memory_win32_handle_properties, 48 ) 49 .result_with_success(memory_win32_handle_properties) 50 } 51 52 #[inline] name() -> &'static CStr53 pub const fn name() -> &'static CStr { 54 vk::KhrExternalMemoryWin32Fn::name() 55 } 56 57 #[inline] fp(&self) -> &vk::KhrExternalMemoryWin32Fn58 pub fn fp(&self) -> &vk::KhrExternalMemoryWin32Fn { 59 &self.fp 60 } 61 62 #[inline] device(&self) -> vk::Device63 pub fn device(&self) -> vk::Device { 64 self.handle 65 } 66 } 67