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