1 #[cfg(doc)]
2 use super::Entry;
3 use crate::device::Device;
4 use crate::prelude::*;
5 use crate::vk;
6 use crate::RawPtr;
7 use std::mem;
8 use std::os::raw::c_char;
9 use std::ptr;
10 
11 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VkInstance.html>
12 #[derive(Clone)]
13 pub struct Instance {
14     pub(crate) handle: vk::Instance,
15 
16     pub(crate) instance_fn_1_0: vk::InstanceFnV1_0,
17     pub(crate) instance_fn_1_1: vk::InstanceFnV1_1,
18     pub(crate) instance_fn_1_2: vk::InstanceFnV1_2,
19     pub(crate) instance_fn_1_3: vk::InstanceFnV1_3,
20 }
21 
22 impl Instance {
load(static_fn: &vk::StaticFn, instance: vk::Instance) -> Self23     pub unsafe fn load(static_fn: &vk::StaticFn, instance: vk::Instance) -> Self {
24         let load_fn = |name: &std::ffi::CStr| {
25             mem::transmute((static_fn.get_instance_proc_addr)(instance, name.as_ptr()))
26         };
27 
28         Self {
29             handle: instance,
30 
31             instance_fn_1_0: vk::InstanceFnV1_0::load(load_fn),
32             instance_fn_1_1: vk::InstanceFnV1_1::load(load_fn),
33             instance_fn_1_2: vk::InstanceFnV1_2::load(load_fn),
34             instance_fn_1_3: vk::InstanceFnV1_3::load(load_fn),
35         }
36     }
37 
38     #[inline]
handle(&self) -> vk::Instance39     pub fn handle(&self) -> vk::Instance {
40         self.handle
41     }
42 }
43 
44 /// Vulkan core 1.3
45 #[allow(non_camel_case_types)]
46 impl Instance {
47     #[inline]
fp_v1_3(&self) -> &vk::InstanceFnV1_348     pub fn fp_v1_3(&self) -> &vk::InstanceFnV1_3 {
49         &self.instance_fn_1_3
50     }
51 
52     /// Retrieve the number of elements to pass to [`get_physical_device_tool_properties()`][Self::get_physical_device_tool_properties()]
53     #[inline]
get_physical_device_tool_properties_len( &self, physical_device: vk::PhysicalDevice, ) -> VkResult<usize>54     pub unsafe fn get_physical_device_tool_properties_len(
55         &self,
56         physical_device: vk::PhysicalDevice,
57     ) -> VkResult<usize> {
58         let mut count = 0;
59         (self.instance_fn_1_3.get_physical_device_tool_properties)(
60             physical_device,
61             &mut count,
62             ptr::null_mut(),
63         )
64         .result_with_success(count as usize)
65     }
66 
67     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceToolProperties.html>
68     ///
69     /// Call [`get_physical_device_tool_properties_len()`][Self::get_physical_device_tool_properties_len()] to query the number of elements to pass to `out`.
70     /// Be sure to [`Default::default()`]-initialize these elements and optionally set their `p_next` pointer.
71     #[inline]
get_physical_device_tool_properties( &self, physical_device: vk::PhysicalDevice, out: &mut [vk::PhysicalDeviceToolProperties], ) -> VkResult<()>72     pub unsafe fn get_physical_device_tool_properties(
73         &self,
74         physical_device: vk::PhysicalDevice,
75         out: &mut [vk::PhysicalDeviceToolProperties],
76     ) -> VkResult<()> {
77         let mut count = out.len() as u32;
78         (self.instance_fn_1_3.get_physical_device_tool_properties)(
79             physical_device,
80             &mut count,
81             out.as_mut_ptr(),
82         )
83         .result()?;
84         assert_eq!(count as usize, out.len());
85         Ok(())
86     }
87 }
88 
89 /// Vulkan core 1.2
90 #[allow(non_camel_case_types)]
91 impl Instance {
92     #[inline]
fp_v1_2(&self) -> &vk::InstanceFnV1_293     pub fn fp_v1_2(&self) -> &vk::InstanceFnV1_2 {
94         &self.instance_fn_1_2
95     }
96 }
97 
98 /// Vulkan core 1.1
99 #[allow(non_camel_case_types)]
100 impl Instance {
101     #[inline]
fp_v1_1(&self) -> &vk::InstanceFnV1_1102     pub fn fp_v1_1(&self) -> &vk::InstanceFnV1_1 {
103         &self.instance_fn_1_1
104     }
105 
106     /// Retrieve the number of elements to pass to [`enumerate_physical_device_groups()`][Self::enumerate_physical_device_groups()]
107     #[inline]
enumerate_physical_device_groups_len(&self) -> VkResult<usize>108     pub unsafe fn enumerate_physical_device_groups_len(&self) -> VkResult<usize> {
109         let mut group_count = 0;
110         (self.instance_fn_1_1.enumerate_physical_device_groups)(
111             self.handle(),
112             &mut group_count,
113             ptr::null_mut(),
114         )
115         .result_with_success(group_count as usize)
116     }
117 
118     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkEnumeratePhysicalDeviceGroups.html>
119     ///
120     /// Call [`enumerate_physical_device_groups_len()`][Self::enumerate_physical_device_groups_len()] to query the number of elements to pass to `out`.
121     /// Be sure to [`Default::default()`]-initialize these elements and optionally set their `p_next` pointer.
122     #[inline]
enumerate_physical_device_groups( &self, out: &mut [vk::PhysicalDeviceGroupProperties], ) -> VkResult<()>123     pub unsafe fn enumerate_physical_device_groups(
124         &self,
125         out: &mut [vk::PhysicalDeviceGroupProperties],
126     ) -> VkResult<()> {
127         let mut count = out.len() as u32;
128         (self.instance_fn_1_1.enumerate_physical_device_groups)(
129             self.handle(),
130             &mut count,
131             out.as_mut_ptr(),
132         )
133         .result()?;
134         assert_eq!(count as usize, out.len());
135         Ok(())
136     }
137 
138     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceFeatures2.html>
139     #[inline]
get_physical_device_features2( &self, physical_device: vk::PhysicalDevice, features: &mut vk::PhysicalDeviceFeatures2, )140     pub unsafe fn get_physical_device_features2(
141         &self,
142         physical_device: vk::PhysicalDevice,
143         features: &mut vk::PhysicalDeviceFeatures2,
144     ) {
145         (self.instance_fn_1_1.get_physical_device_features2)(physical_device, features);
146     }
147 
148     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceProperties2.html>
149     #[inline]
get_physical_device_properties2( &self, physical_device: vk::PhysicalDevice, prop: &mut vk::PhysicalDeviceProperties2, )150     pub unsafe fn get_physical_device_properties2(
151         &self,
152         physical_device: vk::PhysicalDevice,
153         prop: &mut vk::PhysicalDeviceProperties2,
154     ) {
155         (self.instance_fn_1_1.get_physical_device_properties2)(physical_device, prop);
156     }
157 
158     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceFormatProperties2.html>
159     #[inline]
get_physical_device_format_properties2( &self, physical_device: vk::PhysicalDevice, format: vk::Format, out: &mut vk::FormatProperties2, )160     pub unsafe fn get_physical_device_format_properties2(
161         &self,
162         physical_device: vk::PhysicalDevice,
163         format: vk::Format,
164         out: &mut vk::FormatProperties2,
165     ) {
166         (self.instance_fn_1_1.get_physical_device_format_properties2)(physical_device, format, out);
167     }
168 
169     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceImageFormatProperties2.html>
170     #[inline]
get_physical_device_image_format_properties2( &self, physical_device: vk::PhysicalDevice, format_info: &vk::PhysicalDeviceImageFormatInfo2, image_format_prop: &mut vk::ImageFormatProperties2, ) -> VkResult<()>171     pub unsafe fn get_physical_device_image_format_properties2(
172         &self,
173         physical_device: vk::PhysicalDevice,
174         format_info: &vk::PhysicalDeviceImageFormatInfo2,
175         image_format_prop: &mut vk::ImageFormatProperties2,
176     ) -> VkResult<()> {
177         (self
178             .instance_fn_1_1
179             .get_physical_device_image_format_properties2)(
180             physical_device,
181             format_info,
182             image_format_prop,
183         )
184         .result()
185     }
186 
187     /// Retrieve the number of elements to pass to [`get_physical_device_queue_family_properties2()`][Self::get_physical_device_queue_family_properties2()]
188     #[inline]
get_physical_device_queue_family_properties2_len( &self, physical_device: vk::PhysicalDevice, ) -> usize189     pub unsafe fn get_physical_device_queue_family_properties2_len(
190         &self,
191         physical_device: vk::PhysicalDevice,
192     ) -> usize {
193         let mut queue_count = 0;
194         (self
195             .instance_fn_1_1
196             .get_physical_device_queue_family_properties2)(
197             physical_device,
198             &mut queue_count,
199             ptr::null_mut(),
200         );
201         queue_count as usize
202     }
203 
204     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceQueueFamilyProperties2.html>
205     ///
206     /// Call [`get_physical_device_queue_family_properties2_len()`][Self::get_physical_device_queue_family_properties2_len()] to query the number of elements to pass to `out`.
207     /// Be sure to [`Default::default()`]-initialize these elements and optionally set their `p_next` pointer.
208     #[inline]
get_physical_device_queue_family_properties2( &self, physical_device: vk::PhysicalDevice, out: &mut [vk::QueueFamilyProperties2], )209     pub unsafe fn get_physical_device_queue_family_properties2(
210         &self,
211         physical_device: vk::PhysicalDevice,
212         out: &mut [vk::QueueFamilyProperties2],
213     ) {
214         let mut count = out.len() as u32;
215         (self
216             .instance_fn_1_1
217             .get_physical_device_queue_family_properties2)(
218             physical_device,
219             &mut count,
220             out.as_mut_ptr(),
221         );
222         assert_eq!(count as usize, out.len());
223     }
224 
225     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceMemoryProperties2.html>
226     #[inline]
get_physical_device_memory_properties2( &self, physical_device: vk::PhysicalDevice, out: &mut vk::PhysicalDeviceMemoryProperties2, )227     pub unsafe fn get_physical_device_memory_properties2(
228         &self,
229         physical_device: vk::PhysicalDevice,
230         out: &mut vk::PhysicalDeviceMemoryProperties2,
231     ) {
232         (self.instance_fn_1_1.get_physical_device_memory_properties2)(physical_device, out);
233     }
234 
235     /// Retrieve the number of elements to pass to [`get_physical_device_sparse_image_format_properties2()`][Self::get_physical_device_sparse_image_format_properties2()]
236     #[inline]
get_physical_device_sparse_image_format_properties2_len( &self, physical_device: vk::PhysicalDevice, format_info: &vk::PhysicalDeviceSparseImageFormatInfo2, ) -> usize237     pub unsafe fn get_physical_device_sparse_image_format_properties2_len(
238         &self,
239         physical_device: vk::PhysicalDevice,
240         format_info: &vk::PhysicalDeviceSparseImageFormatInfo2,
241     ) -> usize {
242         let mut format_count = 0;
243         (self
244             .instance_fn_1_1
245             .get_physical_device_sparse_image_format_properties2)(
246             physical_device,
247             format_info,
248             &mut format_count,
249             ptr::null_mut(),
250         );
251         format_count as usize
252     }
253 
254     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceSparseImageFormatProperties2.html>
255     ///
256     /// Call [`get_physical_device_sparse_image_format_properties2_len()`][Self::get_physical_device_sparse_image_format_properties2_len()] to query the number of elements to pass to `out`.
257     /// Be sure to [`Default::default()`]-initialize these elements and optionally set their `p_next` pointer.
258     #[inline]
get_physical_device_sparse_image_format_properties2( &self, physical_device: vk::PhysicalDevice, format_info: &vk::PhysicalDeviceSparseImageFormatInfo2, out: &mut [vk::SparseImageFormatProperties2], )259     pub unsafe fn get_physical_device_sparse_image_format_properties2(
260         &self,
261         physical_device: vk::PhysicalDevice,
262         format_info: &vk::PhysicalDeviceSparseImageFormatInfo2,
263         out: &mut [vk::SparseImageFormatProperties2],
264     ) {
265         let mut count = out.len() as u32;
266         (self
267             .instance_fn_1_1
268             .get_physical_device_sparse_image_format_properties2)(
269             physical_device,
270             format_info,
271             &mut count,
272             out.as_mut_ptr(),
273         );
274         assert_eq!(count as usize, out.len());
275     }
276 
277     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceExternalBufferProperties.html>
278     #[inline]
get_physical_device_external_buffer_properties( &self, physical_device: vk::PhysicalDevice, external_buffer_info: &vk::PhysicalDeviceExternalBufferInfo, out: &mut vk::ExternalBufferProperties, )279     pub unsafe fn get_physical_device_external_buffer_properties(
280         &self,
281         physical_device: vk::PhysicalDevice,
282         external_buffer_info: &vk::PhysicalDeviceExternalBufferInfo,
283         out: &mut vk::ExternalBufferProperties,
284     ) {
285         (self
286             .instance_fn_1_1
287             .get_physical_device_external_buffer_properties)(
288             physical_device,
289             external_buffer_info,
290             out,
291         );
292     }
293 
294     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceExternalFenceProperties.html>
295     #[inline]
get_physical_device_external_fence_properties( &self, physical_device: vk::PhysicalDevice, external_fence_info: &vk::PhysicalDeviceExternalFenceInfo, out: &mut vk::ExternalFenceProperties, )296     pub unsafe fn get_physical_device_external_fence_properties(
297         &self,
298         physical_device: vk::PhysicalDevice,
299         external_fence_info: &vk::PhysicalDeviceExternalFenceInfo,
300         out: &mut vk::ExternalFenceProperties,
301     ) {
302         (self
303             .instance_fn_1_1
304             .get_physical_device_external_fence_properties)(
305             physical_device,
306             external_fence_info,
307             out,
308         );
309     }
310 
311     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceExternalSemaphoreProperties.html>
312     #[inline]
get_physical_device_external_semaphore_properties( &self, physical_device: vk::PhysicalDevice, external_semaphore_info: &vk::PhysicalDeviceExternalSemaphoreInfo, out: &mut vk::ExternalSemaphoreProperties, )313     pub unsafe fn get_physical_device_external_semaphore_properties(
314         &self,
315         physical_device: vk::PhysicalDevice,
316         external_semaphore_info: &vk::PhysicalDeviceExternalSemaphoreInfo,
317         out: &mut vk::ExternalSemaphoreProperties,
318     ) {
319         (self
320             .instance_fn_1_1
321             .get_physical_device_external_semaphore_properties)(
322             physical_device,
323             external_semaphore_info,
324             out,
325         );
326     }
327 }
328 
329 /// Vulkan core 1.0
330 #[allow(non_camel_case_types)]
331 impl Instance {
332     #[inline]
fp_v1_0(&self) -> &vk::InstanceFnV1_0333     pub fn fp_v1_0(&self) -> &vk::InstanceFnV1_0 {
334         &self.instance_fn_1_0
335     }
336 
337     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCreateDevice.html>
338     ///
339     /// # Safety
340     ///
341     /// There is a [parent/child relation] between [`Instance`] and the resulting [`Device`].  The
342     /// application must not [destroy][Instance::destroy_instance()] the parent [`Instance`] object
343     /// before first [destroying][Device::destroy_device()] the returned [`Device`] child object.
344     /// [`Device`] does _not_ implement [drop][drop()] semantics and can only be destroyed via
345     /// [`destroy_device()`][Device::destroy_device()].
346     ///
347     /// See the [`Entry::create_instance()`] documentation for more destruction ordering rules on
348     /// [`Instance`].
349     ///
350     /// [parent/child relation]: https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#fundamentals-objectmodel-lifetime
351     #[inline]
create_device( &self, physical_device: vk::PhysicalDevice, create_info: &vk::DeviceCreateInfo, allocation_callbacks: Option<&vk::AllocationCallbacks>, ) -> VkResult<Device>352     pub unsafe fn create_device(
353         &self,
354         physical_device: vk::PhysicalDevice,
355         create_info: &vk::DeviceCreateInfo,
356         allocation_callbacks: Option<&vk::AllocationCallbacks>,
357     ) -> VkResult<Device> {
358         let mut device = mem::zeroed();
359         (self.instance_fn_1_0.create_device)(
360             physical_device,
361             create_info,
362             allocation_callbacks.as_raw_ptr(),
363             &mut device,
364         )
365         .result()?;
366         Ok(Device::load(&self.instance_fn_1_0, device))
367     }
368 
369     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetDeviceProcAddr.html>
370     #[inline]
get_device_proc_addr( &self, device: vk::Device, p_name: *const c_char, ) -> vk::PFN_vkVoidFunction371     pub unsafe fn get_device_proc_addr(
372         &self,
373         device: vk::Device,
374         p_name: *const c_char,
375     ) -> vk::PFN_vkVoidFunction {
376         (self.instance_fn_1_0.get_device_proc_addr)(device, p_name)
377     }
378 
379     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkDestroyInstance.html>
380     #[inline]
destroy_instance(&self, allocation_callbacks: Option<&vk::AllocationCallbacks>)381     pub unsafe fn destroy_instance(&self, allocation_callbacks: Option<&vk::AllocationCallbacks>) {
382         (self.instance_fn_1_0.destroy_instance)(self.handle(), allocation_callbacks.as_raw_ptr());
383     }
384 
385     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceFormatProperties.html>
386     #[inline]
get_physical_device_format_properties( &self, physical_device: vk::PhysicalDevice, format: vk::Format, ) -> vk::FormatProperties387     pub unsafe fn get_physical_device_format_properties(
388         &self,
389         physical_device: vk::PhysicalDevice,
390         format: vk::Format,
391     ) -> vk::FormatProperties {
392         let mut format_prop = mem::zeroed();
393         (self.instance_fn_1_0.get_physical_device_format_properties)(
394             physical_device,
395             format,
396             &mut format_prop,
397         );
398         format_prop
399     }
400 
401     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceImageFormatProperties.html>
402     #[inline]
get_physical_device_image_format_properties( &self, physical_device: vk::PhysicalDevice, format: vk::Format, typ: vk::ImageType, tiling: vk::ImageTiling, usage: vk::ImageUsageFlags, flags: vk::ImageCreateFlags, ) -> VkResult<vk::ImageFormatProperties>403     pub unsafe fn get_physical_device_image_format_properties(
404         &self,
405         physical_device: vk::PhysicalDevice,
406         format: vk::Format,
407         typ: vk::ImageType,
408         tiling: vk::ImageTiling,
409         usage: vk::ImageUsageFlags,
410         flags: vk::ImageCreateFlags,
411     ) -> VkResult<vk::ImageFormatProperties> {
412         let mut image_format_prop = mem::zeroed();
413         (self
414             .instance_fn_1_0
415             .get_physical_device_image_format_properties)(
416             physical_device,
417             format,
418             typ,
419             tiling,
420             usage,
421             flags,
422             &mut image_format_prop,
423         )
424         .result_with_success(image_format_prop)
425     }
426 
427     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceMemoryProperties.html>
428     #[inline]
get_physical_device_memory_properties( &self, physical_device: vk::PhysicalDevice, ) -> vk::PhysicalDeviceMemoryProperties429     pub unsafe fn get_physical_device_memory_properties(
430         &self,
431         physical_device: vk::PhysicalDevice,
432     ) -> vk::PhysicalDeviceMemoryProperties {
433         let mut memory_prop = mem::zeroed();
434         (self.instance_fn_1_0.get_physical_device_memory_properties)(
435             physical_device,
436             &mut memory_prop,
437         );
438         memory_prop
439     }
440 
441     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceProperties.html>
442     #[inline]
get_physical_device_properties( &self, physical_device: vk::PhysicalDevice, ) -> vk::PhysicalDeviceProperties443     pub unsafe fn get_physical_device_properties(
444         &self,
445         physical_device: vk::PhysicalDevice,
446     ) -> vk::PhysicalDeviceProperties {
447         let mut prop = mem::zeroed();
448         (self.instance_fn_1_0.get_physical_device_properties)(physical_device, &mut prop);
449         prop
450     }
451 
452     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceQueueFamilyProperties.html>
453     #[inline]
get_physical_device_queue_family_properties( &self, physical_device: vk::PhysicalDevice, ) -> Vec<vk::QueueFamilyProperties>454     pub unsafe fn get_physical_device_queue_family_properties(
455         &self,
456         physical_device: vk::PhysicalDevice,
457     ) -> Vec<vk::QueueFamilyProperties> {
458         read_into_uninitialized_vector(|count, data| {
459             (self
460                 .instance_fn_1_0
461                 .get_physical_device_queue_family_properties)(
462                 physical_device, count, data
463             );
464             vk::Result::SUCCESS
465         })
466         // The closure always returns SUCCESS
467         .unwrap()
468     }
469 
470     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceFeatures.html>
471     #[inline]
get_physical_device_features( &self, physical_device: vk::PhysicalDevice, ) -> vk::PhysicalDeviceFeatures472     pub unsafe fn get_physical_device_features(
473         &self,
474         physical_device: vk::PhysicalDevice,
475     ) -> vk::PhysicalDeviceFeatures {
476         let mut prop = mem::zeroed();
477         (self.instance_fn_1_0.get_physical_device_features)(physical_device, &mut prop);
478         prop
479     }
480 
481     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkEnumeratePhysicalDevices.html>
482     #[inline]
enumerate_physical_devices(&self) -> VkResult<Vec<vk::PhysicalDevice>>483     pub unsafe fn enumerate_physical_devices(&self) -> VkResult<Vec<vk::PhysicalDevice>> {
484         read_into_uninitialized_vector(|count, data| {
485             (self.instance_fn_1_0.enumerate_physical_devices)(self.handle(), count, data)
486         })
487     }
488 
489     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkEnumerateDeviceExtensionProperties.html>
490     #[inline]
enumerate_device_extension_properties( &self, device: vk::PhysicalDevice, ) -> VkResult<Vec<vk::ExtensionProperties>>491     pub unsafe fn enumerate_device_extension_properties(
492         &self,
493         device: vk::PhysicalDevice,
494     ) -> VkResult<Vec<vk::ExtensionProperties>> {
495         read_into_uninitialized_vector(|count, data| {
496             (self.instance_fn_1_0.enumerate_device_extension_properties)(
497                 device,
498                 ptr::null(),
499                 count,
500                 data,
501             )
502         })
503     }
504 
505     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkEnumerateDeviceLayerProperties.html>
506     #[inline]
enumerate_device_layer_properties( &self, device: vk::PhysicalDevice, ) -> VkResult<Vec<vk::LayerProperties>>507     pub unsafe fn enumerate_device_layer_properties(
508         &self,
509         device: vk::PhysicalDevice,
510     ) -> VkResult<Vec<vk::LayerProperties>> {
511         read_into_uninitialized_vector(|count, data| {
512             (self.instance_fn_1_0.enumerate_device_layer_properties)(device, count, data)
513         })
514     }
515 
516     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceSparseImageFormatProperties.html>
517     #[inline]
get_physical_device_sparse_image_format_properties( &self, physical_device: vk::PhysicalDevice, format: vk::Format, typ: vk::ImageType, samples: vk::SampleCountFlags, usage: vk::ImageUsageFlags, tiling: vk::ImageTiling, ) -> Vec<vk::SparseImageFormatProperties>518     pub unsafe fn get_physical_device_sparse_image_format_properties(
519         &self,
520         physical_device: vk::PhysicalDevice,
521         format: vk::Format,
522         typ: vk::ImageType,
523         samples: vk::SampleCountFlags,
524         usage: vk::ImageUsageFlags,
525         tiling: vk::ImageTiling,
526     ) -> Vec<vk::SparseImageFormatProperties> {
527         read_into_uninitialized_vector(|count, data| {
528             (self
529                 .instance_fn_1_0
530                 .get_physical_device_sparse_image_format_properties)(
531                 physical_device,
532                 format,
533                 typ,
534                 samples,
535                 usage,
536                 tiling,
537                 count,
538                 data,
539             );
540             vk::Result::SUCCESS
541         })
542         // The closure always returns SUCCESS
543         .unwrap()
544     }
545 }
546