ash/extensions/khr/
deferred_host_operations.rs

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