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    pub unsafe fn get_physical_device_display_properties(
25        &self,
26        physical_device: vk::PhysicalDevice,
27    ) -> VkResult<Vec<vk::DisplayPropertiesKHR>> {
28        read_into_uninitialized_vector(|count, data| {
29            (self.fp.get_physical_device_display_properties_khr)(physical_device, count, data)
30        })
31    }
32
33    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceDisplayPlanePropertiesKHR.html>
34    pub unsafe fn get_physical_device_display_plane_properties(
35        &self,
36        physical_device: vk::PhysicalDevice,
37    ) -> VkResult<Vec<vk::DisplayPlanePropertiesKHR>> {
38        read_into_uninitialized_vector(|count, data| {
39            (self.fp.get_physical_device_display_plane_properties_khr)(physical_device, count, data)
40        })
41    }
42
43    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetDisplayPlaneSupportedDisplaysKHR.html>
44    pub unsafe fn get_display_plane_supported_displays(
45        &self,
46        physical_device: vk::PhysicalDevice,
47        plane_index: u32,
48    ) -> VkResult<Vec<vk::DisplayKHR>> {
49        read_into_uninitialized_vector(|count, data| {
50            (self.fp.get_display_plane_supported_displays_khr)(
51                physical_device,
52                plane_index,
53                count,
54                data,
55            )
56        })
57    }
58
59    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetDisplayModePropertiesKHR.html>
60    pub unsafe fn get_display_mode_properties(
61        &self,
62        physical_device: vk::PhysicalDevice,
63        display: vk::DisplayKHR,
64    ) -> VkResult<Vec<vk::DisplayModePropertiesKHR>> {
65        read_into_uninitialized_vector(|count, data| {
66            (self.fp.get_display_mode_properties_khr)(physical_device, display, count, data)
67        })
68    }
69
70    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCreateDisplayModeKHR.html>
71    pub unsafe fn create_display_mode(
72        &self,
73        physical_device: vk::PhysicalDevice,
74        display: vk::DisplayKHR,
75        create_info: &vk::DisplayModeCreateInfoKHR,
76        allocation_callbacks: Option<&vk::AllocationCallbacks>,
77    ) -> VkResult<vk::DisplayModeKHR> {
78        let mut display_mode = mem::MaybeUninit::zeroed();
79        (self.fp.create_display_mode_khr)(
80            physical_device,
81            display,
82            create_info,
83            allocation_callbacks.as_raw_ptr(),
84            display_mode.as_mut_ptr(),
85        )
86        .result_with_success(display_mode.assume_init())
87    }
88
89    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetDisplayPlaneCapabilitiesKHR.html>
90    pub unsafe fn get_display_plane_capabilities(
91        &self,
92        physical_device: vk::PhysicalDevice,
93        mode: vk::DisplayModeKHR,
94        plane_index: u32,
95    ) -> VkResult<vk::DisplayPlaneCapabilitiesKHR> {
96        let mut display_plane_capabilities = mem::MaybeUninit::zeroed();
97        (self.fp.get_display_plane_capabilities_khr)(
98            physical_device,
99            mode,
100            plane_index,
101            display_plane_capabilities.as_mut_ptr(),
102        )
103        .result_with_success(display_plane_capabilities.assume_init())
104    }
105
106    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCreateDisplayPlaneSurfaceKHR.html>
107    pub unsafe fn create_display_plane_surface(
108        &self,
109        create_info: &vk::DisplaySurfaceCreateInfoKHR,
110        allocation_callbacks: Option<&vk::AllocationCallbacks>,
111    ) -> VkResult<vk::SurfaceKHR> {
112        let mut surface = mem::MaybeUninit::zeroed();
113        (self.fp.create_display_plane_surface_khr)(
114            self.handle,
115            create_info,
116            allocation_callbacks.as_raw_ptr(),
117            surface.as_mut_ptr(),
118        )
119        .result_with_success(surface.assume_init())
120    }
121
122    pub const fn name() -> &'static CStr {
123        vk::KhrDisplayFn::name()
124    }
125
126    pub fn fp(&self) -> &vk::KhrDisplayFn {
127        &self.fp
128    }
129
130    pub fn instance(&self) -> vk::Instance {
131        self.handle
132    }
133}