summaryrefslogtreecommitdiffstats
path: root/LibOVR/Src/CAPI/CAPI_LatencyStatistics.h
diff options
context:
space:
mode:
Diffstat (limited to 'LibOVR/Src/CAPI/CAPI_LatencyStatistics.h')
-rw-r--r--LibOVR/Src/CAPI/CAPI_LatencyStatistics.h178
1 files changed, 178 insertions, 0 deletions
diff --git a/LibOVR/Src/CAPI/CAPI_LatencyStatistics.h b/LibOVR/Src/CAPI/CAPI_LatencyStatistics.h
new file mode 100644
index 0000000..0c2f3bd
--- /dev/null
+++ b/LibOVR/Src/CAPI/CAPI_LatencyStatistics.h
@@ -0,0 +1,178 @@
+/************************************************************************************
+
+Filename : CAPI_LatencyStatistics.h
+Content : Record latency statistics during rendering
+Created : Sept 23, 2014
+Authors : Chris Taylor, Kevin Jenkins
+
+Copyright : Copyright 2014 Oculus VR, LLC All Rights reserved.
+
+Licensed under the Oculus VR Rift SDK License Version 3.2 (the "License");
+you may not use the Oculus VR Rift SDK except in compliance with the License,
+which is provided at the time of installation or download, or which
+otherwise accompanies this software in either electronic or hard copy form.
+
+You may obtain a copy of the License at
+
+http://www.oculusvr.com/licenses/LICENSE-3.2
+
+Unless required by applicable law or agreed to in writing, the Oculus VR SDK
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+************************************************************************************/
+
+#ifndef OVR_CAPI_LatencyStatistics_h
+#define OVR_CAPI_LatencyStatistics_h
+
+#include "../OVR_CAPI.h"
+#include "../Kernel/OVR_Timer.h"
+#include "../Kernel/OVR_Lockless.h"
+#include "../Kernel/OVR_SysFile.h"
+#include "CAPI_FrameTimeManager.h"
+
+namespace OVR { namespace CAPI {
+
+
+// Define epoch period for lag statistics
+#define OVR_LAG_STATS_EPOCH 1.0 /* seconds */
+// Define seconds without frames before resetting stats
+#define OVR_LAG_STATS_RESET_LIMIT 2.0 /* seconds */
+
+
+//-------------------------------------------------------------------------------------
+// ***** LatencyStatisticsResults
+
+// Results from statistics collection
+struct LatencyStatisticsResults
+{
+ // Number of seconds of data represented by these statistics.
+ double IntervalSeconds;
+
+ // Frames per second during the epoch.
+ double FPS;
+
+ // Measures average time for EndFrame() call over each of the frames.
+ double EndFrameExecutionTime;
+
+ // Measures the time between first scanline and first pose request before app starts rendering eyes.
+ float LatencyRender;
+
+ // Measures the time between first scanline and distortion/timewarp rendering.
+ float LatencyTimewarp;
+
+ // Time between Present() call and photon emission from first scanline of screen
+ float LatencyPostPresent;
+
+ // Measures the time from receiving the camera frame until vision CPU processing completes.
+ double LatencyVisionProc;
+
+ // Measures the time from exposure until the pose is available for the frame, including processing time.
+ double LatencyVisionFrame;
+};
+
+//-----------------------------------------------------------------------------
+typedef Delegate1<void, LatencyStatisticsResults*> LatencyStatisticsSlot;
+
+// ***** LatencyStatisticsObserver
+class LatencyStatisticsCSV
+{
+public:
+ LatencyStatisticsCSV();
+ ~LatencyStatisticsCSV();
+ bool Start(String fileName, String userData1);
+ bool Stop();
+ void OnResults(LatencyStatisticsResults *results);
+
+ // Internal
+ void WriteHeaderV1();
+ void WriteResultsV1(LatencyStatisticsResults *results);
+ ObserverScope<LatencyStatisticsSlot>* GetObserver() { return &_Observer; }
+
+protected:
+ ObserverScope<LatencyStatisticsSlot> _Observer;
+ String Guid, UserData1;
+ String FileName;
+ OVR::SysFile _File;
+ String OS, OSVersion, ProcessInfo, DisplayDriverVersion, CameraDriverVersion, GPUVersion;
+};
+
+//-----------------------------------------------------------------------------
+// ***** LatencyStatisticsCalculator
+
+// Calculator for latency statistics
+class LagStatsCalculator
+{
+ // Statistics instrumentation inputs:
+
+ // Timestamp when the EndFrame() call started executing
+ double EndFrameStartTime;
+ // Timestamp when the EndFrame() call finished executing
+ double EndFrameEndTime;
+
+ // Latency statistics for the epoch
+ LatencyStatisticsResults latencyStatisticsData;
+
+ // Last latency data
+ // float LatencyData[3]; // render, timewarp, median post-present
+
+ // Last vision processing frame counter number
+ uint32_t LastCameraFrameCounter;
+
+ // Running statistics:
+
+ void resetPerfStats(double resetTime = 0.);
+
+ // Start of the current statistics epoch
+ double EpochBegin;
+ // Count of frames in this stats epoch, measured at EndFrame()
+ int FrameCount;
+ // Sum of end frame durations for this stats epoch
+ //double EndFrameSum;
+
+ // Sum of latencies
+ // double LatencySum[3];
+
+ // Sum of vision processing times
+ //double VisionProcSum;
+ // Sum of vision latency times
+ //double VisionLagSum;
+ // Count of vision frames
+ int VisionFrames;
+
+ // Statistics results:
+
+ LocklessUpdater<LatencyStatisticsResults, LatencyStatisticsResults> Results;
+
+ void calculateResults();
+
+ OVR::ObserverScope<LatencyStatisticsSlot> calculateResultsSubject;
+ OVR::Lock calculateResultsLock;
+
+public:
+ LagStatsCalculator();
+
+ void GetLatestResults(LatencyStatisticsResults* results);
+ void AddResultsObserver(ObserverScope<LatencyStatisticsSlot> *calculateResultsObserver);
+
+public:
+ // Internal instrumentation interface:
+
+ // EndFrame() instrumentation
+ void InstrumentEndFrameStart(double timestamp);
+ void InstrumentEndFrameEnd(double timestamp);
+
+ // DK2 latency tester instrumentation
+ // Note: This assumes that it is called right before InstrumentEndFrameEnd()
+ void InstrumentLatencyTimings(FrameTimeManager& ftm);
+
+ // Eye pose instrumentation
+ void InstrumentEyePose(const ovrTrackingState& state);
+};
+
+
+}} // namespace OVR::CAPI
+
+#endif // OVR_CAPI_LatencyStatistics_h