From cd297376a8ff394e1743a0d00a13501d9b52b55b Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Thu, 7 Mar 2024 17:57:07 +0100 Subject: [PATCH] openvr: throttle using WaitFrameSync --- Cargo.lock | 4 ++-- src/backend/openvr/mod.rs | 15 +++++---------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8f05579..29bbeb4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2198,7 +2198,7 @@ dependencies = [ [[package]] name = "ovr_overlay" version = "0.0.0" -source = "git+https://github.com/galister/ovr_overlay_oyasumi#376e817f9bf6438a486fbbfc6cf6ac2b8ff8ae36" +source = "git+https://github.com/galister/ovr_overlay_oyasumi#43a825d12bc86e225df5eaac8da9b3fd4880f9f1" dependencies = [ "byteorder", "derive_more", @@ -2213,7 +2213,7 @@ dependencies = [ [[package]] name = "ovr_overlay_sys" version = "0.0.0" -source = "git+https://github.com/galister/ovr_overlay_oyasumi#376e817f9bf6438a486fbbfc6cf6ac2b8ff8ae36" +source = "git+https://github.com/galister/ovr_overlay_oyasumi#43a825d12bc86e225df5eaac8da9b3fd4880f9f1" dependencies = [ "autocxx", "autocxx-build", diff --git a/src/backend/openvr/mod.rs b/src/backend/openvr/mod.rs index 287b103..cbb2e26 100644 --- a/src/backend/openvr/mod.rs +++ b/src/backend/openvr/mod.rs @@ -126,7 +126,9 @@ pub fn openvr_run(running: Arc) -> Result<(), BackendError> { let watch_id = overlays.get_by_name(WATCH_NAME).unwrap().state.id; // want panic - let frame_time = (1000.0 / refresh_rate).floor() * 0.001; + // want at least half refresh rate + let frame_timeout = 2 * (1000.0 / refresh_rate).floor() as u32; + let mut next_device_update = Instant::now(); let mut due_tasks = VecDeque::with_capacity(4); @@ -134,6 +136,8 @@ pub fn openvr_run(running: Arc) -> Result<(), BackendError> { let pointer_lines = [lines.allocate(), lines.allocate()]; 'main_loop: loop { + let _ = overlay_mgr.wait_frame_sync(frame_timeout); + if !running.load(Ordering::Relaxed) { log::warn!("Received shutdown signal."); break 'main_loop; @@ -279,15 +283,6 @@ pub fn openvr_run(running: Arc) -> Result<(), BackendError> { // close font handles? state.hid_provider.on_new_frame(); - - let mut seconds_since_vsync = 0f32; - std::thread::sleep(Duration::from_secs_f32( - if system_mgr.get_time_since_last_vsync(&mut seconds_since_vsync, &mut 0u64) { - (frame_time - seconds_since_vsync).max(0.0) - } else { - frame_time - }, - )); } log::warn!("OpenVR shutdown");