openvr: throttle using WaitFrameSync

This commit is contained in:
galister
2024-03-07 17:57:07 +01:00
parent e7456a9b0a
commit cd297376a8
2 changed files with 7 additions and 12 deletions

4
Cargo.lock generated
View File

@@ -2198,7 +2198,7 @@ dependencies = [
[[package]] [[package]]
name = "ovr_overlay" name = "ovr_overlay"
version = "0.0.0" 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 = [ dependencies = [
"byteorder", "byteorder",
"derive_more", "derive_more",
@@ -2213,7 +2213,7 @@ dependencies = [
[[package]] [[package]]
name = "ovr_overlay_sys" name = "ovr_overlay_sys"
version = "0.0.0" 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 = [ dependencies = [
"autocxx", "autocxx",
"autocxx-build", "autocxx-build",

View File

@@ -126,7 +126,9 @@ pub fn openvr_run(running: Arc<AtomicBool>) -> Result<(), BackendError> {
let watch_id = overlays.get_by_name(WATCH_NAME).unwrap().state.id; // want panic 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 next_device_update = Instant::now();
let mut due_tasks = VecDeque::with_capacity(4); let mut due_tasks = VecDeque::with_capacity(4);
@@ -134,6 +136,8 @@ pub fn openvr_run(running: Arc<AtomicBool>) -> Result<(), BackendError> {
let pointer_lines = [lines.allocate(), lines.allocate()]; let pointer_lines = [lines.allocate(), lines.allocate()];
'main_loop: loop { 'main_loop: loop {
let _ = overlay_mgr.wait_frame_sync(frame_timeout);
if !running.load(Ordering::Relaxed) { if !running.load(Ordering::Relaxed) {
log::warn!("Received shutdown signal."); log::warn!("Received shutdown signal.");
break 'main_loop; break 'main_loop;
@@ -279,15 +283,6 @@ pub fn openvr_run(running: Arc<AtomicBool>) -> Result<(), BackendError> {
// close font handles? // close font handles?
state.hid_provider.on_new_frame(); 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"); log::warn!("OpenVR shutdown");