| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/scheduler/compositor_timing_history.h" | 5 #include "cc/scheduler/compositor_timing_history.h" |
| 6 | 6 |
| 7 #include "cc/debug/rendering_stats_instrumentation.h" | 7 #include "cc/debug/rendering_stats_instrumentation.h" |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
| 9 | 9 |
| 10 namespace cc { | 10 namespace cc { |
| 11 namespace { | 11 namespace { |
| 12 | 12 |
| 13 class CompositorTimingHistoryTest; | 13 class CompositorTimingHistoryTest; |
| 14 | 14 |
| 15 class TestCompositorTimingHistory : public CompositorTimingHistory { | 15 class TestCompositorTimingHistory : public CompositorTimingHistory { |
| 16 public: | 16 public: |
| 17 TestCompositorTimingHistory(CompositorTimingHistoryTest* test, | 17 TestCompositorTimingHistory(CompositorTimingHistoryTest* test, |
| 18 RenderingStatsInstrumentation* rendering_stats) | 18 RenderingStatsInstrumentation* rendering_stats) |
| 19 : CompositorTimingHistory(CompositorTimingHistory::NULL_UMA, | 19 : CompositorTimingHistory(NULL_UMA, rendering_stats), test_(test) {} |
| 20 rendering_stats), | |
| 21 test_(test) {} | |
| 22 | 20 |
| 23 protected: | 21 protected: |
| 24 base::TimeTicks Now() const override; | 22 base::TimeTicks Now() const override; |
| 25 | 23 |
| 26 CompositorTimingHistoryTest* test_; | 24 CompositorTimingHistoryTest* test_; |
| 27 | 25 |
| 28 private: | 26 private: |
| 29 DISALLOW_COPY_AND_ASSIGN(TestCompositorTimingHistory); | 27 DISALLOW_COPY_AND_ASSIGN(TestCompositorTimingHistory); |
| 30 }; | 28 }; |
| 31 | 29 |
| 32 class CompositorTimingHistoryTest : public testing::Test { | 30 class CompositorTimingHistoryTest : public testing::Test { |
| 33 public: | 31 public: |
| 34 CompositorTimingHistoryTest() | 32 CompositorTimingHistoryTest() |
| 35 : rendering_stats_(RenderingStatsInstrumentation::Create()), | 33 : rendering_stats_(RenderingStatsInstrumentation::Create()), |
| 36 timing_history_(this, rendering_stats_.get()) { | 34 timing_history_(this, rendering_stats_.get()) { |
| 37 AdvanceNowBy(base::TimeDelta::FromMilliseconds(1)); | 35 AdvanceNowBy(base::TimeDelta::FromMilliseconds(1)); |
| 38 timing_history_.SetRecordingEnabled(true); | 36 timing_history_.SetRecordingEnabled(true); |
| 39 } | 37 } |
| 40 | 38 |
| 41 void AdvanceNowBy(base::TimeDelta delta) { now_ += delta; } | 39 void AdvanceNowBy(base::TimeDelta delta) { now_ += delta; } |
| 42 | 40 |
| 43 base::TimeTicks Now() { return now_; } | 41 base::TimeTicks Now() { return now_; } |
| 44 | 42 |
| 45 void TriggerAllNotificationsWithoutAdvancingTime() { | |
| 46 timing_history_.WillBeginMainFrame(); | |
| 47 timing_history_.DidCommit(); | |
| 48 timing_history_.WillPrepareTiles(); | |
| 49 timing_history_.DidPrepareTiles(); | |
| 50 timing_history_.ReadyToActivate(); | |
| 51 timing_history_.WillActivate(); | |
| 52 timing_history_.DidActivate(); | |
| 53 timing_history_.WillDraw(); | |
| 54 timing_history_.DidDraw(); | |
| 55 } | |
| 56 | |
| 57 void TriggerInitialUnrecordedActions() { | |
| 58 // The first two cycles are not used since | |
| 59 // they are generally more expensive then subsequent frames. | |
| 60 TriggerAllNotificationsWithoutAdvancingTime(); | |
| 61 TriggerAllNotificationsWithoutAdvancingTime(); | |
| 62 } | |
| 63 | |
| 64 protected: | 43 protected: |
| 65 scoped_ptr<RenderingStatsInstrumentation> rendering_stats_; | 44 scoped_ptr<RenderingStatsInstrumentation> rendering_stats_; |
| 66 TestCompositorTimingHistory timing_history_; | 45 TestCompositorTimingHistory timing_history_; |
| 67 base::TimeTicks now_; | 46 base::TimeTicks now_; |
| 68 }; | 47 }; |
| 69 | 48 |
| 70 base::TimeTicks TestCompositorTimingHistory::Now() const { | 49 base::TimeTicks TestCompositorTimingHistory::Now() const { |
| 71 return test_->Now(); | 50 return test_->Now(); |
| 72 } | 51 } |
| 73 | 52 |
| 74 TEST_F(CompositorTimingHistoryTest, FirstTwoFramesNotRecorded) { | 53 TEST_F(CompositorTimingHistoryTest, AllSequentialCommit) { |
| 75 base::TimeDelta one_second = base::TimeDelta::FromSeconds(1); | 54 base::TimeDelta one_second = base::TimeDelta::FromSeconds(1); |
| 76 | 55 |
| 77 base::TimeDelta begin_main_frame_to_commit_duration = | 56 base::TimeDelta begin_main_frame_to_commit_duration = |
| 78 base::TimeDelta::FromMilliseconds(1); | |
| 79 base::TimeDelta prepare_tiles_duration = base::TimeDelta::FromMilliseconds(2); | |
| 80 base::TimeDelta prepare_tiles_end_to_ready_to_activate_duration = | |
| 81 base::TimeDelta::FromMilliseconds(1); | |
| 82 base::TimeDelta commit_to_ready_to_activate_duration = | |
| 83 base::TimeDelta::FromMilliseconds(3); | |
| 84 base::TimeDelta activate_duration = base::TimeDelta::FromMilliseconds(4); | |
| 85 base::TimeDelta draw_duration = base::TimeDelta::FromMilliseconds(5); | |
| 86 | |
| 87 // Verify first two frames don't affect results. | |
| 88 for (int i = 0; i < 2; i++) { | |
| 89 timing_history_.WillBeginMainFrame(); | |
| 90 AdvanceNowBy(begin_main_frame_to_commit_duration); | |
| 91 timing_history_.DidCommit(); | |
| 92 timing_history_.WillPrepareTiles(); | |
| 93 AdvanceNowBy(prepare_tiles_duration); | |
| 94 timing_history_.DidPrepareTiles(); | |
| 95 AdvanceNowBy(prepare_tiles_end_to_ready_to_activate_duration); | |
| 96 timing_history_.ReadyToActivate(); | |
| 97 AdvanceNowBy(one_second); | |
| 98 timing_history_.WillActivate(); | |
| 99 AdvanceNowBy(activate_duration); | |
| 100 timing_history_.DidActivate(); | |
| 101 AdvanceNowBy(one_second); | |
| 102 timing_history_.WillDraw(); | |
| 103 AdvanceNowBy(draw_duration); | |
| 104 timing_history_.DidDraw(); | |
| 105 | |
| 106 EXPECT_EQ(base::TimeDelta(), | |
| 107 timing_history_.BeginMainFrameToCommitDurationEstimate()); | |
| 108 EXPECT_EQ(base::TimeDelta(), | |
| 109 timing_history_.CommitToReadyToActivateDurationEstimate()); | |
| 110 EXPECT_EQ(base::TimeDelta(), | |
| 111 timing_history_.PrepareTilesDurationEstimate()); | |
| 112 EXPECT_EQ(base::TimeDelta(), timing_history_.ActivateDurationEstimate()); | |
| 113 EXPECT_EQ(base::TimeDelta(), timing_history_.DrawDurationEstimate()); | |
| 114 } | |
| 115 | |
| 116 timing_history_.WillBeginMainFrame(); | |
| 117 AdvanceNowBy(begin_main_frame_to_commit_duration); | |
| 118 timing_history_.DidCommit(); | |
| 119 timing_history_.WillPrepareTiles(); | |
| 120 AdvanceNowBy(prepare_tiles_duration); | |
| 121 timing_history_.DidPrepareTiles(); | |
| 122 AdvanceNowBy(prepare_tiles_end_to_ready_to_activate_duration); | |
| 123 timing_history_.ReadyToActivate(); | |
| 124 // Do not count idle time between notification and actual activation. | |
| 125 AdvanceNowBy(one_second); | |
| 126 timing_history_.WillActivate(); | |
| 127 AdvanceNowBy(activate_duration); | |
| 128 timing_history_.DidActivate(); | |
| 129 // Do not count idle time between activate and draw. | |
| 130 AdvanceNowBy(one_second); | |
| 131 timing_history_.WillDraw(); | |
| 132 AdvanceNowBy(draw_duration); | |
| 133 timing_history_.DidDraw(); | |
| 134 | |
| 135 EXPECT_EQ(begin_main_frame_to_commit_duration, | |
| 136 timing_history_.BeginMainFrameToCommitDurationEstimate()); | |
| 137 EXPECT_EQ(commit_to_ready_to_activate_duration, | |
| 138 timing_history_.CommitToReadyToActivateDurationEstimate()); | |
| 139 EXPECT_EQ(prepare_tiles_duration, | |
| 140 timing_history_.PrepareTilesDurationEstimate()); | |
| 141 EXPECT_EQ(activate_duration, timing_history_.ActivateDurationEstimate()); | |
| 142 EXPECT_EQ(draw_duration, timing_history_.DrawDurationEstimate()); | |
| 143 } | |
| 144 | |
| 145 TEST_F(CompositorTimingHistoryTest, AllSequentialCommit) { | |
| 146 TriggerInitialUnrecordedActions(); | |
| 147 | |
| 148 base::TimeDelta one_second = base::TimeDelta::FromSeconds(1); | |
| 149 | |
| 150 base::TimeDelta begin_main_frame_to_commit_duration = | |
| 151 base::TimeDelta::FromMilliseconds(1); | 57 base::TimeDelta::FromMilliseconds(1); |
| 152 base::TimeDelta prepare_tiles_duration = base::TimeDelta::FromMilliseconds(2); | 58 base::TimeDelta prepare_tiles_duration = base::TimeDelta::FromMilliseconds(2); |
| 153 base::TimeDelta prepare_tiles_end_to_ready_to_activate_duration = | 59 base::TimeDelta prepare_tiles_end_to_ready_to_activate_duration = |
| 154 base::TimeDelta::FromMilliseconds(1); | 60 base::TimeDelta::FromMilliseconds(1); |
| 155 base::TimeDelta commit_to_ready_to_activate_duration = | 61 base::TimeDelta commit_to_ready_to_activate_duration = |
| 156 base::TimeDelta::FromMilliseconds(3); | 62 base::TimeDelta::FromMilliseconds(3); |
| 157 base::TimeDelta activate_duration = base::TimeDelta::FromMilliseconds(4); | 63 base::TimeDelta activate_duration = base::TimeDelta::FromMilliseconds(4); |
| 158 base::TimeDelta draw_duration = base::TimeDelta::FromMilliseconds(5); | 64 base::TimeDelta draw_duration = base::TimeDelta::FromMilliseconds(5); |
| 159 | 65 |
| 160 timing_history_.WillBeginMainFrame(); | 66 timing_history_.WillBeginMainFrame(); |
| 161 AdvanceNowBy(begin_main_frame_to_commit_duration); | 67 AdvanceNowBy(begin_main_frame_to_commit_duration); |
| 68 // timing_history_.BeginMainFrameAborted(); |
| 162 timing_history_.DidCommit(); | 69 timing_history_.DidCommit(); |
| 163 timing_history_.WillPrepareTiles(); | 70 timing_history_.WillPrepareTiles(); |
| 164 AdvanceNowBy(prepare_tiles_duration); | 71 AdvanceNowBy(prepare_tiles_duration); |
| 165 timing_history_.DidPrepareTiles(); | 72 timing_history_.DidPrepareTiles(); |
| 166 AdvanceNowBy(prepare_tiles_end_to_ready_to_activate_duration); | 73 AdvanceNowBy(prepare_tiles_end_to_ready_to_activate_duration); |
| 167 timing_history_.ReadyToActivate(); | 74 timing_history_.ReadyToActivate(); |
| 168 // Do not count idle time between notification and actual activation. | 75 // Do not count idle time between notification and actual activation. |
| 169 AdvanceNowBy(one_second); | 76 AdvanceNowBy(one_second); |
| 170 timing_history_.WillActivate(); | 77 timing_history_.WillActivate(); |
| 171 AdvanceNowBy(activate_duration); | 78 AdvanceNowBy(activate_duration); |
| 172 timing_history_.DidActivate(); | 79 timing_history_.DidActivate(); |
| 173 // Do not count idle time between activate and draw. | 80 // Do not count idle time between activate and draw. |
| 174 AdvanceNowBy(one_second); | 81 AdvanceNowBy(one_second); |
| 175 timing_history_.WillDraw(); | 82 timing_history_.WillDraw(); |
| 176 AdvanceNowBy(draw_duration); | 83 AdvanceNowBy(draw_duration); |
| 177 timing_history_.DidDraw(); | 84 timing_history_.DidDraw(); |
| 178 | 85 |
| 179 EXPECT_EQ(begin_main_frame_to_commit_duration, | 86 EXPECT_EQ(begin_main_frame_to_commit_duration, |
| 180 timing_history_.BeginMainFrameToCommitDurationEstimate()); | 87 timing_history_.BeginMainFrameToCommitDurationEstimate()); |
| 181 EXPECT_EQ(commit_to_ready_to_activate_duration, | 88 EXPECT_EQ(commit_to_ready_to_activate_duration, |
| 182 timing_history_.CommitToReadyToActivateDurationEstimate()); | 89 timing_history_.CommitToReadyToActivateDurationEstimate()); |
| 183 EXPECT_EQ(prepare_tiles_duration, | 90 EXPECT_EQ(prepare_tiles_duration, |
| 184 timing_history_.PrepareTilesDurationEstimate()); | 91 timing_history_.PrepareTilesDurationEstimate()); |
| 185 EXPECT_EQ(activate_duration, timing_history_.ActivateDurationEstimate()); | 92 EXPECT_EQ(activate_duration, timing_history_.ActivateDurationEstimate()); |
| 186 EXPECT_EQ(draw_duration, timing_history_.DrawDurationEstimate()); | 93 EXPECT_EQ(draw_duration, timing_history_.DrawDurationEstimate()); |
| 187 } | 94 } |
| 188 | 95 |
| 189 TEST_F(CompositorTimingHistoryTest, AllSequentialBeginMainFrameAborted) { | 96 TEST_F(CompositorTimingHistoryTest, AllSequentialBeginMainFrameAborted) { |
| 190 TriggerInitialUnrecordedActions(); | |
| 191 | |
| 192 base::TimeDelta one_second = base::TimeDelta::FromSeconds(1); | 97 base::TimeDelta one_second = base::TimeDelta::FromSeconds(1); |
| 193 | 98 |
| 194 base::TimeDelta begin_main_frame_to_commit_duration = | 99 base::TimeDelta begin_main_frame_to_commit_duration = |
| 195 base::TimeDelta::FromMilliseconds(1); | 100 base::TimeDelta::FromMilliseconds(1); |
| 196 base::TimeDelta prepare_tiles_duration = base::TimeDelta::FromMilliseconds(2); | 101 base::TimeDelta prepare_tiles_duration = base::TimeDelta::FromMilliseconds(2); |
| 197 base::TimeDelta prepare_tiles_end_to_ready_to_activate_duration = | 102 base::TimeDelta prepare_tiles_end_to_ready_to_activate_duration = |
| 198 base::TimeDelta::FromMilliseconds(1); | 103 base::TimeDelta::FromMilliseconds(1); |
| 199 base::TimeDelta commit_to_ready_to_activate_duration = | 104 base::TimeDelta commit_to_ready_to_activate_duration = |
| 200 base::TimeDelta::FromMilliseconds(3); | 105 base::TimeDelta::FromMilliseconds(3); |
| 201 base::TimeDelta activate_duration = base::TimeDelta::FromMilliseconds(4); | 106 base::TimeDelta activate_duration = base::TimeDelta::FromMilliseconds(4); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 226 EXPECT_EQ(commit_to_ready_to_activate_duration, | 131 EXPECT_EQ(commit_to_ready_to_activate_duration, |
| 227 timing_history_.CommitToReadyToActivateDurationEstimate()); | 132 timing_history_.CommitToReadyToActivateDurationEstimate()); |
| 228 EXPECT_EQ(prepare_tiles_duration, | 133 EXPECT_EQ(prepare_tiles_duration, |
| 229 timing_history_.PrepareTilesDurationEstimate()); | 134 timing_history_.PrepareTilesDurationEstimate()); |
| 230 EXPECT_EQ(activate_duration, timing_history_.ActivateDurationEstimate()); | 135 EXPECT_EQ(activate_duration, timing_history_.ActivateDurationEstimate()); |
| 231 EXPECT_EQ(draw_duration, timing_history_.DrawDurationEstimate()); | 136 EXPECT_EQ(draw_duration, timing_history_.DrawDurationEstimate()); |
| 232 } | 137 } |
| 233 | 138 |
| 234 } // namespace | 139 } // namespace |
| 235 } // namespace cc | 140 } // namespace cc |
| OLD | NEW |