Implement callstack serialization.

This commit is contained in:
Bartosz Taudul 2021-10-10 16:14:17 +02:00
parent a421083e58
commit 5ccf369919
No known key found for this signature in database
GPG Key ID: B7FE2008B7575DF3
4 changed files with 42 additions and 6 deletions

View File

@ -182,10 +182,10 @@ static tracy_force_inline void SendLuaCallstack( lua_State* L, uint32_t depth )
} }
assert( dst - ptr == spaceNeeded + 2 ); assert( dst - ptr == spaceNeeded + 2 );
TracyLfqPrepare( QueueType::CallstackAlloc ); TracyQueuePrepare( QueueType::CallstackAlloc );
MemWrite( &item->callstackAllocFat.ptr, (uint64_t)ptr ); MemWrite( &item->callstackAllocFat.ptr, (uint64_t)ptr );
MemWrite( &item->callstackAllocFat.nativePtr, (uint64_t)Callstack( depth ) ); MemWrite( &item->callstackAllocFat.nativePtr, (uint64_t)Callstack( depth ) );
TracyLfqCommit; TracyQueueCommit( callstackAllocFatThread );
} }
static inline int LuaZoneBeginS( lua_State* L ) static inline int LuaZoneBeginS( lua_State* L )

View File

@ -2448,6 +2448,29 @@ Profiler::DequeueStatus Profiler::DequeueSerial()
tracy_free_fast( (void*)ptr ); tracy_free_fast( (void*)ptr );
break; break;
} }
case QueueType::Callstack:
{
ThreadCtxCheckSerial( callstackFatThread );
ptr = MemRead<uint64_t>( &item->callstackFat.ptr );
SendCallstackPayload( ptr );
tracy_free_fast( (void*)ptr );
break;
}
case QueueType::CallstackAlloc:
{
ThreadCtxCheckSerial( callstackAllocFatThread );
ptr = MemRead<uint64_t>( &item->callstackAllocFat.nativePtr );
if( ptr != 0 )
{
CutCallstack( (void*)ptr, "lua_pcall" );
SendCallstackPayload( ptr );
tracy_free_fast( (void*)ptr );
}
ptr = MemRead<uint64_t>( &item->callstackAllocFat.ptr );
SendCallstackAlloc( ptr );
tracy_free_fast( (void*)ptr );
break;
}
#endif #endif
default: default:
assert( false ); assert( false );
@ -3141,11 +3164,12 @@ void Profiler::ReportTopology()
void Profiler::SendCallstack( int depth, const char* skipBefore ) void Profiler::SendCallstack( int depth, const char* skipBefore )
{ {
#ifdef TRACY_HAS_CALLSTACK #ifdef TRACY_HAS_CALLSTACK
TracyLfqPrepare( QueueType::Callstack );
auto ptr = Callstack( depth ); auto ptr = Callstack( depth );
CutCallstack( ptr, skipBefore ); CutCallstack( ptr, skipBefore );
TracyQueuePrepare( QueueType::Callstack );
MemWrite( &item->callstackFat.ptr, (uint64_t)ptr ); MemWrite( &item->callstackFat.ptr, (uint64_t)ptr );
TracyLfqCommit; TracyQueueCommit( callstackFatThread );
#endif #endif
} }

View File

@ -548,9 +548,9 @@ public:
{ {
#ifdef TRACY_HAS_CALLSTACK #ifdef TRACY_HAS_CALLSTACK
auto ptr = Callstack( depth ); auto ptr = Callstack( depth );
TracyLfqPrepare( QueueType::Callstack ); TracyQueuePrepare( QueueType::Callstack );
MemWrite( &item->callstackFat.ptr, (uint64_t)ptr ); MemWrite( &item->callstackFat.ptr, (uint64_t)ptr );
TracyLfqCommit; TracyQueueCommit( callstackFatThread );
#endif #endif
} }

View File

@ -453,12 +453,22 @@ struct QueueCallstackFat
uint64_t ptr; uint64_t ptr;
}; };
struct QueueCallstackFatThread : public QueueCallstackFat
{
uint32_t thread;
};
struct QueueCallstackAllocFat struct QueueCallstackAllocFat
{ {
uint64_t ptr; uint64_t ptr;
uint64_t nativePtr; uint64_t nativePtr;
}; };
struct QueueCallstackAllocFatThread : public QueueCallstackAllocFat
{
uint32_t thread;
};
struct QueueCallstackSample struct QueueCallstackSample
{ {
int64_t time; int64_t time;
@ -633,7 +643,9 @@ struct QueueItem
QueueMemFree memFree; QueueMemFree memFree;
QueueMemNamePayload memName; QueueMemNamePayload memName;
QueueCallstackFat callstackFat; QueueCallstackFat callstackFat;
QueueCallstackFatThread callstackFatThread;
QueueCallstackAllocFat callstackAllocFat; QueueCallstackAllocFat callstackAllocFat;
QueueCallstackAllocFatThread callstackAllocFatThread;
QueueCallstackSample callstackSample; QueueCallstackSample callstackSample;
QueueCallstackSampleFat callstackSampleFat; QueueCallstackSampleFat callstackSampleFat;
QueueCallstackFrameSize callstackFrameSize; QueueCallstackFrameSize callstackFrameSize;