From 6d39fb0a652bf963d1d6a33907cd883015e98003 Mon Sep 17 00:00:00 2001 From: awtterpip Date: Fri, 29 Dec 2023 17:02:48 -0600 Subject: [PATCH] oxr backend progress --- xr_api/Cargo.toml | 1 + xr_api/src/backend/oxr.rs | 77 ++++++++++++++++++++++- xr_api/src/backend/oxr/graphics.rs | 17 +++++ xr_api/src/backend/oxr/graphics/vulkan.rs | 9 +++ xr_api/src/backend/oxr/utils.rs | 7 +++ xr_api/src/types.rs | 9 ++- 6 files changed, 115 insertions(+), 5 deletions(-) create mode 100644 xr_api/src/backend/oxr/graphics.rs create mode 100644 xr_api/src/backend/oxr/graphics/vulkan.rs diff --git a/xr_api/Cargo.toml b/xr_api/Cargo.toml index 435029c..cff3494 100644 --- a/xr_api/Cargo.toml +++ b/xr_api/Cargo.toml @@ -8,6 +8,7 @@ default = ["linked"] linked = ["openxr/linked"] [dependencies] +ash = "0.37.3" futures = "0.3.29" glam = "0.25.0" thiserror = "1.0.51" diff --git a/xr_api/src/backend/oxr.rs b/xr_api/src/backend/oxr.rs index 9bad4b4..42d0361 100644 --- a/xr_api/src/backend/oxr.rs +++ b/xr_api/src/backend/oxr.rs @@ -1,3 +1,8 @@ +mod graphics; +mod utils; + +use std::sync::Mutex; + use crate::prelude::*; pub struct OXrEntry(openxr::Entry); @@ -11,6 +16,14 @@ impl OXrEntry { } } +impl Into for ExtensionSet { + fn into(self) -> openxr::ExtensionSet { + let mut set = openxr::ExtensionSet::default(); + set.khr_vulkan_enable2 = self.vulkan; + set + } +} + impl EntryTrait for OXrEntry { fn available_extensions(&self) -> Result { // self.0.enumerate_extensions(); @@ -18,11 +31,25 @@ impl EntryTrait for OXrEntry { } fn create_instance(&self, exts: ExtensionSet) -> Result { - todo!() + #[allow(unused_mut)] + let mut enabled_extensions: openxr::ExtensionSet = exts.into(); + #[cfg(target_os = "android")] + { + enabled_extensions.khr_android_create_instance = true; + } + let xr_instance = self.0.create_instance( + &openxr::ApplicationInfo { + application_name: "bevy", + ..Default::default() + }, + &enabled_extensions, + &[], + )?; + Ok(OXrInstance(xr_instance, exts).into()) } } -pub struct OXrInstance(openxr::Instance); +pub struct OXrInstance(openxr::Instance, ExtensionSet); impl InstanceTrait for OXrInstance { fn entry(&self) -> Entry { @@ -30,10 +57,54 @@ impl InstanceTrait for OXrInstance { } fn enabled_extensions(&self) -> ExtensionSet { - todo!() + self.1 } fn create_session(&self, info: SessionCreateInfo) -> Result { + graphics::init_oxr_graphics(self.0.clone(), self.1, info.texture_format).map(Into::into) + } +} + +pub struct OXrSession { + pub(crate) instance: Instance, + pub(crate) session: openxr::Session, + pub(crate) render_resources: Mutex< + Option<( + wgpu::Device, + wgpu::Queue, + wgpu::AdapterInfo, + wgpu::Adapter, + wgpu::Instance, + )>, + >, +} + +impl SessionTrait for OXrSession { + fn instance(&self) -> &Instance { + &self.instance + } + + fn get_render_resources( + &self, + ) -> Option<( + wgpu::Device, + wgpu::Queue, + wgpu::AdapterInfo, + wgpu::Adapter, + wgpu::Instance, + )> { + std::mem::take(&mut self.render_resources.lock().unwrap()) + } + + fn create_input(&self, bindings: Bindings) -> Result { + todo!() + } + + fn begin_frame(&self) -> Result<(View, View)> { + todo!() + } + + fn end_frame(&self) -> Result<()> { todo!() } } diff --git a/xr_api/src/backend/oxr/graphics.rs b/xr_api/src/backend/oxr/graphics.rs new file mode 100644 index 0000000..34f221a --- /dev/null +++ b/xr_api/src/backend/oxr/graphics.rs @@ -0,0 +1,17 @@ +mod vulkan; + +use super::OXrSession; +use crate::error::{Result, XrError}; +use crate::types::ExtensionSet; + +pub fn init_oxr_graphics( + instance: openxr::Instance, + extensions: ExtensionSet, + format: wgpu::TextureFormat, +) -> Result { + if extensions.vulkan { + return vulkan::init_oxr_graphics(instance, format); + } + + Err(XrError::Placeholder) +} diff --git a/xr_api/src/backend/oxr/graphics/vulkan.rs b/xr_api/src/backend/oxr/graphics/vulkan.rs new file mode 100644 index 0000000..21392af --- /dev/null +++ b/xr_api/src/backend/oxr/graphics/vulkan.rs @@ -0,0 +1,9 @@ +use crate::backend::oxr::OXrSession; +use crate::error::Result; + +pub fn init_oxr_graphics( + instance: openxr::Instance, + format: wgpu::TextureFormat, +) -> Result { + todo!() +} diff --git a/xr_api/src/backend/oxr/utils.rs b/xr_api/src/backend/oxr/utils.rs index e69de29..f5b569c 100644 --- a/xr_api/src/backend/oxr/utils.rs +++ b/xr_api/src/backend/oxr/utils.rs @@ -0,0 +1,7 @@ +use crate::error::XrError; + +impl From for XrError { + fn from(value: openxr::sys::Result) -> Self { + XrError::Placeholder + } +} diff --git a/xr_api/src/types.rs b/xr_api/src/types.rs index 219d651..8e598be 100644 --- a/xr_api/src/types.rs +++ b/xr_api/src/types.rs @@ -5,9 +5,14 @@ use crate::api_traits::{ActionInputTrait, HapticTrait, InputTrait}; use crate::error::Result; #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] -pub struct ExtensionSet {} +pub struct ExtensionSet { + pub vulkan: bool, +} -pub enum SessionCreateInfo {} +pub struct SessionCreateInfo { + /// preferred texture format + pub texture_format: wgpu::TextureFormat, +} pub struct Bindings {}