feat(wayland/presentation_time): hook up presentation time to OpenXR
Signed-off-by: Schmarni <marnistromer@gmail.com>
This commit is contained in:
@@ -30,6 +30,7 @@ use bevy::render::{Render, RenderApp};
|
|||||||
use bevy::{asset::Assets, ecs::resource::Resource, image::Image};
|
use bevy::{asset::Assets, ecs::resource::Resource, image::Image};
|
||||||
use bevy_dmabuf::import::ImportedDmatexs;
|
use bevy_dmabuf::import::ImportedDmatexs;
|
||||||
use bevy_mod_openxr::render::end_frame;
|
use bevy_mod_openxr::render::end_frame;
|
||||||
|
use bevy_mod_openxr::resources::{OxrFrameState, OxrInstance};
|
||||||
use bevy_mod_xr::session::XrRenderSet;
|
use bevy_mod_xr::session::XrRenderSet;
|
||||||
use cluFlock::{FlockLock, ToFlock};
|
use cluFlock::{FlockLock, ToFlock};
|
||||||
use core::buffer::BufferUsage;
|
use core::buffer::BufferUsage;
|
||||||
@@ -37,6 +38,7 @@ use core::{buffer::Buffer, callback::Callback, surface::WL_SURFACE_REGISTRY};
|
|||||||
use display::Display;
|
use display::Display;
|
||||||
use mint::Vector2;
|
use mint::Vector2;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
|
use std::mem::MaybeUninit;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use std::{
|
use std::{
|
||||||
fs::{self, OpenOptions},
|
fs::{self, OpenOptions},
|
||||||
@@ -381,11 +383,38 @@ fn update_graphics(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[instrument(level = "debug", name = "Wayland frame", skip_all)]
|
#[instrument(level = "debug", name = "Wayland frame", skip_all)]
|
||||||
fn submit_frame_timings(mut frame_count: Local<u64>) {
|
fn submit_frame_timings(
|
||||||
|
mut frame_count: Local<u64>,
|
||||||
|
instance: Option<Res<OxrInstance>>,
|
||||||
|
frame_state: Option<Res<OxrFrameState>>,
|
||||||
|
) {
|
||||||
*frame_count += 1;
|
*frame_count += 1;
|
||||||
|
let display_timestamp = frame_state
|
||||||
|
.and_then(|state| Some((state, instance?)))
|
||||||
|
.and_then(|(state, instance)| {
|
||||||
|
instance
|
||||||
|
.exts()
|
||||||
|
.khr_convert_timespec_time
|
||||||
|
.and_then(|v| unsafe {
|
||||||
|
let mut out = MaybeUninit::uninit();
|
||||||
|
let result = (v.convert_time_to_timespec_time)(
|
||||||
|
instance.as_raw(),
|
||||||
|
state.predicted_display_time,
|
||||||
|
out.as_mut_ptr(),
|
||||||
|
);
|
||||||
|
if result != openxr::sys::Result::SUCCESS {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
let v = out.assume_init();
|
||||||
|
Some(rustix::time::Timespec {
|
||||||
|
tv_sec: v.tv_sec,
|
||||||
|
tv_nsec: v.tv_nsec,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.unwrap_or_else(|| rustix::time::clock_gettime(rustix::time::ClockId::Monotonic))
|
||||||
|
.into();
|
||||||
for surface in WL_SURFACE_REGISTRY.get_valid_contents() {
|
for surface in WL_SURFACE_REGISTRY.get_valid_contents() {
|
||||||
let display_timestamp =
|
|
||||||
rustix::time::clock_gettime(rustix::time::ClockId::Monotonic).into();
|
|
||||||
surface.submit_presentation_feedback(display_timestamp, *frame_count);
|
surface.submit_presentation_feedback(display_timestamp, *frame_count);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ use waynest::{
|
|||||||
|
|
||||||
use crate::wayland::core::surface::Surface;
|
use crate::wayland::core::surface::Surface;
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug)]
|
||||||
pub struct MonotonicTimestamp {
|
pub struct MonotonicTimestamp {
|
||||||
secs: u64,
|
secs: u64,
|
||||||
subsec_nanos: u32,
|
subsec_nanos: u32,
|
||||||
|
|||||||
Reference in New Issue
Block a user