| Index: cc/scheduler/scheduler_unittest.cc
|
| diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc
|
| index c40185063dc8d2d7016d929b6a1c0972a7d0b619..68dc0d1a49ee9e1ed8de92a1982c282438c318a3 100644
|
| --- a/cc/scheduler/scheduler_unittest.cc
|
| +++ b/cc/scheduler/scheduler_unittest.cc
|
| @@ -94,11 +94,15 @@ class FakeSchedulerClient : public SchedulerClient {
|
| }
|
|
|
| // SchedulerClient implementation.
|
| - virtual void SetNeedsBeginImplFrame(bool enable) OVERRIDE {
|
| - actions_.push_back("SetNeedsBeginImplFrame");
|
| + virtual void SetNeedsBeginFrame(bool enable) OVERRIDE {
|
| + actions_.push_back("SetNeedsBeginFrame");
|
| states_.push_back(scheduler_->StateAsValue().release());
|
| needs_begin_impl_frame_ = enable;
|
| }
|
| + virtual void WillBeginImplFrame(const BeginFrameArgs& args) OVERRIDE {
|
| + actions_.push_back("WillBeginImplFrame");
|
| + states_.push_back(scheduler_->StateAsValue().release());
|
| + }
|
| virtual void ScheduledActionSendBeginMainFrame() OVERRIDE {
|
| actions_.push_back("ScheduledActionSendBeginMainFrame");
|
| states_.push_back(scheduler_->StateAsValue().release());
|
| @@ -190,7 +194,7 @@ void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler,
|
| scheduler->NotifyBeginMainFrameStarted();
|
| scheduler->NotifyReadyToCommit();
|
| // Go through the motions to draw the commit.
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
|
|
| // Run the posted deadline task.
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| @@ -198,8 +202,8 @@ void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler,
|
| EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
|
|
|
| // We need another BeginImplFrame so Scheduler calls
|
| - // SetNeedsBeginImplFrame(false).
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| + // SetNeedsBeginFrame(false).
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
|
|
| // Run the posted deadline task.
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| @@ -236,19 +240,20 @@ TEST(SchedulerTest, RequestCommit) {
|
| client.Reset();
|
| scheduler->SetNeedsCommit();
|
| EXPECT_TRUE(client.needs_begin_impl_frame());
|
| - EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client);
|
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client);
|
| client.Reset();
|
|
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client);
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION("WillBeginImplFrame", client, 0, 2);
|
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| EXPECT_TRUE(client.needs_begin_impl_frame());
|
| client.Reset();
|
|
|
| // If we don't swap on the deadline, we need to request another
|
| // BeginImplFrame.
|
| - scheduler->OnBeginImplFrameDeadline();
|
| - EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client);
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client);
|
| EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
|
| EXPECT_TRUE(client.needs_begin_impl_frame());
|
| client.Reset();
|
| @@ -261,29 +266,29 @@ TEST(SchedulerTest, RequestCommit) {
|
| client.Reset();
|
|
|
| // BeginImplFrame should prepare the draw.
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(client.num_actions_(), 0);
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| EXPECT_TRUE(client.needs_begin_impl_frame());
|
| client.Reset();
|
|
|
| // BeginImplFrame deadline should draw.
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2);
|
| - EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2);
|
| + EXPECT_ACTION("SetNeedsBeginFrame", client, 1, 2);
|
| EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
|
| EXPECT_TRUE(client.needs_begin_impl_frame());
|
| client.Reset();
|
|
|
| - // The following BeginImplFrame deadline should SetNeedsBeginImplFrame(false)
|
| + // The following BeginImplFrame deadline should SetNeedsBeginFrame(false)
|
| // to avoid excessive toggles.
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(client.num_actions_(), 0);
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| client.Reset();
|
|
|
| - scheduler->OnBeginImplFrameDeadline();
|
| - EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client);
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client);
|
| EXPECT_FALSE(client.needs_begin_impl_frame());
|
| client.Reset();
|
| }
|
| @@ -302,11 +307,12 @@ TEST(SchedulerTest, RequestCommitAfterBeginMainFrameSent) {
|
|
|
| // SetNeedsCommit should begin the frame.
|
| scheduler->SetNeedsCommit();
|
| - EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client);
|
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client);
|
|
|
| client.Reset();
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client);
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION("WillBeginImplFrame", client, 0, 2);
|
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
|
|
| EXPECT_TRUE(client.needs_begin_impl_frame());
|
| @@ -323,20 +329,20 @@ TEST(SchedulerTest, RequestCommitAfterBeginMainFrameSent) {
|
| EXPECT_SINGLE_ACTION("ScheduledActionCommit", client);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| client.Reset();
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2);
|
| - EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2);
|
| + EXPECT_ACTION("SetNeedsBeginFrame", client, 1, 2);
|
| EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
|
|
|
| // Because we just swapped, the Scheduler should also request the next
|
| // BeginImplFrame from the OutputSurface.
|
| EXPECT_TRUE(client.needs_begin_impl_frame());
|
| client.Reset();
|
| -
|
| // Since another commit is needed, the next BeginImplFrame should initiate
|
| // the second commit.
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client);
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_ACTION("WillBeginImplFrame", client, 0, 2);
|
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| client.Reset();
|
|
|
| @@ -347,17 +353,17 @@ TEST(SchedulerTest, RequestCommitAfterBeginMainFrameSent) {
|
| EXPECT_SINGLE_ACTION("ScheduledActionCommit", client);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| client.Reset();
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2);
|
| - EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2);
|
| + EXPECT_ACTION("SetNeedsBeginFrame", client, 1, 2);
|
| EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
|
| EXPECT_TRUE(client.needs_begin_impl_frame());
|
| client.Reset();
|
|
|
| // On the next BeginImplFrame, verify we go back to a quiescent state and
|
| // no longer request BeginImplFrames.
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_FALSE(client.needs_begin_impl_frame());
|
| client.Reset();
|
| }
|
| @@ -405,22 +411,22 @@ TEST(SchedulerTest, RequestRedrawInsideDraw) {
|
| EXPECT_TRUE(client.needs_begin_impl_frame());
|
| EXPECT_EQ(0, client.num_draws());
|
|
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(1, client.num_draws());
|
| EXPECT_TRUE(scheduler->RedrawPending());
|
| EXPECT_TRUE(client.needs_begin_impl_frame());
|
|
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(2, client.num_draws());
|
| EXPECT_FALSE(scheduler->RedrawPending());
|
| EXPECT_TRUE(client.needs_begin_impl_frame());
|
|
|
| // We stop requesting BeginImplFrames after a BeginImplFrame where we don't
|
| // swap.
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(2, client.num_draws());
|
| EXPECT_FALSE(scheduler->RedrawPending());
|
| EXPECT_FALSE(client.needs_begin_impl_frame());
|
| @@ -445,8 +451,8 @@ TEST(SchedulerTest, RequestRedrawInsideFailedDraw) {
|
| EXPECT_EQ(0, client.num_draws());
|
|
|
| // Fail the draw.
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(1, client.num_draws());
|
|
|
| // We have a commit pending and the draw failed, and we didn't lose the redraw
|
| @@ -456,8 +462,8 @@ TEST(SchedulerTest, RequestRedrawInsideFailedDraw) {
|
| EXPECT_TRUE(client.needs_begin_impl_frame());
|
|
|
| // Fail the draw again.
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(2, client.num_draws());
|
| EXPECT_TRUE(scheduler->CommitPending());
|
| EXPECT_TRUE(scheduler->RedrawPending());
|
| @@ -465,8 +471,8 @@ TEST(SchedulerTest, RequestRedrawInsideFailedDraw) {
|
|
|
| // Draw successfully.
|
| client.SetDrawWillHappen(true);
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(3, client.num_draws());
|
| EXPECT_TRUE(scheduler->CommitPending());
|
| EXPECT_FALSE(scheduler->RedrawPending());
|
| @@ -526,17 +532,17 @@ TEST(SchedulerTest, RequestCommitInsideDraw) {
|
| EXPECT_TRUE(client.needs_begin_impl_frame());
|
|
|
| client.SetNeedsCommitOnNextDraw();
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| client.SetNeedsCommitOnNextDraw();
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(1, client.num_draws());
|
| EXPECT_TRUE(scheduler->CommitPending());
|
| EXPECT_TRUE(client.needs_begin_impl_frame());
|
| scheduler->NotifyBeginMainFrameStarted();
|
| scheduler->NotifyReadyToCommit();
|
|
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(2, client.num_draws());
|
|
|
| EXPECT_FALSE(scheduler->RedrawPending());
|
| @@ -545,8 +551,8 @@ TEST(SchedulerTest, RequestCommitInsideDraw) {
|
|
|
| // We stop requesting BeginImplFrames after a BeginImplFrame where we don't
|
| // swap.
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(2, client.num_draws());
|
| EXPECT_FALSE(scheduler->RedrawPending());
|
| EXPECT_FALSE(scheduler->CommitPending());
|
| @@ -572,8 +578,8 @@ TEST(SchedulerTest, RequestCommitInsideFailedDraw) {
|
| EXPECT_EQ(0, client.num_draws());
|
|
|
| // Fail the draw.
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(1, client.num_draws());
|
|
|
| // We have a commit pending and the draw failed, and we didn't lose the commit
|
| @@ -583,8 +589,9 @@ TEST(SchedulerTest, RequestCommitInsideFailedDraw) {
|
| EXPECT_TRUE(client.needs_begin_impl_frame());
|
|
|
| // Fail the draw again.
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| +
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(2, client.num_draws());
|
| EXPECT_TRUE(scheduler->CommitPending());
|
| EXPECT_TRUE(scheduler->RedrawPending());
|
| @@ -592,8 +599,8 @@ TEST(SchedulerTest, RequestCommitInsideFailedDraw) {
|
|
|
| // Draw successfully.
|
| client.SetDrawWillHappen(true);
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(3, client.num_draws());
|
| EXPECT_TRUE(scheduler->CommitPending());
|
| EXPECT_FALSE(scheduler->RedrawPending());
|
| @@ -617,8 +624,8 @@ TEST(SchedulerTest, NoSwapWhenDrawFails) {
|
|
|
| // Draw successfully, this starts a new frame.
|
| client.SetNeedsCommitOnNextDraw();
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(1, client.num_draws());
|
|
|
| scheduler->SetNeedsRedraw();
|
| @@ -628,8 +635,8 @@ TEST(SchedulerTest, NoSwapWhenDrawFails) {
|
| // Fail to draw, this should not start a frame.
|
| client.SetDrawWillHappen(false);
|
| client.SetNeedsCommitOnNextDraw();
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(2, client.num_draws());
|
| }
|
|
|
| @@ -714,13 +721,13 @@ TEST(SchedulerTest, ManageTiles) {
|
| // We have no immediate actions to perform, so the BeginImplFrame should post
|
| // the deadline task.
|
| client.Reset();
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(client.num_actions_(), 0);
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
|
|
| // On the deadline, he actions should have occured in the right order.
|
| client.Reset();
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(1, client.num_draws());
|
| EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
|
| EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles"));
|
| @@ -741,15 +748,15 @@ TEST(SchedulerTest, ManageTiles) {
|
| // We have no immediate actions to perform, so the BeginImplFrame should post
|
| // the deadline task.
|
| client.Reset();
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(client.num_actions_(), 0);
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
|
|
| // Draw. The draw will trigger SetNeedsManageTiles, and
|
| // then the ManageTiles action will be triggered after the Draw.
|
| // Afterwards, neither a draw nor ManageTiles are pending.
|
| client.Reset();
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(1, client.num_draws());
|
| EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
|
| EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles"));
|
| @@ -761,12 +768,12 @@ TEST(SchedulerTest, ManageTiles) {
|
|
|
| // We need a BeginImplFrame where we don't swap to go idle.
|
| client.Reset();
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(client.num_actions_(), 0);
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| client.Reset();
|
| - scheduler->OnBeginImplFrameDeadline();
|
| - EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client);
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client);
|
| EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
|
| EXPECT_EQ(0, client.num_draws());
|
|
|
| @@ -781,11 +788,11 @@ TEST(SchedulerTest, ManageTiles) {
|
|
|
| // BeginImplFrame. There will be no draw, only ManageTiles.
|
| client.Reset();
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(client.num_actions_(), 0);
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| client.Reset();
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(0, client.num_draws());
|
| EXPECT_FALSE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
|
| EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles"));
|
| @@ -807,8 +814,8 @@ TEST(SchedulerTest, ManageTilesOncePerFrame) {
|
| scheduler->SetNeedsManageTiles();
|
| scheduler->SetNeedsRedraw();
|
| client.Reset();
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(client.num_actions_(), 0);
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
|
|
| EXPECT_TRUE(scheduler->ManageTilesPending());
|
| @@ -816,7 +823,7 @@ TEST(SchedulerTest, ManageTilesOncePerFrame) {
|
| EXPECT_FALSE(scheduler->ManageTilesPending());
|
|
|
| client.Reset();
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(1, client.num_draws());
|
| EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
|
| EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles"));
|
| @@ -828,12 +835,12 @@ TEST(SchedulerTest, ManageTilesOncePerFrame) {
|
| scheduler->SetNeedsManageTiles();
|
| scheduler->SetNeedsRedraw();
|
| client.Reset();
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(client.num_actions_(), 0);
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
|
|
| client.Reset();
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(1, client.num_draws());
|
| EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
|
| EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles"));
|
| @@ -850,14 +857,14 @@ TEST(SchedulerTest, ManageTilesOncePerFrame) {
|
| scheduler->SetNeedsManageTiles();
|
| scheduler->SetNeedsRedraw();
|
| client.Reset();
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(client.num_actions_(), 0);
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
|
|
| EXPECT_TRUE(scheduler->ManageTilesPending());
|
|
|
| client.Reset();
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(1, client.num_draws());
|
| EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
|
| EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles"));
|
| @@ -872,14 +879,14 @@ TEST(SchedulerTest, ManageTilesOncePerFrame) {
|
| scheduler->SetNeedsManageTiles();
|
| scheduler->SetNeedsRedraw();
|
| client.Reset();
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(client.num_actions_(), 0);
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
|
|
| EXPECT_TRUE(scheduler->ManageTilesPending());
|
|
|
| client.Reset();
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(1, client.num_draws());
|
| EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
|
| EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles"));
|
| @@ -890,12 +897,12 @@ TEST(SchedulerTest, ManageTilesOncePerFrame) {
|
| scheduler->SetNeedsManageTiles();
|
| scheduler->SetNeedsRedraw();
|
| client.Reset();
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| - EXPECT_EQ(client.num_actions_(), 0);
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
|
|
| client.Reset();
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(1, client.num_draws());
|
| EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
|
| EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles"));
|
| @@ -917,9 +924,8 @@ TEST(SchedulerTest, TriggerBeginFrameDeadlineEarly) {
|
| InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
|
|
|
| client.Reset();
|
| - BeginFrameArgs impl_frame_args = BeginFrameArgs::CreateForTesting();
|
| scheduler->SetNeedsRedraw();
|
| - scheduler->BeginImplFrame(impl_frame_args);
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
|
|
| // The deadline should be zero since there is no work other than drawing
|
| // pending.
|
| @@ -975,9 +981,9 @@ void MainFrameInHighLatencyMode(int64 begin_main_frame_to_commit_estimate_in_ms,
|
| client.Reset();
|
| scheduler->SetNeedsCommit();
|
| EXPECT_FALSE(scheduler->MainThreadIsInHighLatencyMode());
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| EXPECT_FALSE(scheduler->MainThreadIsInHighLatencyMode());
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode());
|
| scheduler->NotifyBeginMainFrameStarted();
|
| scheduler->NotifyReadyToCommit();
|
| @@ -987,9 +993,9 @@ void MainFrameInHighLatencyMode(int64 begin_main_frame_to_commit_estimate_in_ms,
|
| client.Reset();
|
| scheduler->SetNeedsCommit();
|
| EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode());
|
| - scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting());
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode());
|
| - scheduler->OnBeginImplFrameDeadline();
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| EXPECT_EQ(scheduler->MainThreadIsInHighLatencyMode(),
|
| should_send_begin_main_frame);
|
| EXPECT_EQ(client.HasAction("ScheduledActionSendBeginMainFrame"),
|
| @@ -1044,9 +1050,9 @@ TEST(SchedulerTest, PollForCommitCompletion) {
|
| scheduler->NotifyReadyToCommit();
|
| scheduler->SetNeedsRedraw();
|
|
|
| - BeginFrameArgs impl_frame_args = BeginFrameArgs::CreateForTesting();
|
| - impl_frame_args.interval = base::TimeDelta::FromMilliseconds(1000);
|
| - scheduler->BeginImplFrame(impl_frame_args);
|
| + BeginFrameArgs frame_args = BeginFrameArgs::CreateForTesting();
|
| + frame_args.interval = base::TimeDelta::FromMilliseconds(1000);
|
| + scheduler->BeginFrame(frame_args);
|
|
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| @@ -1056,7 +1062,7 @@ TEST(SchedulerTest, PollForCommitCompletion) {
|
| // the NotifyReadyToCommit for now.
|
| EXPECT_FALSE(scheduler->CommitPending());
|
| scheduler->SetNeedsCommit();
|
| - scheduler->BeginImplFrame(impl_frame_args);
|
| + scheduler->BeginFrame(frame_args);
|
| EXPECT_TRUE(scheduler->CommitPending());
|
|
|
| // Spin the event loop a few times and make sure we get more
|
| @@ -1065,7 +1071,7 @@ TEST(SchedulerTest, PollForCommitCompletion) {
|
|
|
| // Does three iterations to make sure that the timer is properly repeating.
|
| for (int i = 0; i < 3; ++i) {
|
| - EXPECT_EQ((impl_frame_args.interval * 2).InMicroseconds(),
|
| + EXPECT_EQ((frame_args.interval * 2).InMicroseconds(),
|
| client.task_runner().NextPendingTaskDelay().InMicroseconds())
|
| << *scheduler->StateAsValue();
|
| client.task_runner().RunPendingTasks();
|
| @@ -1078,7 +1084,7 @@ TEST(SchedulerTest, PollForCommitCompletion) {
|
| // Do the same thing after BeginMainFrame starts but still before activation.
|
| scheduler->NotifyBeginMainFrameStarted();
|
| for (int i = 0; i < 3; ++i) {
|
| - EXPECT_EQ((impl_frame_args.interval * 2).InMicroseconds(),
|
| + EXPECT_EQ((frame_args.interval * 2).InMicroseconds(),
|
| client.task_runner().NextPendingTaskDelay().InMicroseconds())
|
| << *scheduler->StateAsValue();
|
| client.task_runner().RunPendingTasks();
|
| @@ -1089,5 +1095,82 @@ TEST(SchedulerTest, PollForCommitCompletion) {
|
| }
|
| }
|
|
|
| +TEST(SchedulerTest, BeginRetroFrame) {
|
| + FakeSchedulerClient client;
|
| + SchedulerSettings scheduler_settings;
|
| + Scheduler* scheduler = client.CreateScheduler(scheduler_settings);
|
| + scheduler->SetCanStart();
|
| + scheduler->SetVisible(true);
|
| + scheduler->SetCanDraw(true);
|
| + InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
|
| +
|
| + // SetNeedsCommit should begin the frame on the next BeginImplFrame.
|
| + client.Reset();
|
| + scheduler->SetNeedsCommit();
|
| + EXPECT_TRUE(client.needs_begin_impl_frame());
|
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client);
|
| + client.Reset();
|
| +
|
| + // Create a BeginFrame with a long deadline to avoid race conditions.
|
| + // This is the first BeginFrame, which will be handled immediately.
|
| + BeginFrameArgs args = BeginFrameArgs::CreateForTesting();
|
| + args.deadline += base::TimeDelta::FromHours(1);
|
| + scheduler->BeginFrame(args);
|
| +
|
| + EXPECT_ACTION("WillBeginImplFrame", client, 0, 2);
|
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2);
|
| + EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| + EXPECT_TRUE(client.needs_begin_impl_frame());
|
| + client.Reset();
|
| +
|
| + // Queue BeginFrames while we are still handling the previous BeginFrame.
|
| + args.frame_time += base::TimeDelta::FromSeconds(1);
|
| + scheduler->BeginFrame(args);
|
| + args.frame_time += base::TimeDelta::FromSeconds(1);
|
| + scheduler->BeginFrame(args);
|
| +
|
| + // If we don't swap on the deadline, we need to request another
|
| + // BeginImplFrame.
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client);
|
| + EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
|
| + EXPECT_TRUE(client.needs_begin_impl_frame());
|
| + client.Reset();
|
| +
|
| + // NotifyReadyToCommit should trigger the commit.
|
| + scheduler->NotifyBeginMainFrameStarted();
|
| + scheduler->NotifyReadyToCommit();
|
| + EXPECT_SINGLE_ACTION("ScheduledActionCommit", client);
|
| + EXPECT_TRUE(client.needs_begin_impl_frame());
|
| + client.Reset();
|
| +
|
| + // BeginImplFrame should prepare the draw.
|
| + client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame.
|
| + EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
|
| + EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| + EXPECT_TRUE(client.needs_begin_impl_frame());
|
| + client.Reset();
|
| +
|
| + // BeginImplFrame deadline should draw.
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| + EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2);
|
| + EXPECT_ACTION("SetNeedsBeginFrame", client, 1, 2);
|
| + EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
|
| + EXPECT_TRUE(client.needs_begin_impl_frame());
|
| + client.Reset();
|
| +
|
| + // The following BeginImplFrame deadline should SetNeedsBeginFrame(false)
|
| + // to avoid excessive toggles.
|
| + client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame.
|
| + EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
|
| + EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| + client.Reset();
|
| +
|
| + client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client);
|
| + EXPECT_FALSE(client.needs_begin_impl_frame());
|
| + client.Reset();
|
| +}
|
| +
|
| } // namespace
|
| } // namespace cc
|
|
|