| Index: cc/surfaces/display_scheduler_unittest.cc
|
| diff --git a/cc/surfaces/display_scheduler_unittest.cc b/cc/surfaces/display_scheduler_unittest.cc
|
| index c7b5bd81802681d0c567ca61e6b31e969a7026f0..a5a053d8415796047f1dce8ea1a44e890dedb605 100644
|
| --- a/cc/surfaces/display_scheduler_unittest.cc
|
| +++ b/cc/surfaces/display_scheduler_unittest.cc
|
| @@ -54,7 +54,13 @@ class TestDisplayScheduler : public DisplayScheduler {
|
| return DesiredBeginFrameDeadlineTime();
|
| }
|
|
|
| - void BeginFrameDeadlineForTest() { OnBeginFrameDeadline(); }
|
| + void BeginFrameDeadlineForTest() {
|
| + // Ensure that any missed BeginFrames were handled by the scheduler. We need
|
| + // to run the scheduled task ourselves since the NullTaskRunner won't.
|
| + if (!missed_begin_frame_task_.IsCancelled())
|
| + missed_begin_frame_task_.callback().Run();
|
| + OnBeginFrameDeadline();
|
| + }
|
|
|
| void ScheduleBeginFrameDeadline() override {
|
| scheduler_begin_frame_deadline_count_++;
|
| @@ -65,6 +71,10 @@ class TestDisplayScheduler : public DisplayScheduler {
|
| return scheduler_begin_frame_deadline_count_;
|
| }
|
|
|
| + bool inside_begin_frame_deadline_interval() {
|
| + return inside_begin_frame_deadline_interval_;
|
| + }
|
| +
|
| protected:
|
| int scheduler_begin_frame_deadline_count_;
|
| };
|
| @@ -85,7 +95,8 @@ class DisplaySchedulerTest : public testing::Test {
|
|
|
| void SetUp() override { scheduler_.SetRootSurfaceResourcesLocked(false); }
|
|
|
| - void BeginFrameForTest() {
|
| + void AdvanceTimeAndBeginFrameForTest() {
|
| + now_src_.Advance(base::TimeDelta::FromMicroseconds(10000));
|
| base::TimeTicks frame_time = now_src_.NowTicks();
|
| base::TimeDelta interval = BeginFrameArgs::DefaultInterval();
|
| base::TimeTicks deadline = frame_time + interval;
|
| @@ -120,14 +131,14 @@ TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilNewRootSurface) {
|
| scheduler_.SetVisible(true);
|
|
|
| // Go trough an initial BeginFrame cycle with the root surface.
|
| - BeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| scheduler_.SetNewRootSurface(root_surface_id1);
|
| scheduler_.BeginFrameDeadlineForTest();
|
|
|
| // Resize on the next begin frame cycle should cause the deadline to wait
|
| // for a new root surface.
|
| + AdvanceTimeAndBeginFrameForTest();
|
| late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
|
| - BeginFrameForTest();
|
| scheduler_.SurfaceDamaged(sid1);
|
| EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| scheduler_.DisplayResized();
|
| @@ -139,7 +150,7 @@ TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilNewRootSurface) {
|
|
|
| // Verify deadline goes back to normal after resize.
|
| late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
|
| - BeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| scheduler_.SurfaceDamaged(sid1);
|
| EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| scheduler_.SurfaceDamaged(root_surface_id2);
|
| @@ -158,14 +169,14 @@ TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilDamagedSurface) {
|
| scheduler_.SetVisible(true);
|
|
|
| // Go trough an initial BeginFrame cycle with the root surface.
|
| - BeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| scheduler_.SetNewRootSurface(root_surface_id);
|
| scheduler_.BeginFrameDeadlineForTest();
|
|
|
| // Resize on the next begin frame cycle should cause the deadline to wait
|
| // for a new root surface.
|
| + AdvanceTimeAndBeginFrameForTest();
|
| late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
|
| - BeginFrameForTest();
|
| scheduler_.SurfaceDamaged(sid1);
|
| EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| scheduler_.DisplayResized();
|
| @@ -176,8 +187,8 @@ TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilDamagedSurface) {
|
| scheduler_.BeginFrameDeadlineForTest();
|
|
|
| // Verify deadline goes back to normal after resize.
|
| + AdvanceTimeAndBeginFrameForTest();
|
| late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
|
| - BeginFrameForTest();
|
| scheduler_.SurfaceDamaged(sid1);
|
| EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| scheduler_.SurfaceDamaged(root_surface_id);
|
| @@ -201,15 +212,15 @@ TEST_F(DisplaySchedulerTest, SurfaceDamaged) {
|
|
|
| // Get scheduler to detect surface 1 as active by drawing
|
| // two frames in a row with damage from surface 1.
|
| - BeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| scheduler_.SurfaceDamaged(sid1);
|
| scheduler_.BeginFrameDeadlineForTest();
|
| - BeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| scheduler_.SurfaceDamaged(sid1);
|
| scheduler_.BeginFrameDeadlineForTest();
|
|
|
| // Damage only from surface 2 (inactive) does not trigger deadline early.
|
| - BeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| scheduler_.SurfaceDamaged(sid2);
|
| EXPECT_LT(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| @@ -221,13 +232,13 @@ TEST_F(DisplaySchedulerTest, SurfaceDamaged) {
|
| scheduler_.BeginFrameDeadlineForTest();
|
|
|
| // Make both surface 1 and 2 active.
|
| - BeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| scheduler_.SurfaceDamaged(sid2);
|
| scheduler_.SurfaceDamaged(sid1);
|
| scheduler_.BeginFrameDeadlineForTest();
|
|
|
| // Deadline doesn't trigger early until surface 1 and 2 are both damaged.
|
| - BeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| EXPECT_LT(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| scheduler_.SurfaceDamaged(sid1);
|
| @@ -239,16 +250,15 @@ TEST_F(DisplaySchedulerTest, SurfaceDamaged) {
|
| scheduler_.BeginFrameDeadlineForTest();
|
|
|
| // Make the system idle
|
| - BeginFrameForTest();
|
| - scheduler_.BeginFrameDeadlineForTest();
|
| - BeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| scheduler_.BeginFrameDeadlineForTest();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| + EXPECT_FALSE(scheduler_.inside_begin_frame_deadline_interval());
|
|
|
| // Deadline should trigger early if child surfaces are idle and
|
| // we get damage on the root surface.
|
| - BeginFrameForTest();
|
| - EXPECT_LT(now_src().NowTicks(),
|
| - scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| + AdvanceTimeAndBeginFrameForTest();
|
| + EXPECT_FALSE(scheduler_.inside_begin_frame_deadline_interval());
|
| scheduler_.SurfaceDamaged(root_surface_id);
|
| EXPECT_GE(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| @@ -267,7 +277,7 @@ TEST_F(DisplaySchedulerTest, OutputSurfaceLost) {
|
| scheduler_.SetNewRootSurface(root_surface_id);
|
|
|
| // DrawAndSwap normally.
|
| - BeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| EXPECT_LT(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| EXPECT_EQ(0, client_.draw_and_swap_count());
|
| @@ -276,7 +286,7 @@ TEST_F(DisplaySchedulerTest, OutputSurfaceLost) {
|
| EXPECT_EQ(1, client_.draw_and_swap_count());
|
|
|
| // Deadline triggers immediately on OutputSurfaceLost.
|
| - BeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| EXPECT_LT(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| scheduler_.OutputSurfaceLost();
|
| @@ -334,7 +344,7 @@ TEST_F(DisplaySchedulerTest, Visibility) {
|
| EXPECT_EQ(1u, fake_begin_frame_source_.num_observers());
|
|
|
| // DrawAndSwap normally.
|
| - BeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| EXPECT_LT(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| EXPECT_EQ(0, client_.draw_and_swap_count());
|
| @@ -342,7 +352,7 @@ TEST_F(DisplaySchedulerTest, Visibility) {
|
| scheduler_.BeginFrameDeadlineForTest();
|
| EXPECT_EQ(1, client_.draw_and_swap_count());
|
|
|
| - BeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| EXPECT_LT(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
|
|
| @@ -386,7 +396,7 @@ TEST_F(DisplaySchedulerTest, ResizeCausesSwap) {
|
| scheduler_.SetNewRootSurface(root_surface_id);
|
|
|
| // DrawAndSwap normally.
|
| - BeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| EXPECT_LT(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| EXPECT_EQ(0, client_.draw_and_swap_count());
|
| @@ -395,7 +405,7 @@ TEST_F(DisplaySchedulerTest, ResizeCausesSwap) {
|
| EXPECT_EQ(1, client_.draw_and_swap_count());
|
|
|
| scheduler_.DisplayResized();
|
| - BeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| // DisplayResized should trigger a swap to happen.
|
| scheduler_.BeginFrameDeadlineForTest();
|
| EXPECT_EQ(2, client_.draw_and_swap_count());
|
| @@ -414,7 +424,7 @@ TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) {
|
| scheduler_.SetNewRootSurface(root_surface_id);
|
|
|
| // DrawAndSwap normally.
|
| - BeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| EXPECT_LT(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| EXPECT_EQ(0, client_.draw_and_swap_count());
|
| @@ -423,8 +433,8 @@ TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) {
|
| EXPECT_EQ(1, client_.draw_and_swap_count());
|
|
|
| // Deadline triggers late while root resources are locked.
|
| + AdvanceTimeAndBeginFrameForTest();
|
| late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
|
| - BeginFrameForTest();
|
| scheduler_.SurfaceDamaged(sid1);
|
| EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| scheduler_.SetRootSurfaceResourcesLocked(true);
|
| @@ -437,8 +447,8 @@ TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) {
|
| EXPECT_EQ(1, client_.draw_and_swap_count());
|
|
|
| // Deadline triggers normally when root resources are unlocked.
|
| + AdvanceTimeAndBeginFrameForTest();
|
| late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
|
| - BeginFrameForTest();
|
| scheduler_.SurfaceDamaged(sid1);
|
| EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| scheduler_.SetRootSurfaceResourcesLocked(false);
|
| @@ -465,17 +475,17 @@ TEST_F(DisplaySchedulerTest, DidSwapBuffers) {
|
| scheduler_.SetNewRootSurface(root_surface_id);
|
|
|
| // Get scheduler to detect surface 1 and 2 as active.
|
| - BeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| scheduler_.SurfaceDamaged(sid1);
|
| scheduler_.SurfaceDamaged(sid2);
|
| scheduler_.BeginFrameDeadlineForTest();
|
| - BeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| scheduler_.SurfaceDamaged(sid1);
|
| scheduler_.SurfaceDamaged(sid2);
|
| scheduler_.BeginFrameDeadlineForTest();
|
|
|
| // DrawAndSwap normally.
|
| - BeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| EXPECT_LT(now_src().NowTicks(),
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| EXPECT_EQ(2, client_.draw_and_swap_count());
|
| @@ -486,9 +496,9 @@ TEST_F(DisplaySchedulerTest, DidSwapBuffers) {
|
| scheduler_.DidSwapBuffers();
|
|
|
| // Deadline triggers late when swap throttled.
|
| + AdvanceTimeAndBeginFrameForTest();
|
| base::TimeTicks late_deadline =
|
| now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
|
| - BeginFrameForTest();
|
| // Damage surface 1, but not surface 2 so we avoid triggering deadline
|
| // early because all surfaces are ready.
|
| scheduler_.SurfaceDamaged(sid1);
|
| @@ -501,11 +511,11 @@ TEST_F(DisplaySchedulerTest, DidSwapBuffers) {
|
|
|
| // Deadline triggers normally once not swap throttled.
|
| // Damage from previous BeginFrame should cary over, so don't damage again.
|
| + scheduler_.DidReceiveSwapBuffersAck();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| base::TimeTicks expected_deadline =
|
| scheduler_.LastUsedBeginFrameArgs().deadline -
|
| BeginFrameArgs::DefaultEstimatedParentDrawTime();
|
| - scheduler_.DidReceiveSwapBuffersAck();
|
| - BeginFrameForTest();
|
| EXPECT_EQ(expected_deadline,
|
| scheduler_.DesiredBeginFrameDeadlineTimeForTest());
|
| // Still waiting for surface 2. Once it updates, deadline should trigger
|
| @@ -549,12 +559,12 @@ TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) {
|
| scheduler_.SetNewRootSurface(root_surface_id);
|
| EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
|
|
|
| - BeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
|
|
|
| scheduler_.BeginFrameDeadlineForTest();
|
| scheduler_.DidSwapBuffers();
|
| - BeginFrameForTest();
|
| + AdvanceTimeAndBeginFrameForTest();
|
| EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
|
|
|
| scheduler_.DidReceiveSwapBuffersAck();
|
|
|