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