1
0
mirror of https://github.com/wolfpld/tracy synced 2025-01-15 11:57:59 +00:00

Compare commits

...

6 Commits

Author SHA1 Message Date
Bartosz Taudul
5f7225ce32
Merge pull request #224 from keur/external_trace_use_file_and_line
Use file:line when comparing traces
2021-05-22 12:36:05 +02:00
Bartosz Taudul
1fc0e1ead5
Merge pull request #225 from stgatilov/patch-1
Tiny fix in manual
2021-05-22 12:13:26 +02:00
Kevin Kuehler
871d41be1f Implement FindMatchingZone(..)
Sets m_compare to the matched index. It supports multiple flags. It can
be run by comparing function name, source file, line number, and any
combination thereof. When searching for a match, we do 3 runs, quitting
out if any of them succeed.

  1. Look for zone with same function same, source file, line number.
  2. Look for zone with same function same, source file.
  3. Look for zone with same function same.
2021-05-22 01:33:06 -07:00
stgatilov
e01ba2d7d4
Tiny fix in manual
Without parentheses, bitwise-and takes precedence over bitwise-or.
2021-05-22 14:20:36 +07:00
Bartosz Taudul
306055ebfa
Cosmetics. 2021-05-22 00:46:11 +02:00
Kevin Kuehler
5ab84d0c3f Use file:line when comparing traces
When comparing traces, where multiple classes share the same zone
names, the behavior prior to this patch was to auto-select the first
matching zone name in the other trace. Instead, find the most correct
zone by using filename and line number.
2021-05-21 15:25:26 -07:00
3 changed files with 93 additions and 36 deletions

View File

@ -1121,7 +1121,7 @@ enum SubSystems
...
// Preferably a define in the build system
#define SUBSYSTEMS Sys_Physics | Sys_NasalDemons
#define SUBSYSTEMS (Sys_Physics | Sys_NasalDemons)
...

View File

@ -11189,6 +11189,87 @@ void View::DrawZoneList( int id, const Vector<short_ptr<ZoneEvent>>& zones )
ImGui::TreePop();
}
bool View::FindMatchingZone( int prev0, int prev1, int flags )
{
int idx = 0;
bool found = false;
auto& srcloc0 = m_worker.GetSourceLocation( m_compare.match[0][m_compare.selMatch[0]] );
auto& srcloc1 = m_compare.second->GetSourceLocation( m_compare.match[1][m_compare.selMatch[1]] );
auto string0 = m_worker.GetString( srcloc0.name.active ? srcloc0.name : srcloc0.function );
auto string1 = m_compare.second->GetString( srcloc1.name.active ? srcloc1.name : srcloc1.function );
auto file0 = m_worker.GetString( srcloc0.file );
auto file1 = m_compare.second->GetString( srcloc1.file );
bool wrongFile = false;
bool wrongLine = false;
if( flags & FindMatchingZoneFlagSourceFile )
{
wrongFile = strcmp( file0, file1 ) != 0;
}
if( flags & FindMatchingZoneFlagLineNum )
{
wrongLine = srcloc0.line != srcloc1.line;
}
if( strcmp( string0, string1 ) != 0 || wrongFile || wrongLine )
{
if( prev0 != m_compare.selMatch[0] )
{
for( auto& v : m_compare.match[1] )
{
auto& srcloc = m_compare.second->GetSourceLocation( v );
auto string = m_compare.second->GetString( srcloc.name.active ? srcloc.name : srcloc.function );
auto file = m_compare.second->GetString( srcloc.file );
bool sameFile = true;
bool sameLine = true;
if( flags & FindMatchingZoneFlagSourceFile )
{
sameFile = strcmp( file0, file ) == 0;
}
if( flags & FindMatchingZoneFlagLineNum )
{
sameLine = srcloc0.line == srcloc.line;
}
if( strcmp( string0, string ) == 0 && sameFile && sameLine )
{
m_compare.selMatch[1] = idx;
found = true;
break;
}
idx++;
}
}
else
{
assert( prev1 != m_compare.selMatch[1] );
for( auto& v : m_compare.match[0] )
{
auto& srcloc = m_worker.GetSourceLocation( v );
auto string = m_worker.GetString( srcloc.name.active ? srcloc.name : srcloc.function );
auto file = m_worker.GetString( srcloc.file );
bool sameFile = true;
bool sameLine = true;
if( flags & FindMatchingZoneFlagSourceFile )
{
sameFile = strcmp( file1, file ) == 0;
}
if( flags & FindMatchingZoneFlagLineNum )
{
sameLine = srcloc1.line == srcloc.line;
}
if( strcmp( string1, string ) == 0 && sameFile && sameLine )
{
m_compare.selMatch[0] = idx;
found = true;
break;
}
idx++;
}
}
}
return found;
}
void View::DrawCompare()
{
ImGui::SetNextWindowSize( ImVec2( 590, 800 ), ImGuiCond_FirstUseEver );
@ -11403,43 +11484,11 @@ void View::DrawCompare()
if( m_compare.link )
{
auto& srcloc0 = m_worker.GetSourceLocation( m_compare.match[0][m_compare.selMatch[0]] );
auto& srcloc1 = m_compare.second->GetSourceLocation( m_compare.match[1][m_compare.selMatch[1]] );
auto string0 = m_worker.GetString( srcloc0.name.active ? srcloc0.name : srcloc0.function );
auto string1 = m_compare.second->GetString( srcloc1.name.active ? srcloc1.name : srcloc1.function );
if( strcmp( string0, string1 ) != 0 )
if( !FindMatchingZone( prev0, prev1, FindMatchingZoneFlagSourceFile | FindMatchingZoneFlagLineNum ) )
{
idx = 0;
if( prev0 != m_compare.selMatch[0] )
if( !FindMatchingZone( prev0, prev1, FindMatchingZoneFlagSourceFile ) )
{
for( auto& v : m_compare.match[1] )
{
auto& srcloc = m_compare.second->GetSourceLocation( v );
auto string = m_compare.second->GetString( srcloc.name.active ? srcloc.name : srcloc.function );
if( strcmp( string0, string ) == 0 )
{
m_compare.selMatch[1] = idx;
break;
}
idx++;
}
}
else
{
assert( prev1 != m_compare.selMatch[1] );
for( auto& v : m_compare.match[0] )
{
auto& srcloc = m_worker.GetSourceLocation( v );
auto string = m_worker.GetString( srcloc.name.active ? srcloc.name : srcloc.function );
if( strcmp( string1, string ) == 0 )
{
m_compare.selMatch[0] = idx;
break;
}
idx++;
}
FindMatchingZone( prev0, prev1, FindMatchingZoneFlagDefault );
}
}
}

View File

@ -251,6 +251,7 @@ private:
uint64_t GetZoneThread( const ZoneEvent& zone ) const;
uint64_t GetZoneThread( const GpuEvent& zone ) const;
const GpuCtxData* GetZoneCtx( const GpuEvent& zone ) const;
bool FindMatchingZone( int prev0, int prev1, int flags );
const ZoneEvent* FindZoneAtTime( uint64_t thread, int64_t time ) const;
uint64_t GetFrameNumber( const FrameData& fd, int i, uint64_t offset ) const;
const char* GetFrameText( const FrameData& fd, int i, uint64_t ftime, uint64_t offset ) const;
@ -447,6 +448,13 @@ private:
NeedsJoin
};
enum
{
FindMatchingZoneFlagDefault = 0,
FindMatchingZoneFlagSourceFile = (1 << 0),
FindMatchingZoneFlagLineNum = (1 << 1),
};
std::atomic<SaveThreadState> m_saveThreadState { SaveThreadState::Inert };
std::thread m_saveThread;
std::atomic<size_t> m_srcFileBytes { 0 };