From 8f05905ecbc4cd4002c887c02c3022c41e0de1f0 Mon Sep 17 00:00:00 2001 From: Anna Sofie Nordstrand Date: Wed, 29 Dec 2021 07:35:25 -0600 Subject: [PATCH] extensions: Add VK_KHR_get_surface_capabilities2 (#530) --- Changelog.md | 4 + .../khr/get_surface_capabilities2.rs | 80 +++++++++++++++++++ ash/src/extensions/khr/mod.rs | 2 + 3 files changed, 86 insertions(+) create mode 100644 ash/src/extensions/khr/get_surface_capabilities2.rs diff --git a/Changelog.md b/Changelog.md index 2da459c..18c0292 100644 --- a/Changelog.md +++ b/Changelog.md @@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] - ReleaseDate +### Added + +- Added `VK_KHR_get_surface_capabilities2` device extension (#530) + ## [0.35.0] - 2021-12-27 ### Changed diff --git a/ash/src/extensions/khr/get_surface_capabilities2.rs b/ash/src/extensions/khr/get_surface_capabilities2.rs new file mode 100644 index 0000000..8c93219 --- /dev/null +++ b/ash/src/extensions/khr/get_surface_capabilities2.rs @@ -0,0 +1,80 @@ +use crate::prelude::*; +use crate::vk; +use crate::{Entry, Instance}; +use std::ffi::CStr; +use std::mem; + +#[derive(Clone)] +pub struct GetSurfaceCapabilities2 { + fp: vk::KhrGetSurfaceCapabilities2Fn, +} + +impl GetSurfaceCapabilities2 { + pub fn new(entry: &Entry, instance: &Instance) -> Self { + let fp = vk::KhrGetSurfaceCapabilities2Fn::load(|name| unsafe { + mem::transmute(entry.get_instance_proc_addr(instance.handle(), name.as_ptr())) + }); + Self { fp } + } + + #[doc = "https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetPhysicalDeviceSurfaceCapabilities2KHR.html"] + pub unsafe fn get_physical_device_surface_capabilities2( + &self, + physical_device: vk::PhysicalDevice, + surface_info: &vk::PhysicalDeviceSurfaceInfo2KHR, + ) -> VkResult { + let mut surface_capabilities = Default::default(); + self.fp + .get_physical_device_surface_capabilities2_khr( + physical_device, + surface_info, + &mut surface_capabilities, + ) + .result_with_success(surface_capabilities) + } + + /// Retrieve the number of elements to pass to [`Self::get_physical_device_surface_formats2()`] + pub unsafe fn get_physical_device_surface_formats2_len( + &self, + physical_device: vk::PhysicalDevice, + surface_info: &vk::PhysicalDeviceSurfaceInfo2KHR, + ) -> VkResult { + let mut count = 0; + let err_code = self.fp.get_physical_device_surface_formats2_khr( + physical_device, + surface_info, + &mut count, + std::ptr::null_mut(), + ); + err_code.result_with_success(count as usize) + } + + #[doc = "https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetPhysicalDeviceSurfaceFormats2KHR.html"] + /// + /// Call [`Self::get_physical_device_surface_formats2_len()`] to query the number of elements to pass to `out`. + /// Be sure to [`Default::default()`]-initialize these elements and optionally set their `p_next` pointer. + pub unsafe fn get_physical_device_surface_formats2( + &self, + physical_device: vk::PhysicalDevice, + surface_info: &vk::PhysicalDeviceSurfaceInfo2KHR, + out: &mut [vk::SurfaceFormat2KHR], + ) -> VkResult<()> { + let mut count = out.len() as u32; + let err_code = self.fp.get_physical_device_surface_formats2_khr( + physical_device, + surface_info, + &mut count, + out.as_mut_ptr(), + ); + assert_eq!(count, out.len() as u32); + err_code.result() + } + + pub fn name() -> &'static CStr { + vk::KhrGetSurfaceCapabilities2Fn::name() + } + + pub fn fp(&self) -> &vk::KhrGetSurfaceCapabilities2Fn { + &self.fp + } +} diff --git a/ash/src/extensions/khr/mod.rs b/ash/src/extensions/khr/mod.rs index 69cffe0..ca83e57 100644 --- a/ash/src/extensions/khr/mod.rs +++ b/ash/src/extensions/khr/mod.rs @@ -12,6 +12,7 @@ pub use self::external_memory_fd::ExternalMemoryFd; pub use self::external_semaphore_fd::ExternalSemaphoreFd; pub use self::get_memory_requirements2::GetMemoryRequirements2; pub use self::get_physical_device_properties2::GetPhysicalDeviceProperties2; +pub use self::get_surface_capabilities2::GetSurfaceCapabilities2; pub use self::maintenance1::Maintenance1; pub use self::maintenance3::Maintenance3; pub use self::maintenance4::Maintenance4; @@ -42,6 +43,7 @@ mod external_memory_fd; mod external_semaphore_fd; mod get_memory_requirements2; mod get_physical_device_properties2; +mod get_surface_capabilities2; mod maintenance1; mod maintenance3; mod maintenance4;