diff --git a/server/TracyTimelineController.cpp b/server/TracyTimelineController.cpp index 0c1943ff..1a32845e 100644 --- a/server/TracyTimelineController.cpp +++ b/server/TracyTimelineController.cpp @@ -9,9 +9,15 @@ TimelineController::TimelineController() : m_height( 0 ) , m_offset( 0 ) , m_scroll( 0 ) + , m_firstFrame( true ) { } +void TimelineController::FirstFrameExpired() +{ + m_firstFrame = false; +} + void TimelineController::End( float offset ) { const auto scrollPos = ImGui::GetScrollY(); @@ -26,4 +32,45 @@ void TimelineController::End( float offset ) m_scroll = scrollPos; } +float TimelineController::AdjustThreadPosition( VisData& vis, float wy, int& offset ) +{ + if( vis.offset < offset ) + { + vis.offset = offset; + } + else if( vis.offset > offset ) + { + const auto diff = vis.offset - offset; + const auto move = std::max( 2.0, diff * 10.0 * ImGui::GetIO().DeltaTime ); + offset = vis.offset = int( std::max( vis.offset - move, offset ) ); + } + + return offset + wy; +} + +void TimelineController::AdjustThreadHeight( VisData& vis, int oldOffset, int& offset ) +{ + const auto h = offset - oldOffset; + if( vis.height > h ) + { + vis.height = h; + offset = oldOffset + vis.height; + } + else if( vis.height < h ) + { + if( m_firstFrame ) + { + vis.height = h; + offset = oldOffset + h; + } + else + { + const auto diff = h - vis.height; + const auto move = std::max( 2.0, diff * 10.0 * ImGui::GetIO().DeltaTime ); + vis.height = int( std::min( vis.height + move, h ) ); + offset = oldOffset + vis.height; + } + } +} + } diff --git a/server/TracyTimelineController.hpp b/server/TracyTimelineController.hpp index 20c51390..eccb8edd 100644 --- a/server/TracyTimelineController.hpp +++ b/server/TracyTimelineController.hpp @@ -1,22 +1,53 @@ #ifndef __TRACYTIMELINECONTROLLER_HPP__ #define __TRACYTIMELINECONTROLLER_HPP__ +#include "../public/common/TracyForceInline.hpp" +#include "tracy_robin_hood.h" + namespace tracy { class TimelineController { + struct VisData + { + bool visible = true; + bool showFull = true; + bool ghost = false; + int offset = 0; + int height = 0; + }; + public: TimelineController(); + void FirstFrameExpired(); void End( float offset ); float GetHeight() const { return m_height; } + const unordered_flat_map& GetVisData() const { return m_visData; } + + void AdjustThreadHeight( VisData& vis, int oldOffset, int& offset ); + float AdjustThreadPosition( VisData& vis, float wy, int& offset ); + + tracy_force_inline VisData& Vis( const void* ptr ) + { + auto it = m_visData.find( ptr ); + if( it == m_visData.end() ) + { + it = m_visData.emplace( ptr, VisData {} ).first; + } + return it->second; + } private: + unordered_flat_map m_visData; + float m_height; float m_offset; float m_scroll; + + bool m_firstFrame; }; } diff --git a/server/TracyView.cpp b/server/TracyView.cpp index 6c73f5e9..e069872c 100644 --- a/server/TracyView.cpp +++ b/server/TracyView.cpp @@ -838,7 +838,7 @@ bool View::DrawImpl() if( ImGui::SmallButton( " " ICON_FA_CARET_LEFT " " ) ) ZoomToPrevFrame(); ImGui::SameLine(); { - const auto vis = Vis( m_frames ).visible; + const auto vis = m_tc.Vis( m_frames ).visible; if( !vis ) { ImGui::PushStyleColor( ImGuiCol_Text, GImGui->Style.Colors[ImGuiCol_TextDisabled] ); @@ -1085,6 +1085,7 @@ bool View::DrawImpl() if( std::chrono::duration_cast( now - m_firstFrameTime ).count() > 500 ) { m_firstFrame = false; + m_tc.FirstFrameExpired(); } } } diff --git a/server/TracyView.hpp b/server/TracyView.hpp index 67f21c70..a6e433de 100644 --- a/server/TracyView.hpp +++ b/server/TracyView.hpp @@ -80,15 +80,6 @@ class View }; public: - struct VisData - { - bool visible = true; - bool showFull = true; - bool ghost = false; - int offset = 0; - int height = 0; - }; - struct PlotView { double min; @@ -330,7 +321,6 @@ private: void SetPlaybackFrame( uint32_t idx ); bool Save( const char* fn, FileWrite::Compression comp, int zlevel, bool buildDict ); - unordered_flat_map m_visData; unordered_flat_map m_visibleMsgThread; unordered_flat_map m_waitStackThread; unordered_flat_map m_gpuDrift; @@ -338,16 +328,6 @@ private: Vector m_threadOrder; Vector m_threadDnd; - tracy_force_inline VisData& Vis( const void* ptr ) - { - auto it = m_visData.find( ptr ); - if( it == m_visData.end() ) - { - it = m_visData.emplace( ptr, VisData {} ).first; - } - return it->second; - } - tracy_force_inline bool& VisibleMsgThread( uint64_t thread ) { auto it = m_visibleMsgThread.find( thread ); @@ -378,8 +358,6 @@ private: return it->second; } - void AdjustThreadHeight( View::VisData& vis, int oldOffset, int& offset ); - float AdjustThreadPosition( View::VisData& vis, float wy, int& offset ); static int64_t AdjustGpuTime( int64_t time, int64_t begin, int drift ); static const char* DecodeContextSwitchState( uint8_t state ); diff --git a/server/TracyView_CpuData.cpp b/server/TracyView_CpuData.cpp index 28a63c35..285dcbb2 100644 --- a/server/TracyView_CpuData.cpp +++ b/server/TracyView_CpuData.cpp @@ -28,11 +28,11 @@ int View::DrawCpuData( int offset, double pxns, const ImVec2& wpos, bool hover, const auto dpos = wpos + ImVec2( 0.5f, 0.5f ); static int cpuDataVisStub; - auto& vis = Vis( &cpuDataVisStub ); + auto& vis = m_tc.Vis( &cpuDataVisStub ); bool& showFull = vis.showFull; ImGui::PushID( &vis ); - const auto yPos = AdjustThreadPosition( vis, wpos.y, offset ); + const auto yPos = m_tc.AdjustThreadPosition( vis, wpos.y, offset ); const auto oldOffset = offset; ImGui::PushClipRect( wpos, wpos + ImVec2( w, offset + vis.height ), true ); if( yPos + ty >= yMin && yPos <= yMax ) @@ -465,7 +465,7 @@ int View::DrawCpuData( int offset, double pxns, const ImVec2& wpos, bool hover, } offset += ostep * 0.2f; - AdjustThreadHeight( vis, oldOffset, offset ); + m_tc.AdjustThreadHeight( vis, oldOffset, offset ); ImGui::PopClipRect(); ImGui::PopID(); diff --git a/server/TracyView_Locks.cpp b/server/TracyView_Locks.cpp index 7f3027be..52126451 100644 --- a/server/TracyView_Locks.cpp +++ b/server/TracyView_Locks.cpp @@ -362,7 +362,7 @@ int View::DrawLocks( uint64_t tid, bool hover, double pxns, const ImVec2& wpos, for( const auto& v : m_worker.GetLockMap() ) { const auto& lockmap = *v.second; - if( !lockmap.valid || !Vis( &lockmap ).visible ) continue; + if( !lockmap.valid || !m_tc.Vis( &lockmap ).visible ) continue; if( m_vd.onlyContendedLocks && ( lockmap.threadList.size() == 1 || !lockmap.isContended ) && m_lockInfoWindow != v.first ) continue; auto it = lockmap.threadMap.find( tid ); diff --git a/server/TracyView_NotificationArea.cpp b/server/TracyView_NotificationArea.cpp index abc4022b..11fb84cd 100644 --- a/server/TracyView_NotificationArea.cpp +++ b/server/TracyView_NotificationArea.cpp @@ -189,7 +189,7 @@ void View::DrawNotificationArea() } { bool hidden = false; - for( auto& v : m_visData ) + for( auto& v : m_tc.GetVisData() ) { if( !v.second.visible ) { diff --git a/server/TracyView_Options.cpp b/server/TracyView_Options.cpp index 8f26626a..e9ddc706 100644 --- a/server/TracyView_Options.cpp +++ b/server/TracyView_Options.cpp @@ -95,7 +95,7 @@ void View::DrawOptions() const auto& timeline = gpuData[i]->threadData.begin()->second.timeline; char buf[1024]; sprintf( buf, "%s context %zu", GpuContextNames[(int)gpuData[i]->type], i ); - SmallCheckbox( buf, &Vis( gpuData[i] ).visible ); + SmallCheckbox( buf, &m_tc.Vis( gpuData[i] ).visible ); ImGui::SameLine(); if( gpuData[i]->threadData.size() == 1 ) { @@ -280,7 +280,7 @@ void View::DrawOptions() { for( const auto& l : m_worker.GetLockMap() ) { - Vis( l.second ).visible = true; + m_tc.Vis( l.second ).visible = true; } } ImGui::SameLine(); @@ -288,7 +288,7 @@ void View::DrawOptions() { for( const auto& l : m_worker.GetLockMap() ) { - Vis( l.second ).visible = false; + m_tc.Vis( l.second ).visible = false; } } ImGui::SameLine(); @@ -304,7 +304,7 @@ void View::DrawOptions() { for( const auto& l : m_worker.GetLockMap() ) { - if( l.second->threadList.size() != 1 && l.second->isContended ) Vis( l.second ).visible = true; + if( l.second->threadList.size() != 1 && l.second->isContended ) m_tc.Vis( l.second ).visible = true; } } ImGui::SameLine(); @@ -312,7 +312,7 @@ void View::DrawOptions() { for( const auto& l : m_worker.GetLockMap() ) { - if( l.second->threadList.size() != 1 && l.second->isContended ) Vis( l.second ).visible = false; + if( l.second->threadList.size() != 1 && l.second->isContended ) m_tc.Vis( l.second ).visible = false; } } @@ -332,7 +332,7 @@ void View::DrawOptions() { sprintf( buf, "%" PRIu32 ": %s", l.first, m_worker.GetString( m_worker.GetSourceLocation( l.second->srcloc ).function ) ); } - SmallCheckbox( buf, &Vis( l.second ).visible ); + SmallCheckbox( buf, &m_tc.Vis( l.second ).visible ); if( ImGui::IsItemHovered() ) { m_lockHoverHighlight = l.first; @@ -382,7 +382,7 @@ void View::DrawOptions() { for( const auto& l : m_worker.GetLockMap() ) { - if( l.second->threadList.size() != 1 && !l.second->isContended ) Vis( l.second ).visible = true; + if( l.second->threadList.size() != 1 && !l.second->isContended ) m_tc.Vis( l.second ).visible = true; } } ImGui::SameLine(); @@ -390,7 +390,7 @@ void View::DrawOptions() { for( const auto& l : m_worker.GetLockMap() ) { - if( l.second->threadList.size() != 1 && !l.second->isContended ) Vis( l.second ).visible = false; + if( l.second->threadList.size() != 1 && !l.second->isContended ) m_tc.Vis( l.second ).visible = false; } } @@ -410,7 +410,7 @@ void View::DrawOptions() { sprintf( buf, "%" PRIu32 ": %s", l.first, m_worker.GetString( m_worker.GetSourceLocation( l.second->srcloc ).function ) ); } - SmallCheckbox( buf, &Vis( l.second ).visible ); + SmallCheckbox( buf, &m_tc.Vis( l.second ).visible ); if( ImGui::IsItemHovered() ) { m_lockHoverHighlight = l.first; @@ -460,7 +460,7 @@ void View::DrawOptions() { for( const auto& l : m_worker.GetLockMap() ) { - if( l.second->threadList.size() == 1 ) Vis( l.second ).visible = true; + if( l.second->threadList.size() == 1 ) m_tc.Vis( l.second ).visible = true; } } ImGui::SameLine(); @@ -468,7 +468,7 @@ void View::DrawOptions() { for( const auto& l : m_worker.GetLockMap() ) { - if( l.second->threadList.size() == 1 ) Vis( l.second ).visible = false; + if( l.second->threadList.size() == 1 ) m_tc.Vis( l.second ).visible = false; } } @@ -488,7 +488,7 @@ void View::DrawOptions() { sprintf( buf, "%" PRIu32 ": %s", l.first, m_worker.GetString( m_worker.GetSourceLocation( l.second->srcloc ).function ) ); } - SmallCheckbox( buf, &Vis( l.second ).visible ); + SmallCheckbox( buf, &m_tc.Vis( l.second ).visible ); if( ImGui::IsItemHovered() ) { m_lockHoverHighlight = l.first; @@ -548,7 +548,7 @@ void View::DrawOptions() { for( const auto& p : m_worker.GetPlots() ) { - Vis( p ).visible = true; + m_tc.Vis( p ).visible = true; } } ImGui::SameLine(); @@ -556,7 +556,7 @@ void View::DrawOptions() { for( const auto& p : m_worker.GetPlots() ) { - Vis( p ).visible = false; + m_tc.Vis( p ).visible = false; } } @@ -564,7 +564,7 @@ void View::DrawOptions() { SmallColorBox( GetPlotColor( p ) ); ImGui::SameLine(); - SmallCheckbox( GetPlotName( p ), &Vis( p ).visible ); + SmallCheckbox( GetPlotName( p ), &m_tc.Vis( p ).visible ); ImGui::SameLine(); ImGui::TextDisabled( "%s data points", RealToString( p->data.size() ) ); } @@ -585,7 +585,7 @@ void View::DrawOptions() { for( const auto& t : m_threadOrder ) { - Vis( t ).visible = true; + m_tc.Vis( t ).visible = true; } } ImGui::SameLine(); @@ -593,7 +593,7 @@ void View::DrawOptions() { for( const auto& t : m_threadOrder ) { - Vis( t ).visible = false; + m_tc.Vis( t ).visible = false; } } @@ -608,7 +608,7 @@ void View::DrawOptions() const auto threadColor = GetThreadColor( t->id, 0 ); SmallColorBox( threadColor ); ImGui::SameLine(); - SmallCheckbox( threadName, &Vis( t ).visible ); + SmallCheckbox( threadName, &m_tc.Vis( t ).visible ); if( ImGui::BeginDragDropSource( ImGuiDragDropFlags_SourceNoHoldToOpenOthers ) ) { ImGui::SetDragDropPayload( "ThreadOrder", &idx, sizeof(int) ); @@ -704,7 +704,7 @@ void View::DrawOptions() { for( const auto& fd : m_worker.GetFrames() ) { - Vis( fd ).visible = true; + m_tc.Vis( fd ).visible = true; } } ImGui::SameLine(); @@ -712,7 +712,7 @@ void View::DrawOptions() { for( const auto& fd : m_worker.GetFrames() ) { - Vis( fd ).visible = false; + m_tc.Vis( fd ).visible = false; } } @@ -720,7 +720,7 @@ void View::DrawOptions() for( const auto& fd : m_worker.GetFrames() ) { ImGui::PushID( idx++ ); - SmallCheckbox( GetFrameSetName( *fd ), &Vis( fd ).visible ); + SmallCheckbox( GetFrameSetName( *fd ), &m_tc.Vis( fd ).visible ); ImGui::PopID(); ImGui::SameLine(); ImGui::TextDisabled( "%s %sframes", RealToString( fd->frames.size() ), fd->continuous ? "" : "discontinuous " ); diff --git a/server/TracyView_Plots.cpp b/server/TracyView_Plots.cpp index 4d4ec5d8..83ee3da3 100644 --- a/server/TracyView_Plots.cpp +++ b/server/TracyView_Plots.cpp @@ -89,7 +89,7 @@ int View::DrawPlots( int offset, double pxns, const ImVec2& wpos, bool hover, fl for( const auto& v : m_worker.GetPlots() ) { - auto& vis = Vis( v ); + auto& vis = m_tc.Vis( v ); if( !vis.visible ) { vis.height = 0; @@ -101,7 +101,7 @@ int View::DrawPlots( int offset, double pxns, const ImVec2& wpos, bool hover, fl ImGui::PushID( &vis ); float txtx = 0; - const auto yPos = AdjustThreadPosition( vis, wpos.y, offset ); + const auto yPos = m_tc.AdjustThreadPosition( vis, wpos.y, offset ); const auto oldOffset = offset; ImGui::PushClipRect( wpos + ImVec2( 0, offset ), wpos + ImVec2( w, offset + vis.height ), true ); if( yPos + ty >= yMin && yPos <= yMax ) @@ -426,7 +426,7 @@ int View::DrawPlots( int offset, double pxns, const ImVec2& wpos, bool hover, fl } offset += 0.2 * ty; - AdjustThreadHeight( vis, oldOffset, offset ); + m_tc.AdjustThreadHeight( vis, oldOffset, offset ); ImGui::PopClipRect(); ImGui::PopID(); } diff --git a/server/TracyView_Timeline.cpp b/server/TracyView_Timeline.cpp index 38be35f0..2b8b803f 100644 --- a/server/TracyView_Timeline.cpp +++ b/server/TracyView_Timeline.cpp @@ -13,47 +13,6 @@ constexpr float MinVisSize = 3; extern double s_time; -float View::AdjustThreadPosition( View::VisData& vis, float wy, int& offset ) -{ - if( vis.offset < offset ) - { - vis.offset = offset; - } - else if( vis.offset > offset ) - { - const auto diff = vis.offset - offset; - const auto move = std::max( 2.0, diff * 10.0 * ImGui::GetIO().DeltaTime ); - offset = vis.offset = int( std::max( vis.offset - move, offset ) ); - } - - return offset + wy; -} - -void View::AdjustThreadHeight( View::VisData& vis, int oldOffset, int& offset ) -{ - const auto h = offset - oldOffset; - if( vis.height > h ) - { - vis.height = h; - offset = oldOffset + vis.height; - } - else if( vis.height < h ) - { - if( m_firstFrame ) - { - vis.height = h; - offset = oldOffset + h; - } - else - { - const auto diff = h - vis.height; - const auto move = std::max( 2.0, diff * 10.0 * ImGui::GetIO().DeltaTime ); - vis.height = int( std::min( vis.height + move, h ) ); - offset = oldOffset + vis.height; - } - } -} - void View::HandleTimelineMouse( int64_t timespan, const ImVec2& wpos, float w, double& pxns ) { assert( timespan > 0 ); @@ -264,7 +223,7 @@ void View::DrawTimeline() auto& frames = m_worker.GetFrames(); for( auto fd : frames ) { - if( Vis( fd ).visible ) + if( m_tc.Vis( fd ).visible ) { DrawTimelineFrames( *fd ); } @@ -310,7 +269,7 @@ void View::DrawTimeline() for( size_t i=0; iid ) { - auto& vis = Vis( v ); + auto& vis = m_tc.Vis( v ); vis.height = 0; vis.offset = 0; offset = oldOffset; @@ -831,7 +790,7 @@ void View::DrawTimeline() float ghostSz; if( hasGhostZones && !v->timeline.empty() ) { - auto& vis = Vis( v ); + auto& vis = m_tc.Vis( v ); const auto color = vis.ghost ? 0xFFAA9999 : 0x88AA7777; draw->AddText( wpos + ImVec2( 1.5f * ty + txtsz.x, oldOffset ), color, ICON_FA_GHOST ); ghostSz = ImGui::CalcTextSize( ICON_FA_GHOST ).x; @@ -845,7 +804,7 @@ void View::DrawTimeline() { if( IsMouseClicked( 0 ) ) { - auto& vis = Vis( v ); + auto& vis = m_tc.Vis( v ); vis.ghost = !vis.ghost; } } @@ -973,7 +932,7 @@ void View::DrawTimeline() if( IsMouseClicked( 0 ) ) { - Vis( v ).showFull = !showFull; + m_tc.Vis( v ).showFull = !showFull; } if( last >= 0 && IsMouseClicked( 2 ) ) { @@ -997,7 +956,7 @@ void View::DrawTimeline() ImGui::EndPopup(); } - AdjustThreadHeight( Vis( v ), oldOffset, offset ); + m_tc.AdjustThreadHeight( m_tc.Vis( v ), oldOffset, offset ); ImGui::PopClipRect(); ImGui::PopID(); }