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