Tracing.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. /************************************************************************************
  2. PublicHeader: n/a
  3. Filename : Tracing.h
  4. Content : Performance tracing
  5. Created : December 4, 2014
  6. Author : Ed Hutchins
  7. Copyright : Copyright 2014 Oculus VR, LLC All Rights reserved.
  8. Licensed under the Oculus VR Rift SDK License Version 3.2 (the "License");
  9. you may not use the Oculus VR Rift SDK except in compliance with the License,
  10. which is provided at the time of installation or download, or which
  11. otherwise accompanies this software in either electronic or hard copy form.
  12. You may obtain a copy of the License at
  13. http://www.oculusvr.com/licenses/LICENSE-3.2
  14. Unless required by applicable law or agreed to in writing, the Oculus VR SDK
  15. distributed under the License is distributed on an "AS IS" BASIS,
  16. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  17. See the License for the specific language governing permissions and
  18. limitations under the License.
  19. ************************************************************************************/
  20. #ifndef OVR_Tracing_h
  21. #define OVR_Tracing_h
  22. //-----------------------------------------------------------------------------------
  23. // ***** OVR_ENABLE_ETW_TRACING definition (XXX default to on for windows builds?)
  24. //
  25. #ifdef OVR_OS_WIN32
  26. #define OVR_ENABLE_ETW_TRACING
  27. #endif
  28. //-----------------------------------------------------------------------------------
  29. // ***** Trace* definitions
  30. //
  31. #ifdef OVR_ENABLE_ETW_TRACING
  32. #define TracingIsEnabled() (OVR_SDK_LibOVREnableBits[0] != 0)
  33. #ifdef TRACE_STATE_CAPTURE_FUNC
  34. // hook in our own state capture callback to record the state of all opened HMDs (supress unused parameter warnings with void() casts)
  35. #define MCGEN_PRIVATE_ENABLE_CALLBACK_V2(SourceId, ControlCode, Level, MatchAnyKeyword, MatchAllKeywords, FilterData, CallbackContext) \
  36. ( \
  37. void(SourceId), \
  38. void(Level), \
  39. void(MatchAnyKeyword), \
  40. void(MatchAllKeywords), \
  41. void(FilterData), \
  42. void(CallbackContext), \
  43. (((ControlCode) == EVENT_CONTROL_CODE_CAPTURE_STATE) ? (TRACE_STATE_CAPTURE_FUNC) : 0) \
  44. )
  45. #endif
  46. #if !defined(_In_reads_)
  47. // get VS2010 working
  48. #define _In_reads_(x)
  49. #endif
  50. #include "LibOVREvents.h"
  51. // Register/Unregister the OVR_SDK_LibOVR provider with ETW
  52. // (MCGEN_PRIVATE_ENABLE_CALLBACK_V2 hooks in our state capture)
  53. #define TraceInit() \
  54. do { \
  55. ULONG status = EventRegisterOVR_SDK_LibOVR(); \
  56. if (ERROR_SUCCESS != status) { \
  57. LogError("[LibOVR] Failed to register ETW provider (%ul)", status); \
  58. } \
  59. } while (0)
  60. #define TraceFini() EventUnregisterOVR_SDK_LibOVR()
  61. // Trace function call and return for perf, and waypoints for debug
  62. #define TraceCall(frameIndex) EventWriteCall(__FUNCTIONW__, __LINE__, (frameIndex))
  63. #define TraceReturn(frameIndex) EventWriteReturn(__FUNCTIONW__, __LINE__, (frameIndex))
  64. #define TraceWaypoint(frameIndex) EventWriteWaypoint(__FUNCTIONW__, __LINE__, (frameIndex))
  65. // DistortionRenderer events
  66. #define TraceDistortionBegin(id, frameIndex) EventWriteDistortionBegin((id), (frameIndex))
  67. #define TraceDistortionWaitGPU(id, frameIndex) EventWriteDistortionWaitGPU((id), (frameIndex))
  68. #define TraceDistortionPresent(id, frameIndex) EventWriteDistortionPresent((id), (frameIndex))
  69. #define TraceDistortionEnd(id, frameIndex) EventWriteDistortionEnd((id), (frameIndex))
  70. // Tracking Camera events
  71. #define _TraceCameraFrameData(fn,camIdx,img) \
  72. fn( \
  73. (camIdx), \
  74. (img).FrameNumber, \
  75. (img).HmdFrameNumber, \
  76. (img).ArrivalTime, \
  77. (img).CaptureTime \
  78. )
  79. #define TraceCameraFrameReceived(img) _TraceCameraFrameData(EventWriteCameraFrameReceived, 0, (img))
  80. #define TraceCameraBeginProcessing(camIdx, img) _TraceCameraFrameData(EventWriteCameraBeginProcessing, camIdx, (img))
  81. #define TraceCameraEndProcessing(camIdx, img) _TraceCameraFrameData(EventWriteCameraEndProcessing, camIdx, (img))
  82. #define TraceCameraFrameRequest(requestNumber, frameCount, lastFrameNumber) EventWriteCameraFrameRequest(requestNumber, frameCount, lastFrameNumber)
  83. #define TraceCameraSkippedFrames(camIdx, skippedFrameCount) EventWriteCameraSkippedFrames(camIdx, skippedFrameCount)
  84. #define TraceCameraBeginGlobalImageAquisition(attachedCameras) EventWriteCameraBeginGlobalImageAquisition(attachedCameras, 0, 0)
  85. #define TraceCameraEndGlobalImageAquisition(attachedCameras, capturedFrames, captureTime) EventWriteCameraEndGlobalImageAquisition(attachedCameras, capturedFrames, captureTime)
  86. #define TraceCameraBeginLEDMatching(camIdx, matchPass, objIdx, matchCount) EventWriteBeginCameraLEDMatching(camIdx, matchPass, objIdx, matchCount)
  87. #define TraceCameraEndLEDMatching(camIdx, matchPass, objIdx, matchCount) EventWriteEndCameraLEDMatching(camIdx, matchPass, objIdx, matchCount)
  88. #define TraceCameraPoseChange(camIdx, newWorld, oldWorld) \
  89. EventWriteCameraPoseChange( \
  90. camIdx, \
  91. &(newWorld).Rotation.x, \
  92. &(newWorld).Translation.x, \
  93. &(oldWorld).Rotation.x, \
  94. &(oldWorld).Translation.x \
  95. )
  96. #define TraceCameraClockSync(camIdx, objIdx, hmdFrameNumber, captureTime) EventWriteCameraClockSync(camIdx, objIdx, hmdFrameNumber, captureTime)
  97. #define TraceCameraPoseReconstruction(camIdx, objIdx, sample) \
  98. EventWriteCameraPoseReconstruction( \
  99. camIdx, \
  100. objIdx, \
  101. (sample).HasPosition, \
  102. (sample).HasOrientation, \
  103. (sample).HasVelocities, \
  104. (sample).ObjectSpaceError, \
  105. (sample).MatchCount \
  106. )
  107. #define TraceCameraPoseSensorFusion(camIdx, objIdx) EventWriteCameraPoseSensorFusion(camIdx, objIdx)
  108. #define TraceCameraGetFrame(camIdx, lastFrameNumber) EventWriteCameraGetFrame(camIdx, lastFrameNumber)
  109. #define TraceCameraBeginBlobSegmentation(camIdx, lastFrameNumber) EventWriteCameraBeginBlobSegmentation(camIdx, lastFrameNumber)
  110. // Trace the interesting parts of an ovrHmdDesc structure
  111. /*
  112. #define TraceHmdDesc(desc) \
  113. EventWriteHmdDesc( \
  114. (desc).Type, \
  115. (desc).VendorId, \
  116. (desc).ProductId, \
  117. (desc).SerialNumber, \
  118. (desc).FirmwareMajor, \
  119. (desc).FirmwareMinor, \
  120. (desc).AvailableHmdCaps, \
  121. (desc).DefaultHmdCaps, \
  122. (desc).AvailableTrackingCaps, \
  123. (desc).DefaultTrackingCaps, \
  124. (desc).Resolution.w, \
  125. (desc).Resolution.h, \
  126. (desc).DisplayRefreshRate \
  127. )
  128. */
  129. // What happened here?
  130. #define TraceHmdDesc(desc) \
  131. EventWriteHmdDesc(\
  132. (desc).Type, \
  133. (desc).VendorId, \
  134. (desc).ProductId, \
  135. (desc).SerialNumber, \
  136. (desc).FirmwareMajor, \
  137. (desc).FirmwareMinor, \
  138. (desc).AvailableHmdCaps, \
  139. (desc).AvailableTrackingCaps, \
  140. (desc).Resolution.w, \
  141. (desc).Resolution.h \
  142. )
  143. #define TraceHmdDisplay(dpy) \
  144. EventWriteHmdDisplay( \
  145. (0), \
  146. (dpy).DeviceTypeGuess, \
  147. (dpy).DisplayID.ToCStr(), \
  148. (dpy).ModelName.ToCStr(), \
  149. (dpy).EdidSerialNumber.ToCStr(), \
  150. (dpy).LogicalResolutionInPixels.w, \
  151. (dpy).LogicalResolutionInPixels.h, \
  152. (dpy).NativeResolutionInPixels.w, \
  153. (dpy).NativeResolutionInPixels.h, \
  154. 0, \
  155. 0, \
  156. (dpy).DeviceNumber, \
  157. (dpy).Rotation, \
  158. (dpy).ApplicationExclusive \
  159. )
  160. // Trace part of a JSON string (events have a 64k limit)
  161. #define TraceJSONChunk(Name, TotalChunks, ChunkSequence, TotalSize, ChunkSize, ChunkOffset, Chunk) \
  162. EventWriteJSONChunk(Name, TotalChunks, ChunkSequence, TotalSize, ChunkSize, ChunkOffset, Chunk)
  163. // Trace messages from the public ovr_Trace API and our internal logger
  164. #define TraceLogDebug(message) EventWriteLogDebugMessage(message)
  165. #define TraceLogInfo(message) EventWriteLogInfoMessage(message)
  166. #define TraceLogError(message) EventWriteLogErrorMessage(message)
  167. // Trace an ovrTrackingState
  168. #define TraceTrackingState(ts) \
  169. EventWriteHmdTrackingState( \
  170. (ts).HeadPose.TimeInSeconds, \
  171. &(ts).HeadPose.ThePose.Orientation.x, \
  172. &(ts).HeadPose.ThePose.Position.x, \
  173. &(ts).HeadPose.AngularVelocity.x, \
  174. &(ts).HeadPose.LinearVelocity.x, \
  175. &(ts).CameraPose.Orientation.x, \
  176. &(ts).CameraPose.Position.x, \
  177. &(ts).RawSensorData.Accelerometer.x, \
  178. &(ts).RawSensorData.Gyro.x, \
  179. &(ts).RawSensorData.Magnetometer.x, \
  180. (ts).RawSensorData.Temperature, \
  181. (ts).RawSensorData.TimeInSeconds, \
  182. (ts).StatusFlags, \
  183. (ts).LastCameraFrameCounter \
  184. )
  185. #define TraceCameraBlobs(camIdx, frame) \
  186. if (EventEnabledCameraBlobs()) \
  187. { \
  188. const int max_blobs = 80; \
  189. int count = (frame).Blobs.GetSizeI(); \
  190. double x[max_blobs]; \
  191. double y[max_blobs]; \
  192. int size[max_blobs]; \
  193. if (count > max_blobs) \
  194. count = max_blobs; \
  195. for (int i = 0; i < count; ++i) \
  196. { \
  197. x[i] = (frame).Blobs[i].Position.x; \
  198. y[i] = (frame).Blobs[i].Position.y; \
  199. size[i] = (frame).Blobs[i].BlobSize; \
  200. } \
  201. EventWriteCameraBlobs( \
  202. camIdx, \
  203. (frame).Frame->FrameNumber, \
  204. (frame).Frame->ArrivalTime, \
  205. (frame).Frame->Width, \
  206. (frame).Frame->Height, \
  207. count, \
  208. x, \
  209. y, \
  210. size \
  211. ); \
  212. } \
  213. else ((void)0)
  214. #define TracePosePrediction(OriginalPose, PredictedPose, PredictionTimeDeltaSeconds, CurrentTimeInSeconds, id) \
  215. EventWritePosePrediction( \
  216. &(OriginalPose).Translation.x, \
  217. &(OriginalPose).Rotation.x, \
  218. &(PredictedPose).Translation.x, \
  219. &(PredictedPose).Rotation.x, \
  220. (PredictionTimeDeltaSeconds), \
  221. (CurrentTimeInSeconds), \
  222. (id) \
  223. )
  224. // Trace PoseLatching CPU pinned memory write
  225. #define TracePoseLatchCPUWrite(Sequence, Layer, MotionSensorTime, PredictedScanlineFirst, PredictedScanlineLast, TimeToScanlineFirst, TimeToScanlineLast, StartPosition, EndPosition, StartQuat, EndQuat) \
  226. EventWritePoseLatchCPUWrite(Sequence, Layer, MotionSensorTime, PredictedScanlineFirst, PredictedScanlineLast, TimeToScanlineFirst, TimeToScanlineLast, StartPosition, EndPosition, StartQuat, EndQuat)
  227. // Trace PoseLatching GPU latch
  228. #define TracePoseLatchGPULatchReadback(Sequence, Layer, MotionSensorTime, PredictedScanlineFirst, PredictedScanlineLast, TimeToScanlineFirst, TimeToScanlineLast) \
  229. EventWritePoseLatchGPULatchReadback(Sequence, Layer, MotionSensorTime, PredictedScanlineFirst, PredictedScanlineLast, TimeToScanlineFirst, TimeToScanlineLast)
  230. #define TraceVSync(VSyncTime, FrameIndex, TWGpuEndTime) \
  231. EventWriteVSync(VSyncTime, FrameIndex, TWGpuEndTime)
  232. #define TraceAppCompositorFocus(Pid) \
  233. EventWriteAppCompositorFocus(Pid)
  234. #define TraceAppConnect(Pid) \
  235. EventWriteAppConnect(Pid)
  236. #define TraceAppDisconnect(Pid) \
  237. EventWriteAppDisconnect(Pid)
  238. #define TraceAppNoOp(Pid) \
  239. EventWriteAppNoOp(Pid)
  240. #define TraceLatencyTiming(LatencyTiming) \
  241. EventWriteLatencyTiming( \
  242. LatencyTiming.LatencyRenderCpuBegin, \
  243. LatencyTiming.LatencyRenderCpuEnd, \
  244. LatencyTiming.LatencyRenderIMU, \
  245. LatencyTiming.LatencyTimewarpCpu, \
  246. LatencyTiming.LatencyTimewarpLatched, \
  247. LatencyTiming.LatencyTimewarpGpuEnd, \
  248. LatencyTiming.LatencyPostPresent, \
  249. LatencyTiming.ErrorRender, \
  250. LatencyTiming.ErrorTimewarp \
  251. )
  252. #define TraceEndFrameAppTiming(AppTiming, DistortionGpuDuration) \
  253. EventWriteEndFrameAppTiming( \
  254. AppTiming.AppFrameIndex, \
  255. AppTiming.AppRenderIMUTime, \
  256. AppTiming.AppScanoutStartTime, \
  257. AppTiming.AppGpuRenderDuration, \
  258. AppTiming.AppBeginRenderingTime, \
  259. AppTiming.AppEndRenderingTime, \
  260. AppTiming.QueueAheadSeconds, \
  261. DistortionGpuDuration \
  262. )
  263. #define TraceHardwareInfo(data) \
  264. EventWriteHardwareInfo( \
  265. data.RequestedBits, \
  266. data.CollectedBits, \
  267. data.ImuTemp, \
  268. data.StmTemp, \
  269. data.NrfTemp, \
  270. data.VBusVoltage, \
  271. data.IAD, \
  272. data.Proximity, \
  273. data.PanelOnTime, \
  274. data.UseRolling, \
  275. data.HighBrightness, \
  276. data.DP, \
  277. data.SelfRefresh, \
  278. data.Persistence, \
  279. data.LightingOffset, \
  280. data.PixelSettle, \
  281. data.TotalRows, \
  282. data.RecordedCameraCount, \
  283. data.TrackerSensorDieTemp, \
  284. data.TrackerEtronTemp, \
  285. data.TrackerCCMTemp)
  286. #else // OVR_ENABLE_ETW_TRACING
  287. // Eventually other platforms could support their form of performance tracing
  288. #define TracingIsEnabled() (false)
  289. #define TraceInit() ((void)0)
  290. #define TraceFini() ((void)0)
  291. #define TraceCall(frameIndex) ((void)0)
  292. #define TraceReturn(frameIndex) ((void)0)
  293. #define TraceWaypoint(frameIndex) ((void)0)
  294. #define TraceDistortionBegin(id, frameIndex) ((void)0)
  295. #define TraceDistortionWaitGPU(id, frameIndex) ((void)0)
  296. #define TraceDistortionPresent(id, frameIndex) ((void)0)
  297. #define TraceDistortionEnd(id, frameIndex) ((void)0)
  298. #define TraceCameraFrameReceived(cfd) ((void)0)
  299. #define TraceCameraBeginProcessing(camIdx, img) ((void)0)
  300. #define TraceCameraFrameRequest(requestNumber, frameCount, lastFrameNumber) ((void)0)
  301. #define TraceCameraEndProcessing(camIdx, img) ((void)0)
  302. #define TraceCameraSkippedFrames(camIdx, skippedFrameCount) ((void)0)
  303. #define TraceHmdDesc(desc) ((void)0)
  304. #define TraceHmdDisplay(dpy) ((void)0)
  305. #define TraceJSONChunk(Name, TotalChunks, ChunkSequence, TotalSize, ChunkSize, ChunkOffset, Chunk) ((void)0)
  306. #define TraceLogDebug(message) ((void)0)
  307. #define TraceLogInfo(message) ((void)0)
  308. #define TraceLogError(message) ((void)0)
  309. #define TraceTrackingState(ts) ((void)0)
  310. #define TraceCameraBlobs(camIdx, frame) ((void)0)
  311. #define TracePoseLatchCPUWrite(Sequence, Layer, MotionSensorTime, PredictedScanlineFirst, PredictedScanlineLast, TimeToScanlineFirst, TimeToScanlineLast, StartPosition, EndPosition, StartQuat, EndQuat) ((void)0)
  312. #define TracePoseLatchGPULatchReadback(Sequence, Layer, MotionSensorTime, PredictedScanlineFirst, PredictedScanlineLast, TimeToScanlineFirst, TimeToScanlineLast) ((void)0)
  313. #define TraceVSync(VSyncTime, FrameIndex, TWGpuEndTime) ((void)0)
  314. #define TracePosePrediction(OriginalPose, PredictedPose, PredictionTimeDeltaSeconds, CurrentTimeInSeconds, id) ((void)0)
  315. #define TraceAppCompositorFocus(Pid) ((void)0)
  316. #define TraceAppConnect(Pid) ((void)0)
  317. #define TraceAppDisconnect(Pid) ((void)0)
  318. #define TraceAppNoOp(Pid) ((void)0)
  319. #define TraceLatencyTiming(LatencyTiming) ((void)0)
  320. #define TraceEndFrameAppTiming(AppTiming, DistortionGpuDuration) ((void)0)
  321. #define TraceHardwareInfo(data) ((void)0)
  322. #endif // OVR_ENABLE_ETW_TRACING
  323. #endif // OVR_Tracing_h