From 90f55f0cd5d68060b5e81d19dc996b8a7b0442fc Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Tue, 8 Nov 2016 09:13:53 -0800 Subject: [PATCH] Add stutter tracking --- interface/resources/qml/Stats.qml | 4 ++++ interface/src/ui/Stats.cpp | 3 ++- interface/src/ui/Stats.h | 5 ++++- libraries/plugins/src/plugins/DisplayPlugin.h | 2 ++ plugins/openvr/src/OpenVrDisplayPlugin.cpp | 10 ++++++++++ plugins/openvr/src/OpenVrDisplayPlugin.h | 3 +++ 6 files changed, 25 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/Stats.qml b/interface/resources/qml/Stats.qml index 9c55b1ce2d..cb7186456f 100644 --- a/interface/resources/qml/Stats.qml +++ b/interface/resources/qml/Stats.qml @@ -69,6 +69,10 @@ Item { StatText { text: "Present Drop Rate: " + root.presentdroprate.toFixed(2); } + StatText { + text: "Stutter Rate: " + root.stutterrate.toFixed(3); + visible: root.stutterrate != -1; + } StatText { text: "Simrate: " + root.simrate } diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index edf72d9758..bad2c3c056 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -128,7 +128,8 @@ void Stats::updateStats(bool force) { STAT_UPDATE(renderrate, displayPlugin->renderRate()); STAT_UPDATE(presentrate, displayPlugin->presentRate()); STAT_UPDATE(presentnewrate, displayPlugin->newFramePresentRate()); - STAT_UPDATE(presentdroprate, qApp->getActiveDisplayPlugin()->droppedFrameRate()); + STAT_UPDATE(presentdroprate, displayPlugin->droppedFrameRate()); + STAT_UPDATE(stutterrate, displayPlugin->stutterRate()); } else { STAT_UPDATE(presentrate, -1); STAT_UPDATE(presentnewrate, -1); diff --git a/interface/src/ui/Stats.h b/interface/src/ui/Stats.h index ffa5c08bc6..5d1aac4287 100644 --- a/interface/src/ui/Stats.h +++ b/interface/src/ui/Stats.h @@ -36,7 +36,9 @@ class Stats : public QQuickItem { STATS_PROPERTY(float, renderrate, 0) // How often the display plugin is presenting to the device STATS_PROPERTY(float, presentrate, 0) - + // How often the display device reprojecting old frames + STATS_PROPERTY(float, stutterrate, 0) + STATS_PROPERTY(float, presentnewrate, 0) STATS_PROPERTY(float, presentdroprate, 0) STATS_PROPERTY(int, simrate, 0) @@ -140,6 +142,7 @@ signals: void presentrateChanged(); void presentnewrateChanged(); void presentdroprateChanged(); + void stutterrateChanged(); void simrateChanged(); void avatarSimrateChanged(); void avatarCountChanged(); diff --git a/libraries/plugins/src/plugins/DisplayPlugin.h b/libraries/plugins/src/plugins/DisplayPlugin.h index 3a9107390a..c87669c99a 100644 --- a/libraries/plugins/src/plugins/DisplayPlugin.h +++ b/libraries/plugins/src/plugins/DisplayPlugin.h @@ -188,6 +188,8 @@ public: virtual float renderRate() const { return -1.0f; } // Rate at which we present to the display device virtual float presentRate() const { return -1.0f; } + // Rate at which old frames are presented to the device display + virtual float stutterRate() const { return -1.0f; } // Rate at which new frames are being presented to the display device virtual float newFramePresentRate() const { return -1.0f; } // Rate at which rendered frames are being skipped diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.cpp b/plugins/openvr/src/OpenVrDisplayPlugin.cpp index 1a4067a847..e300ad3ece 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.cpp +++ b/plugins/openvr/src/OpenVrDisplayPlugin.cpp @@ -641,6 +641,12 @@ void OpenVrDisplayPlugin::hmdPresent() { vr::VRCompositor()->PostPresentHandoff(); _presentRate.increment(); } + + vr::Compositor_FrameTiming frameTiming; + memset(&frameTiming, 0, sizeof(vr::Compositor_FrameTiming)); + frameTiming.m_nSize = sizeof(vr::Compositor_FrameTiming); + vr::VRCompositor()->GetFrameTiming(&frameTiming); + _stutterRate.increment(frameTiming.m_nNumDroppedFrames); } void OpenVrDisplayPlugin::postPreview() { @@ -702,3 +708,7 @@ bool OpenVrDisplayPlugin::isKeyboardVisible() { int OpenVrDisplayPlugin::getRequiredThreadCount() const { return Parent::getRequiredThreadCount() + (_threadedSubmit ? 1 : 0); } + +float OpenVrDisplayPlugin::stutterRate() const { + return _stutterRate.rate(); +} diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.h b/plugins/openvr/src/OpenVrDisplayPlugin.h index 3403bae27c..0f4c5a6320 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.h +++ b/plugins/openvr/src/OpenVrDisplayPlugin.h @@ -58,6 +58,8 @@ public: // Possibly needs an additional thread for VR submission int getRequiredThreadCount() const override; + float stutterRate() const override; + protected: bool internalActivate() override; void internalDeactivate() override; @@ -77,6 +79,7 @@ private: vr::HmdMatrix34_t _lastGoodHMDPose; mat4 _sensorResetMat; bool _threadedSubmit { true }; + RateCounter<> _stutterRate; CompositeInfo::Array _compositeInfos; size_t _renderingIndex { 0 };