diff --git a/profiler/src/profiler/TracyView.hpp b/profiler/src/profiler/TracyView.hpp index 61a27ab8..89787b21 100644 --- a/profiler/src/profiler/TracyView.hpp +++ b/profiler/src/profiler/TracyView.hpp @@ -444,7 +444,7 @@ private: template void CalcZoneTimeDataImpl( const V& children, const ContextSwitch* ctx, unordered_flat_map& data, int64_t& ztime ); - void SetPlaybackFrame( uint32_t idx ); + void SetPlaybackFrame( uint32_t idx, bool mayExtend ); int GetPlaybackFrameBegin() const; int GetPlaybackFrameEnd() const; @@ -977,6 +977,8 @@ private: bool sync = false; bool zoom = false; bool loop = false; + bool limitRange = false; + std::pair range = { -1, -1 }; } m_playback; struct TimeDistribution { diff --git a/profiler/src/profiler/TracyView_FrameOverview.cpp b/profiler/src/profiler/TracyView_FrameOverview.cpp index 12a3162f..13e49a3d 100644 --- a/profiler/src/profiler/TracyView_FrameOverview.cpp +++ b/profiler/src/profiler/TracyView_FrameOverview.cpp @@ -207,7 +207,7 @@ void View::DrawFrames() { m_showPlayback = true; m_playback.pause = true; - SetPlaybackFrame( m_frames->frames[sel].frameImage ); + SetPlaybackFrame( m_frames->frames[sel].frameImage, true ); } } else diff --git a/profiler/src/profiler/TracyView_FrameTimeline.cpp b/profiler/src/profiler/TracyView_FrameTimeline.cpp index a88afeb0..924cd673 100644 --- a/profiler/src/profiler/TracyView_FrameTimeline.cpp +++ b/profiler/src/profiler/TracyView_FrameTimeline.cpp @@ -163,7 +163,7 @@ void View::DrawTimelineFrames( const FrameData& frames ) { m_showPlayback = true; m_playback.pause = true; - SetPlaybackFrame( frames.frames[i].frameImage ); + SetPlaybackFrame( frames.frames[i].frameImage, true ); } } ImGui::EndTooltip(); diff --git a/profiler/src/profiler/TracyView_Playback.cpp b/profiler/src/profiler/TracyView_Playback.cpp index aa301964..ba5cf438 100644 --- a/profiler/src/profiler/TracyView_Playback.cpp +++ b/profiler/src/profiler/TracyView_Playback.cpp @@ -8,20 +8,26 @@ namespace tracy int View::GetPlaybackFrameBegin() const { - return 0; + return m_playback.limitRange ? m_playback.range.first : 0; } int View::GetPlaybackFrameEnd() const { - return m_worker.GetFrameImageCount(); + return m_playback.limitRange ? m_playback.range.second + 1 : m_worker.GetFrameImageCount(); } -void View::SetPlaybackFrame( uint32_t idx ) +void View::SetPlaybackFrame( uint32_t idx, bool mayExtend ) { const auto frameSet = m_worker.GetFramesBase(); const auto& frameImages = m_worker.GetFrameImages(); - const auto begin = GetPlaybackFrameBegin(); - const auto end = GetPlaybackFrameEnd(); + auto begin = GetPlaybackFrameBegin(); + auto end = GetPlaybackFrameEnd(); + if( mayExtend && ( idx < begin || idx >= end ) ) + { + m_playback.limitRange = false; + begin = GetPlaybackFrameBegin(); + end = GetPlaybackFrameEnd(); + } assert( idx >= begin && idx < end ); m_playback.frame = idx; @@ -96,11 +102,11 @@ void View::DrawPlayback() if( m_playback.frame + 1 == end ) { assert( m_playback.loop ); - SetPlaybackFrame( begin ); + SetPlaybackFrame( begin, false ); } else { - SetPlaybackFrame( m_playback.frame + 1 ); + SetPlaybackFrame( m_playback.frame + 1, false ); } } } @@ -154,7 +160,7 @@ void View::DrawPlayback() { if( (uint32_t)tmp < begin + 1 ) tmp = begin + 1; else if( (uint32_t)tmp > end ) tmp = end; - SetPlaybackFrame( uint32_t( tmp - 1 ) ); + SetPlaybackFrame( uint32_t( tmp - 1 ), false ); m_playback.pause = true; } ImGui::SliderFloat( "Playback speed", &m_playback.speed, 0.1f, 4, "%.2f" ); @@ -171,7 +177,7 @@ void View::DrawPlayback() { if( m_playback.frame > begin ) { - SetPlaybackFrame( m_playback.frame - 1 ); + SetPlaybackFrame( m_playback.frame - 1, false ); m_playback.pause = true; } } @@ -180,7 +186,7 @@ void View::DrawPlayback() { if( m_playback.frame < end - 1 ) { - SetPlaybackFrame( m_playback.frame + 1 ); + SetPlaybackFrame( m_playback.frame + 1, false ); m_playback.pause = true; } } @@ -215,6 +221,36 @@ void View::DrawPlayback() ImGui::Checkbox( "Zoom 2\xc3\x97", &m_playback.zoom ); ImGui::SameLine(); ImGui::Checkbox( "Loop", &m_playback.loop ); + bool limitChanged = SmallCheckbox( "Limit frame range", &m_playback.limitRange ); + if( m_playback.limitRange ) + { + if( m_playback.range.first < 0 ) m_playback.range = { 0, m_worker.GetFrameImageCount() - 1 }; + + ImGui::Indent(); + int r0 = m_playback.range.first + 1; + int r1 = m_playback.range.second + 1; + if( ImGui::DragIntRange2( "##range", &r0, &r1, 1, 1, m_worker.GetFrameImageCount(), "%d" ) ) + { + m_playback.range = { r0 - 1, r1 - 1 }; + limitChanged = true; + } + ImGui::Unindent(); + + if( limitChanged ) + { + if( m_playback.frame < m_playback.range.first ) + { + m_playback.pause = true; + SetPlaybackFrame( m_playback.range.first, false ); + } + else if( m_playback.frame > m_playback.range.second ) + { + m_playback.pause = true; + SetPlaybackFrame( m_playback.range.second, false ); + } + } + } + ImGui::Separator(); TextFocused( "Timestamp:", TimeToString( tstart ) ); TooltipIfHovered( TimeToStringExact( tstart ) ); ImGui::SameLine();