The open source OpenXR runtime
at main 169 lines 3.9 kB view raw
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