Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/wolfpld/tracy.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBartosz Taudul <wolf@nereid.pl>2022-07-02 14:16:06 +0300
committerBartosz Taudul <wolf@nereid.pl>2022-07-02 14:16:06 +0300
commitd19b337573433a7375d6eb5a7b69c864cd0d3223 (patch)
treec906de7d45324e2d01eb51834ccfa03d0bdd662d /server/TracyView_Navigation.cpp
parent5b8c8c53091f474d991d2376db5e59f4215f5cf5 (diff)
Split View navigation functions.
Diffstat (limited to 'server/TracyView_Navigation.cpp')
-rw-r--r--server/TracyView_Navigation.cpp133
1 files changed, 133 insertions, 0 deletions
diff --git a/server/TracyView_Navigation.cpp b/server/TracyView_Navigation.cpp
new file mode 100644
index 00000000..a0c0a3e9
--- /dev/null
+++ b/server/TracyView_Navigation.cpp
@@ -0,0 +1,133 @@
+#include "TracyView.hpp"
+
+namespace tracy
+{
+
+void View::ZoomToZone( const ZoneEvent& ev )
+{
+ const auto end = m_worker.GetZoneEnd( ev );
+ if( end - ev.Start() <= 0 ) return;
+ ZoomToRange( ev.Start(), end );
+}
+
+void View::ZoomToZone( const GpuEvent& ev )
+{
+ const auto end = m_worker.GetZoneEnd( ev );
+ if( end - ev.GpuStart() <= 0 ) return;
+ auto ctx = GetZoneCtx( ev );
+ if( !ctx )
+ {
+ ZoomToRange( ev.GpuStart(), end );
+ }
+ else
+ {
+ const auto td = ctx->threadData.size() == 1 ? ctx->threadData.begin() : ctx->threadData.find( m_worker.DecompressThread( ev.Thread() ) );
+ assert( td != ctx->threadData.end() );
+ int64_t begin;
+ if( td->second.timeline.is_magic() )
+ {
+ begin = ((Vector<GpuEvent>*)&td->second.timeline)->front().GpuStart();
+ }
+ else
+ {
+ begin = td->second.timeline.front()->GpuStart();
+ }
+ const auto drift = GpuDrift( ctx );
+ ZoomToRange( AdjustGpuTime( ev.GpuStart(), begin, drift ), AdjustGpuTime( end, begin, drift ) );
+ }
+}
+
+void View::ZoomToRange( int64_t start, int64_t end, bool pause )
+{
+ if( start == end )
+ {
+ end = start + 1;
+ }
+
+ if( pause )
+ {
+ m_viewMode = ViewMode::Paused;
+ m_viewModeHeuristicTry = false;
+ }
+ m_highlightZoom.active = false;
+ if( !m_playback.pause && m_playback.sync ) m_playback.pause = true;
+
+ m_zoomAnim.active = true;
+ if( m_viewMode == ViewMode::LastRange )
+ {
+ const auto rangeCurr = m_vd.zvEnd - m_vd.zvStart;
+ const auto rangeDest = end - start;
+ m_zoomAnim.start0 = m_vd.zvStart;
+ m_zoomAnim.start1 = m_vd.zvStart - ( rangeDest - rangeCurr );
+ m_zoomAnim.end0 = m_vd.zvEnd;
+ m_zoomAnim.end1 = m_vd.zvEnd;
+ }
+ else
+ {
+ m_zoomAnim.start0 = m_vd.zvStart;
+ m_zoomAnim.start1 = start;
+ m_zoomAnim.end0 = m_vd.zvEnd;
+ m_zoomAnim.end1 = end;
+ }
+ m_zoomAnim.progress = 0;
+}
+
+void View::ZoomToPrevFrame()
+{
+ if( m_vd.zvStart >= m_worker.GetFrameBegin( *m_frames, 0 ) )
+ {
+ size_t frame;
+ if( m_frames->continuous )
+ {
+ frame = (size_t)m_worker.GetFrameRange( *m_frames, m_vd.zvStart, m_vd.zvStart ).first;
+ }
+ else
+ {
+ frame = (size_t)m_worker.GetFrameRange( *m_frames, m_vd.zvStart, m_vd.zvStart ).second;
+ }
+
+ if( frame > 0 )
+ {
+ frame--;
+ const auto fbegin = m_worker.GetFrameBegin( *m_frames, frame );
+ const auto fend = m_worker.GetFrameEnd( *m_frames, frame );
+ ZoomToRange( fbegin, fend );
+ }
+ }
+}
+
+void View::ZoomToNextFrame()
+{
+ int64_t start;
+ if( m_zoomAnim.active )
+ {
+ start = m_zoomAnim.start1;
+ }
+ else
+ {
+ start = m_vd.zvStart;
+ }
+
+ size_t frame;
+ if( start < m_worker.GetFrameBegin( *m_frames, 0 ) )
+ {
+ frame = 0;
+ }
+ else
+ {
+ frame = (size_t)m_worker.GetFrameRange( *m_frames, start, start ).first + 1;
+ }
+ if( frame >= m_worker.GetFrameCount( *m_frames ) ) return;
+
+ const auto fbegin = m_worker.GetFrameBegin( *m_frames, frame );
+ const auto fend = m_worker.GetFrameEnd( *m_frames, frame );
+ ZoomToRange( fbegin, fend );
+}
+
+void View::CenterAtTime( int64_t t )
+{
+ const auto hr = std::max<uint64_t>( 1, ( m_vd.zvEnd - m_vd.zvStart ) / 2 );
+ ZoomToRange( t - hr, t + hr );
+}
+
+}