From 0023844bbb788f86bc35223825c492a65952e4fc Mon Sep 17 00:00:00 2001 From: Sapphire Date: Wed, 18 Feb 2026 18:41:48 -0600 Subject: [PATCH] Add support for `XR_META_recommended_layer_resolution` --- openxr/src/lib.rs | 1 + .../src/recommended_layer_resolution_meta.rs | 48 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 openxr/src/recommended_layer_resolution_meta.rs diff --git a/openxr/src/lib.rs b/openxr/src/lib.rs index c479337..a0cc3f2 100644 --- a/openxr/src/lib.rs +++ b/openxr/src/lib.rs @@ -43,6 +43,7 @@ mod passthrough; pub use passthrough::*; mod localization_map_ml; pub use localization_map_ml::*; +mod recommended_layer_resolution_meta; pub use builder::{ CompositionLayerBase, CompositionLayerCubeKHR, CompositionLayerCylinderKHR, diff --git a/openxr/src/recommended_layer_resolution_meta.rs b/openxr/src/recommended_layer_resolution_meta.rs new file mode 100644 index 0000000..78c1982 --- /dev/null +++ b/openxr/src/recommended_layer_resolution_meta.rs @@ -0,0 +1,48 @@ +//! Implements the functions from [`XR_META_recommended_layer_resolution`]. +//! +//! [`XR_META_recommended_layer_resolution`]: https://www.khronos.org/registry/OpenXR/specs/1.1/html/xrspec.html#XR_META_recommended_layer_resolution + +use crate::*; + +use std::ptr; + +impl Session { + /// Requires [`XR_META_recommended_layer_resolution`] + /// + /// [`XR_META_recommended_layer_resolution`]: https://www.khronos.org/registry/OpenXR/specs/1.1/html/xrspec.html#XR_META_recommended_layer_resolution + pub fn get_recommended_layer_resolution( + &self, + display_time: Time, + layer: &CompositionLayerBase<'_, G>, + ) -> Result> { + let ext = self + .inner + .instance + .exts() + .meta_recommended_layer_resolution + .as_ref() + .expect("XR_META_recommended_layer_resolution not loaded"); + + let resolution = unsafe { + let mut resolution = sys::RecommendedLayerResolutionMETA::out(ptr::null_mut()); + let info = sys::RecommendedLayerResolutionGetInfoMETA { + ty: sys::RecommendedLayerResolutionGetInfoMETA::TYPE, + next: ptr::null(), + layer: layer as *const _ as *const _, + predicted_display_time: display_time, + }; + cvt((ext.get_recommended_layer_resolution)( + self.as_raw(), + &info, + resolution.as_mut_ptr(), + ))?; + resolution.assume_init() + }; + + if resolution.is_valid.into() { + Ok(Some(resolution.recommended_image_dimensions)) + } else { + Ok(None) + } + } +}