ash/extensions/khr/
display.rs

1use crate::prelude::*;
2use crate::vk;
3use crate::RawPtr;
4use crate::{Entry, Instance};
5use std::ffi::CStr;
6use std::mem;
7
8#[derive(Clone)]
9pub struct Display {
10    handle: vk::Instance,
11    fp: vk::KhrDisplayFn,
12}
13
14impl Display {
15    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]
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]
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]
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]
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]
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]
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]
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]
130    pub const fn name() -> &'static CStr {
131        vk::KhrDisplayFn::name()
132    }
133
134    #[inline]
135    pub fn fp(&self) -> &vk::KhrDisplayFn {
136        &self.fp
137    }
138
139    #[inline]
140    pub fn instance(&self) -> vk::Instance {
141        self.handle
142    }
143}