frame jitter stop
This commit is contained in:
@@ -345,6 +345,7 @@ fn create_xr_session_inner(
|
|||||||
world.insert_resource(images.clone());
|
world.insert_resource(images.clone());
|
||||||
world.insert_resource(graphics_info.clone());
|
world.insert_resource(graphics_info.clone());
|
||||||
world.insert_resource(stage.clone());
|
world.insert_resource(stage.clone());
|
||||||
|
world.insert_resource(frame_stream.clone());
|
||||||
world.insert_resource(XrRenderResources {
|
world.insert_resource(XrRenderResources {
|
||||||
session,
|
session,
|
||||||
frame_stream,
|
frame_stream,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
use bevy::{
|
use bevy::{
|
||||||
app::{PluginGroup, PluginGroupBuilder},
|
app::{PluginGroup, PluginGroupBuilder},
|
||||||
render::RenderPlugin,
|
render::{pipelined_rendering::PipelinedRenderingPlugin, RenderPlugin},
|
||||||
utils::default,
|
utils::default,
|
||||||
};
|
};
|
||||||
use bevy_xr::camera::XrCameraPlugin;
|
use bevy_xr::camera::XrCameraPlugin;
|
||||||
@@ -21,6 +21,7 @@ pub fn add_xr_plugins<G: PluginGroup>(plugins: G) -> PluginGroupBuilder {
|
|||||||
plugins
|
plugins
|
||||||
.build()
|
.build()
|
||||||
.disable::<RenderPlugin>()
|
.disable::<RenderPlugin>()
|
||||||
|
.disable::<PipelinedRenderingPlugin>()
|
||||||
.add_before::<RenderPlugin, _>(bevy_xr::session::XrSessionPlugin)
|
.add_before::<RenderPlugin, _>(bevy_xr::session::XrSessionPlugin)
|
||||||
.add_before::<RenderPlugin, _>(XrInitPlugin {
|
.add_before::<RenderPlugin, _>(XrInitPlugin {
|
||||||
app_info: default(),
|
app_info: default(),
|
||||||
|
|||||||
@@ -32,13 +32,12 @@ impl Plugin for XrRenderPlugin {
|
|||||||
)
|
)
|
||||||
.after(begin_xr_session),
|
.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);
|
// .add_systems(Startup, init_views);
|
||||||
app.sub_app_mut(RenderApp).add_systems(
|
app.sub_app_mut(RenderApp).add_systems(
|
||||||
Render,
|
Render,
|
||||||
(
|
(
|
||||||
(begin_frame, insert_texture_views)
|
insert_texture_views
|
||||||
.chain()
|
|
||||||
.in_set(RenderSet::PrepareAssets)
|
.in_set(RenderSet::PrepareAssets)
|
||||||
.before(render_system),
|
.before(render_system),
|
||||||
end_frame.in_set(RenderSet::Cleanup),
|
end_frame.in_set(RenderSet::Cleanup),
|
||||||
@@ -84,14 +83,19 @@ pub fn init_views(
|
|||||||
commands.insert_resource(XrViews(views));
|
commands.insert_resource(XrViews(views));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn wait_frame(mut frame_waiter: ResMut<XrFrameWaiter>, mut commands: Commands) {
|
pub fn wait_frame(
|
||||||
|
mut frame_waiter: ResMut<XrFrameWaiter>,
|
||||||
|
mut commands: Commands,
|
||||||
|
frame_stream: ResMut<XrFrameStream>,
|
||||||
|
) {
|
||||||
let _span = info_span!("xr_wait_frame");
|
let _span = info_span!("xr_wait_frame");
|
||||||
let state = frame_waiter.wait().expect("Failed to 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.
|
// 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
|
// TODO: don't add predicted_display_period if pipelined rendering plugin not enabled
|
||||||
commands.insert_resource(XrTime(openxr::Time::from_nanos(
|
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(
|
pub fn update_views(
|
||||||
@@ -247,10 +251,6 @@ fn calculate_projection(near_z: f32, fov: openxr::Fovf) -> Mat4 {
|
|||||||
Mat4::from_cols_array(&cols)
|
Mat4::from_cols_array(&cols)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn begin_frame(mut frame_stream: ResMut<XrFrameStream>) {
|
|
||||||
frame_stream.begin().expect("Failed to begin frame");
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn insert_texture_views(
|
pub fn insert_texture_views(
|
||||||
swapchain_images: Res<XrSwapchainImages>,
|
swapchain_images: Res<XrSwapchainImages>,
|
||||||
mut swapchain: ResMut<XrSwapchain>,
|
mut swapchain: ResMut<XrSwapchain>,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use std::sync::Arc;
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
use crate::error::XrError;
|
use crate::error::XrError;
|
||||||
use crate::graphics::*;
|
use crate::graphics::*;
|
||||||
@@ -92,7 +92,7 @@ impl XrInstance {
|
|||||||
info.0;
|
info.0;
|
||||||
info => {
|
info => {
|
||||||
let (session, frame_waiter, frame_stream) = self.0.create_session::<Api>(system_id, &info)?;
|
let (session, frame_waiter, frame_stream) = self.0.create_session::<Api>(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<Self>);
|
pub struct XrFrameStream(pub(crate) GraphicsWrap<Self>);
|
||||||
|
|
||||||
impl GraphicsType for XrFrameStream {
|
impl GraphicsType for XrFrameStream {
|
||||||
type Inner<G: GraphicsExt> = openxr::FrameStream<G>;
|
type Inner<G: GraphicsExt> = Arc<Mutex<openxr::FrameStream<G>>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl XrFrameStream {
|
impl XrFrameStream {
|
||||||
pub fn begin(&mut self) -> openxr::Result<()> {
|
pub fn begin(&self) -> openxr::Result<()> {
|
||||||
graphics_match!(
|
graphics_match!(
|
||||||
&mut self.0;
|
&self.0;
|
||||||
stream => stream.begin()
|
stream => stream.lock().unwrap().begin()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,8 +158,9 @@ impl XrFrameStream {
|
|||||||
layers: &[&dyn CompositionLayer],
|
layers: &[&dyn CompositionLayer],
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
graphics_match!(
|
graphics_match!(
|
||||||
&mut self.0;
|
&self.0;
|
||||||
stream => {
|
stream => {
|
||||||
|
let mut stream = stream.lock().unwrap();
|
||||||
let mut new_layers = vec![];
|
let mut new_layers = vec![];
|
||||||
|
|
||||||
for (i, layer) in layers.into_iter().enumerate() {
|
for (i, layer) in layers.into_iter().enumerate() {
|
||||||
|
|||||||
Reference in New Issue
Block a user