mirror of
https://github.com/wolfpld/tracy.git
synced 2025-03-20 07:40:02 +08:00
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.
This commit is contained in:
parent
306055ebfa
commit
871d41be1f
@ -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,47 +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 );
|
||||
auto file0 = m_worker.GetString( srcloc0.file );
|
||||
auto file1 = m_compare.second->GetString( srcloc1.file );
|
||||
|
||||
if( strcmp( string0, string1 ) != 0 || strcmp( file0, file1 ) != 0 || srcloc0.line != srcloc1.line )
|
||||
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 );
|
||||
auto file = m_compare.second->GetString( srcloc.file );
|
||||
if( strcmp( string0, string ) == 0 && strcmp( file0, file ) == 0 && srcloc0.line == srcloc.line )
|
||||
{
|
||||
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 );
|
||||
auto file = m_compare.second->GetString( srcloc.file );
|
||||
if( strcmp( string1, string ) == 0 && strcmp( file1, file ) == 0 && srcloc1.line == srcloc.line )
|
||||
{
|
||||
m_compare.selMatch[0] = idx;
|
||||
break;
|
||||
}
|
||||
idx++;
|
||||
}
|
||||
|
||||
FindMatchingZone( prev0, prev1, FindMatchingZoneFlagDefault );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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 };
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user