1 use crate::prelude::*;
2 use crate::vk;
3 use crate::{Entry, Instance};
4 use std::ffi::CStr;
5 use std::mem;
6 
7 #[derive(Clone)]
8 pub struct GetSurfaceCapabilities2 {
9     fp: vk::KhrGetSurfaceCapabilities2Fn,
10 }
11 
12 impl GetSurfaceCapabilities2 {
new(entry: &Entry, instance: &Instance) -> Self13     pub fn new(entry: &Entry, instance: &Instance) -> Self {
14         let fp = vk::KhrGetSurfaceCapabilities2Fn::load(|name| unsafe {
15             mem::transmute(entry.get_instance_proc_addr(instance.handle(), name.as_ptr()))
16         });
17         Self { fp }
18     }
19 
20     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceSurfaceCapabilities2KHR.html>
21     #[inline]
get_physical_device_surface_capabilities2( &self, physical_device: vk::PhysicalDevice, surface_info: &vk::PhysicalDeviceSurfaceInfo2KHR, ) -> VkResult<vk::SurfaceCapabilities2KHR>22     pub unsafe fn get_physical_device_surface_capabilities2(
23         &self,
24         physical_device: vk::PhysicalDevice,
25         surface_info: &vk::PhysicalDeviceSurfaceInfo2KHR,
26     ) -> VkResult<vk::SurfaceCapabilities2KHR> {
27         let mut surface_capabilities = Default::default();
28         (self.fp.get_physical_device_surface_capabilities2_khr)(
29             physical_device,
30             surface_info,
31             &mut surface_capabilities,
32         )
33         .result_with_success(surface_capabilities)
34     }
35 
36     /// Retrieve the number of elements to pass to [`get_physical_device_surface_formats2()`][Self::get_physical_device_surface_formats2()]
37     #[inline]
get_physical_device_surface_formats2_len( &self, physical_device: vk::PhysicalDevice, surface_info: &vk::PhysicalDeviceSurfaceInfo2KHR, ) -> VkResult<usize>38     pub unsafe fn get_physical_device_surface_formats2_len(
39         &self,
40         physical_device: vk::PhysicalDevice,
41         surface_info: &vk::PhysicalDeviceSurfaceInfo2KHR,
42     ) -> VkResult<usize> {
43         let mut count = 0;
44         let err_code = (self.fp.get_physical_device_surface_formats2_khr)(
45             physical_device,
46             surface_info,
47             &mut count,
48             std::ptr::null_mut(),
49         );
50         err_code.result_with_success(count as usize)
51     }
52 
53     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceSurfaceFormats2KHR.html>
54     ///
55     /// Call [`get_physical_device_surface_formats2_len()`][Self::get_physical_device_surface_formats2_len()] to query the number of elements to pass to `out`.
56     /// Be sure to [`Default::default()`]-initialize these elements and optionally set their `p_next` pointer.
57     #[inline]
get_physical_device_surface_formats2( &self, physical_device: vk::PhysicalDevice, surface_info: &vk::PhysicalDeviceSurfaceInfo2KHR, out: &mut [vk::SurfaceFormat2KHR], ) -> VkResult<()>58     pub unsafe fn get_physical_device_surface_formats2(
59         &self,
60         physical_device: vk::PhysicalDevice,
61         surface_info: &vk::PhysicalDeviceSurfaceInfo2KHR,
62         out: &mut [vk::SurfaceFormat2KHR],
63     ) -> VkResult<()> {
64         let mut count = out.len() as u32;
65         let err_code = (self.fp.get_physical_device_surface_formats2_khr)(
66             physical_device,
67             surface_info,
68             &mut count,
69             out.as_mut_ptr(),
70         );
71         assert_eq!(count as usize, out.len());
72         err_code.result()
73     }
74 
75     #[inline]
name() -> &'static CStr76     pub const fn name() -> &'static CStr {
77         vk::KhrGetSurfaceCapabilities2Fn::name()
78     }
79 
80     #[inline]
fp(&self) -> &vk::KhrGetSurfaceCapabilities2Fn81     pub fn fp(&self) -> &vk::KhrGetSurfaceCapabilities2Fn {
82         &self.fp
83     }
84 }
85