From bbbcd037a9cb29be9f54212eaee30551beaab0da Mon Sep 17 00:00:00 2001 From: Rua Date: Sat, 20 Mar 2021 14:08:00 +0100 Subject: [PATCH] Add VK_EXT_full_screen_exclusive extension (#399) --- .../extensions/ext/full_screen_exclusive.rs | 100 ++++++++++++++++++ ash/src/extensions/ext/mod.rs | 2 + 2 files changed, 102 insertions(+) create mode 100644 ash/src/extensions/ext/full_screen_exclusive.rs diff --git a/ash/src/extensions/ext/full_screen_exclusive.rs b/ash/src/extensions/ext/full_screen_exclusive.rs new file mode 100644 index 000000000..51951300e --- /dev/null +++ b/ash/src/extensions/ext/full_screen_exclusive.rs @@ -0,0 +1,100 @@ +#![allow(dead_code)] +use crate::prelude::*; +use crate::version::{DeviceV1_0, InstanceV1_0}; +use crate::vk; +use std::ffi::CStr; +use std::mem; +use std::ptr; + +#[derive(Clone)] +pub struct FullScreenExclusive { + handle: vk::Device, + full_screen_exclusive_fn: vk::ExtFullScreenExclusiveFn, +} + +impl FullScreenExclusive { + pub fn new(instance: &I, device: &D) -> FullScreenExclusive { + let full_screen_exclusive_fn = vk::ExtFullScreenExclusiveFn::load(|name| unsafe { + mem::transmute(instance.get_device_proc_addr(device.handle(), name.as_ptr())) + }); + FullScreenExclusive { + handle: device.handle(), + full_screen_exclusive_fn, + } + } + + pub fn name() -> &'static CStr { + vk::ExtFullScreenExclusiveFn::name() + } + + #[doc = ""] + pub unsafe fn acquire_full_screen_exclusive_mode( + &self, + swapchain: vk::SwapchainKHR, + ) -> VkResult<()> { + self.full_screen_exclusive_fn + .acquire_full_screen_exclusive_mode_ext(self.handle, swapchain) + .result() + } + + #[doc = ""] + pub unsafe fn get_physical_device_surface_present_modes2( + &self, + physical_device: vk::PhysicalDevice, + surface_info: &vk::PhysicalDeviceSurfaceInfo2KHR, + ) -> VkResult> { + let mut count = mem::zeroed(); + self.full_screen_exclusive_fn + .get_physical_device_surface_present_modes2_ext( + physical_device, + surface_info, + &mut count, + ptr::null_mut(), + ) + .result()?; + let mut present_modes = Vec::::with_capacity(count as usize); + let err_code = self + .full_screen_exclusive_fn + .get_physical_device_surface_present_modes2_ext( + physical_device, + surface_info, + &mut count, + present_modes.as_mut_ptr(), + ); + present_modes.set_len(count as usize); + err_code.result_with_success(present_modes) + } + + #[doc = ""] + pub unsafe fn release_full_screen_exclusive_mode( + &self, + swapchain: vk::SwapchainKHR, + ) -> VkResult<()> { + self.full_screen_exclusive_fn + .release_full_screen_exclusive_mode_ext(self.handle, swapchain) + .result() + } + + #[doc = ""] + pub unsafe fn get_device_group_surface_present_modes2( + &self, + surface_info: &vk::PhysicalDeviceSurfaceInfo2KHR, + ) -> VkResult { + let mut present_modes = mem::zeroed(); + self.full_screen_exclusive_fn + .get_device_group_surface_present_modes2_ext( + self.handle, + surface_info, + &mut present_modes, + ) + .result_with_success(present_modes) + } + + pub fn fp(&self) -> &vk::ExtFullScreenExclusiveFn { + &self.full_screen_exclusive_fn + } + + pub fn device(&self) -> vk::Device { + self.handle + } +} diff --git a/ash/src/extensions/ext/mod.rs b/ash/src/extensions/ext/mod.rs index be13c3c2e..e744feb8c 100644 --- a/ash/src/extensions/ext/mod.rs +++ b/ash/src/extensions/ext/mod.rs @@ -4,6 +4,7 @@ pub use self::debug_marker::DebugMarker; #[allow(deprecated)] pub use self::debug_report::DebugReport; pub use self::debug_utils::DebugUtils; +pub use self::full_screen_exclusive::FullScreenExclusive; pub use self::metal_surface::MetalSurface; pub use self::tooling_info::ToolingInfo; @@ -13,5 +14,6 @@ mod debug_marker; #[deprecated(note = "Please use the [DebugUtils](struct.DebugUtils.html) extension instead.")] mod debug_report; mod debug_utils; +mod full_screen_exclusive; mod metal_surface; mod tooling_info;