diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp index 2e66659de7..c5d7ac5690 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp @@ -710,3 +710,7 @@ void HmdDisplayPlugin::compositeExtra() { HmdDisplayPlugin::~HmdDisplayPlugin() { qDebug() << "Destroying HmdDisplayPlugin"; } + +float HmdDisplayPlugin::stutterRate() const { + return _stutterRate.rate(); +} diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h index e50183dd90..435f547899 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h @@ -44,6 +44,8 @@ public: return false; } + float stutterRate() const override; + protected: virtual void hmdPresent() = 0; virtual bool isHmdMounted() const = 0; @@ -108,8 +110,9 @@ protected: QMap _frameInfos; FrameInfo _currentPresentFrameInfo; FrameInfo _currentRenderFrameInfo; + RateCounter<> _stutterRate; - bool _disablePreview{ true }; + bool _disablePreview { true }; private: ivec4 getViewportForSourceSize(const uvec2& size) const; float getLeftCenterPixel() const; diff --git a/plugins/oculus/src/OculusDisplayPlugin.cpp b/plugins/oculus/src/OculusDisplayPlugin.cpp index 415965e948..143204be17 100644 --- a/plugins/oculus/src/OculusDisplayPlugin.cpp +++ b/plugins/oculus/src/OculusDisplayPlugin.cpp @@ -146,6 +146,16 @@ void OculusDisplayPlugin::hmdPresent() { if (!OVR_SUCCESS(result)) { logWarning("Failed to present"); } + + static int droppedFrames = 0; + ovrPerfStats perfStats; + ovr_GetPerfStats(_session, &perfStats); + for (int i = 0; i < perfStats.FrameStatsCount; ++i) { + const auto& frameStats = perfStats.FrameStats[i]; + int delta = frameStats.CompositorDroppedFrameCount - droppedFrames; + _stutterRate.increment(delta); + droppedFrames = frameStats.CompositorDroppedFrameCount; + } } _presentRate.increment(); } diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.cpp b/plugins/openvr/src/OpenVrDisplayPlugin.cpp index e300ad3ece..7f0ac4d5e0 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.cpp +++ b/plugins/openvr/src/OpenVrDisplayPlugin.cpp @@ -708,7 +708,3 @@ 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 0f4c5a6320..3403bae27c 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.h +++ b/plugins/openvr/src/OpenVrDisplayPlugin.h @@ -58,8 +58,6 @@ public: // Possibly needs an additional thread for VR submission int getRequiredThreadCount() const override; - float stutterRate() const override; - protected: bool internalActivate() override; void internalDeactivate() override; @@ -79,7 +77,6 @@ private: vr::HmdMatrix34_t _lastGoodHMDPose; mat4 _sensorResetMat; bool _threadedSubmit { true }; - RateCounter<> _stutterRate; CompositeInfo::Array _compositeInfos; size_t _renderingIndex { 0 };