ash/extensions/ext/
full_screen_exclusive.rs

1use crate::prelude::*;
2use crate::vk;
3use crate::{Device, Instance};
4use std::ffi::CStr;
5use std::mem;
6
7#[derive(Clone)]
8pub struct FullScreenExclusive {
9    handle: vk::Device,
10    fp: vk::ExtFullScreenExclusiveFn,
11}
12
13impl FullScreenExclusive {
14    pub fn new(instance: &Instance, device: &Device) -> Self {
15        let handle = device.handle();
16        let fp = vk::ExtFullScreenExclusiveFn::load(|name| unsafe {
17            mem::transmute(instance.get_device_proc_addr(handle, name.as_ptr()))
18        });
19        Self { handle, fp }
20    }
21
22    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkAcquireFullScreenExclusiveModeEXT.html>
23    pub unsafe fn acquire_full_screen_exclusive_mode(
24        &self,
25        swapchain: vk::SwapchainKHR,
26    ) -> VkResult<()> {
27        (self.fp.acquire_full_screen_exclusive_mode_ext)(self.handle, swapchain).result()
28    }
29
30    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceSurfacePresentModes2EXT.html>
31    pub unsafe fn get_physical_device_surface_present_modes2(
32        &self,
33        physical_device: vk::PhysicalDevice,
34        surface_info: &vk::PhysicalDeviceSurfaceInfo2KHR,
35    ) -> VkResult<Vec<vk::PresentModeKHR>> {
36        read_into_uninitialized_vector(|count, data| {
37            (self.fp.get_physical_device_surface_present_modes2_ext)(
38                physical_device,
39                surface_info,
40                count,
41                data,
42            )
43        })
44    }
45
46    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkReleaseFullScreenExclusiveModeEXT.html>
47    pub unsafe fn release_full_screen_exclusive_mode(
48        &self,
49        swapchain: vk::SwapchainKHR,
50    ) -> VkResult<()> {
51        (self.fp.release_full_screen_exclusive_mode_ext)(self.handle, swapchain).result()
52    }
53
54    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetDeviceGroupSurfacePresentModes2EXT.html>
55    pub unsafe fn get_device_group_surface_present_modes2(
56        &self,
57        surface_info: &vk::PhysicalDeviceSurfaceInfo2KHR,
58    ) -> VkResult<vk::DeviceGroupPresentModeFlagsKHR> {
59        let mut present_modes = mem::zeroed();
60        (self.fp.get_device_group_surface_present_modes2_ext)(
61            self.handle,
62            surface_info,
63            &mut present_modes,
64        )
65        .result_with_success(present_modes)
66    }
67
68    pub const fn name() -> &'static CStr {
69        vk::ExtFullScreenExclusiveFn::name()
70    }
71
72    pub fn fp(&self) -> &vk::ExtFullScreenExclusiveFn {
73        &self.fp
74    }
75
76    pub fn device(&self) -> vk::Device {
77        self.handle
78    }
79}