diff --git a/README.md b/README.md index 9987bfbb..e31305a5 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ To begin data collection, tracy requires that you manually instrument your appli To slice the program's execution recording into frame-sized chunks, put the `FrameMark` macro after you have completed rendering the frame. Ideally that would be right after the swap buffers command. Note that this step is optional, as some applications (for example: a compression utility) do not have the concept of a frame. -To record a zone's execution time add the `ZoneScoped` macro at the beginning of the scope you want to measure. This will automatically record function name, source file name and location. Optionally you may use the `ZoneScopedC( 0xBBGGRR )` macro to set a custom color for the zone. Note that the color value will be constant in the recording (don't try to parametrize it). After you have marked the zone, you may further parametrize it. +To record a zone's execution time add the `ZoneScoped` macro at the beginning of the scope you want to measure. This will automatically record function name, source file name and location. Optionally you may use the `ZoneScopedC( 0xRRGGBB )` macro to set a custom color for the zone. Note that the color value will be constant in the recording (don't try to parametrize it). After you have marked the zone, you may further parametrize it. Use the `ZoneName( const char* name )` macro to set a custom name for the zone, which will be displayed instead of the function's name in the timeline view. The indented usage is to provide a string literal. (The text string that you provide **must** be accessible indefinitely at the given address. Tracy does not guarantee at which point in time it will be sent to the server and there is no notification when it happens.) diff --git a/server/TracyEvent.hpp b/server/TracyEvent.hpp index c476063b..fa9f7f31 100644 --- a/server/TracyEvent.hpp +++ b/server/TracyEvent.hpp @@ -16,6 +16,17 @@ struct TextData #pragma pack( 1 ) +struct SourceLocation +{ + uint64_t function; // ptr + uint64_t file; // ptr + uint32_t line; + uint32_t color; +}; + +enum { SourceLocationSize = sizeof( SourceLocation ) }; + + struct ZoneEvent { int64_t start; diff --git a/server/TracyView.cpp b/server/TracyView.cpp index a6b3a580..da5ee4b0 100644 --- a/server/TracyView.cpp +++ b/server/TracyView.cpp @@ -252,7 +252,7 @@ View::View( FileRead& f ) { uint64_t ptr; f.Read( &ptr, sizeof( ptr ) ); - QueueSourceLocation srcloc; + SourceLocation srcloc; f.Read( &srcloc, sizeof( srcloc ) ); m_sourceLocation.emplace( ptr, srcloc ); } @@ -981,8 +981,9 @@ void View::AddSourceLocation( const QueueSourceLocation& srcloc ) m_pendingSourceLocation.erase( it ); CheckString( srcloc.file ); CheckString( srcloc.function ); + uint32_t color = ( srcloc.r << 16 ) | ( srcloc.g << 8 ) | srcloc.b; std::lock_guard lock( m_lock ); - m_sourceLocation.emplace( srcloc.ptr, srcloc ); + m_sourceLocation.emplace( srcloc.ptr, SourceLocation { srcloc.function, srcloc.file, srcloc.line, color } ); } void View::AddSourceLocationPayload( uint64_t ptr, const char* data, size_t sz ) @@ -1366,9 +1367,9 @@ const char* View::GetThreadString( uint64_t id ) const } } -const QueueSourceLocation& View::GetSourceLocation( uint32_t srcloc ) const +const SourceLocation& View::GetSourceLocation( uint32_t srcloc ) const { - static const QueueSourceLocation empty = {}; + static const SourceLocation empty = {}; const auto it = m_sourceLocation.find( m_sourceLocationExpand[srcloc] ); if( it == m_sourceLocation.end() ) return empty; return it->second; @@ -2089,7 +2090,7 @@ int View::DrawZoneLevel( const Vector& vec, bool hover, double pxns, ++it; if( it == zitend ) break; auto& srcloc2 = GetSourceLocation( (*it)->srcloc ); - if( srcloc.r != srcloc2.r || srcloc.g != srcloc2.g || srcloc.b != srcloc2.b ) break; + if( srcloc.color != srcloc2.color ) break; const auto nend = GetZoneEnd( **it ); const auto pxnext = ( nend - m_zvStart ) * pxns; if( pxnext - px1 >= MinVisSize * 2 ) break; @@ -3043,9 +3044,9 @@ uint32_t View::GetZoneColor( const ZoneEvent& ev ) return GetZoneColor( GetSourceLocation( ev.srcloc ) ); } -uint32_t View::GetZoneColor( const QueueSourceLocation& srcloc ) +uint32_t View::GetZoneColor( const SourceLocation& srcloc ) { - const auto color = srcloc.r | ( srcloc.g << 8 ) | ( srcloc.b << 16 ); + const auto color = srcloc.color; return color != 0 ? ( color | 0xFF000000 ) : 0xFFCC5555; } diff --git a/server/TracyView.hpp b/server/TracyView.hpp index b9ae0d0c..2588ff66 100644 --- a/server/TracyView.hpp +++ b/server/TracyView.hpp @@ -176,7 +176,7 @@ private: int64_t GetZoneEnd( const ZoneEvent& ev ) const; const char* GetString( uint64_t ptr ) const; const char* GetThreadString( uint64_t id ) const; - const QueueSourceLocation& GetSourceLocation( uint32_t srcloc ) const; + const SourceLocation& GetSourceLocation( uint32_t srcloc ) const; const char* ShortenNamespace( const char* name ) const; @@ -196,7 +196,7 @@ private: void HandleZoneViewMouse( int64_t timespan, const ImVec2& wpos, float w, double& pxns ); uint32_t GetZoneColor( const ZoneEvent& ev ); - uint32_t GetZoneColor( const QueueSourceLocation& srcloc ); + uint32_t GetZoneColor( const SourceLocation& srcloc ); uint32_t GetZoneHighlight( const ZoneEvent& ev, bool migration ); float GetZoneThickness( const ZoneEvent& ev ); @@ -230,7 +230,7 @@ private: std::unordered_map m_strings; std::unordered_map m_threadNames; std::unordered_set m_customStrings; - std::unordered_map m_sourceLocation; + std::unordered_map m_sourceLocation; std::vector m_sourceLocationExpand; std::map m_lockMap; uint64_t m_zonesCnt;