diff options
author | Bartosz Taudul <wolf@nereid.pl> | 2022-07-02 14:16:06 +0300 |
---|---|---|
committer | Bartosz Taudul <wolf@nereid.pl> | 2022-07-02 14:16:06 +0300 |
commit | d19b337573433a7375d6eb5a7b69c864cd0d3223 (patch) | |
tree | c906de7d45324e2d01eb51834ccfa03d0bdd662d /server/TracyView_Navigation.cpp | |
parent | 5b8c8c53091f474d991d2376db5e59f4215f5cf5 (diff) |
Split View navigation functions.
Diffstat (limited to 'server/TracyView_Navigation.cpp')
-rw-r--r-- | server/TracyView_Navigation.cpp | 133 |
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 ); +} + +} |