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