diff --git a/openxr/src/graphics/headless.rs b/openxr/src/graphics/headless.rs new file mode 100644 index 00000000..b14c6f00 --- /dev/null +++ b/openxr/src/graphics/headless.rs @@ -0,0 +1,66 @@ +use crate::*; + +/// Used to create a session without graphics. +/// +/// See [`XR_MND_headless`] for safety details. +/// +/// [`XR_MND_headless`]: https://www.khronos.org/registry/OpenXR/specs/1.1/html/xrspec.html#XR_MND_headless +pub enum Headless {} + +impl Graphics for Headless { + type Requirements = Requirements; + type SessionCreateInfo = SessionCreateInfo; + type SwapchainImage = HeadlessSwapchainImage; + type Format = HeadlessFormat; + + fn raise_format(_: i64) -> Self::Format { + unreachable!() + } + fn lower_format(_: Self::Format) -> i64 { + unreachable!() + } + + fn requirements(_instance: &Instance, _system: SystemId) -> Result { + Ok(Requirements {}) + } + + unsafe fn create_session( + instance: &Instance, + system: SystemId, + _info: &SessionCreateInfo, + ) -> Result { + let info = sys::SessionCreateInfo { + ty: sys::SessionCreateInfo::TYPE, + next: std::ptr::null(), + create_flags: Default::default(), + system_id: system, + }; + let mut out = sys::Session::NULL; + cvt((instance.fp().create_session)( + instance.as_raw(), + &info, + &mut out, + ))?; + Ok(out) + } + + fn enumerate_swapchain_images( + _swapchain: &Swapchain, + ) -> Result> { + // in a MND_headless session, xrEnumerateSwapchainFormats will always + // enumerate 0 formats, and so it's not possible to create a swapchain + unreachable!(); + } +} + +#[derive(Clone, Copy)] +pub struct Requirements {} + +#[derive(Clone, Copy)] +pub struct SessionCreateInfo {} + +#[derive(Clone, Copy)] +pub enum HeadlessSwapchainImage {} + +#[derive(Clone, Copy)] +pub enum HeadlessFormat {} diff --git a/openxr/src/graphics/mod.rs b/openxr/src/graphics/mod.rs index 13aa0bf3..1820a51d 100644 --- a/openxr/src/graphics/mod.rs +++ b/openxr/src/graphics/mod.rs @@ -49,3 +49,6 @@ pub use opengl::OpenGL; pub mod opengles; pub use opengles::OpenGlEs; + +pub mod headless; +pub use headless::Headless;