1 use crate::vk;
2 use crate::{Device, Instance};
3 use std::ffi::CStr;
4 use std::mem;
5 use std::ptr;
6 
7 #[derive(Clone)]
8 pub struct GetMemoryRequirements2 {
9     handle: vk::Device,
10     fp: vk::KhrGetMemoryRequirements2Fn,
11 }
12 
13 impl GetMemoryRequirements2 {
new(instance: &Instance, device: &Device) -> Self14     pub fn new(instance: &Instance, device: &Device) -> Self {
15         let handle = device.handle();
16         let fp = vk::KhrGetMemoryRequirements2Fn::load(|name| unsafe {
17             mem::transmute(instance.get_device_proc_addr(handle, name.as_ptr()))
18         });
19         Self { handle, fp }
20     }
21 
22     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetBufferMemoryRequirements2KHR.html>
23     #[inline]
get_buffer_memory_requirements2( &self, info: &vk::BufferMemoryRequirementsInfo2KHR, memory_requirements: &mut vk::MemoryRequirements2KHR, )24     pub unsafe fn get_buffer_memory_requirements2(
25         &self,
26         info: &vk::BufferMemoryRequirementsInfo2KHR,
27         memory_requirements: &mut vk::MemoryRequirements2KHR,
28     ) {
29         (self.fp.get_buffer_memory_requirements2_khr)(self.handle, info, memory_requirements);
30     }
31 
32     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetImageMemoryRequirements2KHR.html>
33     #[inline]
get_image_memory_requirements2( &self, info: &vk::ImageMemoryRequirementsInfo2KHR, memory_requirements: &mut vk::MemoryRequirements2KHR, )34     pub unsafe fn get_image_memory_requirements2(
35         &self,
36         info: &vk::ImageMemoryRequirementsInfo2KHR,
37         memory_requirements: &mut vk::MemoryRequirements2KHR,
38     ) {
39         (self.fp.get_image_memory_requirements2_khr)(self.handle, info, memory_requirements);
40     }
41 
42     /// Retrieve the number of elements to pass to [`get_image_sparse_memory_requirements2()`][Self::get_image_sparse_memory_requirements2()]
43     #[inline]
get_image_sparse_memory_requirements2_len( &self, info: &vk::ImageSparseMemoryRequirementsInfo2KHR, ) -> usize44     pub unsafe fn get_image_sparse_memory_requirements2_len(
45         &self,
46         info: &vk::ImageSparseMemoryRequirementsInfo2KHR,
47     ) -> usize {
48         let mut count = 0;
49         (self.fp.get_image_sparse_memory_requirements2_khr)(
50             self.handle,
51             info,
52             &mut count,
53             ptr::null_mut(),
54         );
55         count as usize
56     }
57 
58     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetImageSparseMemoryRequirements2KHR.html>
59     ///
60     /// Call [`get_image_sparse_memory_requirements2_len()`][Self::get_image_sparse_memory_requirements2_len()] to query the number of elements to pass to `out`.
61     /// Be sure to [`Default::default()`]-initialize these elements and optionally set their `p_next` pointer.
62     #[inline]
get_image_sparse_memory_requirements2( &self, info: &vk::ImageSparseMemoryRequirementsInfo2KHR, out: &mut [vk::SparseImageMemoryRequirements2KHR], )63     pub unsafe fn get_image_sparse_memory_requirements2(
64         &self,
65         info: &vk::ImageSparseMemoryRequirementsInfo2KHR,
66         out: &mut [vk::SparseImageMemoryRequirements2KHR],
67     ) {
68         let mut count = out.len() as u32;
69         (self.fp.get_image_sparse_memory_requirements2_khr)(
70             self.handle,
71             info,
72             &mut count,
73             out.as_mut_ptr(),
74         );
75         assert_eq!(count as usize, out.len());
76     }
77 
78     #[inline]
name() -> &'static CStr79     pub const fn name() -> &'static CStr {
80         vk::KhrGetMemoryRequirements2Fn::name()
81     }
82 
83     #[inline]
fp(&self) -> &vk::KhrGetMemoryRequirements2Fn84     pub fn fp(&self) -> &vk::KhrGetMemoryRequirements2Fn {
85         &self.fp
86     }
87 
88     #[inline]
device(&self) -> vk::Device89     pub fn device(&self) -> vk::Device {
90         self.handle
91     }
92 }
93