1 use crate::prelude::*;
2 use crate::vk;
3 use crate::RawPtr;
4 use crate::{Entry, Instance};
5 use std::ffi::CStr;
6 use std::mem;
7 
8 #[derive(Clone)]
9 pub struct Display {
10     handle: vk::Instance,
11     fp: vk::KhrDisplayFn,
12 }
13 
14 impl Display {
new(entry: &Entry, instance: &Instance) -> Self15     pub fn new(entry: &Entry, instance: &Instance) -> Self {
16         let handle = instance.handle();
17         let fp = vk::KhrDisplayFn::load(|name| unsafe {
18             mem::transmute(entry.get_instance_proc_addr(handle, name.as_ptr()))
19         });
20         Self { handle, fp }
21     }
22 
23     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceDisplayPropertiesKHR.html>
24     #[inline]
get_physical_device_display_properties( &self, physical_device: vk::PhysicalDevice, ) -> VkResult<Vec<vk::DisplayPropertiesKHR>>25     pub unsafe fn get_physical_device_display_properties(
26         &self,
27         physical_device: vk::PhysicalDevice,
28     ) -> VkResult<Vec<vk::DisplayPropertiesKHR>> {
29         read_into_uninitialized_vector(|count, data| {
30             (self.fp.get_physical_device_display_properties_khr)(physical_device, count, data)
31         })
32     }
33 
34     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceDisplayPlanePropertiesKHR.html>
35     #[inline]
get_physical_device_display_plane_properties( &self, physical_device: vk::PhysicalDevice, ) -> VkResult<Vec<vk::DisplayPlanePropertiesKHR>>36     pub unsafe fn get_physical_device_display_plane_properties(
37         &self,
38         physical_device: vk::PhysicalDevice,
39     ) -> VkResult<Vec<vk::DisplayPlanePropertiesKHR>> {
40         read_into_uninitialized_vector(|count, data| {
41             (self.fp.get_physical_device_display_plane_properties_khr)(physical_device, count, data)
42         })
43     }
44 
45     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetDisplayPlaneSupportedDisplaysKHR.html>
46     #[inline]
get_display_plane_supported_displays( &self, physical_device: vk::PhysicalDevice, plane_index: u32, ) -> VkResult<Vec<vk::DisplayKHR>>47     pub unsafe fn get_display_plane_supported_displays(
48         &self,
49         physical_device: vk::PhysicalDevice,
50         plane_index: u32,
51     ) -> VkResult<Vec<vk::DisplayKHR>> {
52         read_into_uninitialized_vector(|count, data| {
53             (self.fp.get_display_plane_supported_displays_khr)(
54                 physical_device,
55                 plane_index,
56                 count,
57                 data,
58             )
59         })
60     }
61 
62     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetDisplayModePropertiesKHR.html>
63     #[inline]
get_display_mode_properties( &self, physical_device: vk::PhysicalDevice, display: vk::DisplayKHR, ) -> VkResult<Vec<vk::DisplayModePropertiesKHR>>64     pub unsafe fn get_display_mode_properties(
65         &self,
66         physical_device: vk::PhysicalDevice,
67         display: vk::DisplayKHR,
68     ) -> VkResult<Vec<vk::DisplayModePropertiesKHR>> {
69         read_into_uninitialized_vector(|count, data| {
70             (self.fp.get_display_mode_properties_khr)(physical_device, display, count, data)
71         })
72     }
73 
74     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCreateDisplayModeKHR.html>
75     #[inline]
create_display_mode( &self, physical_device: vk::PhysicalDevice, display: vk::DisplayKHR, create_info: &vk::DisplayModeCreateInfoKHR, allocation_callbacks: Option<&vk::AllocationCallbacks>, ) -> VkResult<vk::DisplayModeKHR>76     pub unsafe fn create_display_mode(
77         &self,
78         physical_device: vk::PhysicalDevice,
79         display: vk::DisplayKHR,
80         create_info: &vk::DisplayModeCreateInfoKHR,
81         allocation_callbacks: Option<&vk::AllocationCallbacks>,
82     ) -> VkResult<vk::DisplayModeKHR> {
83         let mut display_mode = mem::MaybeUninit::zeroed();
84         (self.fp.create_display_mode_khr)(
85             physical_device,
86             display,
87             create_info,
88             allocation_callbacks.as_raw_ptr(),
89             display_mode.as_mut_ptr(),
90         )
91         .assume_init_on_success(display_mode)
92     }
93 
94     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetDisplayPlaneCapabilitiesKHR.html>
95     #[inline]
get_display_plane_capabilities( &self, physical_device: vk::PhysicalDevice, mode: vk::DisplayModeKHR, plane_index: u32, ) -> VkResult<vk::DisplayPlaneCapabilitiesKHR>96     pub unsafe fn get_display_plane_capabilities(
97         &self,
98         physical_device: vk::PhysicalDevice,
99         mode: vk::DisplayModeKHR,
100         plane_index: u32,
101     ) -> VkResult<vk::DisplayPlaneCapabilitiesKHR> {
102         let mut display_plane_capabilities = mem::MaybeUninit::zeroed();
103         (self.fp.get_display_plane_capabilities_khr)(
104             physical_device,
105             mode,
106             plane_index,
107             display_plane_capabilities.as_mut_ptr(),
108         )
109         .assume_init_on_success(display_plane_capabilities)
110     }
111 
112     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCreateDisplayPlaneSurfaceKHR.html>
113     #[inline]
create_display_plane_surface( &self, create_info: &vk::DisplaySurfaceCreateInfoKHR, allocation_callbacks: Option<&vk::AllocationCallbacks>, ) -> VkResult<vk::SurfaceKHR>114     pub unsafe fn create_display_plane_surface(
115         &self,
116         create_info: &vk::DisplaySurfaceCreateInfoKHR,
117         allocation_callbacks: Option<&vk::AllocationCallbacks>,
118     ) -> VkResult<vk::SurfaceKHR> {
119         let mut surface = mem::MaybeUninit::zeroed();
120         (self.fp.create_display_plane_surface_khr)(
121             self.handle,
122             create_info,
123             allocation_callbacks.as_raw_ptr(),
124             surface.as_mut_ptr(),
125         )
126         .assume_init_on_success(surface)
127     }
128 
129     #[inline]
name() -> &'static CStr130     pub const fn name() -> &'static CStr {
131         vk::KhrDisplayFn::name()
132     }
133 
134     #[inline]
fp(&self) -> &vk::KhrDisplayFn135     pub fn fp(&self) -> &vk::KhrDisplayFn {
136         &self.fp
137     }
138 
139     #[inline]
instance(&self) -> vk::Instance140     pub fn instance(&self) -> vk::Instance {
141         self.handle
142     }
143 }
144