Skip to content

Commit eaa7f80

Browse files
author
Eric Eaton
committed
Eliminate the function GetZoneCtx
The function GetZoneCtx isn't needed. This patch introduces a small structure to help transport the context around to avoid the expensive search. The GPU timeline function take the context as a parameter now instead of the thread ID, since the supplied thread ID is derived from the context in every invocation.
1 parent 58c22dd commit eaa7f80

File tree

7 files changed

+102
-128
lines changed

7 files changed

+102
-128
lines changed

profiler/src/profiler/TracyView.hpp

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -255,11 +255,11 @@ class View
255255
void DrawZoneList( const TimelineContext& ctx, const std::vector<TimelineDraw>& drawList, int offset, uint64_t tid, int maxDepth, double margin );
256256
void DrawThreadCropper( const int depth, const uint64_t tid, const float xPos, const float yPos, const float ostep, const float cropperWidth, const bool hasCtxSwitches );
257257
void DrawContextSwitchList( const TimelineContext& ctx, const std::vector<ContextSwitchDraw>& drawList, const Vector<ContextSwitchData>& ctxSwitch, int offset, int endOffset, bool isFiber );
258-
int DispatchGpuZoneLevel( const Vector<short_ptr<ZoneEvent>>& vec, bool hover, double pxns, int64_t nspx, const ImVec2& wpos, int offset, int depth, uint64_t thread, float yMin, float yMax, int64_t begin, int drift );
258+
int DispatchGpuZoneLevel( const Vector<short_ptr<ZoneEvent>>& vec, bool hover, double pxns, int64_t nspx, const ImVec2& wpos, int offset, int depth, const GpuCtxData* ctx, float yMin, float yMax, int64_t begin, int drift );
259259
template<typename Adapter, typename V>
260-
int DrawGpuZoneLevel( const V& vec, bool hover, double pxns, int64_t nspx, const ImVec2& wpos, int offset, int depth, uint64_t thread, float yMin, float yMax, int64_t begin, int drift );
260+
int DrawGpuZoneLevel( const V& vec, bool hover, double pxns, int64_t nspx, const ImVec2& wpos, int offset, int depth, const GpuCtxData* ctx, float yMin, float yMax, int64_t begin, int drift );
261261
template<typename Adapter, typename V>
262-
int SkipGpuZoneLevel( const V& vec, bool hover, double pxns, int64_t nspx, const ImVec2& wpos, int offset, int depth, uint64_t thread, float yMin, float yMax, int64_t begin, int drift );
262+
int SkipGpuZoneLevel( const V& vec, bool hover, double pxns, int64_t nspx, const ImVec2& wpos, int offset, int depth, const GpuCtxData* ctx, float yMin, float yMax, int64_t begin, int drift );
263263
void DrawLockHeader( uint32_t id, const LockMap& lockmap, const SourceLocation& srcloc, bool hover, ImDrawList* draw, const ImVec2& wpos, float w, float ty, float offset, uint8_t tid );
264264
int DrawLocks( const TimelineContext& ctx, const std::vector<std::unique_ptr<LockDraw>>& lockDraw, uint64_t tid, int _offset, LockHighlight& highlight );
265265
void DrawPlotPoint( const ImVec2& wpos, float x, float y, int offset, uint32_t color, bool hover, bool hasPrev, const PlotItem& item, double prev, PlotType type, PlotValueFormatting format, float PlotHeight, uint64_t name );
@@ -320,7 +320,7 @@ class View
320320
template<typename Adapter, typename V>
321321
void DrawZoneInfoChildren( const V& children, int64_t ztime );
322322
template<typename Adapter, typename V>
323-
void DrawGpuInfoChildren( const V& children, int64_t ztime );
323+
void DrawGpuInfoChildren( const V& children, int64_t ztime, const GpuCtxData* ctx );
324324

325325
void HandleRange( Range& range, int64_t timespan, const ImVec2& wpos, float w );
326326
void HandleTimelineMouse( int64_t timespan, const ImVec2& wpos, float w );
@@ -338,16 +338,16 @@ class View
338338
ZoneColorData GetZoneColorData( const ZoneEvent& ev );
339339

340340
void ZoomToZone( const ZoneEvent& ev );
341-
void ZoomToZoneGPU( const ZoneEvent& ev );
341+
void ZoomToZoneGPU( const ZoneEventC ev );
342342
void ZoomToPrevFrame();
343343
void ZoomToNextFrame();
344344
void CenterAtTime( int64_t t );
345345

346346
void ShowZoneInfo( const ZoneEvent& ev );
347-
void ShowZoneInfo( const ZoneEvent& ev, uint64_t thread );
347+
void ShowZoneInfo( const ZoneEventC ev, uint64_t thread );
348348

349349
void ZoneTooltip( const ZoneEvent& ev );
350-
void ZoneTooltipGPU( const ZoneEvent& ev );
350+
void ZoneTooltipGPU( const ZoneEventC ev );
351351
void CallstackTooltip( uint32_t idx );
352352
void CallstackTooltipContents( uint32_t idx );
353353
void CrashTooltip();
@@ -357,11 +357,10 @@ class View
357357
const ZoneEvent* GetZoneChild( const ZoneEvent& zone, int64_t time ) const;
358358
bool IsZoneReentry( const ZoneEvent& zone ) const;
359359
bool IsZoneReentry( const ZoneEvent& zone, uint64_t tid ) const;
360-
const ZoneEvent* GetZoneParentGPU( const ZoneEvent& zone ) const;
360+
ZoneEventC GetZoneParentGPU( const ZoneEventC zone ) const;
361361
const ThreadData* GetZoneThreadData( const ZoneEvent& zone ) const;
362362
uint64_t GetZoneThread( const ZoneEvent& zone ) const;
363363
uint64_t GetZoneThreadGPU( const EventAdapter<true>& zone ) const;
364-
const GpuCtxData* GetZoneCtx( const ZoneEvent& zone ) const;
365364
bool FindMatchingZone( int prev0, int prev1, int flags );
366365
const ZoneEvent* FindZoneAtTime( uint64_t thread, int64_t time ) const;
367366
uint64_t GetFrameNumber( const FrameData& fd, int i ) const;
@@ -477,7 +476,7 @@ class View
477476
DecayValue<const MessageData*> m_msgHighlight = nullptr;
478477
DecayValue<uint32_t> m_lockHoverHighlight = InvalidId;
479478
DecayValue<const MessageData*> m_msgToFocus = nullptr;
480-
const ZoneEvent* m_gpuInfoWindow = nullptr;
479+
ZoneEventC m_gpuInfoWindow = {nullptr, nullptr};
481480
const ZoneEvent* m_gpuHighlight;
482481
uint64_t m_gpuInfoWindowThread;
483482
uint32_t m_callstackInfoWindow = 0;
@@ -573,7 +572,7 @@ class View
573572
BuzzAnim<uint32_t> m_statBuzzAnim;
574573

575574
Vector<const ZoneEvent*> m_zoneInfoStack;
576-
Vector<const ZoneEvent*> m_gpuInfoStack;
575+
Vector<ZoneEventC> m_gpuInfoStack;
577576

578577
SourceContents m_srcHintCache;
579578
std::unique_ptr<SourceView> m_sourceView;

profiler/src/profiler/TracyView_GpuTimeline.cpp

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ bool View::DrawGpu( const TimelineContext& ctx, const GpuCtxData& gpu, int& offs
4646
const auto begin = tlm.front().Start();
4747
const auto drift = GpuDrift( &gpu );
4848
if( !singleThread ) offset += sstep;
49-
const auto partDepth = DispatchGpuZoneLevel( tl, hover, pxns, int64_t( nspx ), wpos, offset, 0, gpu.thread, yMin, yMax, begin, drift );
49+
const auto partDepth = DispatchGpuZoneLevel( tl, hover, pxns, int64_t( nspx ), wpos, offset, 0, &gpu, yMin, yMax, begin, drift );
5050
if( partDepth != 0 )
5151
{
5252
if( !singleThread )
@@ -73,7 +73,7 @@ bool View::DrawGpu( const TimelineContext& ctx, const GpuCtxData& gpu, int& offs
7373
const auto begin = tl.front()->Start();
7474
const auto drift = GpuDrift( &gpu );
7575
if( !singleThread ) offset += sstep;
76-
const auto partDepth = DispatchGpuZoneLevel( tl, hover, pxns, int64_t( nspx ), wpos, offset, 0, gpu.thread, yMin, yMax, begin, drift );
76+
const auto partDepth = DispatchGpuZoneLevel( tl, hover, pxns, int64_t( nspx ), wpos, offset, 0, &gpu, yMin, yMax, begin, drift );
7777
if( partDepth != 0 )
7878
{
7979
if( !singleThread )
@@ -97,7 +97,7 @@ bool View::DrawGpu( const TimelineContext& ctx, const GpuCtxData& gpu, int& offs
9797
return depth != 0;
9898
}
9999

100-
int View::DispatchGpuZoneLevel( const Vector<short_ptr<ZoneEvent>>& vec, bool hover, double pxns, int64_t nspx, const ImVec2& wpos, int _offset, int depth, uint64_t thread, float yMin, float yMax, int64_t begin, int drift )
100+
int View::DispatchGpuZoneLevel( const Vector<short_ptr<ZoneEvent>>& vec, bool hover, double pxns, int64_t nspx, const ImVec2& wpos, int _offset, int depth, const GpuCtxData *ctx, float yMin, float yMax, int64_t begin, int drift )
101101
{
102102
const auto ty = ImGui::GetTextLineHeight();
103103
const auto ostep = ty + 1;
@@ -108,28 +108,28 @@ int View::DispatchGpuZoneLevel( const Vector<short_ptr<ZoneEvent>>& vec, bool ho
108108
{
109109
if( vec.is_magic() )
110110
{
111-
return DrawGpuZoneLevel<VectorAdapterDirect<ZoneEvent>>( *(Vector<ZoneEvent>*)&vec, hover, pxns, nspx, wpos, _offset, depth, thread, yMin, yMax, begin, drift );
111+
return DrawGpuZoneLevel<VectorAdapterDirect<ZoneEvent>>( *(Vector<ZoneEvent>*)&vec, hover, pxns, nspx, wpos, _offset, depth, ctx, yMin, yMax, begin, drift );
112112
}
113113
else
114114
{
115-
return DrawGpuZoneLevel<VectorAdapterPointer<ZoneEvent>>( vec, hover, pxns, nspx, wpos, _offset, depth, thread, yMin, yMax, begin, drift );
115+
return DrawGpuZoneLevel<VectorAdapterPointer<ZoneEvent>>( vec, hover, pxns, nspx, wpos, _offset, depth, ctx, yMin, yMax, begin, drift );
116116
}
117117
}
118118
else
119119
{
120120
if( vec.is_magic() )
121121
{
122-
return SkipGpuZoneLevel<VectorAdapterDirect<ZoneEvent>>( *(Vector<ZoneEvent>*)&vec, hover, pxns, nspx, wpos, _offset, depth, thread, yMin, yMax, begin, drift );
122+
return SkipGpuZoneLevel<VectorAdapterDirect<ZoneEvent>>( *(Vector<ZoneEvent>*)&vec, hover, pxns, nspx, wpos, _offset, depth, ctx, yMin, yMax, begin, drift );
123123
}
124124
else
125125
{
126-
return SkipGpuZoneLevel<VectorAdapterPointer<ZoneEvent>>( vec, hover, pxns, nspx, wpos, _offset, depth, thread, yMin, yMax, begin, drift );
126+
return SkipGpuZoneLevel<VectorAdapterPointer<ZoneEvent>>( vec, hover, pxns, nspx, wpos, _offset, depth, ctx, yMin, yMax, begin, drift );
127127
}
128128
}
129129
}
130130

131131
template<typename Adapter, typename V>
132-
int View::DrawGpuZoneLevel( const V& vec, bool hover, double pxns, int64_t nspx, const ImVec2& wpos, int _offset, int depth, uint64_t thread, float yMin, float yMax, int64_t begin, int drift )
132+
int View::DrawGpuZoneLevel( const V& vec, bool hover, double pxns, int64_t nspx, const ImVec2& wpos, int _offset, int depth, const GpuCtxData* ctx, float yMin, float yMax, int64_t begin, int drift )
133133
{
134134
// cast to uint64_t, so that unended zones (end = -1) are still drawn
135135
auto it = std::lower_bound( vec.begin(), vec.end(), std::max<int64_t>( 0, m_vd.zvStart ), [begin, drift] ( const auto& l, const auto& r ) { Adapter a; return (uint64_t)AdjustGpuTime( a(l).End(), begin, drift ) < (uint64_t)r; } );
@@ -159,6 +159,7 @@ int View::DrawGpuZoneLevel( const V& vec, bool hover, double pxns, int64_t nspx,
159159
const auto start = AdjustGpuTime( ev.GpuStart(), begin, drift );
160160
end = AdjustGpuTime( end, begin, drift );
161161
const auto zsz = std::max( ( end - start ) * pxns, pxns * 0.5 );
162+
const auto zoneThread = ctx->thread != 0 ? ctx->thread : m_worker.DecompressThread( ev.Thread() );
162163
if( zsz < MinVisSize )
163164
{
164165
const auto color = GetZoneColor( ev );
@@ -202,16 +203,15 @@ int View::DrawGpuZoneLevel( const V& vec, bool hover, double pxns, int64_t nspx,
202203
}
203204
else
204205
{
205-
const auto zoneThread = thread != 0 ? thread : m_worker.DecompressThread( ev.Thread() );
206-
ZoneTooltipGPU( ev );
206+
ZoneTooltipGPU( { &ev.event, ctx } );
207207

208208
if( IsMouseClicked( 2 ) && rend - start > 0 )
209209
{
210-
ZoomToZoneGPU( ev );
210+
ZoomToZoneGPU( { &ev.event, ctx } );
211211
}
212212
if( IsMouseClicked( 0 ) )
213213
{
214-
ShowZoneInfo( ev, zoneThread );
214+
ShowZoneInfo( { &ev.event, ctx }, zoneThread );
215215
}
216216

217217
m_gpuThread = zoneThread;
@@ -231,7 +231,7 @@ int View::DrawGpuZoneLevel( const V& vec, bool hover, double pxns, int64_t nspx,
231231
{
232232
if( ev.Child() >= 0 )
233233
{
234-
const auto d = DispatchGpuZoneLevel( m_worker.GetGpuChildren( ev.Child() ), hover, pxns, nspx, wpos, _offset, depth, thread, yMin, yMax, begin, drift );
234+
const auto d = DispatchGpuZoneLevel( m_worker.GetGpuChildren( ev.Child() ), hover, pxns, nspx, wpos, _offset, depth, ctx, yMin, yMax, begin, drift );
235235
if( d > maxdepth ) maxdepth = d;
236236
}
237237

@@ -288,16 +288,15 @@ int View::DrawGpuZoneLevel( const V& vec, bool hover, double pxns, int64_t nspx,
288288

289289
if( hover && ImGui::IsMouseHoveringRect( wpos + ImVec2( px0, offset ), wpos + ImVec2( px1, offset + tsz.y + 1 ) ) )
290290
{
291-
const auto zoneThread = thread != 0 ? thread : m_worker.DecompressThread( ev.thread );
292-
ZoneTooltipGPU( ev );
291+
ZoneTooltipGPU( { &ev.event, ctx } );
293292

294293
if( !m_zoomAnim.active && IsMouseClicked( 2 ) )
295294
{
296-
ZoomToZoneGPU( ev );
295+
ZoomToZoneGPU( { &ev.event, ctx } );
297296
}
298297
if( IsMouseClicked( 0 ) )
299298
{
300-
ShowZoneInfo( ev, zoneThread );
299+
ShowZoneInfo( { &ev.event, ctx }, zoneThread );
301300
}
302301

303302
m_gpuThread = zoneThread;
@@ -312,7 +311,7 @@ int View::DrawGpuZoneLevel( const V& vec, bool hover, double pxns, int64_t nspx,
312311
}
313312

314313
template<typename Adapter, typename V>
315-
int View::SkipGpuZoneLevel( const V& vec, bool hover, double pxns, int64_t nspx, const ImVec2& wpos, int _offset, int depth, uint64_t thread, float yMin, float yMax, int64_t begin, int drift )
314+
int View::SkipGpuZoneLevel( const V& vec, bool hover, double pxns, int64_t nspx, const ImVec2& wpos, int _offset, int depth, const GpuCtxData* ctx, float yMin, float yMax, int64_t begin, int drift )
316315
{
317316
// cast to uint64_t, so that unended zones (end = -1) are still drawn
318317
auto it = std::lower_bound( vec.begin(), vec.end(), std::max<int64_t>( 0, m_vd.zvStart ), [begin, drift] ( const auto& l, const auto& r ) { Adapter a; return (uint64_t)AdjustGpuTime( a(l).End(), begin, drift ) < (uint64_t)r; } );
@@ -357,7 +356,7 @@ int View::SkipGpuZoneLevel( const V& vec, bool hover, double pxns, int64_t nspx,
357356
{
358357
if( ev.Child() >= 0 )
359358
{
360-
const auto d = DispatchGpuZoneLevel( m_worker.GetGpuChildren( ev.Child() ), hover, pxns, nspx, wpos, _offset, depth, thread, yMin, yMax, begin, drift );
359+
const auto d = DispatchGpuZoneLevel( m_worker.GetGpuChildren( ev.Child() ), hover, pxns, nspx, wpos, _offset, depth, ctx, yMin, yMax, begin, drift );
361360
if( d > maxdepth ) maxdepth = d;
362361
}
363362
++it;

profiler/src/profiler/TracyView_Navigation.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,12 @@ void View::ZoomToZone( const ZoneEvent& ev )
1010
ZoomToRange( ev.Start(), end );
1111
}
1212

13-
void View::ZoomToZoneGPU( const ZoneEvent& ev )
13+
void View::ZoomToZoneGPU( const ZoneEventC evC )
1414
{
15+
auto& ev = *evC.event;
16+
auto ctx = evC.ctx;
1517
const auto end = m_worker.GetZoneEndGPU( ev );
1618
if( end - ev.Start() <= 0 ) return;
17-
auto ctx = GetZoneCtx( ev );
1819
if( !ctx )
1920
{
2021
ZoomToRange( ev.Start(), end );

profiler/src/profiler/TracyView_Timeline.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ void View::DrawTimeline()
473473
}
474474
if( m_gpuInfoWindow )
475475
{
476-
const auto ex = m_worker.GetGpuExtra( *m_gpuInfoWindow );
476+
const auto ex = m_worker.GetGpuExtra( *m_gpuInfoWindow.event );
477477
const auto px0 = ( ex.CpuStart() - m_vd.zvStart ) * pxns;
478478
const auto px1 = std::max( px0 + std::max( 1.0, pxns * 0.5 ), ( ex.CpuEnd() - m_vd.zvStart ) * pxns );
479479
draw->AddRectFilled( ImVec2( wpos.x + px0, linepos.y ), ImVec2( wpos.x + px1, linepos.y + lineh ), 0x2288DD88 );

profiler/src/profiler/TracyView_Utility.cpp

Lines changed: 28 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -395,42 +395,41 @@ bool View::IsZoneReentry( const ZoneEvent& zone, uint64_t tid ) const
395395
return false;
396396
}
397397

398-
const ZoneEvent* View::GetZoneParentGPU( const ZoneEvent& zone ) const
398+
ZoneEventC View::GetZoneParentGPU( const ZoneEventC zoneC ) const
399399
{
400-
for( const auto& ctx : m_worker.GetGpuData() )
400+
auto& zone = *zoneC.event;
401+
auto ctx = zoneC.ctx;
402+
for( const auto& td : ctx->threadData )
401403
{
402-
for( const auto& td : ctx->threadData )
404+
const ZoneEvent* parent = nullptr;
405+
const Vector<short_ptr<ZoneEvent>>* timeline = &td.second.timeline;
406+
if( timeline->empty() ) continue;
407+
for(;;)
403408
{
404-
const ZoneEvent* parent = nullptr;
405-
const Vector<short_ptr<ZoneEvent>>* timeline = &td.second.timeline;
406-
if( timeline->empty() ) continue;
407-
for(;;)
409+
if( timeline->is_magic() )
408410
{
409-
if( timeline->is_magic() )
410-
{
411-
auto vec = (Vector<ZoneEvent>*)timeline;
412-
auto it = std::upper_bound( vec->begin(), vec->end(), zone.Start(), [] ( const auto& l, const auto& r ) { return (uint64_t)l < (uint64_t)r.Start(); } );
413-
if( it != vec->begin() ) --it;
414-
if( zone.End() >= 0 && it->Start() > zone.End() ) break;
415-
if( it == &zone ) return parent;
416-
if( it->Child() < 0 ) break;
417-
parent = it;
418-
timeline = &m_worker.GetGpuChildren( parent->Child() );
419-
}
420-
else
421-
{
422-
auto it = std::upper_bound( timeline->begin(), timeline->end(), zone.Start(), [] ( const auto& l, const auto& r ) { return (uint64_t)l < (uint64_t)r->Start(); } );
423-
if( it != timeline->begin() ) --it;
424-
if( zone.End() >= 0 && (*it)->Start() > zone.End() ) break;
425-
if( *it == &zone ) return parent;
426-
if( (*it)->Child() < 0 ) break;
427-
parent = *it;
428-
timeline = &m_worker.GetGpuChildren( parent->Child() );
429-
}
411+
auto vec = (Vector<ZoneEvent>*)timeline;
412+
auto it = std::upper_bound( vec->begin(), vec->end(), zone.Start(), [] ( const auto& l, const auto& r ) { return (uint64_t)l < (uint64_t)r.Start(); } );
413+
if( it != vec->begin() ) --it;
414+
if( zone.End() >= 0 && it->Start() > zone.End() ) break;
415+
if( it == &zone ) return { parent, ctx };
416+
if( it->Child() < 0 ) break;
417+
parent = it;
418+
timeline = &m_worker.GetGpuChildren( parent->Child() );
419+
}
420+
else
421+
{
422+
auto it = std::upper_bound( timeline->begin(), timeline->end(), zone.Start(), [] ( const auto& l, const auto& r ) { return (uint64_t)l < (uint64_t)r->Start(); } );
423+
if( it != timeline->begin() ) --it;
424+
if( zone.End() >= 0 && (*it)->Start() > zone.End() ) break;
425+
if( *it == &zone ) return { parent, ctx };
426+
if( (*it)->Child() < 0 ) break;
427+
parent = *it;
428+
timeline = &m_worker.GetGpuChildren( parent->Child() );
430429
}
431430
}
432431
}
433-
return nullptr;
432+
return { nullptr, nullptr };
434433
}
435434

436435
const ThreadData* View::GetZoneThreadData( const ZoneEvent& zone ) const
@@ -526,41 +525,6 @@ uint64_t View::GetZoneThreadGPU( const EventAdapter<true>& zone ) const
526525
}
527526
}
528527

529-
const GpuCtxData* View::GetZoneCtx( const ZoneEvent& zone ) const
530-
{
531-
for( const auto& ctx : m_worker.GetGpuData() )
532-
{
533-
for( const auto& td : ctx->threadData )
534-
{
535-
const Vector<short_ptr<ZoneEvent>>* timeline = &td.second.timeline;
536-
if( timeline->empty() ) continue;
537-
for(;;)
538-
{
539-
if( timeline->is_magic() )
540-
{
541-
auto vec = (Vector<ZoneEvent>*)timeline;
542-
auto it = std::upper_bound( vec->begin(), vec->end(), zone.Start(), [] ( const auto& l, const auto& r ) { return (uint64_t)l < (uint64_t)r.Start(); } );
543-
if( it != vec->begin() ) --it;
544-
if( zone.End() >= 0 && it->Start() > zone.End() ) break;
545-
if( it == &zone ) return ctx;
546-
if( it->Child() < 0 ) break;
547-
timeline = &m_worker.GetGpuChildren( it->Child() );
548-
}
549-
else
550-
{
551-
auto it = std::upper_bound( timeline->begin(), timeline->end(), zone.Start(), [] ( const auto& l, const auto& r ) { return (uint64_t)l < (uint64_t)r->Start(); } );
552-
if( it != timeline->begin() ) --it;
553-
if( zone.End() >= 0 && (*it)->Start() > zone.End() ) break;
554-
if( *it == &zone ) return ctx;
555-
if( (*it)->Child() < 0 ) break;
556-
timeline = &m_worker.GetGpuChildren( (*it)->Child() );
557-
}
558-
}
559-
}
560-
}
561-
return nullptr;
562-
}
563-
564528
int64_t View::GetZoneChildTime( const ZoneEvent& zone, bool gpu )
565529
{
566530
int64_t time = 0;

0 commit comments

Comments
 (0)