Send callstacks before sending events they belong to.

This commit is contained in:
Bartosz Taudul 2020-09-29 16:39:56 +02:00
parent 8eb51aa01d
commit bd31e3d2d6
9 changed files with 47 additions and 49 deletions

View File

@ -311,6 +311,10 @@ namespace tracy
m_queryId = ctx->NextQueryId(); m_queryId = ctx->NextQueryId();
cmdList->EndQuery(ctx->m_queryHeap.Get(), D3D12_QUERY_TYPE_TIMESTAMP, m_queryId); cmdList->EndQuery(ctx->m_queryHeap.Get(), D3D12_QUERY_TYPE_TIMESTAMP, m_queryId);
#if defined(TRACY_HAS_CALLSTACK) && defined(TRACY_CALLSTACK)
GetProfiler().SendCallstack(TRACY_CALLSTACK);
#endif
auto* item = Profiler::QueueSerial(); auto* item = Profiler::QueueSerial();
#if defined(TRACY_HAS_CALLSTACK) && defined(TRACY_CALLSTACK) #if defined(TRACY_HAS_CALLSTACK) && defined(TRACY_CALLSTACK)
MemWrite(&item->hdr.type, QueueType::GpuZoneBeginCallstackSerial); MemWrite(&item->hdr.type, QueueType::GpuZoneBeginCallstackSerial);
@ -324,10 +328,6 @@ namespace tracy
MemWrite(&item->gpuZoneBegin.context, ctx->GetId()); MemWrite(&item->gpuZoneBegin.context, ctx->GetId());
Profiler::QueueSerialFinish(); Profiler::QueueSerialFinish();
#if defined(TRACY_HAS_CALLSTACK) && defined(TRACY_CALLSTACK)
GetProfiler().SendCallstack(TRACY_CALLSTACK);
#endif
} }
tracy_force_inline ~D3D12ZoneScope() tracy_force_inline ~D3D12ZoneScope()

View File

@ -197,6 +197,13 @@ static inline int LuaZoneBeginS( lua_State* L )
if( !GetLuaZoneState().active ) return 0; if( !GetLuaZoneState().active ) return 0;
#endif #endif
#ifdef TRACY_CALLSTACK
const uint32_t depth = TRACY_CALLSTACK;
#else
const auto depth = uint32_t( lua_tointeger( L, 1 ) );
#endif
SendLuaCallstack( L, depth );
TracyLfqPrepare( QueueType::ZoneBeginAllocSrcLocCallstack ); TracyLfqPrepare( QueueType::ZoneBeginAllocSrcLocCallstack );
lua_Debug dbg; lua_Debug dbg;
lua_getstack( L, 1, &dbg ); lua_getstack( L, 1, &dbg );
@ -206,13 +213,6 @@ static inline int LuaZoneBeginS( lua_State* L )
MemWrite( &item->zoneBegin.srcloc, srcloc ); MemWrite( &item->zoneBegin.srcloc, srcloc );
TracyLfqCommit; TracyLfqCommit;
#ifdef TRACY_CALLSTACK
const uint32_t depth = TRACY_CALLSTACK;
#else
const auto depth = uint32_t( lua_tointeger( L, 1 ) );
#endif
SendLuaCallstack( L, depth );
return 0; return 0;
} }
@ -225,6 +225,13 @@ static inline int LuaZoneBeginNS( lua_State* L )
if( !GetLuaZoneState().active ) return 0; if( !GetLuaZoneState().active ) return 0;
#endif #endif
#ifdef TRACY_CALLSTACK
const uint32_t depth = TRACY_CALLSTACK;
#else
const auto depth = uint32_t( lua_tointeger( L, 2 ) );
#endif
SendLuaCallstack( L, depth );
TracyLfqPrepare( QueueType::ZoneBeginAllocSrcLocCallstack ); TracyLfqPrepare( QueueType::ZoneBeginAllocSrcLocCallstack );
lua_Debug dbg; lua_Debug dbg;
lua_getstack( L, 1, &dbg ); lua_getstack( L, 1, &dbg );
@ -236,13 +243,6 @@ static inline int LuaZoneBeginNS( lua_State* L )
MemWrite( &item->zoneBegin.srcloc, srcloc ); MemWrite( &item->zoneBegin.srcloc, srcloc );
TracyLfqCommit; TracyLfqCommit;
#ifdef TRACY_CALLSTACK
const uint32_t depth = TRACY_CALLSTACK;
#else
const auto depth = uint32_t( lua_tointeger( L, 2 ) );
#endif
SendLuaCallstack( L, depth );
return 0; return 0;
} }
#endif #endif

View File

@ -246,6 +246,8 @@ namespace tracy {
m_beginQueryId = ctx->NextQueryId(EventInfo{ nullptr, EventPhase::Begin }); m_beginQueryId = ctx->NextQueryId(EventInfo{ nullptr, EventPhase::Begin });
GetProfiler().SendCallstack(depth);
auto item = Profiler::QueueSerial(); auto item = Profiler::QueueSerial();
MemWrite(&item->hdr.type, QueueType::GpuZoneBeginCallstackSerial); MemWrite(&item->hdr.type, QueueType::GpuZoneBeginCallstackSerial);
MemWrite(&item->gpuZoneBegin.cpuTime, Profiler::GetTime()); MemWrite(&item->gpuZoneBegin.cpuTime, Profiler::GetTime());
@ -254,8 +256,6 @@ namespace tracy {
MemWrite(&item->gpuZoneBegin.queryId, (uint16_t)m_beginQueryId); MemWrite(&item->gpuZoneBegin.queryId, (uint16_t)m_beginQueryId);
MemWrite(&item->gpuZoneBegin.context, ctx->GetId()); MemWrite(&item->gpuZoneBegin.context, ctx->GetId());
Profiler::QueueSerialFinish(); Profiler::QueueSerialFinish();
GetProfiler().SendCallstack(depth);
} }
tracy_force_inline void SetEvent(cl_event event) tracy_force_inline void SetEvent(cl_event event)

View File

@ -215,6 +215,8 @@ public:
const auto queryId = GetGpuCtx().ptr->NextQueryId(); const auto queryId = GetGpuCtx().ptr->NextQueryId();
glQueryCounter( GetGpuCtx().ptr->TranslateOpenGlQueryId( queryId ), GL_TIMESTAMP ); glQueryCounter( GetGpuCtx().ptr->TranslateOpenGlQueryId( queryId ), GL_TIMESTAMP );
GetProfiler().SendCallstack( depth );
const auto thread = GetThreadHandle(); const auto thread = GetThreadHandle();
TracyLfqPrepare( QueueType::GpuZoneBeginCallstack ); TracyLfqPrepare( QueueType::GpuZoneBeginCallstack );
MemWrite( &item->gpuZoneBegin.cpuTime, Profiler::GetTime() ); MemWrite( &item->gpuZoneBegin.cpuTime, Profiler::GetTime() );
@ -223,8 +225,6 @@ public:
MemWrite( &item->gpuZoneBegin.queryId, uint16_t( queryId ) ); MemWrite( &item->gpuZoneBegin.queryId, uint16_t( queryId ) );
MemWrite( &item->gpuZoneBegin.context, GetGpuCtx().ptr->GetId() ); MemWrite( &item->gpuZoneBegin.context, GetGpuCtx().ptr->GetId() );
TracyLfqCommit; TracyLfqCommit;
GetProfiler().SendCallstack( depth );
} }
tracy_force_inline ~GpuCtxScope() tracy_force_inline ~GpuCtxScope()

View File

@ -342,6 +342,8 @@ public:
const auto queryId = ctx->NextQueryId(); const auto queryId = ctx->NextQueryId();
vkCmdWriteTimestamp( cmdbuf, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, ctx->m_query, queryId ); vkCmdWriteTimestamp( cmdbuf, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, ctx->m_query, queryId );
GetProfiler().SendCallstack( depth );
auto item = Profiler::QueueSerial(); auto item = Profiler::QueueSerial();
MemWrite( &item->hdr.type, QueueType::GpuZoneBeginCallstackSerial ); MemWrite( &item->hdr.type, QueueType::GpuZoneBeginCallstackSerial );
MemWrite( &item->gpuZoneBegin.cpuTime, Profiler::GetTime() ); MemWrite( &item->gpuZoneBegin.cpuTime, Profiler::GetTime() );
@ -350,8 +352,6 @@ public:
MemWrite( &item->gpuZoneBegin.queryId, uint16_t( queryId ) ); MemWrite( &item->gpuZoneBegin.queryId, uint16_t( queryId ) );
MemWrite( &item->gpuZoneBegin.context, ctx->GetId() ); MemWrite( &item->gpuZoneBegin.context, ctx->GetId() );
Profiler::QueueSerialFinish(); Profiler::QueueSerialFinish();
GetProfiler().SendCallstack( depth );
} }
tracy_force_inline ~VkCtxScope() tracy_force_inline ~VkCtxScope()

View File

@ -594,12 +594,12 @@ LONG WINAPI CrashFilter( PEXCEPTION_POINTERS pExp )
} }
{ {
GetProfiler().SendCallstack( 60, "KiUserExceptionDispatcher" );
TracyLfqPrepare( QueueType::CrashReport ); TracyLfqPrepare( QueueType::CrashReport );
item->crashReport.time = Profiler::GetTime(); item->crashReport.time = Profiler::GetTime();
item->crashReport.text = (uint64_t)s_crashText; item->crashReport.text = (uint64_t)s_crashText;
TracyLfqCommit; TracyLfqCommit;
GetProfiler().SendCallstack( 60, "KiUserExceptionDispatcher" );
} }
HANDLE h = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 ); HANDLE h = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 );
@ -826,12 +826,12 @@ static void CrashHandler( int signal, siginfo_t* info, void* /*ucontext*/ )
} }
{ {
GetProfiler().SendCallstack( 60, "__kernel_rt_sigreturn" );
TracyLfqPrepare( QueueType::CrashReport ); TracyLfqPrepare( QueueType::CrashReport );
item->crashReport.time = Profiler::GetTime(); item->crashReport.time = Profiler::GetTime();
item->crashReport.text = (uint64_t)s_crashText; item->crashReport.text = (uint64_t)s_crashText;
TracyLfqCommit; TracyLfqCommit;
GetProfiler().SendCallstack( 60, "__kernel_rt_sigreturn" );
} }
DIR* dp = opendir( "/proc/self/task" ); DIR* dp = opendir( "/proc/self/task" );
@ -2992,14 +2992,13 @@ TRACY_API TracyCZoneCtx ___tracy_emit_zone_begin_callstack( const struct ___trac
TracyLfqCommitC; TracyLfqCommitC;
} }
#endif #endif
tracy::GetProfiler().SendCallstack( depth );
{ {
TracyLfqPrepareC( tracy::QueueType::ZoneBeginCallstack ); TracyLfqPrepareC( tracy::QueueType::ZoneBeginCallstack );
tracy::MemWrite( &item->zoneBegin.time, tracy::Profiler::GetTime() ); tracy::MemWrite( &item->zoneBegin.time, tracy::Profiler::GetTime() );
tracy::MemWrite( &item->zoneBegin.srcloc, (uint64_t)srcloc ); tracy::MemWrite( &item->zoneBegin.srcloc, (uint64_t)srcloc );
TracyLfqCommitC; TracyLfqCommitC;
} }
tracy::GetProfiler().SendCallstack( depth );
return ctx; return ctx;
} }
@ -3058,14 +3057,13 @@ TRACY_API TracyCZoneCtx ___tracy_emit_zone_begin_alloc_callstack( uint64_t srclo
TracyLfqCommitC; TracyLfqCommitC;
} }
#endif #endif
tracy::GetProfiler().SendCallstack( depth );
{ {
TracyLfqPrepareC( tracy::QueueType::ZoneBeginAllocSrcLocCallstack ); TracyLfqPrepareC( tracy::QueueType::ZoneBeginAllocSrcLocCallstack );
tracy::MemWrite( &item->zoneBegin.time, tracy::Profiler::GetTime() ); tracy::MemWrite( &item->zoneBegin.time, tracy::Profiler::GetTime() );
tracy::MemWrite( &item->zoneBegin.srcloc, srcloc ); tracy::MemWrite( &item->zoneBegin.srcloc, srcloc );
TracyLfqCommitC; TracyLfqCommitC;
} }
tracy::GetProfiler().SendCallstack( depth );
return ctx; return ctx;
} }

View File

@ -283,6 +283,8 @@ public:
#ifdef TRACY_ON_DEMAND #ifdef TRACY_ON_DEMAND
if( !GetProfiler().IsConnected() ) return; if( !GetProfiler().IsConnected() ) return;
#endif #endif
if( callstack != 0 ) tracy::GetProfiler().SendCallstack( callstack );
TracyLfqPrepare( callstack == 0 ? QueueType::Message : QueueType::MessageCallstack ); TracyLfqPrepare( callstack == 0 ? QueueType::Message : QueueType::MessageCallstack );
auto ptr = (char*)tracy_malloc( size ); auto ptr = (char*)tracy_malloc( size );
memcpy( ptr, txt, size ); memcpy( ptr, txt, size );
@ -290,8 +292,6 @@ public:
MemWrite( &item->messageFat.text, (uint64_t)ptr ); MemWrite( &item->messageFat.text, (uint64_t)ptr );
MemWrite( &item->messageFat.size, (uint16_t)size ); MemWrite( &item->messageFat.size, (uint16_t)size );
TracyLfqCommit; TracyLfqCommit;
if( callstack != 0 ) tracy::GetProfiler().SendCallstack( callstack );
} }
static tracy_force_inline void Message( const char* txt, int callstack ) static tracy_force_inline void Message( const char* txt, int callstack )
@ -299,12 +299,12 @@ public:
#ifdef TRACY_ON_DEMAND #ifdef TRACY_ON_DEMAND
if( !GetProfiler().IsConnected() ) return; if( !GetProfiler().IsConnected() ) return;
#endif #endif
if( callstack != 0 ) tracy::GetProfiler().SendCallstack( callstack );
TracyLfqPrepare( callstack == 0 ? QueueType::MessageLiteral : QueueType::MessageLiteralCallstack ); TracyLfqPrepare( callstack == 0 ? QueueType::MessageLiteral : QueueType::MessageLiteralCallstack );
MemWrite( &item->messageLiteral.time, GetTime() ); MemWrite( &item->messageLiteral.time, GetTime() );
MemWrite( &item->messageLiteral.text, (uint64_t)txt ); MemWrite( &item->messageLiteral.text, (uint64_t)txt );
TracyLfqCommit; TracyLfqCommit;
if( callstack != 0 ) tracy::GetProfiler().SendCallstack( callstack );
} }
static tracy_force_inline void MessageColor( const char* txt, size_t size, uint32_t color, int callstack ) static tracy_force_inline void MessageColor( const char* txt, size_t size, uint32_t color, int callstack )
@ -313,6 +313,8 @@ public:
#ifdef TRACY_ON_DEMAND #ifdef TRACY_ON_DEMAND
if( !GetProfiler().IsConnected() ) return; if( !GetProfiler().IsConnected() ) return;
#endif #endif
if( callstack != 0 ) tracy::GetProfiler().SendCallstack( callstack );
TracyLfqPrepare( callstack == 0 ? QueueType::MessageColor : QueueType::MessageColorCallstack ); TracyLfqPrepare( callstack == 0 ? QueueType::MessageColor : QueueType::MessageColorCallstack );
auto ptr = (char*)tracy_malloc( size ); auto ptr = (char*)tracy_malloc( size );
memcpy( ptr, txt, size ); memcpy( ptr, txt, size );
@ -323,8 +325,6 @@ public:
MemWrite( &item->messageColorFat.b, uint8_t( ( color >> 16 ) & 0xFF ) ); MemWrite( &item->messageColorFat.b, uint8_t( ( color >> 16 ) & 0xFF ) );
MemWrite( &item->messageColorFat.size, (uint16_t)size ); MemWrite( &item->messageColorFat.size, (uint16_t)size );
TracyLfqCommit; TracyLfqCommit;
if( callstack != 0 ) tracy::GetProfiler().SendCallstack( callstack );
} }
static tracy_force_inline void MessageColor( const char* txt, uint32_t color, int callstack ) static tracy_force_inline void MessageColor( const char* txt, uint32_t color, int callstack )
@ -332,6 +332,8 @@ public:
#ifdef TRACY_ON_DEMAND #ifdef TRACY_ON_DEMAND
if( !GetProfiler().IsConnected() ) return; if( !GetProfiler().IsConnected() ) return;
#endif #endif
if( callstack != 0 ) tracy::GetProfiler().SendCallstack( callstack );
TracyLfqPrepare( callstack == 0 ? QueueType::MessageLiteralColor : QueueType::MessageLiteralColorCallstack ); TracyLfqPrepare( callstack == 0 ? QueueType::MessageLiteralColor : QueueType::MessageLiteralColorCallstack );
MemWrite( &item->messageColorLiteral.time, GetTime() ); MemWrite( &item->messageColorLiteral.time, GetTime() );
MemWrite( &item->messageColorLiteral.text, (uint64_t)txt ); MemWrite( &item->messageColorLiteral.text, (uint64_t)txt );
@ -339,8 +341,6 @@ public:
MemWrite( &item->messageColorLiteral.g, uint8_t( ( color >> 8 ) & 0xFF ) ); MemWrite( &item->messageColorLiteral.g, uint8_t( ( color >> 8 ) & 0xFF ) );
MemWrite( &item->messageColorLiteral.b, uint8_t( ( color >> 16 ) & 0xFF ) ); MemWrite( &item->messageColorLiteral.b, uint8_t( ( color >> 16 ) & 0xFF ) );
TracyLfqCommit; TracyLfqCommit;
if( callstack != 0 ) tracy::GetProfiler().SendCallstack( callstack );
} }
static tracy_force_inline void MessageAppInfo( const char* txt, size_t size ) static tracy_force_inline void MessageAppInfo( const char* txt, size_t size )
@ -401,8 +401,8 @@ public:
auto callstack = Callstack( depth ); auto callstack = Callstack( depth );
profiler.m_serialLock.lock(); profiler.m_serialLock.lock();
SendMemAlloc( QueueType::MemAllocCallstack, thread, ptr, size );
SendCallstackMemory( callstack ); SendCallstackMemory( callstack );
SendMemAlloc( QueueType::MemAllocCallstack, thread, ptr, size );
profiler.m_serialLock.unlock(); profiler.m_serialLock.unlock();
#else #else
MemAlloc( ptr, size, secure ); MemAlloc( ptr, size, secure );
@ -423,8 +423,8 @@ public:
auto callstack = Callstack( depth ); auto callstack = Callstack( depth );
profiler.m_serialLock.lock(); profiler.m_serialLock.lock();
SendMemFree( QueueType::MemFreeCallstack, thread, ptr );
SendCallstackMemory( callstack ); SendCallstackMemory( callstack );
SendMemFree( QueueType::MemFreeCallstack, thread, ptr );
profiler.m_serialLock.unlock(); profiler.m_serialLock.unlock();
#else #else
MemFree( ptr, secure ); MemFree( ptr, secure );
@ -473,9 +473,9 @@ public:
auto callstack = Callstack( depth ); auto callstack = Callstack( depth );
profiler.m_serialLock.lock(); profiler.m_serialLock.lock();
SendCallstackMemory( callstack );
SendMemName( name ); SendMemName( name );
SendMemAlloc( QueueType::MemAllocCallstackNamed, thread, ptr, size ); SendMemAlloc( QueueType::MemAllocCallstackNamed, thread, ptr, size );
SendCallstackMemory( callstack );
profiler.m_serialLock.unlock(); profiler.m_serialLock.unlock();
#else #else
MemAlloc( ptr, size, secure ); MemAlloc( ptr, size, secure );
@ -496,9 +496,9 @@ public:
auto callstack = Callstack( depth ); auto callstack = Callstack( depth );
profiler.m_serialLock.lock(); profiler.m_serialLock.lock();
SendCallstackMemory( callstack );
SendMemName( name ); SendMemName( name );
SendMemFree( QueueType::MemFreeCallstackNamed, thread, ptr ); SendMemFree( QueueType::MemFreeCallstackNamed, thread, ptr );
SendCallstackMemory( callstack );
profiler.m_serialLock.unlock(); profiler.m_serialLock.unlock();
#else #else
MemFree( ptr, secure ); MemFree( ptr, secure );

View File

@ -49,12 +49,12 @@ public:
#ifdef TRACY_ON_DEMAND #ifdef TRACY_ON_DEMAND
m_connectionId = GetProfiler().ConnectionId(); m_connectionId = GetProfiler().ConnectionId();
#endif #endif
GetProfiler().SendCallstack( depth );
TracyLfqPrepare( QueueType::ZoneBeginCallstack ); TracyLfqPrepare( QueueType::ZoneBeginCallstack );
MemWrite( &item->zoneBegin.time, Profiler::GetTime() ); MemWrite( &item->zoneBegin.time, Profiler::GetTime() );
MemWrite( &item->zoneBegin.srcloc, (uint64_t)srcloc ); MemWrite( &item->zoneBegin.srcloc, (uint64_t)srcloc );
TracyLfqCommit; TracyLfqCommit;
GetProfiler().SendCallstack( depth );
} }
tracy_force_inline ScopedZone( uint32_t line, const char* source, size_t sourceSz, const char* function, size_t functionSz, const char* name, size_t nameSz, bool is_active = true ) tracy_force_inline ScopedZone( uint32_t line, const char* source, size_t sourceSz, const char* function, size_t functionSz, const char* name, size_t nameSz, bool is_active = true )
@ -86,13 +86,13 @@ public:
#ifdef TRACY_ON_DEMAND #ifdef TRACY_ON_DEMAND
m_connectionId = GetProfiler().ConnectionId(); m_connectionId = GetProfiler().ConnectionId();
#endif #endif
GetProfiler().SendCallstack( depth );
TracyLfqPrepare( QueueType::ZoneBeginAllocSrcLocCallstack ); TracyLfqPrepare( QueueType::ZoneBeginAllocSrcLocCallstack );
const auto srcloc = Profiler::AllocSourceLocation( line, source, sourceSz, function, functionSz, name, nameSz ); const auto srcloc = Profiler::AllocSourceLocation( line, source, sourceSz, function, functionSz, name, nameSz );
MemWrite( &item->zoneBegin.time, Profiler::GetTime() ); MemWrite( &item->zoneBegin.time, Profiler::GetTime() );
MemWrite( &item->zoneBegin.srcloc, srcloc ); MemWrite( &item->zoneBegin.srcloc, srcloc );
TracyLfqCommit; TracyLfqCommit;
GetProfiler().SendCallstack( depth );
} }
tracy_force_inline ~ScopedZone() tracy_force_inline ~ScopedZone()

View File

@ -9,7 +9,7 @@ namespace tracy
constexpr unsigned Lz4CompressBound( unsigned isize ) { return isize + ( isize / 255 ) + 16; } constexpr unsigned Lz4CompressBound( unsigned isize ) { return isize + ( isize / 255 ) + 16; }
enum : uint32_t { ProtocolVersion = 41 }; enum : uint32_t { ProtocolVersion = 42 };
enum : uint16_t { BroadcastVersion = 2 }; enum : uint16_t { BroadcastVersion = 2 };
using lz4sz_t = uint32_t; using lz4sz_t = uint32_t;