From 1bfd9c95f031a9843ea5446de12b5a764e4981a2 Mon Sep 17 00:00:00 2001 From: Schmarni Date: Fri, 12 Sep 2025 06:34:14 +0200 Subject: [PATCH] feat(wayland/presentation_time): hook up presentation time to OpenXR Signed-off-by: Schmarni --- src/wayland/mod.rs | 35 ++++++++++++++++++++++++++++++++--- src/wayland/presentation.rs | 1 + 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/wayland/mod.rs b/src/wayland/mod.rs index 1147ad6..8459a05 100644 --- a/src/wayland/mod.rs +++ b/src/wayland/mod.rs @@ -30,6 +30,7 @@ use bevy::render::{Render, RenderApp}; use bevy::{asset::Assets, ecs::resource::Resource, image::Image}; use bevy_dmabuf::import::ImportedDmatexs; use bevy_mod_openxr::render::end_frame; +use bevy_mod_openxr::resources::{OxrFrameState, OxrInstance}; use bevy_mod_xr::session::XrRenderSet; use cluFlock::{FlockLock, ToFlock}; use core::buffer::BufferUsage; @@ -37,6 +38,7 @@ use core::{buffer::Buffer, callback::Callback, surface::WL_SURFACE_REGISTRY}; use display::Display; use mint::Vector2; use std::fs::File; +use std::mem::MaybeUninit; use std::time::Duration; use std::{ fs::{self, OpenOptions}, @@ -381,11 +383,38 @@ fn update_graphics( } #[instrument(level = "debug", name = "Wayland frame", skip_all)] -fn submit_frame_timings(mut frame_count: Local) { +fn submit_frame_timings( + mut frame_count: Local, + instance: Option>, + frame_state: Option>, +) { *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() { - let display_timestamp = - rustix::time::clock_gettime(rustix::time::ClockId::Monotonic).into(); surface.submit_presentation_feedback(display_timestamp, *frame_count); } } diff --git a/src/wayland/presentation.rs b/src/wayland/presentation.rs index 7f8e635..4bea67c 100644 --- a/src/wayland/presentation.rs +++ b/src/wayland/presentation.rs @@ -11,6 +11,7 @@ use waynest::{ use crate::wayland::core::surface::Surface; +#[derive(Clone, Copy, Debug)] pub struct MonotonicTimestamp { secs: u64, subsec_nanos: u32,