mirror of
https://github.com/wolfpld/tracy.git
synced 2024-11-26 16:04:34 +00:00
Fix zone depth calculation.
This commit is contained in:
parent
a0a397207d
commit
c1090a3116
@ -1367,7 +1367,7 @@ void View::DrawZones()
|
|||||||
|
|
||||||
m_lastCpu = -1;
|
m_lastCpu = -1;
|
||||||
auto depth = DrawZoneLevel( v->timeline, hover, pxns, wpos, offset, 0 );
|
auto depth = DrawZoneLevel( v->timeline, hover, pxns, wpos, offset, 0 );
|
||||||
offset += ostep * ( depth + 1 );
|
offset += ostep * depth;
|
||||||
|
|
||||||
depth = DrawLocks( v->id, hover, pxns, wpos, offset, nextLockHighlight );
|
depth = DrawLocks( v->id, hover, pxns, wpos, offset, nextLockHighlight );
|
||||||
offset += ostep * ( depth + 0.2f );
|
offset += ostep * ( depth + 0.2f );
|
||||||
@ -1377,168 +1377,171 @@ void View::DrawZones()
|
|||||||
|
|
||||||
int View::DrawZoneLevel( const Vector<Event*>& vec, bool hover, double pxns, const ImVec2& wpos, int _offset, int depth )
|
int View::DrawZoneLevel( const Vector<Event*>& vec, bool hover, double pxns, const ImVec2& wpos, int _offset, int depth )
|
||||||
{
|
{
|
||||||
int maxdepth = depth;
|
|
||||||
auto it = std::lower_bound( vec.begin(), vec.end(), m_zvStart - m_delay, [] ( const auto& l, const auto& r ) { return l->end < r; } );
|
auto it = std::lower_bound( vec.begin(), vec.end(), m_zvStart - m_delay, [] ( const auto& l, const auto& r ) { return l->end < r; } );
|
||||||
if( it != vec.end() )
|
if( it == vec.end() ) return depth;
|
||||||
|
|
||||||
|
const auto zitend = std::lower_bound( vec.begin(), vec.end(), m_zvEnd + m_resolution, [] ( const auto& l, const auto& r ) { return l->start < r; } );
|
||||||
|
if( it == zitend ) return depth;
|
||||||
|
|
||||||
|
const auto w = ImGui::GetWindowContentRegionWidth();
|
||||||
|
const auto ty = ImGui::GetFontSize();
|
||||||
|
const auto ostep = ty + 1;
|
||||||
|
const auto offset = _offset + ostep * depth;
|
||||||
|
auto draw = ImGui::GetWindowDrawList();
|
||||||
|
const auto dsz = m_delay * pxns;
|
||||||
|
const auto rsz = m_resolution * pxns;
|
||||||
|
|
||||||
|
depth++;
|
||||||
|
int maxdepth = depth;
|
||||||
|
|
||||||
|
while( it < zitend )
|
||||||
{
|
{
|
||||||
const auto w = ImGui::GetWindowContentRegionWidth();
|
auto& ev = **it;
|
||||||
const auto ty = ImGui::GetFontSize();
|
auto& srcloc = GetSourceLocation( ev.srcloc );
|
||||||
const auto ostep = ty + 1;
|
const auto color = GetZoneColor( srcloc );
|
||||||
const auto offset = _offset + ostep * depth;
|
const auto end = GetZoneEnd( ev );
|
||||||
auto draw = ImGui::GetWindowDrawList();
|
const auto zsz = ( end - ev.start ) * pxns;
|
||||||
const auto dsz = m_delay * pxns;
|
if( zsz < MinVisSize )
|
||||||
const auto rsz = m_resolution * pxns;
|
|
||||||
|
|
||||||
const auto zitend = std::lower_bound( vec.begin(), vec.end(), m_zvEnd + m_resolution, [] ( const auto& l, const auto& r ) { return l->start < r; } );
|
|
||||||
while( it < zitend )
|
|
||||||
{
|
{
|
||||||
auto& ev = **it;
|
int num = 1;
|
||||||
auto& srcloc = GetSourceLocation( ev.srcloc );
|
const auto px0 = ( ev.start - m_zvStart ) * pxns;
|
||||||
const auto color = GetZoneColor( srcloc );
|
auto px1 = ( end - m_zvStart ) * pxns;
|
||||||
const auto end = GetZoneEnd( ev );
|
auto rend = end;
|
||||||
const auto zsz = ( end - ev.start ) * pxns;
|
for(;;)
|
||||||
if( zsz < MinVisSize )
|
|
||||||
{
|
{
|
||||||
int num = 1;
|
++it;
|
||||||
const auto px0 = ( ev.start - m_zvStart ) * pxns;
|
if( it == zitend ) break;
|
||||||
auto px1 = ( end - m_zvStart ) * pxns;
|
auto& srcloc2 = GetSourceLocation( (*it)->srcloc );
|
||||||
auto rend = end;
|
if( srcloc.color != srcloc2.color ) break;
|
||||||
for(;;)
|
const auto nend = GetZoneEnd( **it );
|
||||||
{
|
const auto pxnext = ( nend - m_zvStart ) * pxns;
|
||||||
++it;
|
if( pxnext - px1 >= MinVisSize * 2 ) break;
|
||||||
if( it == zitend ) break;
|
px1 = pxnext;
|
||||||
auto& srcloc2 = GetSourceLocation( (*it)->srcloc );
|
rend = nend;
|
||||||
if( srcloc.color != srcloc2.color ) break;
|
num++;
|
||||||
const auto nend = GetZoneEnd( **it );
|
}
|
||||||
const auto pxnext = ( nend - m_zvStart ) * pxns;
|
draw->AddRectFilled( wpos + ImVec2( std::max( px0, -10.0 ), offset ), wpos + ImVec2( std::min( px1, double( w + 10 ) ), offset + ty ), color, 2.f );
|
||||||
if( pxnext - px1 >= MinVisSize * 2 ) break;
|
if( hover && ImGui::IsMouseHoveringRect( wpos + ImVec2( std::max( px0, -10.0 ), offset ), wpos + ImVec2( std::min( px1, double( w + 10 ) ), offset + ty ) ) )
|
||||||
px1 = pxnext;
|
{
|
||||||
rend = nend;
|
ImGui::BeginTooltip();
|
||||||
num++;
|
ImGui::Text( "Zones too small to display: %i", num );
|
||||||
}
|
ImGui::Text( "Execution time: %s", TimeToString( rend - ev.start ) );
|
||||||
draw->AddRectFilled( wpos + ImVec2( std::max( px0, -10.0 ), offset ), wpos + ImVec2( std::min( px1, double( w + 10 ) ), offset + ty ), color, 2.f );
|
ImGui::EndTooltip();
|
||||||
if( hover && ImGui::IsMouseHoveringRect( wpos + ImVec2( std::max( px0, -10.0 ), offset ), wpos + ImVec2( std::min( px1, double( w + 10 ) ), offset + ty ) ) )
|
|
||||||
{
|
|
||||||
ImGui::BeginTooltip();
|
|
||||||
ImGui::Text( "Zones too small to display: %i", num );
|
|
||||||
ImGui::Text( "Execution time: %s", TimeToString( rend - ev.start ) );
|
|
||||||
ImGui::EndTooltip();
|
|
||||||
|
|
||||||
if( ImGui::IsMouseClicked( 2 ) && rend - ev.start > 0 )
|
if( ImGui::IsMouseClicked( 2 ) && rend - ev.start > 0 )
|
||||||
{
|
|
||||||
m_zvStartNext = ev.start;
|
|
||||||
m_zvEndNext = rend;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
char tmp[32];
|
|
||||||
sprintf( tmp, "%i", num );
|
|
||||||
const auto tsz = ImGui::CalcTextSize( tmp );
|
|
||||||
if( tsz.x < px1 - px0 )
|
|
||||||
{
|
{
|
||||||
const auto x = px0 + ( px1 - px0 - tsz.x ) / 2;
|
m_zvStartNext = ev.start;
|
||||||
draw->AddText( wpos + ImVec2( x, offset ), 0xFF4488DD, tmp );
|
m_zvEndNext = rend;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
char tmp[32];
|
||||||
|
sprintf( tmp, "%i", num );
|
||||||
|
const auto tsz = ImGui::CalcTextSize( tmp );
|
||||||
|
if( tsz.x < px1 - px0 )
|
||||||
|
{
|
||||||
|
const auto x = px0 + ( px1 - px0 - tsz.x ) / 2;
|
||||||
|
draw->AddText( wpos + ImVec2( x, offset ), 0xFF4488DD, tmp );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const char* zoneName;
|
||||||
|
if( ev.text && ev.text->zoneName )
|
||||||
|
{
|
||||||
|
zoneName = GetString( ev.text->zoneName );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
zoneName = GetString( srcloc.function );
|
||||||
|
}
|
||||||
|
|
||||||
|
int dmul = 1;
|
||||||
|
if( ev.text )
|
||||||
|
{
|
||||||
|
if( ev.text->zoneName ) dmul++;
|
||||||
|
if( ev.text->userText ) dmul++;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool migration = false;
|
||||||
|
if( m_lastCpu != ev.cpu_start )
|
||||||
|
{
|
||||||
|
if( m_lastCpu != -1 )
|
||||||
|
{
|
||||||
|
migration = true;
|
||||||
|
}
|
||||||
|
m_lastCpu = ev.cpu_start;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !ev.child.empty() )
|
||||||
|
{
|
||||||
|
const auto d = DrawZoneLevel( ev.child, hover, pxns, wpos, _offset, depth );
|
||||||
|
if( d > maxdepth ) maxdepth = d;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ev.end != -1 && m_lastCpu != ev.cpu_end )
|
||||||
|
{
|
||||||
|
m_lastCpu = ev.cpu_end;
|
||||||
|
migration = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto tsz = ImGui::CalcTextSize( zoneName );
|
||||||
|
const auto pr0 = ( ev.start - m_zvStart ) * pxns;
|
||||||
|
const auto pr1 = ( end - m_zvStart ) * pxns;
|
||||||
|
const auto px0 = std::max( pr0, -10.0 );
|
||||||
|
const auto px1 = std::min( pr1, double( w + 10 ) );
|
||||||
|
draw->AddRectFilled( wpos + ImVec2( px0, offset ), wpos + ImVec2( px1, offset + tsz.y ), color, 2.f );
|
||||||
|
draw->AddRect( wpos + ImVec2( px0, offset ), wpos + ImVec2( px1, offset + tsz.y ), GetZoneHighlight( ev, migration ), 2.f, -1, GetZoneThickness( ev ) );
|
||||||
|
if( dsz * dmul >= MinVisSize )
|
||||||
|
{
|
||||||
|
draw->AddRectFilled( wpos + ImVec2( pr0, offset ), wpos + ImVec2( std::min( pr0+dsz*dmul, pr1 ), offset + tsz.y ), 0x882222DD, 2.f );
|
||||||
|
draw->AddRectFilled( wpos + ImVec2( pr1, offset ), wpos + ImVec2( pr1+dsz, offset + tsz.y ), 0x882222DD, 2.f );
|
||||||
|
}
|
||||||
|
if( rsz >= MinVisSize )
|
||||||
|
{
|
||||||
|
draw->AddLine( wpos + ImVec2( pr0 + rsz, offset + tsz.y/2 ), wpos + ImVec2( pr0 - rsz, offset + tsz.y/2 ), 0xAAFFFFFF );
|
||||||
|
draw->AddLine( wpos + ImVec2( pr0 + rsz, offset + tsz.y/4 ), wpos + ImVec2( pr0 + rsz, offset + 3*tsz.y/4 ), 0xAAFFFFFF );
|
||||||
|
draw->AddLine( wpos + ImVec2( pr0 - rsz, offset + tsz.y/4 ), wpos + ImVec2( pr0 - rsz, offset + 3*tsz.y/4 ), 0xAAFFFFFF );
|
||||||
|
|
||||||
|
draw->AddLine( wpos + ImVec2( pr1 + rsz, offset + tsz.y/2 ), wpos + ImVec2( pr1 - rsz, offset + tsz.y/2 ), 0xAAFFFFFF );
|
||||||
|
draw->AddLine( wpos + ImVec2( pr1 + rsz, offset + tsz.y/4 ), wpos + ImVec2( pr1 + rsz, offset + 3*tsz.y/4 ), 0xAAFFFFFF );
|
||||||
|
draw->AddLine( wpos + ImVec2( pr1 - rsz, offset + tsz.y/4 ), wpos + ImVec2( pr1 - rsz, offset + 3*tsz.y/4 ), 0xAAFFFFFF );
|
||||||
|
}
|
||||||
|
if( tsz.x < zsz )
|
||||||
|
{
|
||||||
|
const auto x = ( ev.start - m_zvStart ) * pxns + ( ( end - ev.start ) * pxns - tsz.x ) / 2;
|
||||||
|
if( x < 0 || x > w - tsz.x )
|
||||||
|
{
|
||||||
|
ImGui::PushClipRect( wpos + ImVec2( px0, offset ), wpos + ImVec2( px1, offset + tsz.y * 2 ), true );
|
||||||
|
draw->AddText( wpos + ImVec2( std::max( std::max( 0., px0 ), std::min( double( w - tsz.x ), x ) ), offset ), 0xFFFFFFFF, zoneName );
|
||||||
|
ImGui::PopClipRect();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
draw->AddText( wpos + ImVec2( x, offset ), 0xFFFFFFFF, zoneName );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const char* zoneName;
|
ImGui::PushClipRect( wpos + ImVec2( px0, offset ), wpos + ImVec2( px1, offset + tsz.y * 2 ), true );
|
||||||
if( ev.text && ev.text->zoneName )
|
draw->AddText( wpos + ImVec2( ( ev.start - m_zvStart ) * pxns, offset ), 0xFFFFFFFF, zoneName );
|
||||||
{
|
ImGui::PopClipRect();
|
||||||
zoneName = GetString( ev.text->zoneName );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
zoneName = GetString( srcloc.function );
|
|
||||||
}
|
|
||||||
|
|
||||||
int dmul = 1;
|
|
||||||
if( ev.text )
|
|
||||||
{
|
|
||||||
if( ev.text->zoneName ) dmul++;
|
|
||||||
if( ev.text->userText ) dmul++;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool migration = false;
|
|
||||||
if( m_lastCpu != ev.cpu_start )
|
|
||||||
{
|
|
||||||
if( m_lastCpu != -1 )
|
|
||||||
{
|
|
||||||
migration = true;
|
|
||||||
}
|
|
||||||
m_lastCpu = ev.cpu_start;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !ev.child.empty() )
|
|
||||||
{
|
|
||||||
const auto d = DrawZoneLevel( ev.child, hover, pxns, wpos, _offset, depth+1 );
|
|
||||||
if( d > maxdepth ) maxdepth = d;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( ev.end != -1 && m_lastCpu != ev.cpu_end )
|
|
||||||
{
|
|
||||||
m_lastCpu = ev.cpu_end;
|
|
||||||
migration = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto tsz = ImGui::CalcTextSize( zoneName );
|
|
||||||
const auto pr0 = ( ev.start - m_zvStart ) * pxns;
|
|
||||||
const auto pr1 = ( end - m_zvStart ) * pxns;
|
|
||||||
const auto px0 = std::max( pr0, -10.0 );
|
|
||||||
const auto px1 = std::min( pr1, double( w + 10 ) );
|
|
||||||
draw->AddRectFilled( wpos + ImVec2( px0, offset ), wpos + ImVec2( px1, offset + tsz.y ), color, 2.f );
|
|
||||||
draw->AddRect( wpos + ImVec2( px0, offset ), wpos + ImVec2( px1, offset + tsz.y ), GetZoneHighlight( ev, migration ), 2.f, -1, GetZoneThickness( ev ) );
|
|
||||||
if( dsz * dmul >= MinVisSize )
|
|
||||||
{
|
|
||||||
draw->AddRectFilled( wpos + ImVec2( pr0, offset ), wpos + ImVec2( std::min( pr0+dsz*dmul, pr1 ), offset + tsz.y ), 0x882222DD, 2.f );
|
|
||||||
draw->AddRectFilled( wpos + ImVec2( pr1, offset ), wpos + ImVec2( pr1+dsz, offset + tsz.y ), 0x882222DD, 2.f );
|
|
||||||
}
|
|
||||||
if( rsz >= MinVisSize )
|
|
||||||
{
|
|
||||||
draw->AddLine( wpos + ImVec2( pr0 + rsz, offset + tsz.y/2 ), wpos + ImVec2( pr0 - rsz, offset + tsz.y/2 ), 0xAAFFFFFF );
|
|
||||||
draw->AddLine( wpos + ImVec2( pr0 + rsz, offset + tsz.y/4 ), wpos + ImVec2( pr0 + rsz, offset + 3*tsz.y/4 ), 0xAAFFFFFF );
|
|
||||||
draw->AddLine( wpos + ImVec2( pr0 - rsz, offset + tsz.y/4 ), wpos + ImVec2( pr0 - rsz, offset + 3*tsz.y/4 ), 0xAAFFFFFF );
|
|
||||||
|
|
||||||
draw->AddLine( wpos + ImVec2( pr1 + rsz, offset + tsz.y/2 ), wpos + ImVec2( pr1 - rsz, offset + tsz.y/2 ), 0xAAFFFFFF );
|
|
||||||
draw->AddLine( wpos + ImVec2( pr1 + rsz, offset + tsz.y/4 ), wpos + ImVec2( pr1 + rsz, offset + 3*tsz.y/4 ), 0xAAFFFFFF );
|
|
||||||
draw->AddLine( wpos + ImVec2( pr1 - rsz, offset + tsz.y/4 ), wpos + ImVec2( pr1 - rsz, offset + 3*tsz.y/4 ), 0xAAFFFFFF );
|
|
||||||
}
|
|
||||||
if( tsz.x < zsz )
|
|
||||||
{
|
|
||||||
const auto x = ( ev.start - m_zvStart ) * pxns + ( ( end - ev.start ) * pxns - tsz.x ) / 2;
|
|
||||||
if( x < 0 || x > w - tsz.x )
|
|
||||||
{
|
|
||||||
ImGui::PushClipRect( wpos + ImVec2( px0, offset ), wpos + ImVec2( px1, offset + tsz.y * 2 ), true );
|
|
||||||
draw->AddText( wpos + ImVec2( std::max( std::max( 0., px0 ), std::min( double( w - tsz.x ), x ) ), offset ), 0xFFFFFFFF, zoneName );
|
|
||||||
ImGui::PopClipRect();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
draw->AddText( wpos + ImVec2( x, offset ), 0xFFFFFFFF, zoneName );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ImGui::PushClipRect( wpos + ImVec2( px0, offset ), wpos + ImVec2( px1, offset + tsz.y * 2 ), true );
|
|
||||||
draw->AddText( wpos + ImVec2( ( ev.start - m_zvStart ) * pxns, offset ), 0xFFFFFFFF, zoneName );
|
|
||||||
ImGui::PopClipRect();
|
|
||||||
}
|
|
||||||
|
|
||||||
if( hover && ImGui::IsMouseHoveringRect( wpos + ImVec2( px0, offset ), wpos + ImVec2( px1, offset + tsz.y ) ) )
|
|
||||||
{
|
|
||||||
ZoneTooltip( ev );
|
|
||||||
|
|
||||||
if( m_zvStartNext == 0 && ImGui::IsMouseClicked( 2 ) )
|
|
||||||
{
|
|
||||||
ZoomToZone( ev );
|
|
||||||
}
|
|
||||||
if( ImGui::IsMouseClicked( 0 ) )
|
|
||||||
{
|
|
||||||
m_zoneInfoWindow = &ev;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
++it;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( hover && ImGui::IsMouseHoveringRect( wpos + ImVec2( px0, offset ), wpos + ImVec2( px1, offset + tsz.y ) ) )
|
||||||
|
{
|
||||||
|
ZoneTooltip( ev );
|
||||||
|
|
||||||
|
if( m_zvStartNext == 0 && ImGui::IsMouseClicked( 2 ) )
|
||||||
|
{
|
||||||
|
ZoomToZone( ev );
|
||||||
|
}
|
||||||
|
if( ImGui::IsMouseClicked( 0 ) )
|
||||||
|
{
|
||||||
|
m_zoneInfoWindow = &ev;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
++it;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return maxdepth;
|
return maxdepth;
|
||||||
|
Loading…
Reference in New Issue
Block a user