diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp index 5241e40a29d..4da1c94d121 100644 --- a/Source/Core/Core/Core.cpp +++ b/Source/Core/Core/Core.cpp @@ -868,6 +868,10 @@ void Callback_FramePresented(const PresentInfo& present_info) { g_perf_metrics.CountFrame(); + const auto presentation_offset = + present_info.actual_present_time - present_info.intended_present_time; + g_perf_metrics.SetLatestFramePresentationOffset(presentation_offset); + if (present_info.reason == PresentInfo::PresentReason::VideoInterfaceDuplicate) return; diff --git a/Source/Core/VideoCommon/PerformanceMetrics.cpp b/Source/Core/VideoCommon/PerformanceMetrics.cpp index 5a38e1e3c66..d00e5dbbba9 100644 --- a/Source/Core/VideoCommon/PerformanceMetrics.cpp +++ b/Source/Core/VideoCommon/PerformanceMetrics.cpp @@ -23,6 +23,8 @@ void PerformanceMetrics::Reset() m_speed = 0; m_max_speed = 0; + + m_frame_presentation_offset = DT{}; } void PerformanceMetrics::CountFrame() @@ -98,6 +100,11 @@ double PerformanceMetrics::GetMaxSpeed() const return m_max_speed.load(std::memory_order_relaxed); } +void PerformanceMetrics::SetLatestFramePresentationOffset(DT offset) +{ + m_frame_presentation_offset.store(offset, std::memory_order_relaxed); +} + void PerformanceMetrics::DrawImGuiStats(const float backbuffer_scale) { m_vps_counter.UpdateStats(); @@ -293,6 +300,10 @@ void PerformanceMetrics::DrawImGuiStats(const float backbuffer_scale) DT_ms(m_fps_counter.GetDtAvg()).count()); ImGui::TextColored(ImVec4(r, g, b, 1.0f), " ±:%6.2lfms", DT_ms(m_fps_counter.GetDtStd()).count()); + + const auto offset = + DT_ms(m_frame_presentation_offset.load(std::memory_order_relaxed)).count(); + ImGui::TextColored(ImVec4(r, g, b, 1.0f), "ofs:%5.1lfms", offset); } } ImGui::End(); diff --git a/Source/Core/VideoCommon/PerformanceMetrics.h b/Source/Core/VideoCommon/PerformanceMetrics.h index bca6372d181..914e6bc82f5 100644 --- a/Source/Core/VideoCommon/PerformanceMetrics.h +++ b/Source/Core/VideoCommon/PerformanceMetrics.h @@ -43,6 +43,9 @@ public: double GetSpeed() const; double GetMaxSpeed() const; + // Call from any thread. + void SetLatestFramePresentationOffset(DT offset); + // ImGui Functions void DrawImGuiStats(const float backbuffer_scale); @@ -55,6 +58,8 @@ private: std::atomic m_speed{}; std::atomic m_max_speed{}; + std::atomic
m_frame_presentation_offset{}; + struct PerfSample { TimePoint clock_time;