1 use crate::prelude::*; 2 use crate::vk; 3 use crate::RawPtr; 4 use crate::{Device, Instance}; 5 use std::ffi::CStr; 6 use std::mem; 7 8 #[derive(Clone)] 9 pub struct DeferredHostOperations { 10 handle: vk::Device, 11 fp: vk::KhrDeferredHostOperationsFn, 12 } 13 14 impl DeferredHostOperations { new(instance: &Instance, device: &Device) -> Self15 pub fn new(instance: &Instance, device: &Device) -> Self { 16 let handle = device.handle(); 17 let fp = vk::KhrDeferredHostOperationsFn::load(|name| unsafe { 18 mem::transmute(instance.get_device_proc_addr(handle, name.as_ptr())) 19 }); 20 Self { handle, fp } 21 } 22 23 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCreateDeferredOperationKHR.html> 24 #[inline] create_deferred_operation( &self, allocation_callbacks: Option<&vk::AllocationCallbacks>, ) -> VkResult<vk::DeferredOperationKHR>25 pub unsafe fn create_deferred_operation( 26 &self, 27 allocation_callbacks: Option<&vk::AllocationCallbacks>, 28 ) -> VkResult<vk::DeferredOperationKHR> { 29 let mut operation = mem::zeroed(); 30 (self.fp.create_deferred_operation_khr)( 31 self.handle, 32 allocation_callbacks.as_raw_ptr(), 33 &mut operation, 34 ) 35 .result_with_success(operation) 36 } 37 38 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkDeferredOperationJoinKHR.html> 39 #[inline] deferred_operation_join( &self, operation: vk::DeferredOperationKHR, ) -> VkResult<()>40 pub unsafe fn deferred_operation_join( 41 &self, 42 operation: vk::DeferredOperationKHR, 43 ) -> VkResult<()> { 44 (self.fp.deferred_operation_join_khr)(self.handle, operation).result() 45 } 46 47 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkDestroyDeferredOperationKHR.html> 48 #[inline] destroy_deferred_operation( &self, operation: vk::DeferredOperationKHR, allocation_callbacks: Option<&vk::AllocationCallbacks>, )49 pub unsafe fn destroy_deferred_operation( 50 &self, 51 operation: vk::DeferredOperationKHR, 52 allocation_callbacks: Option<&vk::AllocationCallbacks>, 53 ) { 54 (self.fp.destroy_deferred_operation_khr)( 55 self.handle, 56 operation, 57 allocation_callbacks.as_raw_ptr(), 58 ); 59 } 60 61 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetDeferredOperationMaxConcurrencyKHR.html> 62 #[inline] get_deferred_operation_max_concurrency( &self, operation: vk::DeferredOperationKHR, ) -> u3263 pub unsafe fn get_deferred_operation_max_concurrency( 64 &self, 65 operation: vk::DeferredOperationKHR, 66 ) -> u32 { 67 (self.fp.get_deferred_operation_max_concurrency_khr)(self.handle, operation) 68 } 69 70 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetDeferredOperationResultKHR.html> 71 #[inline] get_deferred_operation_result( &self, operation: vk::DeferredOperationKHR, ) -> VkResult<()>72 pub unsafe fn get_deferred_operation_result( 73 &self, 74 operation: vk::DeferredOperationKHR, 75 ) -> VkResult<()> { 76 (self.fp.get_deferred_operation_result_khr)(self.handle, operation).result() 77 } 78 79 #[inline] name() -> &'static CStr80 pub const fn name() -> &'static CStr { 81 vk::KhrDeferredHostOperationsFn::name() 82 } 83 84 #[inline] fp(&self) -> &vk::KhrDeferredHostOperationsFn85 pub fn fp(&self) -> &vk::KhrDeferredHostOperationsFn { 86 &self.fp 87 } 88 89 #[inline] device(&self) -> vk::Device90 pub fn device(&self) -> vk::Device { 91 self.handle 92 } 93 } 94