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(); |