From 9b39148e670fb2daf1d8d2b30dc3b2ff12ad3400 Mon Sep 17 00:00:00 2001 From: awtterpip Date: Thu, 14 Mar 2024 20:50:35 -0500 Subject: [PATCH] frame jitter stop --- crates/bevy_openxr/src/init.rs | 1 + crates/bevy_openxr/src/lib.rs | 3 ++- crates/bevy_openxr/src/render.rs | 18 +++++++++--------- crates/bevy_openxr/src/resources.rs | 17 +++++++++-------- 4 files changed, 21 insertions(+), 18 deletions(-) diff --git a/crates/bevy_openxr/src/init.rs b/crates/bevy_openxr/src/init.rs index 1a10170..8fbdeb8 100644 --- a/crates/bevy_openxr/src/init.rs +++ b/crates/bevy_openxr/src/init.rs @@ -345,6 +345,7 @@ fn create_xr_session_inner( world.insert_resource(images.clone()); world.insert_resource(graphics_info.clone()); world.insert_resource(stage.clone()); + world.insert_resource(frame_stream.clone()); world.insert_resource(XrRenderResources { session, frame_stream, diff --git a/crates/bevy_openxr/src/lib.rs b/crates/bevy_openxr/src/lib.rs index 66e9d40..834330b 100644 --- a/crates/bevy_openxr/src/lib.rs +++ b/crates/bevy_openxr/src/lib.rs @@ -1,6 +1,6 @@ use bevy::{ app::{PluginGroup, PluginGroupBuilder}, - render::RenderPlugin, + render::{pipelined_rendering::PipelinedRenderingPlugin, RenderPlugin}, utils::default, }; use bevy_xr::camera::XrCameraPlugin; @@ -21,6 +21,7 @@ pub fn add_xr_plugins(plugins: G) -> PluginGroupBuilder { plugins .build() .disable::() + .disable::() .add_before::(bevy_xr::session::XrSessionPlugin) .add_before::(XrInitPlugin { app_info: default(), diff --git a/crates/bevy_openxr/src/render.rs b/crates/bevy_openxr/src/render.rs index 6114bdc..0c0948c 100644 --- a/crates/bevy_openxr/src/render.rs +++ b/crates/bevy_openxr/src/render.rs @@ -32,13 +32,12 @@ impl Plugin for XrRenderPlugin { ) .after(begin_xr_session), ) - .add_systems(PostUpdate, update_views.run_if(session_running)); + .add_systems(PreUpdate, update_views.run_if(session_running)); // .add_systems(Startup, init_views); app.sub_app_mut(RenderApp).add_systems( Render, ( - (begin_frame, insert_texture_views) - .chain() + insert_texture_views .in_set(RenderSet::PrepareAssets) .before(render_system), end_frame.in_set(RenderSet::Cleanup), @@ -84,14 +83,19 @@ pub fn init_views( commands.insert_resource(XrViews(views)); } -pub fn wait_frame(mut frame_waiter: ResMut, mut commands: Commands) { +pub fn wait_frame( + mut frame_waiter: ResMut, + mut commands: Commands, + frame_stream: ResMut, +) { let _span = info_span!("xr_wait_frame"); let state = frame_waiter.wait().expect("Failed to wait frame"); // Here we insert the predicted display time for when this frame will be displayed. // TODO: don't add predicted_display_period if pipelined rendering plugin not enabled commands.insert_resource(XrTime(openxr::Time::from_nanos( - state.predicted_display_time.as_nanos() + state.predicted_display_period.as_nanos(), + state.predicted_display_time.as_nanos(), ))); + frame_stream.begin().expect("Failed to begin frame"); } pub fn update_views( @@ -247,10 +251,6 @@ fn calculate_projection(near_z: f32, fov: openxr::Fovf) -> Mat4 { Mat4::from_cols_array(&cols) } -pub fn begin_frame(mut frame_stream: ResMut) { - frame_stream.begin().expect("Failed to begin frame"); -} - pub fn insert_texture_views( swapchain_images: Res, mut swapchain: ResMut, diff --git a/crates/bevy_openxr/src/resources.rs b/crates/bevy_openxr/src/resources.rs index 4154d6d..cf798cf 100644 --- a/crates/bevy_openxr/src/resources.rs +++ b/crates/bevy_openxr/src/resources.rs @@ -1,4 +1,4 @@ -use std::sync::Arc; +use std::sync::{Arc, Mutex}; use crate::error::XrError; use crate::graphics::*; @@ -92,7 +92,7 @@ impl XrInstance { info.0; info => { let (session, frame_waiter, frame_stream) = self.0.create_session::(system_id, &info)?; - Ok((session.into(), XrFrameWaiter(frame_waiter), XrFrameStream(Api::wrap(frame_stream)))) + Ok((session.into(), XrFrameWaiter(frame_waiter), XrFrameStream(Api::wrap(Arc::new(Mutex::new(frame_stream)))))) } ) } @@ -136,18 +136,18 @@ impl XrSession { } } -#[derive(Resource)] +#[derive(Resource, Clone)] pub struct XrFrameStream(pub(crate) GraphicsWrap); impl GraphicsType for XrFrameStream { - type Inner = openxr::FrameStream; + type Inner = Arc>>; } impl XrFrameStream { - pub fn begin(&mut self) -> openxr::Result<()> { + pub fn begin(&self) -> openxr::Result<()> { graphics_match!( - &mut self.0; - stream => stream.begin() + &self.0; + stream => stream.lock().unwrap().begin() ) } @@ -158,8 +158,9 @@ impl XrFrameStream { layers: &[&dyn CompositionLayer], ) -> Result<()> { graphics_match!( - &mut self.0; + &self.0; stream => { + let mut stream = stream.lock().unwrap(); let mut new_layers = vec![]; for (i, layer) in layers.into_iter().enumerate() {