diff options
-rw-r--r-- | manual/tracy.tex | 2 | ||||
-rw-r--r-- | server/TracyView.cpp | 119 | ||||
-rw-r--r-- | server/TracyView.hpp | 8 |
3 files changed, 93 insertions, 36 deletions
diff --git a/manual/tracy.tex b/manual/tracy.tex index 6735f3fc..b02fc919 100644 --- a/manual/tracy.tex +++ b/manual/tracy.tex @@ -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) ... diff --git a/server/TracyView.cpp b/server/TracyView.cpp index 754b9265..3388963d 100644 --- a/server/TracyView.cpp +++ b/server/TracyView.cpp @@ -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] ) - { - 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 + if( !FindMatchingZone( prev0, prev1, FindMatchingZoneFlagSourceFile ) ) { - 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 ); } } } diff --git a/server/TracyView.hpp b/server/TracyView.hpp index 7e7ddfa3..53d10990 100644 --- a/server/TracyView.hpp +++ b/server/TracyView.hpp @@ -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 }; |