TracyQueue.hpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685
  1. #ifndef __TRACYQUEUE_HPP__
  2. #define __TRACYQUEUE_HPP__
  3. #include <stdint.h>
  4. namespace tracy
  5. {
  6. enum class QueueType : uint8_t
  7. {
  8. ZoneText,
  9. ZoneName,
  10. Message,
  11. MessageColor,
  12. MessageCallstack,
  13. MessageColorCallstack,
  14. MessageAppInfo,
  15. ZoneBeginAllocSrcLoc,
  16. ZoneBeginAllocSrcLocCallstack,
  17. CallstackSerial,
  18. Callstack,
  19. CallstackAlloc,
  20. CallstackSample,
  21. FrameImage,
  22. ZoneBegin,
  23. ZoneBeginCallstack,
  24. ZoneEnd,
  25. LockWait,
  26. LockObtain,
  27. LockRelease,
  28. LockSharedWait,
  29. LockSharedObtain,
  30. LockSharedRelease,
  31. LockName,
  32. MemAlloc,
  33. MemAllocNamed,
  34. MemFree,
  35. MemFreeNamed,
  36. MemAllocCallstack,
  37. MemAllocCallstackNamed,
  38. MemFreeCallstack,
  39. MemFreeCallstackNamed,
  40. GpuZoneBegin,
  41. GpuZoneBeginCallstack,
  42. GpuZoneBeginAllocSrcLoc,
  43. GpuZoneBeginAllocSrcLocCallstack,
  44. GpuZoneEnd,
  45. GpuZoneBeginSerial,
  46. GpuZoneBeginCallstackSerial,
  47. GpuZoneBeginAllocSrcLocSerial,
  48. GpuZoneBeginAllocSrcLocCallstackSerial,
  49. GpuZoneEndSerial,
  50. PlotData,
  51. ContextSwitch,
  52. ThreadWakeup,
  53. GpuTime,
  54. GpuContextName,
  55. Terminate,
  56. KeepAlive,
  57. ThreadContext,
  58. GpuCalibration,
  59. Crash,
  60. CrashReport,
  61. ZoneValidation,
  62. ZoneColor,
  63. ZoneValue,
  64. FrameMarkMsg,
  65. FrameMarkMsgStart,
  66. FrameMarkMsgEnd,
  67. SourceLocation,
  68. LockAnnounce,
  69. LockTerminate,
  70. LockMark,
  71. MessageLiteral,
  72. MessageLiteralColor,
  73. MessageLiteralCallstack,
  74. MessageLiteralColorCallstack,
  75. GpuNewContext,
  76. CallstackFrameSize,
  77. CallstackFrame,
  78. SymbolInformation,
  79. CodeInformation,
  80. SysTimeReport,
  81. TidToPid,
  82. PlotConfig,
  83. ParamSetup,
  84. AckServerQueryNoop,
  85. AckSourceCodeNotAvailable,
  86. CpuTopology,
  87. SingleStringData,
  88. SecondStringData,
  89. MemNamePayload,
  90. StringData,
  91. ThreadName,
  92. PlotName,
  93. SourceLocationPayload,
  94. CallstackPayload,
  95. CallstackAllocPayload,
  96. FrameName,
  97. FrameImageData,
  98. ExternalName,
  99. ExternalThreadName,
  100. SymbolCode,
  101. SourceCode,
  102. NUM_TYPES
  103. };
  104. #pragma pack( 1 )
  105. struct QueueThreadContext
  106. {
  107. uint64_t thread;
  108. };
  109. struct QueueZoneBeginLean
  110. {
  111. int64_t time;
  112. };
  113. struct QueueZoneBegin : public QueueZoneBeginLean
  114. {
  115. uint64_t srcloc; // ptr
  116. };
  117. struct QueueZoneEnd
  118. {
  119. int64_t time;
  120. };
  121. struct QueueZoneValidation
  122. {
  123. uint32_t id;
  124. };
  125. struct QueueZoneColor
  126. {
  127. uint8_t r;
  128. uint8_t g;
  129. uint8_t b;
  130. };
  131. struct QueueZoneValue
  132. {
  133. uint64_t value;
  134. };
  135. struct QueueStringTransfer
  136. {
  137. uint64_t ptr;
  138. };
  139. struct QueueFrameMark
  140. {
  141. int64_t time;
  142. uint64_t name; // ptr
  143. };
  144. struct QueueFrameImage
  145. {
  146. uint32_t frame;
  147. uint16_t w;
  148. uint16_t h;
  149. uint8_t flip;
  150. };
  151. struct QueueFrameImageFat : public QueueFrameImage
  152. {
  153. uint64_t image; // ptr
  154. };
  155. struct QueueSourceLocation
  156. {
  157. uint64_t name;
  158. uint64_t function; // ptr
  159. uint64_t file; // ptr
  160. uint32_t line;
  161. uint8_t r;
  162. uint8_t g;
  163. uint8_t b;
  164. };
  165. struct QueueZoneTextFat
  166. {
  167. uint64_t text; // ptr
  168. uint16_t size;
  169. };
  170. enum class LockType : uint8_t
  171. {
  172. Lockable,
  173. SharedLockable
  174. };
  175. struct QueueLockAnnounce
  176. {
  177. uint32_t id;
  178. int64_t time;
  179. uint64_t lckloc; // ptr
  180. LockType type;
  181. };
  182. struct QueueLockTerminate
  183. {
  184. uint32_t id;
  185. int64_t time;
  186. };
  187. struct QueueLockWait
  188. {
  189. uint64_t thread;
  190. uint32_t id;
  191. int64_t time;
  192. };
  193. struct QueueLockObtain
  194. {
  195. uint64_t thread;
  196. uint32_t id;
  197. int64_t time;
  198. };
  199. struct QueueLockRelease
  200. {
  201. uint64_t thread;
  202. uint32_t id;
  203. int64_t time;
  204. };
  205. struct QueueLockMark
  206. {
  207. uint64_t thread;
  208. uint32_t id;
  209. uint64_t srcloc; // ptr
  210. };
  211. struct QueueLockName
  212. {
  213. uint32_t id;
  214. };
  215. struct QueueLockNameFat : public QueueLockName
  216. {
  217. uint64_t name; // ptr
  218. uint16_t size;
  219. };
  220. enum class PlotDataType : uint8_t
  221. {
  222. Float,
  223. Double,
  224. Int
  225. };
  226. struct QueuePlotData
  227. {
  228. uint64_t name; // ptr
  229. int64_t time;
  230. PlotDataType type;
  231. union
  232. {
  233. double d;
  234. float f;
  235. int64_t i;
  236. } data;
  237. };
  238. struct QueueMessage
  239. {
  240. int64_t time;
  241. };
  242. struct QueueMessageColor : public QueueMessage
  243. {
  244. uint8_t r;
  245. uint8_t g;
  246. uint8_t b;
  247. };
  248. struct QueueMessageLiteral : public QueueMessage
  249. {
  250. uint64_t text; // ptr
  251. };
  252. struct QueueMessageColorLiteral : public QueueMessageColor
  253. {
  254. uint64_t text; // ptr
  255. };
  256. struct QueueMessageFat : public QueueMessage
  257. {
  258. uint64_t text; // ptr
  259. uint16_t size;
  260. };
  261. struct QueueMessageColorFat : public QueueMessageColor
  262. {
  263. uint64_t text; // ptr
  264. uint16_t size;
  265. };
  266. // Don't change order, only add new entries at the end, this is also used on trace dumps!
  267. enum class GpuContextType : uint8_t
  268. {
  269. Invalid,
  270. OpenGl,
  271. Vulkan,
  272. OpenCL,
  273. Direct3D12
  274. };
  275. enum GpuContextFlags : uint8_t
  276. {
  277. GpuContextCalibration = 1 << 0
  278. };
  279. struct QueueGpuNewContext
  280. {
  281. int64_t cpuTime;
  282. int64_t gpuTime;
  283. uint64_t thread;
  284. float period;
  285. uint8_t context;
  286. GpuContextFlags flags;
  287. GpuContextType type;
  288. };
  289. struct QueueGpuZoneBeginLean
  290. {
  291. int64_t cpuTime;
  292. uint64_t thread;
  293. uint16_t queryId;
  294. uint8_t context;
  295. };
  296. struct QueueGpuZoneBegin : public QueueGpuZoneBeginLean
  297. {
  298. uint64_t srcloc;
  299. };
  300. struct QueueGpuZoneEnd
  301. {
  302. int64_t cpuTime;
  303. uint64_t thread;
  304. uint16_t queryId;
  305. uint8_t context;
  306. };
  307. struct QueueGpuTime
  308. {
  309. int64_t gpuTime;
  310. uint16_t queryId;
  311. uint8_t context;
  312. };
  313. struct QueueGpuCalibration
  314. {
  315. int64_t gpuTime;
  316. int64_t cpuTime;
  317. int64_t cpuDelta;
  318. uint8_t context;
  319. };
  320. struct QueueGpuContextName
  321. {
  322. uint8_t context;
  323. };
  324. struct QueueGpuContextNameFat : public QueueGpuContextName
  325. {
  326. uint64_t ptr;
  327. uint16_t size;
  328. };
  329. struct QueueMemNamePayload
  330. {
  331. uint64_t name;
  332. };
  333. struct QueueMemAlloc
  334. {
  335. int64_t time;
  336. uint64_t thread;
  337. uint64_t ptr;
  338. char size[6];
  339. };
  340. struct QueueMemFree
  341. {
  342. int64_t time;
  343. uint64_t thread;
  344. uint64_t ptr;
  345. };
  346. struct QueueCallstackFat
  347. {
  348. uint64_t ptr;
  349. };
  350. struct QueueCallstackAllocFat
  351. {
  352. uint64_t ptr;
  353. uint64_t nativePtr;
  354. };
  355. struct QueueCallstackSample
  356. {
  357. int64_t time;
  358. uint64_t thread;
  359. };
  360. struct QueueCallstackSampleFat : public QueueCallstackSample
  361. {
  362. uint64_t ptr;
  363. };
  364. struct QueueCallstackFrameSize
  365. {
  366. uint64_t ptr;
  367. uint8_t size;
  368. };
  369. struct QueueCallstackFrame
  370. {
  371. uint32_t line;
  372. uint64_t symAddr;
  373. uint32_t symLen;
  374. };
  375. struct QueueSymbolInformation
  376. {
  377. uint32_t line;
  378. uint64_t symAddr;
  379. };
  380. struct QueueCodeInformation
  381. {
  382. uint64_t ptr;
  383. uint32_t line;
  384. };
  385. struct QueueCrashReport
  386. {
  387. int64_t time;
  388. uint64_t text; // ptr
  389. };
  390. struct QueueSysTime
  391. {
  392. int64_t time;
  393. float sysTime;
  394. };
  395. struct QueueContextSwitch
  396. {
  397. int64_t time;
  398. uint64_t oldThread;
  399. uint64_t newThread;
  400. uint8_t cpu;
  401. uint8_t reason;
  402. uint8_t state;
  403. };
  404. struct QueueThreadWakeup
  405. {
  406. int64_t time;
  407. uint64_t thread;
  408. };
  409. struct QueueTidToPid
  410. {
  411. uint64_t tid;
  412. uint64_t pid;
  413. };
  414. enum class PlotFormatType : uint8_t
  415. {
  416. Number,
  417. Memory,
  418. Percentage
  419. };
  420. struct QueuePlotConfig
  421. {
  422. uint64_t name; // ptr
  423. uint8_t type;
  424. };
  425. struct QueueParamSetup
  426. {
  427. uint32_t idx;
  428. uint64_t name; // ptr
  429. uint8_t isBool;
  430. int32_t val;
  431. };
  432. struct QueueCpuTopology
  433. {
  434. uint32_t package;
  435. uint32_t core;
  436. uint32_t thread;
  437. };
  438. struct QueueHeader
  439. {
  440. union
  441. {
  442. QueueType type;
  443. uint8_t idx;
  444. };
  445. };
  446. struct QueueItem
  447. {
  448. QueueHeader hdr;
  449. union
  450. {
  451. QueueThreadContext threadCtx;
  452. QueueZoneBegin zoneBegin;
  453. QueueZoneBeginLean zoneBeginLean;
  454. QueueZoneEnd zoneEnd;
  455. QueueZoneValidation zoneValidation;
  456. QueueZoneColor zoneColor;
  457. QueueZoneValue zoneValue;
  458. QueueStringTransfer stringTransfer;
  459. QueueFrameMark frameMark;
  460. QueueFrameImage frameImage;
  461. QueueFrameImageFat frameImageFat;
  462. QueueSourceLocation srcloc;
  463. QueueZoneTextFat zoneTextFat;
  464. QueueLockAnnounce lockAnnounce;
  465. QueueLockTerminate lockTerminate;
  466. QueueLockWait lockWait;
  467. QueueLockObtain lockObtain;
  468. QueueLockRelease lockRelease;
  469. QueueLockMark lockMark;
  470. QueueLockName lockName;
  471. QueueLockNameFat lockNameFat;
  472. QueuePlotData plotData;
  473. QueueMessage message;
  474. QueueMessageColor messageColor;
  475. QueueMessageLiteral messageLiteral;
  476. QueueMessageColorLiteral messageColorLiteral;
  477. QueueMessageFat messageFat;
  478. QueueMessageColorFat messageColorFat;
  479. QueueGpuNewContext gpuNewContext;
  480. QueueGpuZoneBegin gpuZoneBegin;
  481. QueueGpuZoneBeginLean gpuZoneBeginLean;
  482. QueueGpuZoneEnd gpuZoneEnd;
  483. QueueGpuTime gpuTime;
  484. QueueGpuCalibration gpuCalibration;
  485. QueueGpuContextName gpuContextName;
  486. QueueGpuContextNameFat gpuContextNameFat;
  487. QueueMemAlloc memAlloc;
  488. QueueMemFree memFree;
  489. QueueMemNamePayload memName;
  490. QueueCallstackFat callstackFat;
  491. QueueCallstackAllocFat callstackAllocFat;
  492. QueueCallstackSample callstackSample;
  493. QueueCallstackSampleFat callstackSampleFat;
  494. QueueCallstackFrameSize callstackFrameSize;
  495. QueueCallstackFrame callstackFrame;
  496. QueueSymbolInformation symbolInformation;
  497. QueueCodeInformation codeInformation;
  498. QueueCrashReport crashReport;
  499. QueueSysTime sysTime;
  500. QueueContextSwitch contextSwitch;
  501. QueueThreadWakeup threadWakeup;
  502. QueueTidToPid tidToPid;
  503. QueuePlotConfig plotConfig;
  504. QueueParamSetup paramSetup;
  505. QueueCpuTopology cpuTopology;
  506. };
  507. };
  508. #pragma pack()
  509. enum { QueueItemSize = sizeof( QueueItem ) };
  510. static constexpr size_t QueueDataSize[] = {
  511. sizeof( QueueHeader ), // zone text
  512. sizeof( QueueHeader ), // zone name
  513. sizeof( QueueHeader ) + sizeof( QueueMessage ),
  514. sizeof( QueueHeader ) + sizeof( QueueMessageColor ),
  515. sizeof( QueueHeader ) + sizeof( QueueMessage ), // callstack
  516. sizeof( QueueHeader ) + sizeof( QueueMessageColor ), // callstack
  517. sizeof( QueueHeader ) + sizeof( QueueMessage ), // app info
  518. sizeof( QueueHeader ) + sizeof( QueueZoneBeginLean ), // allocated source location
  519. sizeof( QueueHeader ) + sizeof( QueueZoneBeginLean ), // allocated source location, callstack
  520. sizeof( QueueHeader ), // callstack memory
  521. sizeof( QueueHeader ), // callstack
  522. sizeof( QueueHeader ), // callstack alloc
  523. sizeof( QueueHeader ) + sizeof( QueueCallstackSample ),
  524. sizeof( QueueHeader ) + sizeof( QueueFrameImage ),
  525. sizeof( QueueHeader ) + sizeof( QueueZoneBegin ),
  526. sizeof( QueueHeader ) + sizeof( QueueZoneBegin ), // callstack
  527. sizeof( QueueHeader ) + sizeof( QueueZoneEnd ),
  528. sizeof( QueueHeader ) + sizeof( QueueLockWait ),
  529. sizeof( QueueHeader ) + sizeof( QueueLockObtain ),
  530. sizeof( QueueHeader ) + sizeof( QueueLockRelease ),
  531. sizeof( QueueHeader ) + sizeof( QueueLockWait ), // shared
  532. sizeof( QueueHeader ) + sizeof( QueueLockObtain ), // shared
  533. sizeof( QueueHeader ) + sizeof( QueueLockRelease ), // shared
  534. sizeof( QueueHeader ) + sizeof( QueueLockName ),
  535. sizeof( QueueHeader ) + sizeof( QueueMemAlloc ),
  536. sizeof( QueueHeader ) + sizeof( QueueMemAlloc ), // named
  537. sizeof( QueueHeader ) + sizeof( QueueMemFree ),
  538. sizeof( QueueHeader ) + sizeof( QueueMemFree ), // named
  539. sizeof( QueueHeader ) + sizeof( QueueMemAlloc ), // callstack
  540. sizeof( QueueHeader ) + sizeof( QueueMemAlloc ), // callstack, named
  541. sizeof( QueueHeader ) + sizeof( QueueMemFree ), // callstack
  542. sizeof( QueueHeader ) + sizeof( QueueMemFree ), // callstack, named
  543. sizeof( QueueHeader ) + sizeof( QueueGpuZoneBegin ),
  544. sizeof( QueueHeader ) + sizeof( QueueGpuZoneBegin ), // callstack
  545. sizeof( QueueHeader ) + sizeof( QueueGpuZoneBeginLean ),// allocated source location
  546. sizeof( QueueHeader ) + sizeof( QueueGpuZoneBeginLean ),// allocated source location, callstack
  547. sizeof( QueueHeader ) + sizeof( QueueGpuZoneEnd ),
  548. sizeof( QueueHeader ) + sizeof( QueueGpuZoneBegin ), // serial
  549. sizeof( QueueHeader ) + sizeof( QueueGpuZoneBegin ), // serial, callstack
  550. sizeof( QueueHeader ) + sizeof( QueueGpuZoneBeginLean ),// serial, allocated source location
  551. sizeof( QueueHeader ) + sizeof( QueueGpuZoneBeginLean ),// serial, allocated source location, callstack
  552. sizeof( QueueHeader ) + sizeof( QueueGpuZoneEnd ), // serial
  553. sizeof( QueueHeader ) + sizeof( QueuePlotData ),
  554. sizeof( QueueHeader ) + sizeof( QueueContextSwitch ),
  555. sizeof( QueueHeader ) + sizeof( QueueThreadWakeup ),
  556. sizeof( QueueHeader ) + sizeof( QueueGpuTime ),
  557. sizeof( QueueHeader ) + sizeof( QueueGpuContextName ),
  558. // above items must be first
  559. sizeof( QueueHeader ), // terminate
  560. sizeof( QueueHeader ), // keep alive
  561. sizeof( QueueHeader ) + sizeof( QueueThreadContext ),
  562. sizeof( QueueHeader ) + sizeof( QueueGpuCalibration ),
  563. sizeof( QueueHeader ), // crash
  564. sizeof( QueueHeader ) + sizeof( QueueCrashReport ),
  565. sizeof( QueueHeader ) + sizeof( QueueZoneValidation ),
  566. sizeof( QueueHeader ) + sizeof( QueueZoneColor ),
  567. sizeof( QueueHeader ) + sizeof( QueueZoneValue ),
  568. sizeof( QueueHeader ) + sizeof( QueueFrameMark ), // continuous frames
  569. sizeof( QueueHeader ) + sizeof( QueueFrameMark ), // start
  570. sizeof( QueueHeader ) + sizeof( QueueFrameMark ), // end
  571. sizeof( QueueHeader ) + sizeof( QueueSourceLocation ),
  572. sizeof( QueueHeader ) + sizeof( QueueLockAnnounce ),
  573. sizeof( QueueHeader ) + sizeof( QueueLockTerminate ),
  574. sizeof( QueueHeader ) + sizeof( QueueLockMark ),
  575. sizeof( QueueHeader ) + sizeof( QueueMessageLiteral ),
  576. sizeof( QueueHeader ) + sizeof( QueueMessageColorLiteral ),
  577. sizeof( QueueHeader ) + sizeof( QueueMessageLiteral ), // callstack
  578. sizeof( QueueHeader ) + sizeof( QueueMessageColorLiteral ), // callstack
  579. sizeof( QueueHeader ) + sizeof( QueueGpuNewContext ),
  580. sizeof( QueueHeader ) + sizeof( QueueCallstackFrameSize ),
  581. sizeof( QueueHeader ) + sizeof( QueueCallstackFrame ),
  582. sizeof( QueueHeader ) + sizeof( QueueSymbolInformation ),
  583. sizeof( QueueHeader ) + sizeof( QueueCodeInformation ),
  584. sizeof( QueueHeader ) + sizeof( QueueSysTime ),
  585. sizeof( QueueHeader ) + sizeof( QueueTidToPid ),
  586. sizeof( QueueHeader ) + sizeof( QueuePlotConfig ),
  587. sizeof( QueueHeader ) + sizeof( QueueParamSetup ),
  588. sizeof( QueueHeader ), // server query acknowledgement
  589. sizeof( QueueHeader ), // source code not available
  590. sizeof( QueueHeader ) + sizeof( QueueCpuTopology ),
  591. sizeof( QueueHeader ), // single string data
  592. sizeof( QueueHeader ), // second string data
  593. sizeof( QueueHeader ) + sizeof( QueueMemNamePayload ),
  594. // keep all QueueStringTransfer below
  595. sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // string data
  596. sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // thread name
  597. sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // plot name
  598. sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // allocated source location payload
  599. sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // callstack payload
  600. sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // callstack alloc payload
  601. sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // frame name
  602. sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // frame image data
  603. sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // external name
  604. sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // external thread name
  605. sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // symbol code
  606. sizeof( QueueHeader ) + sizeof( QueueStringTransfer ), // source code
  607. };
  608. static_assert( QueueItemSize == 32, "Queue item size not 32 bytes" );
  609. static_assert( sizeof( QueueDataSize ) / sizeof( size_t ) == (uint8_t)QueueType::NUM_TYPES, "QueueDataSize mismatch" );
  610. static_assert( sizeof( void* ) <= sizeof( uint64_t ), "Pointer size > 8 bytes" );
  611. static_assert( sizeof( void* ) == sizeof( uintptr_t ), "Pointer size != uintptr_t" );
  612. }
  613. #endif