diff --git a/xr_api/src/backend/oxr.rs b/xr_api/src/backend/oxr.rs index 4a35465..544765c 100644 --- a/xr_api/src/backend/oxr.rs +++ b/xr_api/src/backend/oxr.rs @@ -3,6 +3,8 @@ mod utils; use std::sync::Mutex; +use glam::UVec2; +use openxr::EnvironmentBlendMode; use tracing::{info, info_span, warn}; use crate::{backend::oxr::graphics::VIEW_TYPE, prelude::*}; @@ -83,10 +85,13 @@ pub struct OXrSession { )>, >, pub(crate) frame_state: Mutex, + pub(crate) views: Mutex<[openxr::View; 2]>, pub(crate) frame_waiter: Mutex, pub(crate) swapchain: graphics::Swapchain, pub(crate) stage: openxr::Space, pub(crate) head: openxr::Space, + pub(crate) resolution: UVec2, + pub(crate) blend_mode: EnvironmentBlendMode, } impl SessionTrait for OXrSession { @@ -171,6 +176,8 @@ impl SessionTrait for OXrSession { .1 }; + *self.views.lock().unwrap() = [views[0].clone(), views[1].clone()]; + { let _span = info_span!("xr_acquire_image").entered(); self.swapchain.acquire_image().unwrap() @@ -195,7 +202,26 @@ impl SessionTrait for OXrSession { } fn end_frame(&self) -> Result<()> { - todo!() + { + let _span = info_span!("xr_release_image").entered(); + self.swapchain.release_image().unwrap(); + } + { + let _span = info_span!("xr_end_frame").entered(); + let result = self.swapchain.end( + self.frame_state.lock().unwrap().predicted_display_time, + &*self.views.lock().unwrap(), + &self.stage, + self.resolution, + self.blend_mode, + // passthrough_layer.map(|p| p.into_inner()), + ); + match result { + Ok(_) => {} + Err(e) => warn!("error: {}", e), + } + } + Ok(()) } } diff --git a/xr_api/src/backend/oxr/graphics/vulkan.rs b/xr_api/src/backend/oxr/graphics/vulkan.rs index 11c8ddb..149df16 100644 --- a/xr_api/src/backend/oxr/graphics/vulkan.rs +++ b/xr_api/src/backend/oxr/graphics/vulkan.rs @@ -298,6 +298,8 @@ pub fn init_oxr_graphics( wgpu_adapter, wgpu_instance, ))), + resolution, + views: Mutex::new([openxr::View::default(), openxr::View::default()]), swapchain: Swapchain::Vulkan(SwapchainInner { stream: Mutex::new(frame_stream), swapchain: Mutex::new(swapchain), @@ -309,6 +311,7 @@ pub fn init_oxr_graphics( predicted_display_period: openxr::Duration::from_nanos(1), should_render: true, }), + blend_mode, frame_waiter: Mutex::new(frame_wait), stage: session .create_reference_space(openxr::ReferenceSpaceType::STAGE, openxr::Posef::IDENTITY)?,