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 "base/macros.h" | 7 #include "base/macros.h" |
8 #include "cc/debug/rendering_stats_instrumentation.h" | 8 #include "cc/debug/rendering_stats_instrumentation.h" |
9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
10 | 10 |
11 namespace cc { | 11 namespace cc { |
12 namespace { | 12 namespace { |
13 | 13 |
14 class CompositorTimingHistoryTest; | 14 class CompositorTimingHistoryTest; |
15 | 15 |
16 class TestCompositorTimingHistory : public CompositorTimingHistory { | 16 class TestCompositorTimingHistory : public CompositorTimingHistory { |
17 public: | 17 public: |
18 TestCompositorTimingHistory(CompositorTimingHistoryTest* test, | 18 TestCompositorTimingHistory(CompositorTimingHistoryTest* test, |
19 RenderingStatsInstrumentation* rendering_stats) | 19 RenderingStatsInstrumentation* rendering_stats) |
20 : CompositorTimingHistory(NULL_UMA, rendering_stats), test_(test) {} | 20 : CompositorTimingHistory(false, NULL_UMA, rendering_stats), |
| 21 test_(test) {} |
21 | 22 |
22 protected: | 23 protected: |
23 base::TimeTicks Now() const override; | 24 base::TimeTicks Now() const override; |
24 | 25 |
25 CompositorTimingHistoryTest* test_; | 26 CompositorTimingHistoryTest* test_; |
26 | 27 |
27 private: | 28 private: |
28 DISALLOW_COPY_AND_ASSIGN(TestCompositorTimingHistory); | 29 DISALLOW_COPY_AND_ASSIGN(TestCompositorTimingHistory); |
29 }; | 30 }; |
30 | 31 |
(...skipping 30 matching lines...) Expand all Loading... |
61 base::TimeDelta begin_main_frame_start_to_commit_duration = | 62 base::TimeDelta begin_main_frame_start_to_commit_duration = |
62 base::TimeDelta::FromMilliseconds(1); | 63 base::TimeDelta::FromMilliseconds(1); |
63 base::TimeDelta prepare_tiles_duration = base::TimeDelta::FromMilliseconds(2); | 64 base::TimeDelta prepare_tiles_duration = base::TimeDelta::FromMilliseconds(2); |
64 base::TimeDelta prepare_tiles_end_to_ready_to_activate_duration = | 65 base::TimeDelta prepare_tiles_end_to_ready_to_activate_duration = |
65 base::TimeDelta::FromMilliseconds(1); | 66 base::TimeDelta::FromMilliseconds(1); |
66 base::TimeDelta commit_to_ready_to_activate_duration = | 67 base::TimeDelta commit_to_ready_to_activate_duration = |
67 base::TimeDelta::FromMilliseconds(3); | 68 base::TimeDelta::FromMilliseconds(3); |
68 base::TimeDelta activate_duration = base::TimeDelta::FromMilliseconds(4); | 69 base::TimeDelta activate_duration = base::TimeDelta::FromMilliseconds(4); |
69 base::TimeDelta draw_duration = base::TimeDelta::FromMilliseconds(5); | 70 base::TimeDelta draw_duration = base::TimeDelta::FromMilliseconds(5); |
70 | 71 |
71 timing_history_.WillBeginMainFrame(true); | 72 timing_history_.WillBeginMainFrame(true, Now()); |
72 AdvanceNowBy(begin_main_frame_queue_duration); | 73 AdvanceNowBy(begin_main_frame_queue_duration); |
73 timing_history_.BeginMainFrameStarted(Now()); | 74 timing_history_.BeginMainFrameStarted(Now()); |
74 AdvanceNowBy(begin_main_frame_start_to_commit_duration); | 75 AdvanceNowBy(begin_main_frame_start_to_commit_duration); |
75 timing_history_.DidCommit(); | 76 timing_history_.DidCommit(); |
76 timing_history_.WillPrepareTiles(); | 77 timing_history_.WillPrepareTiles(); |
77 AdvanceNowBy(prepare_tiles_duration); | 78 AdvanceNowBy(prepare_tiles_duration); |
78 timing_history_.DidPrepareTiles(); | 79 timing_history_.DidPrepareTiles(); |
79 AdvanceNowBy(prepare_tiles_end_to_ready_to_activate_duration); | 80 AdvanceNowBy(prepare_tiles_end_to_ready_to_activate_duration); |
80 timing_history_.ReadyToActivate(); | 81 timing_history_.ReadyToActivate(); |
81 // Do not count idle time between notification and actual activation. | 82 // Do not count idle time between notification and actual activation. |
82 AdvanceNowBy(one_second); | 83 AdvanceNowBy(one_second); |
83 timing_history_.WillActivate(); | 84 timing_history_.WillActivate(); |
84 AdvanceNowBy(activate_duration); | 85 AdvanceNowBy(activate_duration); |
85 timing_history_.DidActivate(); | 86 timing_history_.DidActivate(); |
86 // Do not count idle time between activate and draw. | 87 // Do not count idle time between activate and draw. |
87 AdvanceNowBy(one_second); | 88 AdvanceNowBy(one_second); |
88 timing_history_.WillDraw(); | 89 timing_history_.WillDraw(); |
89 AdvanceNowBy(draw_duration); | 90 AdvanceNowBy(draw_duration); |
90 timing_history_.DidDraw(true); | 91 timing_history_.DidDraw(true, true, Now()); |
91 | 92 |
92 EXPECT_EQ(begin_main_frame_queue_duration, | 93 EXPECT_EQ(begin_main_frame_queue_duration, |
93 timing_history_.BeginMainFrameQueueDurationCriticalEstimate()); | 94 timing_history_.BeginMainFrameQueueDurationCriticalEstimate()); |
94 EXPECT_EQ(begin_main_frame_queue_duration, | 95 EXPECT_EQ(begin_main_frame_queue_duration, |
95 timing_history_.BeginMainFrameQueueDurationNotCriticalEstimate()); | 96 timing_history_.BeginMainFrameQueueDurationNotCriticalEstimate()); |
96 | 97 |
97 EXPECT_EQ(begin_main_frame_start_to_commit_duration, | 98 EXPECT_EQ(begin_main_frame_start_to_commit_duration, |
98 timing_history_.BeginMainFrameStartToCommitDurationEstimate()); | 99 timing_history_.BeginMainFrameStartToCommitDurationEstimate()); |
99 | 100 |
100 base::TimeDelta begin_main_frame_to_commit_duration_expected_ = | 101 base::TimeDelta begin_main_frame_to_commit_duration_expected_ = |
(...skipping 18 matching lines...) Expand all Loading... |
119 base::TimeDelta begin_main_frame_start_to_commit_duration = | 120 base::TimeDelta begin_main_frame_start_to_commit_duration = |
120 base::TimeDelta::FromMilliseconds(1); | 121 base::TimeDelta::FromMilliseconds(1); |
121 base::TimeDelta prepare_tiles_duration = base::TimeDelta::FromMilliseconds(2); | 122 base::TimeDelta prepare_tiles_duration = base::TimeDelta::FromMilliseconds(2); |
122 base::TimeDelta prepare_tiles_end_to_ready_to_activate_duration = | 123 base::TimeDelta prepare_tiles_end_to_ready_to_activate_duration = |
123 base::TimeDelta::FromMilliseconds(1); | 124 base::TimeDelta::FromMilliseconds(1); |
124 base::TimeDelta commit_to_ready_to_activate_duration = | 125 base::TimeDelta commit_to_ready_to_activate_duration = |
125 base::TimeDelta::FromMilliseconds(3); | 126 base::TimeDelta::FromMilliseconds(3); |
126 base::TimeDelta activate_duration = base::TimeDelta::FromMilliseconds(4); | 127 base::TimeDelta activate_duration = base::TimeDelta::FromMilliseconds(4); |
127 base::TimeDelta draw_duration = base::TimeDelta::FromMilliseconds(5); | 128 base::TimeDelta draw_duration = base::TimeDelta::FromMilliseconds(5); |
128 | 129 |
129 timing_history_.WillBeginMainFrame(true); | 130 timing_history_.WillBeginMainFrame(false, Now()); |
130 AdvanceNowBy(begin_main_frame_queue_duration); | 131 AdvanceNowBy(begin_main_frame_queue_duration); |
131 timing_history_.BeginMainFrameStarted(Now()); | 132 timing_history_.BeginMainFrameStarted(Now()); |
132 AdvanceNowBy(begin_main_frame_start_to_commit_duration); | 133 AdvanceNowBy(begin_main_frame_start_to_commit_duration); |
133 // BeginMainFrameAborted counts as a commit complete. | 134 // BeginMainFrameAborted counts as a commit complete. |
134 timing_history_.BeginMainFrameAborted(); | 135 timing_history_.BeginMainFrameAborted(); |
135 timing_history_.WillPrepareTiles(); | 136 timing_history_.WillPrepareTiles(); |
136 AdvanceNowBy(prepare_tiles_duration); | 137 AdvanceNowBy(prepare_tiles_duration); |
137 timing_history_.DidPrepareTiles(); | 138 timing_history_.DidPrepareTiles(); |
138 AdvanceNowBy(prepare_tiles_end_to_ready_to_activate_duration); | 139 AdvanceNowBy(prepare_tiles_end_to_ready_to_activate_duration); |
139 timing_history_.ReadyToActivate(); | 140 timing_history_.ReadyToActivate(); |
140 // Do not count idle time between notification and actual activation. | 141 // Do not count idle time between notification and actual activation. |
141 AdvanceNowBy(one_second); | 142 AdvanceNowBy(one_second); |
142 timing_history_.WillActivate(); | 143 timing_history_.WillActivate(); |
143 AdvanceNowBy(activate_duration); | 144 AdvanceNowBy(activate_duration); |
144 timing_history_.DidActivate(); | 145 timing_history_.DidActivate(); |
145 // Do not count idle time between activate and draw. | 146 // Do not count idle time between activate and draw. |
146 AdvanceNowBy(one_second); | 147 AdvanceNowBy(one_second); |
147 timing_history_.WillDraw(); | 148 timing_history_.WillDraw(); |
148 AdvanceNowBy(draw_duration); | 149 AdvanceNowBy(draw_duration); |
149 timing_history_.DidDraw(true); | 150 timing_history_.DidDraw(false, false, Now()); |
150 | 151 |
151 EXPECT_EQ(begin_main_frame_queue_duration, | 152 EXPECT_EQ(base::TimeDelta(), |
152 timing_history_.BeginMainFrameQueueDurationCriticalEstimate()); | 153 timing_history_.BeginMainFrameQueueDurationCriticalEstimate()); |
153 EXPECT_EQ(begin_main_frame_queue_duration, | 154 EXPECT_EQ(begin_main_frame_queue_duration, |
154 timing_history_.BeginMainFrameQueueDurationNotCriticalEstimate()); | 155 timing_history_.BeginMainFrameQueueDurationNotCriticalEstimate()); |
155 | 156 |
156 EXPECT_EQ(begin_main_frame_start_to_commit_duration, | 157 EXPECT_EQ(begin_main_frame_start_to_commit_duration, |
157 timing_history_.BeginMainFrameStartToCommitDurationEstimate()); | 158 timing_history_.BeginMainFrameStartToCommitDurationEstimate()); |
158 | 159 |
159 base::TimeDelta begin_main_frame_to_commit_duration_expected_ = | 160 base::TimeDelta begin_main_frame_to_commit_duration_expected_ = |
160 begin_main_frame_queue_duration + | 161 begin_main_frame_queue_duration + |
161 begin_main_frame_start_to_commit_duration; | 162 begin_main_frame_start_to_commit_duration; |
(...skipping 10 matching lines...) Expand all Loading... |
172 | 173 |
173 TEST_F(CompositorTimingHistoryTest, BeginMainFrame_CriticalFaster) { | 174 TEST_F(CompositorTimingHistoryTest, BeginMainFrame_CriticalFaster) { |
174 // Critical BeginMainFrames are faster than non critical ones. | 175 // Critical BeginMainFrames are faster than non critical ones. |
175 base::TimeDelta begin_main_frame_queue_duration_critical = | 176 base::TimeDelta begin_main_frame_queue_duration_critical = |
176 base::TimeDelta::FromMilliseconds(1); | 177 base::TimeDelta::FromMilliseconds(1); |
177 base::TimeDelta begin_main_frame_queue_duration_not_critical = | 178 base::TimeDelta begin_main_frame_queue_duration_not_critical = |
178 base::TimeDelta::FromMilliseconds(2); | 179 base::TimeDelta::FromMilliseconds(2); |
179 base::TimeDelta begin_main_frame_start_to_commit_duration = | 180 base::TimeDelta begin_main_frame_start_to_commit_duration = |
180 base::TimeDelta::FromMilliseconds(1); | 181 base::TimeDelta::FromMilliseconds(1); |
181 | 182 |
182 timing_history_.WillBeginMainFrame(true); | 183 timing_history_.WillBeginMainFrame(true, Now()); |
183 AdvanceNowBy(begin_main_frame_queue_duration_critical); | 184 AdvanceNowBy(begin_main_frame_queue_duration_critical); |
184 timing_history_.BeginMainFrameStarted(Now()); | 185 timing_history_.BeginMainFrameStarted(Now()); |
185 AdvanceNowBy(begin_main_frame_start_to_commit_duration); | 186 AdvanceNowBy(begin_main_frame_start_to_commit_duration); |
186 timing_history_.BeginMainFrameAborted(); | 187 timing_history_.BeginMainFrameAborted(); |
187 | 188 |
188 timing_history_.WillBeginMainFrame(false); | 189 timing_history_.WillBeginMainFrame(false, Now()); |
189 AdvanceNowBy(begin_main_frame_queue_duration_not_critical); | 190 AdvanceNowBy(begin_main_frame_queue_duration_not_critical); |
190 timing_history_.BeginMainFrameStarted(Now()); | 191 timing_history_.BeginMainFrameStarted(Now()); |
191 AdvanceNowBy(begin_main_frame_start_to_commit_duration); | 192 AdvanceNowBy(begin_main_frame_start_to_commit_duration); |
192 timing_history_.BeginMainFrameAborted(); | 193 timing_history_.BeginMainFrameAborted(); |
193 | 194 |
194 // Since the critical BeginMainFrames are faster than non critical ones, | 195 // Since the critical BeginMainFrames are faster than non critical ones, |
195 // the expectations are straightforward. | 196 // the expectations are straightforward. |
196 EXPECT_EQ(begin_main_frame_queue_duration_critical, | 197 EXPECT_EQ(begin_main_frame_queue_duration_critical, |
197 timing_history_.BeginMainFrameQueueDurationCriticalEstimate()); | 198 timing_history_.BeginMainFrameQueueDurationCriticalEstimate()); |
198 EXPECT_EQ(begin_main_frame_queue_duration_not_critical, | 199 EXPECT_EQ(begin_main_frame_queue_duration_not_critical, |
(...skipping 13 matching lines...) Expand all Loading... |
212 // which is unexpected, but could occur if one type of frame | 213 // which is unexpected, but could occur if one type of frame |
213 // hasn't been sent for a significant amount of time. | 214 // hasn't been sent for a significant amount of time. |
214 base::TimeDelta begin_main_frame_queue_duration_critical = | 215 base::TimeDelta begin_main_frame_queue_duration_critical = |
215 base::TimeDelta::FromMilliseconds(2); | 216 base::TimeDelta::FromMilliseconds(2); |
216 base::TimeDelta begin_main_frame_queue_duration_not_critical = | 217 base::TimeDelta begin_main_frame_queue_duration_not_critical = |
217 base::TimeDelta::FromMilliseconds(1); | 218 base::TimeDelta::FromMilliseconds(1); |
218 base::TimeDelta begin_main_frame_start_to_commit_duration = | 219 base::TimeDelta begin_main_frame_start_to_commit_duration = |
219 base::TimeDelta::FromMilliseconds(1); | 220 base::TimeDelta::FromMilliseconds(1); |
220 | 221 |
221 // A single critical frame that is slow. | 222 // A single critical frame that is slow. |
222 timing_history_.WillBeginMainFrame(true); | 223 timing_history_.WillBeginMainFrame(true, Now()); |
223 AdvanceNowBy(begin_main_frame_queue_duration_critical); | 224 AdvanceNowBy(begin_main_frame_queue_duration_critical); |
224 timing_history_.BeginMainFrameStarted(Now()); | 225 timing_history_.BeginMainFrameStarted(Now()); |
225 AdvanceNowBy(begin_main_frame_start_to_commit_duration); | 226 AdvanceNowBy(begin_main_frame_start_to_commit_duration); |
226 // BeginMainFrameAborted counts as a commit complete. | 227 // BeginMainFrameAborted counts as a commit complete. |
227 timing_history_.BeginMainFrameAborted(); | 228 timing_history_.BeginMainFrameAborted(); |
228 | 229 |
229 // A bunch of faster non critical frames that are newer. | 230 // A bunch of faster non critical frames that are newer. |
230 for (int i = 0; i < 100; i++) { | 231 for (int i = 0; i < 100; i++) { |
231 timing_history_.WillBeginMainFrame(false); | 232 timing_history_.WillBeginMainFrame(false, Now()); |
232 AdvanceNowBy(begin_main_frame_queue_duration_not_critical); | 233 AdvanceNowBy(begin_main_frame_queue_duration_not_critical); |
233 timing_history_.BeginMainFrameStarted(Now()); | 234 timing_history_.BeginMainFrameStarted(Now()); |
234 AdvanceNowBy(begin_main_frame_start_to_commit_duration); | 235 AdvanceNowBy(begin_main_frame_start_to_commit_duration); |
235 // BeginMainFrameAborted counts as a commit complete. | 236 // BeginMainFrameAborted counts as a commit complete. |
236 timing_history_.BeginMainFrameAborted(); | 237 timing_history_.BeginMainFrameAborted(); |
237 } | 238 } |
238 | 239 |
239 // Recent fast non critical BeginMainFrames should result in the | 240 // Recent fast non critical BeginMainFrames should result in the |
240 // critical estimate also being fast. | 241 // critical estimate also being fast. |
241 EXPECT_EQ(begin_main_frame_queue_duration_not_critical, | 242 EXPECT_EQ(begin_main_frame_queue_duration_not_critical, |
(...skipping 16 matching lines...) Expand all Loading... |
258 // which is unexpected, but could occur if one type of frame | 259 // which is unexpected, but could occur if one type of frame |
259 // hasn't been sent for a significant amount of time. | 260 // hasn't been sent for a significant amount of time. |
260 base::TimeDelta begin_main_frame_queue_duration_critical = | 261 base::TimeDelta begin_main_frame_queue_duration_critical = |
261 base::TimeDelta::FromMilliseconds(2); | 262 base::TimeDelta::FromMilliseconds(2); |
262 base::TimeDelta begin_main_frame_queue_duration_not_critical = | 263 base::TimeDelta begin_main_frame_queue_duration_not_critical = |
263 base::TimeDelta::FromMilliseconds(1); | 264 base::TimeDelta::FromMilliseconds(1); |
264 base::TimeDelta begin_main_frame_start_to_commit_duration = | 265 base::TimeDelta begin_main_frame_start_to_commit_duration = |
265 base::TimeDelta::FromMilliseconds(1); | 266 base::TimeDelta::FromMilliseconds(1); |
266 | 267 |
267 // A single non critical frame that is fast. | 268 // A single non critical frame that is fast. |
268 timing_history_.WillBeginMainFrame(false); | 269 timing_history_.WillBeginMainFrame(false, Now()); |
269 AdvanceNowBy(begin_main_frame_queue_duration_not_critical); | 270 AdvanceNowBy(begin_main_frame_queue_duration_not_critical); |
270 timing_history_.BeginMainFrameStarted(Now()); | 271 timing_history_.BeginMainFrameStarted(Now()); |
271 AdvanceNowBy(begin_main_frame_start_to_commit_duration); | 272 AdvanceNowBy(begin_main_frame_start_to_commit_duration); |
272 timing_history_.BeginMainFrameAborted(); | 273 timing_history_.BeginMainFrameAborted(); |
273 | 274 |
274 // A bunch of slower critical frames that are newer. | 275 // A bunch of slower critical frames that are newer. |
275 for (int i = 0; i < 100; i++) { | 276 for (int i = 0; i < 100; i++) { |
276 timing_history_.WillBeginMainFrame(true); | 277 timing_history_.WillBeginMainFrame(true, Now()); |
277 AdvanceNowBy(begin_main_frame_queue_duration_critical); | 278 AdvanceNowBy(begin_main_frame_queue_duration_critical); |
278 timing_history_.BeginMainFrameStarted(Now()); | 279 timing_history_.BeginMainFrameStarted(Now()); |
279 AdvanceNowBy(begin_main_frame_start_to_commit_duration); | 280 AdvanceNowBy(begin_main_frame_start_to_commit_duration); |
280 timing_history_.BeginMainFrameAborted(); | 281 timing_history_.BeginMainFrameAborted(); |
281 } | 282 } |
282 | 283 |
283 // Recent slow critical BeginMainFrames should result in the | 284 // Recent slow critical BeginMainFrames should result in the |
284 // not critical estimate also being slow. | 285 // not critical estimate also being slow. |
285 EXPECT_EQ(begin_main_frame_queue_duration_critical, | 286 EXPECT_EQ(begin_main_frame_queue_duration_critical, |
286 timing_history_.BeginMainFrameQueueDurationCriticalEstimate()); | 287 timing_history_.BeginMainFrameQueueDurationCriticalEstimate()); |
287 EXPECT_EQ(begin_main_frame_queue_duration_critical, | 288 EXPECT_EQ(begin_main_frame_queue_duration_critical, |
288 timing_history_.BeginMainFrameQueueDurationNotCriticalEstimate()); | 289 timing_history_.BeginMainFrameQueueDurationNotCriticalEstimate()); |
289 | 290 |
290 EXPECT_EQ(begin_main_frame_start_to_commit_duration, | 291 EXPECT_EQ(begin_main_frame_start_to_commit_duration, |
291 timing_history_.BeginMainFrameStartToCommitDurationEstimate()); | 292 timing_history_.BeginMainFrameStartToCommitDurationEstimate()); |
292 | 293 |
293 base::TimeDelta begin_main_frame_to_commit_duration_expected_ = | 294 base::TimeDelta begin_main_frame_to_commit_duration_expected_ = |
294 begin_main_frame_queue_duration_critical + | 295 begin_main_frame_queue_duration_critical + |
295 begin_main_frame_start_to_commit_duration; | 296 begin_main_frame_start_to_commit_duration; |
296 EXPECT_EQ(begin_main_frame_to_commit_duration_expected_, | 297 EXPECT_EQ(begin_main_frame_to_commit_duration_expected_, |
297 timing_history_.BeginMainFrameToCommitDurationEstimate()); | 298 timing_history_.BeginMainFrameToCommitDurationEstimate()); |
298 } | 299 } |
299 | 300 |
300 } // namespace | 301 } // namespace |
301 } // namespace cc | 302 } // namespace cc |
OLD | NEW |