Move vis data to timeline controller.

This commit is contained in:
Bartosz Taudul 2022-08-20 17:02:29 +02:00
parent 49bda91be5
commit 655d8a01ea
No known key found for this signature in database
GPG Key ID: B7FE2008B7575DF3
10 changed files with 120 additions and 104 deletions

View File

@ -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<double>( 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<double>( vis.height + move, h ) );
offset = oldOffset + vis.height;
}
}
}
}

View File

@ -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<const void*, VisData>& 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<const void*, VisData> m_visData;
float m_height;
float m_offset;
float m_scroll;
bool m_firstFrame;
};
}

View File

@ -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<std::chrono::milliseconds>( now - m_firstFrameTime ).count() > 500 )
{
m_firstFrame = false;
m_tc.FirstFrameExpired();
}
}
}

View File

@ -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<const void*, VisData> m_visData;
unordered_flat_map<uint64_t, bool> m_visibleMsgThread;
unordered_flat_map<uint64_t, bool> m_waitStackThread;
unordered_flat_map<const void*, int> m_gpuDrift;
@ -338,16 +328,6 @@ private:
Vector<const ThreadData*> m_threadOrder;
Vector<float> 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 );

View File

@ -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();

View File

@ -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 );

View File

@ -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 )
{

View File

@ -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 " );

View File

@ -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();
}

View File

@ -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<double>( 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<double>( 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; i<m_worker.GetGpuData().size(); i++ )
{
const auto& v = m_worker.GetGpuData()[i];
auto& vis = Vis( v );
auto& vis = m_tc.Vis( v );
if( !vis.visible )
{
vis.height = 0;
@ -320,7 +279,7 @@ void View::DrawTimeline()
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, oldOffset + vis.height ), true );
@ -585,7 +544,7 @@ void View::DrawTimeline()
ImGui::EndPopup();
}
AdjustThreadHeight( vis, oldOffset, offset );
m_tc.AdjustThreadHeight( vis, oldOffset, offset );
ImGui::PopClipRect();
ImGui::PopID();
}
@ -611,7 +570,7 @@ void View::DrawTimeline()
LockHighlight nextLockHighlight { -1 };
for( const auto& v : m_threadOrder )
{
auto& vis = Vis( v );
auto& vis = m_tc.Vis( v );
if( !vis.visible )
{
vis.height = 0;
@ -621,7 +580,7 @@ void View::DrawTimeline()
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 );
@ -691,7 +650,7 @@ void View::DrawTimeline()
if( !m_vd.drawEmptyLabels && showFull && depth == 0 && msgit == msgend && crash.thread != v->id )
{
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();
}