The open source OpenXR runtime
1#ifndef __TRACYPROTOCOL_HPP__
2#define __TRACYPROTOCOL_HPP__
3
4#include <limits>
5#include <stdint.h>
6
7namespace tracy
8{
9
10constexpr unsigned Lz4CompressBound( unsigned isize ) { return isize + ( isize / 255 ) + 16; }
11
12enum : uint32_t { ProtocolVersion = 63 };
13enum : uint16_t { BroadcastVersion = 3 };
14
15using lz4sz_t = uint32_t;
16
17enum { TargetFrameSize = 256 * 1024 };
18enum { LZ4Size = Lz4CompressBound( TargetFrameSize ) };
19static_assert( LZ4Size <= std::numeric_limits<lz4sz_t>::max(), "LZ4Size greater than lz4sz_t" );
20static_assert( TargetFrameSize * 2 >= 64 * 1024, "Not enough space for LZ4 stream buffer" );
21
22enum { HandshakeShibbolethSize = 8 };
23static const char HandshakeShibboleth[HandshakeShibbolethSize] = { 'T', 'r', 'a', 'c', 'y', 'P', 'r', 'f' };
24
25enum HandshakeStatus : uint8_t
26{
27 HandshakePending,
28 HandshakeWelcome,
29 HandshakeProtocolMismatch,
30 HandshakeNotAvailable,
31 HandshakeDropped
32};
33
34enum { WelcomeMessageProgramNameSize = 64 };
35enum { WelcomeMessageHostInfoSize = 1024 };
36
37#pragma pack( push, 1 )
38
39// Must increase left query space after handling!
40enum ServerQuery : uint8_t
41{
42 ServerQueryTerminate,
43 ServerQueryString,
44 ServerQueryThreadString,
45 ServerQuerySourceLocation,
46 ServerQueryPlotName,
47 ServerQueryFrameName,
48 ServerQueryParameter,
49 ServerQueryFiberName,
50 // Items above are high priority. Split order must be preserved. See IsQueryPrio().
51 ServerQueryDisconnect,
52 ServerQueryCallstackFrame,
53 ServerQueryExternalName,
54 ServerQuerySymbol,
55 ServerQuerySymbolCode,
56 ServerQuerySourceCode,
57 ServerQueryDataTransfer,
58 ServerQueryDataTransferPart
59};
60
61struct ServerQueryPacket
62{
63 ServerQuery type;
64 uint64_t ptr;
65 uint32_t extra;
66};
67
68enum { ServerQueryPacketSize = sizeof( ServerQueryPacket ) };
69
70
71enum CpuArchitecture : uint8_t
72{
73 CpuArchUnknown,
74 CpuArchX86,
75 CpuArchX64,
76 CpuArchArm32,
77 CpuArchArm64
78};
79
80
81struct WelcomeFlag
82{
83 enum _t : uint8_t
84 {
85 OnDemand = 1 << 0,
86 IsApple = 1 << 1,
87 CodeTransfer = 1 << 2,
88 CombineSamples = 1 << 3,
89 IdentifySamples = 1 << 4,
90 };
91};
92
93struct WelcomeMessage
94{
95 double timerMul;
96 int64_t initBegin;
97 int64_t initEnd;
98 uint64_t delay;
99 uint64_t resolution;
100 uint64_t epoch;
101 uint64_t exectime;
102 uint64_t pid;
103 int64_t samplingPeriod;
104 uint8_t flags;
105 uint8_t cpuArch;
106 char cpuManufacturer[12];
107 uint32_t cpuId;
108 char programName[WelcomeMessageProgramNameSize];
109 char hostInfo[WelcomeMessageHostInfoSize];
110};
111
112enum { WelcomeMessageSize = sizeof( WelcomeMessage ) };
113
114
115struct OnDemandPayloadMessage
116{
117 uint64_t frames;
118 uint64_t currentTime;
119};
120
121enum { OnDemandPayloadMessageSize = sizeof( OnDemandPayloadMessage ) };
122
123
124struct BroadcastMessage
125{
126 uint16_t broadcastVersion;
127 uint16_t listenPort;
128 uint32_t protocolVersion;
129 uint64_t pid;
130 int32_t activeTime; // in seconds
131 char programName[WelcomeMessageProgramNameSize];
132};
133
134struct BroadcastMessage_v2
135{
136 uint16_t broadcastVersion;
137 uint16_t listenPort;
138 uint32_t protocolVersion;
139 int32_t activeTime;
140 char programName[WelcomeMessageProgramNameSize];
141};
142
143struct BroadcastMessage_v1
144{
145 uint32_t broadcastVersion;
146 uint32_t protocolVersion;
147 uint32_t listenPort;
148 uint32_t activeTime;
149 char programName[WelcomeMessageProgramNameSize];
150};
151
152struct BroadcastMessage_v0
153{
154 uint32_t broadcastVersion;
155 uint32_t protocolVersion;
156 uint32_t activeTime;
157 char programName[WelcomeMessageProgramNameSize];
158};
159
160enum { BroadcastMessageSize = sizeof( BroadcastMessage ) };
161enum { BroadcastMessageSize_v2 = sizeof( BroadcastMessage_v2 ) };
162enum { BroadcastMessageSize_v1 = sizeof( BroadcastMessage_v1 ) };
163enum { BroadcastMessageSize_v0 = sizeof( BroadcastMessage_v0 ) };
164
165#pragma pack( pop )
166
167}
168
169#endif