ash/extensions/khr/
maintenance4.rs

1use crate::vk;
2use crate::{Device, Instance};
3use std::ffi::CStr;
4use std::mem;
5
6#[derive(Clone)]
7pub struct Maintenance4 {
8    handle: vk::Device,
9    fp: vk::KhrMaintenance4Fn,
10}
11
12impl Maintenance4 {
13    pub fn new(instance: &Instance, device: &Device) -> Self {
14        let handle = device.handle();
15        let fp = vk::KhrMaintenance4Fn::load(|name| unsafe {
16            mem::transmute(instance.get_device_proc_addr(handle, name.as_ptr()))
17        });
18        Self { handle, fp }
19    }
20
21    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetDeviceBufferMemoryRequirementsKHR.html>
22    pub unsafe fn get_device_buffer_memory_requirements(
23        &self,
24        create_info: &vk::DeviceBufferMemoryRequirementsKHR,
25        out: &mut vk::MemoryRequirements2,
26    ) {
27        (self.fp.get_device_buffer_memory_requirements_khr)(self.handle, create_info, out)
28    }
29
30    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetDeviceImageMemoryRequirementsKHR.html>
31    pub unsafe fn get_device_image_memory_requirements(
32        &self,
33        create_info: &vk::DeviceImageMemoryRequirementsKHR,
34        out: &mut vk::MemoryRequirements2,
35    ) {
36        (self.fp.get_device_image_memory_requirements_khr)(self.handle, create_info, out)
37    }
38
39    /// Retrieve the number of elements to pass to [`get_device_image_sparse_memory_requirements()`][Self::get_device_image_sparse_memory_requirements()]
40    pub unsafe fn get_device_image_sparse_memory_requirements_len(
41        &self,
42        create_info: &vk::DeviceImageMemoryRequirementsKHR,
43    ) -> usize {
44        let mut count = 0;
45        (self.fp.get_device_image_sparse_memory_requirements_khr)(
46            self.handle,
47            create_info,
48            &mut count,
49            std::ptr::null_mut(),
50        );
51        count as usize
52    }
53
54    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetDeviceImageSparseMemoryRequirementsKHR.html>
55    ///
56    /// Call [`get_device_image_sparse_memory_requirements_len()`][Self::get_device_image_sparse_memory_requirements_len()] to query the number of elements to pass to `out`.
57    /// Be sure to [`Default::default()`]-initialize these elements and optionally set their `p_next` pointer.
58    pub unsafe fn get_device_image_sparse_memory_requirements(
59        &self,
60        create_info: &vk::DeviceImageMemoryRequirementsKHR,
61        out: &mut [vk::SparseImageMemoryRequirements2],
62    ) {
63        let mut count = out.len() as u32;
64        (self.fp.get_device_image_sparse_memory_requirements_khr)(
65            self.handle,
66            create_info,
67            &mut count,
68            out.as_mut_ptr(),
69        );
70        assert_eq!(count as usize, out.len());
71    }
72
73    pub const fn name() -> &'static CStr {
74        vk::KhrMaintenance4Fn::name()
75    }
76
77    pub fn fp(&self) -> &vk::KhrMaintenance4Fn {
78        &self.fp
79    }
80
81    pub fn device(&self) -> vk::Device {
82        self.handle
83    }
84}