mirror of
https://github.com/wolfpld/tracy.git
synced 2024-11-22 22:44:34 +00:00
Support call stacks longer than 255 entries.
This commit is contained in:
parent
9b8eb69886
commit
48e4d33bea
@ -23,7 +23,7 @@ template<typename T>
|
||||
class VarArray
|
||||
{
|
||||
public:
|
||||
VarArray( uint8_t size, const T* data )
|
||||
VarArray( uint16_t size, const T* data )
|
||||
: m_size( size )
|
||||
, m_ptr( data )
|
||||
{
|
||||
@ -39,7 +39,7 @@ public:
|
||||
tracy_force_inline uint32_t get_hash() const { return m_hash; }
|
||||
|
||||
tracy_force_inline bool empty() const { return m_size == 0; }
|
||||
tracy_force_inline uint8_t size() const { return m_size; }
|
||||
tracy_force_inline uint16_t size() const { return m_size; }
|
||||
|
||||
tracy_force_inline const T* data() const { return m_ptr; };
|
||||
|
||||
@ -54,7 +54,7 @@ public:
|
||||
private:
|
||||
tracy_force_inline void CalcHash();
|
||||
|
||||
uint8_t m_size;
|
||||
uint16_t m_size;
|
||||
uint32_t m_hash;
|
||||
const short_ptr<T> m_ptr;
|
||||
};
|
||||
|
@ -7,7 +7,7 @@ namespace Version
|
||||
{
|
||||
enum { Major = 0 };
|
||||
enum { Minor = 6 };
|
||||
enum { Patch = 7 };
|
||||
enum { Patch = 8 };
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5959,8 +5959,8 @@ void DrawZoneTrace( T zone, const std::vector<T>& trace, const Worker& worker, B
|
||||
auto& prevCs = worker.GetCallstack( pcv );
|
||||
auto& currCs = worker.GetCallstack( ccv );
|
||||
|
||||
const auto psz = int8_t( prevCs.size() );
|
||||
int8_t idx;
|
||||
const auto psz = int( prevCs.size() );
|
||||
int idx;
|
||||
for( idx=0; idx<psz; idx++ )
|
||||
{
|
||||
auto pf = prevCs[idx];
|
||||
@ -5976,7 +5976,7 @@ void DrawZoneTrace( T zone, const std::vector<T>& trace, const Worker& worker, B
|
||||
}
|
||||
if( found ) break;
|
||||
}
|
||||
for( int8_t j=1; j<idx; j++ )
|
||||
for( int j=1; j<idx; j++ )
|
||||
{
|
||||
auto frameData = worker.GetCallstackFrame( prevCs[j] );
|
||||
auto frame = frameData->data + frameData->size - 1;
|
||||
@ -6034,7 +6034,7 @@ void DrawZoneTrace( T zone, const std::vector<T>& trace, const Worker& worker, B
|
||||
{
|
||||
auto& cs = worker.GetCallstack( lcv );
|
||||
const auto csz = cs.size();
|
||||
for( uint8_t i=1; i<csz; i++ )
|
||||
for( uint16_t i=1; i<csz; i++ )
|
||||
{
|
||||
auto frameData = worker.GetCallstackFrame( cs[i] );
|
||||
auto frame = frameData->data + frameData->size - 1;
|
||||
@ -14083,7 +14083,7 @@ unordered_flat_map<uint64_t, CallstackFrameTree> View::GetCallstackFrameTreeTopD
|
||||
treePtr->alloc += path.second.mem;
|
||||
treePtr->callstacks.emplace( path.first );
|
||||
|
||||
for( int i = 1; i < cs.size(); i++ )
|
||||
for( uint16_t i = 1; i < cs.size(); i++ )
|
||||
{
|
||||
treePtr = GetFrameTreeItemGroup( treePtr->children, cs[i], m_worker );
|
||||
if( !treePtr ) break;
|
||||
@ -14106,7 +14106,7 @@ unordered_flat_map<uint64_t, CallstackFrameTree> View::GetCallstackFrameTreeTopD
|
||||
treePtr->alloc += path.second.mem;
|
||||
treePtr->callstacks.emplace( path.first );
|
||||
|
||||
for( int i = 1; i < cs.size(); i++ )
|
||||
for( uint16_t i = 1; i < cs.size(); i++ )
|
||||
{
|
||||
treePtr = GetFrameTreeItemNoGroup( treePtr->children, cs[i], m_worker );
|
||||
treePtr->count += path.second.cnt;
|
||||
@ -15597,12 +15597,12 @@ void View::SmallCallstackButton( const char* name, uint32_t callstack, int& idx,
|
||||
}
|
||||
}
|
||||
|
||||
void View::DrawCallstackCalls( uint32_t callstack, uint8_t limit ) const
|
||||
void View::DrawCallstackCalls( uint32_t callstack, uint16_t limit ) const
|
||||
{
|
||||
const auto& csdata = m_worker.GetCallstack( callstack );
|
||||
const auto cssz = std::min( csdata.size(), limit );
|
||||
bool first = true;
|
||||
for( uint8_t i=0; i<cssz; i++ )
|
||||
for( uint16_t i=0; i<cssz; i++ )
|
||||
{
|
||||
const auto frameData = m_worker.GetCallstackFrame( csdata[i] );
|
||||
if( !frameData ) break;
|
||||
|
@ -234,7 +234,7 @@ private:
|
||||
const char* GetPlotName( const PlotData* plot ) const;
|
||||
|
||||
void SmallCallstackButton( const char* name, uint32_t callstack, int& idx, bool tooltip = true );
|
||||
void DrawCallstackCalls( uint32_t callstack, uint8_t limit ) const;
|
||||
void DrawCallstackCalls( uint32_t callstack, uint16_t limit ) const;
|
||||
void SetViewToLastFrames();
|
||||
int64_t GetZoneChildTime( const ZoneEvent& zone );
|
||||
int64_t GetZoneChildTime( const GpuEvent& zone );
|
||||
|
@ -1332,21 +1332,43 @@ Worker::Worker( FileRead& f, EventType::Type eventMask, bool bgTasks )
|
||||
s_loadProgress.progress.store( LoadProgress::CallStacks, std::memory_order_relaxed );
|
||||
f.Read( sz );
|
||||
m_data.callstackPayload.reserve( sz );
|
||||
for( uint64_t i=0; i<sz; i++ )
|
||||
if( fileVer >= FileVersion( 0, 6, 8 ) )
|
||||
{
|
||||
uint8_t csz;
|
||||
f.Read( csz );
|
||||
for( uint64_t i=0; i<sz; i++ )
|
||||
{
|
||||
uint16_t csz;
|
||||
f.Read( csz );
|
||||
|
||||
const auto memsize = sizeof( VarArray<CallstackFrameId> ) + csz * sizeof( CallstackFrameId );
|
||||
auto mem = (char*)m_slab.AllocRaw( memsize );
|
||||
const auto memsize = sizeof( VarArray<CallstackFrameId> ) + csz * sizeof( CallstackFrameId );
|
||||
auto mem = (char*)m_slab.AllocRaw( memsize );
|
||||
|
||||
auto data = (CallstackFrameId*)mem;
|
||||
f.Read( data, csz * sizeof( CallstackFrameId ) );
|
||||
auto data = (CallstackFrameId*)mem;
|
||||
f.Read( data, csz * sizeof( CallstackFrameId ) );
|
||||
|
||||
auto arr = (VarArray<CallstackFrameId>*)( mem + csz * sizeof( CallstackFrameId ) );
|
||||
new(arr) VarArray<CallstackFrameId>( csz, data );
|
||||
auto arr = (VarArray<CallstackFrameId>*)( mem + csz * sizeof( CallstackFrameId ) );
|
||||
new(arr) VarArray<CallstackFrameId>( csz, data );
|
||||
|
||||
m_data.callstackPayload.push_back_no_space_check( arr );
|
||||
m_data.callstackPayload.push_back_no_space_check( arr );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for( uint64_t i=0; i<sz; i++ )
|
||||
{
|
||||
uint8_t csz;
|
||||
f.Read( csz );
|
||||
|
||||
const auto memsize = sizeof( VarArray<CallstackFrameId> ) + csz * sizeof( CallstackFrameId );
|
||||
auto mem = (char*)m_slab.AllocRaw( memsize );
|
||||
|
||||
auto data = (CallstackFrameId*)mem;
|
||||
f.Read( data, csz * sizeof( CallstackFrameId ) );
|
||||
|
||||
auto arr = (VarArray<CallstackFrameId>*)( mem + csz * sizeof( CallstackFrameId ) );
|
||||
new(arr) VarArray<CallstackFrameId>( csz, data );
|
||||
|
||||
m_data.callstackPayload.push_back_no_space_check( arr );
|
||||
}
|
||||
}
|
||||
|
||||
if( fileVer >= FileVersion( 0, 6, 5 ) )
|
||||
@ -5720,7 +5742,7 @@ void Worker::UpdateSampleStatistics( uint32_t callstack, uint32_t count, bool ca
|
||||
const auto cssz = cs.size();
|
||||
|
||||
auto frames = (const CallstackFrameData**)alloca( cssz * sizeof( CallstackFrameData* ) );
|
||||
for( uint8_t i=0; i<cssz; i++ )
|
||||
for( uint16_t i=0; i<cssz; i++ )
|
||||
{
|
||||
auto frame = GetCallstackFrame( cs[i] );
|
||||
if( !frame )
|
||||
@ -5764,7 +5786,7 @@ void Worker::UpdateSampleStatisticsPostponed( decltype(Worker::DataBlock::postpo
|
||||
const auto cssz = cs.size();
|
||||
|
||||
auto frames = (const CallstackFrameData**)alloca( cssz * sizeof( CallstackFrameData* ) );
|
||||
for( uint8_t i=0; i<cssz; i++ )
|
||||
for( uint16_t i=0; i<cssz; i++ )
|
||||
{
|
||||
auto frame = GetCallstackFrame( cs[i] );
|
||||
if( !frame )
|
||||
@ -5779,7 +5801,7 @@ void Worker::UpdateSampleStatisticsPostponed( decltype(Worker::DataBlock::postpo
|
||||
it = m_data.postponedSamples.erase( it );
|
||||
}
|
||||
|
||||
void Worker::UpdateSampleStatisticsImpl( const CallstackFrameData** frames, uint8_t framesCount, uint32_t count, const VarArray<CallstackFrameId>& cs )
|
||||
void Worker::UpdateSampleStatisticsImpl( const CallstackFrameData** frames, uint16_t framesCount, uint32_t count, const VarArray<CallstackFrameId>& cs )
|
||||
{
|
||||
const auto fexcl = frames[0];
|
||||
const auto fxsz = fexcl->size;
|
||||
@ -5794,7 +5816,7 @@ void Worker::UpdateSampleStatisticsImpl( const CallstackFrameData** frames, uint
|
||||
if( sym == m_data.symbolStats.end() ) sym = m_data.symbolStats.emplace( frame.symAddr, SymbolStats { 0, 0, unordered_flat_map<uint32_t, uint32_t>() } ).first;
|
||||
sym->second.incl += count;
|
||||
}
|
||||
for( uint8_t c=1; c<framesCount; c++ )
|
||||
for( uint16_t c=1; c<framesCount; c++ )
|
||||
{
|
||||
const auto fincl = frames[c];
|
||||
const auto fsz = fincl->size;
|
||||
@ -6591,7 +6613,7 @@ void Worker::Write( FileWrite& f )
|
||||
for( size_t i=1; i<=sz; i++ )
|
||||
{
|
||||
auto cs = m_data.callstackPayload[i];
|
||||
uint8_t csz = cs->size();
|
||||
uint16_t csz = cs->size();
|
||||
f.Write( &csz, sizeof( csz ) );
|
||||
f.Write( cs->data(), sizeof( CallstackFrameId ) * csz );
|
||||
}
|
||||
|
@ -697,7 +697,7 @@ private:
|
||||
void ReconstructContextSwitchUsage();
|
||||
void UpdateSampleStatistics( uint32_t callstack, uint32_t count, bool canPostpone );
|
||||
void UpdateSampleStatisticsPostponed( decltype(Worker::DataBlock::postponedSamples.begin())& it );
|
||||
void UpdateSampleStatisticsImpl( const CallstackFrameData** frames, uint8_t framesCount, uint32_t count, const VarArray<CallstackFrameId>& cs );
|
||||
void UpdateSampleStatisticsImpl( const CallstackFrameData** frames, uint16_t framesCount, uint32_t count, const VarArray<CallstackFrameId>& cs );
|
||||
#endif
|
||||
|
||||
tracy_force_inline int64_t ReadTimeline( FileRead& f, ZoneEvent* zone, int64_t refTime, int32_t& childIdx );
|
||||
|
Loading…
Reference in New Issue
Block a user