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/surfaces/display_scheduler.h" | 5 #include "cc/surfaces/display_scheduler.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/test/null_task_runner.h" | 8 #include "base/test/null_task_runner.h" |
9 #include "base/test/simple_test_tick_clock.h" | 9 #include "base/test/simple_test_tick_clock.h" |
10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
221 scheduler_->SurfaceDamaged(sid2); | 221 scheduler_->SurfaceDamaged(sid2); |
222 EXPECT_GE(now_src().NowTicks(), | 222 EXPECT_GE(now_src().NowTicks(), |
223 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 223 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
224 scheduler_->BeginFrameDeadlineForTest(); | 224 scheduler_->BeginFrameDeadlineForTest(); |
225 | 225 |
226 // Make the system idle | 226 // Make the system idle |
227 BeginFrameForTest(); | 227 BeginFrameForTest(); |
228 scheduler_->BeginFrameDeadlineForTest(); | 228 scheduler_->BeginFrameDeadlineForTest(); |
229 BeginFrameForTest(); | 229 BeginFrameForTest(); |
230 scheduler_->BeginFrameDeadlineForTest(); | 230 scheduler_->BeginFrameDeadlineForTest(); |
231 BeginFrameForTest(); | |
232 scheduler_->BeginFrameDeadlineForTest(); | |
233 | 231 |
234 // Deadline should trigger early if child surfaces are idle and | 232 // Deadline should trigger early if child surfaces are idle and |
235 // we get damage on the root surface. | 233 // we get damage on the root surface. |
236 BeginFrameForTest(); | |
237 EXPECT_LT(now_src().NowTicks(), | |
238 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | |
239 scheduler_->SurfaceDamaged(root_surface_id); | |
240 EXPECT_GE(now_src().NowTicks(), | |
241 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | |
242 scheduler_->BeginFrameDeadlineForTest(); | |
243 } | |
244 | |
245 TEST_F(DisplaySchedulerTest, SurfaceActiveAt30fps) { | |
246 SurfaceId root_surface_id(0); | |
247 SurfaceId sid1(1); | |
248 SurfaceId sid2(2); | |
249 | |
250 // Set the root surface | |
251 scheduler_->SetNewRootSurface(root_surface_id); | |
252 | |
253 // Get scheduler to detect surface 1 and 2 as active by drawing | |
254 // two frames in a row. First frame with damage only from surface 1 | |
255 // and the second frame only with damage from surface 2. | |
256 BeginFrameForTest(); | |
257 scheduler_->SurfaceDamaged(sid1); | |
258 scheduler_->BeginFrameDeadlineForTest(); | |
259 BeginFrameForTest(); | |
260 scheduler_->SurfaceDamaged(sid2); | |
261 scheduler_->BeginFrameDeadlineForTest(); | |
262 | |
263 // Deadline doesn't trigger early until surface 1 and 2 are both damaged. | |
264 BeginFrameForTest(); | |
265 EXPECT_LT(now_src().NowTicks(), | |
266 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | |
267 scheduler_->SurfaceDamaged(sid1); | |
268 EXPECT_LT(now_src().NowTicks(), | |
269 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | |
270 scheduler_->SurfaceDamaged(sid2); | |
271 EXPECT_GE(now_src().NowTicks(), | |
272 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | |
273 scheduler_->BeginFrameDeadlineForTest(); | |
274 | |
275 // Make the system idle | |
276 BeginFrameForTest(); | |
277 scheduler_->BeginFrameDeadlineForTest(); | |
278 BeginFrameForTest(); | |
279 scheduler_->BeginFrameDeadlineForTest(); | |
280 BeginFrameForTest(); | |
281 scheduler_->BeginFrameDeadlineForTest(); | |
282 | |
283 // Deadline should trigger early if child surfaces are idle and | |
284 // we get damage on the root surface. | |
285 BeginFrameForTest(); | |
286 EXPECT_LT(now_src().NowTicks(), | |
287 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | |
288 scheduler_->SurfaceDamaged(root_surface_id); | |
289 EXPECT_GE(now_src().NowTicks(), | |
290 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | |
291 scheduler_->BeginFrameDeadlineForTest(); | |
292 } | |
293 | |
294 TEST_F(DisplaySchedulerTest, SurfaceActiveAt20fps) { | |
295 SurfaceId root_surface_id(0); | |
296 SurfaceId sid1(1); | |
297 SurfaceId sid2(2); | |
298 SurfaceId sid3(3); | |
299 | |
300 // Set the root surface | |
301 scheduler_->SetNewRootSurface(root_surface_id); | |
302 | |
303 // Get scheduler to detect surface 1, 2, and 3 as active by drawing | |
304 // 3 frames in a row. With damage from each surface in succession. | |
305 BeginFrameForTest(); | |
306 scheduler_->SurfaceDamaged(sid1); | |
307 scheduler_->BeginFrameDeadlineForTest(); | |
308 BeginFrameForTest(); | |
309 scheduler_->SurfaceDamaged(sid2); | |
310 scheduler_->BeginFrameDeadlineForTest(); | |
311 BeginFrameForTest(); | |
312 scheduler_->SurfaceDamaged(sid3); | |
313 scheduler_->BeginFrameDeadlineForTest(); | |
314 | |
315 // Deadline doesn't trigger early until surface 1, 2, and 3 are all damaged. | |
316 BeginFrameForTest(); | |
317 EXPECT_LT(now_src().NowTicks(), | |
318 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | |
319 scheduler_->SurfaceDamaged(sid1); | |
320 EXPECT_LT(now_src().NowTicks(), | |
321 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | |
322 scheduler_->SurfaceDamaged(sid2); | |
323 EXPECT_LT(now_src().NowTicks(), | |
324 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | |
325 scheduler_->SurfaceDamaged(sid3); | |
326 EXPECT_GE(now_src().NowTicks(), | |
327 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | |
328 scheduler_->BeginFrameDeadlineForTest(); | |
329 | |
330 // Make the system idle | |
331 BeginFrameForTest(); | |
332 scheduler_->BeginFrameDeadlineForTest(); | |
333 BeginFrameForTest(); | |
334 scheduler_->BeginFrameDeadlineForTest(); | |
335 BeginFrameForTest(); | |
336 scheduler_->BeginFrameDeadlineForTest(); | |
337 | |
338 // Deadline should trigger early if child surfaces are idle and | |
339 // we get damage on the root surface. | |
340 BeginFrameForTest(); | |
341 EXPECT_LT(now_src().NowTicks(), | |
342 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | |
343 scheduler_->SurfaceDamaged(root_surface_id); | |
344 EXPECT_GE(now_src().NowTicks(), | |
345 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | |
346 scheduler_->BeginFrameDeadlineForTest(); | |
347 } | |
348 | |
349 TEST_F(DisplaySchedulerTest, SurfaceActiveAt20fps_SingleSurface) { | |
350 SurfaceId root_surface_id(0); | |
351 SurfaceId sid1(1); | |
352 SurfaceId sid2(2); | |
353 SurfaceId sid3(3); | |
354 | |
355 // Set the root surface | |
356 scheduler_->SetNewRootSurface(root_surface_id); | |
357 | |
358 // Get scheduler to detect surface 1 as active even though | |
359 // it only swaps at 20fps. | |
360 BeginFrameForTest(); | |
361 scheduler_->SurfaceDamaged(sid1); | |
362 scheduler_->BeginFrameDeadlineForTest(); | |
363 BeginFrameForTest(); | |
364 scheduler_->BeginFrameDeadlineForTest(); | |
365 BeginFrameForTest(); | |
366 scheduler_->BeginFrameDeadlineForTest(); | |
367 | |
368 // Deadline doesn't trigger early until surface 1 is damaged. | |
369 BeginFrameForTest(); | |
370 EXPECT_LT(now_src().NowTicks(), | |
371 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | |
372 scheduler_->SurfaceDamaged(sid1); | |
373 EXPECT_GE(now_src().NowTicks(), | |
374 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | |
375 scheduler_->BeginFrameDeadlineForTest(); | |
376 | |
377 // Make the system idle | |
378 BeginFrameForTest(); | |
379 scheduler_->BeginFrameDeadlineForTest(); | |
380 BeginFrameForTest(); | |
381 scheduler_->BeginFrameDeadlineForTest(); | |
382 BeginFrameForTest(); | |
383 scheduler_->BeginFrameDeadlineForTest(); | |
384 | |
385 // Deadline should trigger early if child surfaces are idle and | |
386 // we get damage on the root surface. | |
387 BeginFrameForTest(); | 234 BeginFrameForTest(); |
388 EXPECT_LT(now_src().NowTicks(), | 235 EXPECT_LT(now_src().NowTicks(), |
389 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 236 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
390 scheduler_->SurfaceDamaged(root_surface_id); | 237 scheduler_->SurfaceDamaged(root_surface_id); |
391 EXPECT_GE(now_src().NowTicks(), | 238 EXPECT_GE(now_src().NowTicks(), |
392 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 239 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
393 scheduler_->BeginFrameDeadlineForTest(); | 240 scheduler_->BeginFrameDeadlineForTest(); |
394 } | 241 } |
395 | 242 |
396 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { | 243 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
550 | 397 |
551 scheduler_->SetRootSurfaceResourcesLocked(true); | 398 scheduler_->SetRootSurfaceResourcesLocked(true); |
552 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 399 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); |
553 | 400 |
554 scheduler_->OutputSurfaceLost(); | 401 scheduler_->OutputSurfaceLost(); |
555 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 402 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); |
556 } | 403 } |
557 | 404 |
558 } // namespace | 405 } // namespace |
559 } // namespace cc | 406 } // namespace cc |
OLD | NEW |