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 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 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 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 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 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}