From 9d479197566cda9613b65c31837162b249a6a665 Mon Sep 17 00:00:00 2001 From: Riccardo Zaglia Date: Tue, 23 May 2023 18:17:55 +0800 Subject: [PATCH] Update SteamVR framerate on statistics thread, support Linux --- alvr/server/src/connection.rs | 25 +++++++++++++++++-------- alvr/server/src/lib.rs | 10 ++-------- alvr/server/src/statistics.rs | 2 +- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/alvr/server/src/connection.rs b/alvr/server/src/connection.rs index c3d62ce635..46df14364a 100644 --- a/alvr/server/src/connection.rs +++ b/alvr/server/src/connection.rs @@ -2,7 +2,7 @@ use crate::{ bitrate::BitrateManager, buttons::BUTTON_PATH_FROM_ID, face_tracking::FaceTrackingSink, - haptics, + haptics, openvr_props, sockets::WelcomeSocket, statistics::StatisticsManager, tracking::{self, TrackingManager}, @@ -24,7 +24,10 @@ use alvr_packets::{ ButtonValue, ClientConnectionResult, ClientControlPacket, ClientListAction, ClientStatistics, ServerControlPacket, StreamConfigPacket, Tracking, AUDIO, HAPTICS, STATISTICS, TRACKING, VIDEO, }; -use alvr_session::{CodecType, ControllersEmulationMode, FrameSize, OpenvrConfig}; +use alvr_session::{ + CodecType, ControllersEmulationMode, FrameSize, OpenvrConfig, OpenvrPropValue, + OpenvrPropertyKey, +}; use alvr_sockets::{ spawn_cancelable, ControlSocketReceiver, ControlSocketSender, PeerType, ProtoControlSocket, StreamSocketBuilder, KEEPALIVE_INTERVAL, @@ -626,8 +629,8 @@ async fn connection_pipeline( crate::SetOpenvrProperty( *alvr_common::HEAD_ID, crate::openvr_props::to_ffi_openvr_prop( - alvr_session::OpenvrPropertyKey::AudioDefaultPlaybackDeviceId, - alvr_session::OpenvrPropValue::String(id), + OpenvrPropertyKey::AudioDefaultPlaybackDeviceId, + OpenvrPropValue::String(id), ), ) } @@ -650,8 +653,8 @@ async fn connection_pipeline( crate::SetOpenvrProperty( *alvr_common::HEAD_ID, crate::openvr_props::to_ffi_openvr_prop( - alvr_session::OpenvrPropertyKey::AudioDefaultPlaybackDeviceId, - alvr_session::OpenvrPropValue::String(id), + OpenvrPropertyKey::AudioDefaultPlaybackDeviceId, + OpenvrPropValue::String(id), ), ) } @@ -675,8 +678,8 @@ async fn connection_pipeline( crate::SetOpenvrProperty( *alvr_common::HEAD_ID, crate::openvr_props::to_ffi_openvr_prop( - alvr_session::OpenvrPropertyKey::AudioDefaultRecordingDeviceId, - alvr_session::OpenvrPropValue::String(id), + OpenvrPropertyKey::AudioDefaultRecordingDeviceId, + OpenvrPropValue::String(id), ), ) } @@ -914,6 +917,12 @@ async fn connection_pipeline( network_latency, decoder_latency, ); + + openvr_props::set_prop( + *HEAD_ID, + OpenvrPropertyKey::DisplayFrequency, + OpenvrPropValue::Float(1.0 / stats.frame_interval_average().as_secs_f32()), + ); } } } diff --git a/alvr/server/src/lib.rs b/alvr/server/src/lib.rs index d6da82b7d7..a630ddb2af 100644 --- a/alvr/server/src/lib.rs +++ b/alvr/server/src/lib.rs @@ -28,7 +28,7 @@ use alvr_common::{ once_cell::sync::{Lazy, OnceCell}, parking_lot::{Mutex, RwLock}, prelude::*, - RelaxedAtomic, HEAD_ID, + RelaxedAtomic, }; use alvr_events::EventType; use alvr_filesystem::{self as afs, Layout}; @@ -36,7 +36,7 @@ use alvr_packets::{ ClientListAction, DecoderInitializationConfig, Haptics, ServerControlPacket, VideoPacketHeader, }; use alvr_server_io::ServerDataManager; -use alvr_session::{CodecType, OpenvrPropValue, OpenvrPropertyKey}; +use alvr_session::CodecType; use bitrate::BitrateManager; use statistics::StatisticsManager; use std::{ @@ -484,12 +484,6 @@ pub unsafe extern "C" fn HmdDriverFactory( extern "C" fn wait_for_vsync() { if let Some(stats) = &mut *STATISTICS_MANAGER.lock() { - openvr_props::set_prop( - *HEAD_ID, - OpenvrPropertyKey::DisplayFrequency, - OpenvrPropValue::Float(1.0 / stats.get_frame_interval().as_secs_f32()), - ); - thread::sleep(stats.duration_until_next_vsync()); } } diff --git a/alvr/server/src/statistics.rs b/alvr/server/src/statistics.rs index 82c6bb6b8c..26dad0a91f 100644 --- a/alvr/server/src/statistics.rs +++ b/alvr/server/src/statistics.rs @@ -293,7 +293,7 @@ impl StatisticsManager { .saturating_sub(self.total_pipeline_latency_average.get_average()) } - pub fn get_frame_interval(&self) -> Duration { + pub fn frame_interval_average(&self) -> Duration { self.predicted_frame_interval_average.get_average() }