From a659fef806759c633d44b12a2a9dbe3c3b92a792 Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Tue, 25 Jan 2022 14:35:55 +0000 Subject: [PATCH] drm: Use vblank time from page flip handler --- src/drm.cpp | 4 +++- src/steamcompmgr.cpp | 3 ++- src/vblankmanager.cpp | 4 ++-- src/vblankmanager.hpp | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/drm.cpp b/src/drm.cpp index 90a078c..58a8a48 100644 --- a/src/drm.cpp +++ b/src/drm.cpp @@ -188,7 +188,9 @@ static void page_flip_handler(int fd, unsigned int frame, unsigned int sec, unsi if ( g_DRM.crtc->id != crtc_id ) return; - vblank_mark_possible_vblank(); + // This is the last vblank time + uint64_t vblanktime = sec * 1'000'000'000lu + usec * 1'000lu; + vblank_mark_possible_vblank(vblanktime); // TODO: get the fbids_queued instance from data if we ever have more than one in flight diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp index eb7f9ce..bf876a5 100644 --- a/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp @@ -494,7 +494,8 @@ static inline void stats_printf( const char* format, ...) uint64_t get_time_in_nanos() { timespec ts; - clock_gettime(CLOCK_MONOTONIC_RAW, &ts); + // Kernel reports page flips with CLOCK_MONOTONIC. + clock_gettime(CLOCK_MONOTONIC, &ts); return ts.tv_sec * 1'000'000'000ul + ts.tv_nsec; } diff --git a/src/vblankmanager.cpp b/src/vblankmanager.cpp index 8ee15e0..889abb8 100644 --- a/src/vblankmanager.cpp +++ b/src/vblankmanager.cpp @@ -77,7 +77,7 @@ int vblank_init( void ) return g_vblankPipe[ 0 ]; } -void vblank_mark_possible_vblank( void ) +void vblank_mark_possible_vblank( uint64_t nanos ) { - g_lastVblank = get_time_in_nanos(); + g_lastVblank = nanos; } diff --git a/src/vblankmanager.hpp b/src/vblankmanager.hpp index 9ad0a9f..ec0eaf1 100644 --- a/src/vblankmanager.hpp +++ b/src/vblankmanager.hpp @@ -2,4 +2,4 @@ int vblank_init( void ); -void vblank_mark_possible_vblank( void ); +void vblank_mark_possible_vblank( uint64_t nanos );