diff --git a/engine/src/flutter/flow/frame_timings.cc b/engine/src/flutter/flow/frame_timings.cc index 4bfaa0e9c05..b5169c1621c 100644 --- a/engine/src/flutter/flow/frame_timings.cc +++ b/engine/src/flutter/flow/frame_timings.cc @@ -136,6 +136,7 @@ std::unique_ptr FrameTimingsRecorder::CloneUntil( std::scoped_lock state_lock(state_mutex_); std::unique_ptr recorder = std::make_unique(frame_number_); + FML_DCHECK(state_ >= state); recorder->state_ = state; if (state >= State::kVsync) { @@ -147,7 +148,7 @@ std::unique_ptr FrameTimingsRecorder::CloneUntil( recorder->build_start_ = build_start_; } - if (state >= State::kRasterEnd) { + if (state >= State::kBuildEnd) { recorder->build_end_ = build_end_; } @@ -157,6 +158,7 @@ std::unique_ptr FrameTimingsRecorder::CloneUntil( if (state >= State::kRasterEnd) { recorder->raster_end_ = raster_end_; + recorder->raster_end_wall_time_ = raster_end_wall_time_; } return recorder; diff --git a/engine/src/flutter/flow/frame_timings_recorder_unittests.cc b/engine/src/flutter/flow/frame_timings_recorder_unittests.cc index 5ae9e6dcd51..3cbb33ca975 100644 --- a/engine/src/flutter/flow/frame_timings_recorder_unittests.cc +++ b/engine/src/flutter/flow/frame_timings_recorder_unittests.cc @@ -106,11 +106,90 @@ TEST(FrameTimingsRecorderTest, RecordersHaveUniqueFrameNumbers) { TEST(FrameTimingsRecorderTest, ClonedHasSameFrameNumber) { auto recorder = std::make_unique(); + auto cloned = + recorder->CloneUntil(FrameTimingsRecorder::State::kUninitialized); + ASSERT_EQ(recorder->GetFrameNumber(), cloned->GetFrameNumber()); +} + +TEST(FrameTimingsRecorderTest, ClonedHasSameVsyncStartAndTarget) { + auto recorder = std::make_unique(); + const auto now = fml::TimePoint::Now(); - recorder->RecordVsync(now, now); + recorder->RecordVsync(now, now + fml::TimeDelta::FromMilliseconds(16)); auto cloned = recorder->CloneUntil(FrameTimingsRecorder::State::kVsync); ASSERT_EQ(recorder->GetFrameNumber(), cloned->GetFrameNumber()); + ASSERT_EQ(recorder->GetVsyncStartTime(), cloned->GetVsyncStartTime()); + ASSERT_EQ(recorder->GetVsyncTargetTime(), cloned->GetVsyncTargetTime()); +} + +TEST(FrameTimingsRecorderTest, ClonedHasSameBuildStart) { + auto recorder = std::make_unique(); + + const auto now = fml::TimePoint::Now(); + recorder->RecordVsync(now, now + fml::TimeDelta::FromMilliseconds(16)); + recorder->RecordBuildStart(fml::TimePoint::Now()); + + auto cloned = recorder->CloneUntil(FrameTimingsRecorder::State::kBuildStart); + ASSERT_EQ(recorder->GetFrameNumber(), cloned->GetFrameNumber()); + ASSERT_EQ(recorder->GetVsyncStartTime(), cloned->GetVsyncStartTime()); + ASSERT_EQ(recorder->GetVsyncTargetTime(), cloned->GetVsyncTargetTime()); + ASSERT_EQ(recorder->GetBuildStartTime(), cloned->GetBuildStartTime()); +} + +TEST(FrameTimingsRecorderTest, ClonedHasSameBuildEnd) { + auto recorder = std::make_unique(); + + const auto now = fml::TimePoint::Now(); + recorder->RecordVsync(now, now + fml::TimeDelta::FromMilliseconds(16)); + recorder->RecordBuildStart(fml::TimePoint::Now()); + recorder->RecordBuildEnd(fml::TimePoint::Now()); + + auto cloned = recorder->CloneUntil(FrameTimingsRecorder::State::kBuildEnd); + ASSERT_EQ(recorder->GetFrameNumber(), cloned->GetFrameNumber()); + ASSERT_EQ(recorder->GetVsyncStartTime(), cloned->GetVsyncStartTime()); + ASSERT_EQ(recorder->GetVsyncTargetTime(), cloned->GetVsyncTargetTime()); + ASSERT_EQ(recorder->GetBuildStartTime(), cloned->GetBuildStartTime()); + ASSERT_EQ(recorder->GetBuildEndTime(), cloned->GetBuildEndTime()); +} + +TEST(FrameTimingsRecorderTest, ClonedHasSameRasterStart) { + auto recorder = std::make_unique(); + + const auto now = fml::TimePoint::Now(); + recorder->RecordVsync(now, now + fml::TimeDelta::FromMilliseconds(16)); + recorder->RecordBuildStart(fml::TimePoint::Now()); + recorder->RecordBuildEnd(fml::TimePoint::Now()); + recorder->RecordRasterStart(fml::TimePoint::Now()); + + auto cloned = recorder->CloneUntil(FrameTimingsRecorder::State::kRasterStart); + ASSERT_EQ(recorder->GetFrameNumber(), cloned->GetFrameNumber()); + ASSERT_EQ(recorder->GetVsyncStartTime(), cloned->GetVsyncStartTime()); + ASSERT_EQ(recorder->GetVsyncTargetTime(), cloned->GetVsyncTargetTime()); + ASSERT_EQ(recorder->GetBuildStartTime(), cloned->GetBuildStartTime()); + ASSERT_EQ(recorder->GetBuildEndTime(), cloned->GetBuildEndTime()); + ASSERT_EQ(recorder->GetRasterStartTime(), cloned->GetRasterStartTime()); +} + +TEST(FrameTimingsRecorderTest, ClonedHasSameRasterEnd) { + auto recorder = std::make_unique(); + + const auto now = fml::TimePoint::Now(); + recorder->RecordVsync(now, now + fml::TimeDelta::FromMilliseconds(16)); + recorder->RecordBuildStart(fml::TimePoint::Now()); + recorder->RecordBuildEnd(fml::TimePoint::Now()); + recorder->RecordRasterStart(fml::TimePoint::Now()); + recorder->RecordRasterEnd(); + + auto cloned = recorder->CloneUntil(FrameTimingsRecorder::State::kRasterEnd); + ASSERT_EQ(recorder->GetFrameNumber(), cloned->GetFrameNumber()); + ASSERT_EQ(recorder->GetVsyncStartTime(), cloned->GetVsyncStartTime()); + ASSERT_EQ(recorder->GetVsyncTargetTime(), cloned->GetVsyncTargetTime()); + ASSERT_EQ(recorder->GetBuildStartTime(), cloned->GetBuildStartTime()); + ASSERT_EQ(recorder->GetBuildEndTime(), cloned->GetBuildEndTime()); + ASSERT_EQ(recorder->GetRasterStartTime(), cloned->GetRasterStartTime()); + ASSERT_EQ(recorder->GetRasterEndTime(), cloned->GetRasterEndTime()); + ASSERT_EQ(recorder->GetRasterEndWallTime(), cloned->GetRasterEndWallTime()); } TEST(FrameTimingsRecorderTest, FrameNumberTraceArgIsValid) {