mirror of
https://github.com/wolfpld/tracy.git
synced 2024-11-10 02:31:48 +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
|
class VarArray
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
VarArray( uint8_t size, const T* data )
|
VarArray( uint16_t size, const T* data )
|
||||||
: m_size( size )
|
: m_size( size )
|
||||||
, m_ptr( data )
|
, m_ptr( data )
|
||||||
{
|
{
|
||||||
@ -39,7 +39,7 @@ public:
|
|||||||
tracy_force_inline uint32_t get_hash() const { return m_hash; }
|
tracy_force_inline uint32_t get_hash() const { return m_hash; }
|
||||||
|
|
||||||
tracy_force_inline bool empty() const { return m_size == 0; }
|
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; };
|
tracy_force_inline const T* data() const { return m_ptr; };
|
||||||
|
|
||||||
@ -54,7 +54,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
tracy_force_inline void CalcHash();
|
tracy_force_inline void CalcHash();
|
||||||
|
|
||||||
uint8_t m_size;
|
uint16_t m_size;
|
||||||
uint32_t m_hash;
|
uint32_t m_hash;
|
||||||
const short_ptr<T> m_ptr;
|
const short_ptr<T> m_ptr;
|
||||||
};
|
};
|
||||||
|
@ -7,7 +7,7 @@ namespace Version
|
|||||||
{
|
{
|
||||||
enum { Major = 0 };
|
enum { Major = 0 };
|
||||||
enum { Minor = 6 };
|
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& prevCs = worker.GetCallstack( pcv );
|
||||||
auto& currCs = worker.GetCallstack( ccv );
|
auto& currCs = worker.GetCallstack( ccv );
|
||||||
|
|
||||||
const auto psz = int8_t( prevCs.size() );
|
const auto psz = int( prevCs.size() );
|
||||||
int8_t idx;
|
int idx;
|
||||||
for( idx=0; idx<psz; idx++ )
|
for( idx=0; idx<psz; idx++ )
|
||||||
{
|
{
|
||||||
auto pf = prevCs[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;
|
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 frameData = worker.GetCallstackFrame( prevCs[j] );
|
||||||
auto frame = frameData->data + frameData->size - 1;
|
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 );
|
auto& cs = worker.GetCallstack( lcv );
|
||||||
const auto csz = cs.size();
|
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 frameData = worker.GetCallstackFrame( cs[i] );
|
||||||
auto frame = frameData->data + frameData->size - 1;
|
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->alloc += path.second.mem;
|
||||||
treePtr->callstacks.emplace( path.first );
|
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 );
|
treePtr = GetFrameTreeItemGroup( treePtr->children, cs[i], m_worker );
|
||||||
if( !treePtr ) break;
|
if( !treePtr ) break;
|
||||||
@ -14106,7 +14106,7 @@ unordered_flat_map<uint64_t, CallstackFrameTree> View::GetCallstackFrameTreeTopD
|
|||||||
treePtr->alloc += path.second.mem;
|
treePtr->alloc += path.second.mem;
|
||||||
treePtr->callstacks.emplace( path.first );
|
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 = GetFrameTreeItemNoGroup( treePtr->children, cs[i], m_worker );
|
||||||
treePtr->count += path.second.cnt;
|
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& csdata = m_worker.GetCallstack( callstack );
|
||||||
const auto cssz = std::min( csdata.size(), limit );
|
const auto cssz = std::min( csdata.size(), limit );
|
||||||
bool first = true;
|
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] );
|
const auto frameData = m_worker.GetCallstackFrame( csdata[i] );
|
||||||
if( !frameData ) break;
|
if( !frameData ) break;
|
||||||
|
@ -234,7 +234,7 @@ private:
|
|||||||
const char* GetPlotName( const PlotData* plot ) const;
|
const char* GetPlotName( const PlotData* plot ) const;
|
||||||
|
|
||||||
void SmallCallstackButton( const char* name, uint32_t callstack, int& idx, bool tooltip = true );
|
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();
|
void SetViewToLastFrames();
|
||||||
int64_t GetZoneChildTime( const ZoneEvent& zone );
|
int64_t GetZoneChildTime( const ZoneEvent& zone );
|
||||||
int64_t GetZoneChildTime( const GpuEvent& 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 );
|
s_loadProgress.progress.store( LoadProgress::CallStacks, std::memory_order_relaxed );
|
||||||
f.Read( sz );
|
f.Read( sz );
|
||||||
m_data.callstackPayload.reserve( sz );
|
m_data.callstackPayload.reserve( sz );
|
||||||
for( uint64_t i=0; i<sz; i++ )
|
if( fileVer >= FileVersion( 0, 6, 8 ) )
|
||||||
{
|
{
|
||||||
uint8_t csz;
|
for( uint64_t i=0; i<sz; i++ )
|
||||||
f.Read( csz );
|
{
|
||||||
|
uint16_t csz;
|
||||||
|
f.Read( csz );
|
||||||
|
|
||||||
const auto memsize = sizeof( VarArray<CallstackFrameId> ) + csz * sizeof( CallstackFrameId );
|
const auto memsize = sizeof( VarArray<CallstackFrameId> ) + csz * sizeof( CallstackFrameId );
|
||||||
auto mem = (char*)m_slab.AllocRaw( memsize );
|
auto mem = (char*)m_slab.AllocRaw( memsize );
|
||||||
|
|
||||||
auto data = (CallstackFrameId*)mem;
|
auto data = (CallstackFrameId*)mem;
|
||||||
f.Read( data, csz * sizeof( CallstackFrameId ) );
|
f.Read( data, csz * sizeof( CallstackFrameId ) );
|
||||||
|
|
||||||
auto arr = (VarArray<CallstackFrameId>*)( mem + csz * sizeof( CallstackFrameId ) );
|
auto arr = (VarArray<CallstackFrameId>*)( mem + csz * sizeof( CallstackFrameId ) );
|
||||||
new(arr) VarArray<CallstackFrameId>( csz, data );
|
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 ) )
|
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();
|
const auto cssz = cs.size();
|
||||||
|
|
||||||
auto frames = (const CallstackFrameData**)alloca( cssz * sizeof( CallstackFrameData* ) );
|
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] );
|
auto frame = GetCallstackFrame( cs[i] );
|
||||||
if( !frame )
|
if( !frame )
|
||||||
@ -5764,7 +5786,7 @@ void Worker::UpdateSampleStatisticsPostponed( decltype(Worker::DataBlock::postpo
|
|||||||
const auto cssz = cs.size();
|
const auto cssz = cs.size();
|
||||||
|
|
||||||
auto frames = (const CallstackFrameData**)alloca( cssz * sizeof( CallstackFrameData* ) );
|
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] );
|
auto frame = GetCallstackFrame( cs[i] );
|
||||||
if( !frame )
|
if( !frame )
|
||||||
@ -5779,7 +5801,7 @@ void Worker::UpdateSampleStatisticsPostponed( decltype(Worker::DataBlock::postpo
|
|||||||
it = m_data.postponedSamples.erase( it );
|
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 fexcl = frames[0];
|
||||||
const auto fxsz = fexcl->size;
|
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;
|
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;
|
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 fincl = frames[c];
|
||||||
const auto fsz = fincl->size;
|
const auto fsz = fincl->size;
|
||||||
@ -6591,7 +6613,7 @@ void Worker::Write( FileWrite& f )
|
|||||||
for( size_t i=1; i<=sz; i++ )
|
for( size_t i=1; i<=sz; i++ )
|
||||||
{
|
{
|
||||||
auto cs = m_data.callstackPayload[i];
|
auto cs = m_data.callstackPayload[i];
|
||||||
uint8_t csz = cs->size();
|
uint16_t csz = cs->size();
|
||||||
f.Write( &csz, sizeof( csz ) );
|
f.Write( &csz, sizeof( csz ) );
|
||||||
f.Write( cs->data(), sizeof( CallstackFrameId ) * csz );
|
f.Write( cs->data(), sizeof( CallstackFrameId ) * csz );
|
||||||
}
|
}
|
||||||
|
@ -697,7 +697,7 @@ private:
|
|||||||
void ReconstructContextSwitchUsage();
|
void ReconstructContextSwitchUsage();
|
||||||
void UpdateSampleStatistics( uint32_t callstack, uint32_t count, bool canPostpone );
|
void UpdateSampleStatistics( uint32_t callstack, uint32_t count, bool canPostpone );
|
||||||
void UpdateSampleStatisticsPostponed( decltype(Worker::DataBlock::postponedSamples.begin())& it );
|
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
|
#endif
|
||||||
|
|
||||||
tracy_force_inline int64_t ReadTimeline( FileRead& f, ZoneEvent* zone, int64_t refTime, int32_t& childIdx );
|
tracy_force_inline int64_t ReadTimeline( FileRead& f, ZoneEvent* zone, int64_t refTime, int32_t& childIdx );
|
||||||
|
Loading…
Reference in New Issue
Block a user