| Index: cc/scheduler/scheduler_unittest.cc
|
| diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc
|
| index 7074bbef4f7a41dbd027ac3cde8f23c6ba741d66..eba7f34d5c8af6f70b8c6484d74d2fedb2965265 100644
|
| --- a/cc/scheduler/scheduler_unittest.cc
|
| +++ b/cc/scheduler/scheduler_unittest.cc
|
| @@ -66,11 +66,15 @@ class FakeSchedulerClient : public SchedulerClient {
|
| const char* Action(int i) const { return actions_[i]; }
|
| base::Value& StateForAction(int i) const { return *states_[i]; }
|
|
|
| - bool HasAction(const char* action) const {
|
| + int ActionIndex(const char* action) const {
|
| for (size_t i = 0; i < actions_.size(); i++)
|
| if (!strcmp(actions_[i], action))
|
| - return true;
|
| - return false;
|
| + return i;
|
| + return -1;
|
| + }
|
| +
|
| + bool HasAction(const char* action) const {
|
| + return ActionIndex(action) >= 0;
|
| }
|
|
|
| void SetDrawWillHappen(bool draw_will_happen) {
|
| @@ -137,6 +141,10 @@ class FakeSchedulerClient : public SchedulerClient {
|
| actions_.push_back("ScheduledActionAcquireLayerTexturesForMainThread");
|
| states_.push_back(scheduler_->StateAsValue().release());
|
| }
|
| + virtual void ScheduledActionManageTiles() OVERRIDE {
|
| + actions_.push_back("ScheduledActionManageTiles");
|
| + states_.push_back(scheduler_->StateAsValue().release());
|
| + }
|
| virtual void DidAnticipatedDrawTimeChange(base::TimeTicks) OVERRIDE {}
|
| virtual base::TimeDelta DrawDurationEstimate() OVERRIDE {
|
| return base::TimeDelta();
|
| @@ -687,5 +695,82 @@ TEST(SchedulerTest, BackToBackReadbackAllowed) {
|
| scheduler->FinishCommit();
|
| }
|
|
|
| +
|
| +class SchedulerClientNeedsManageTilesInDraw : public FakeSchedulerClient {
|
| + public:
|
| + virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible()
|
| + OVERRIDE {
|
| + scheduler_->SetNeedsManageTiles();
|
| + return FakeSchedulerClient::ScheduledActionDrawAndSwapIfPossible();
|
| + }
|
| +};
|
| +
|
| +// Test manage tiles is independant of draws.
|
| +TEST(SchedulerTest, ManageTiles) {
|
| + SchedulerClientNeedsManageTilesInDraw client;
|
| + SchedulerSettings default_scheduler_settings;
|
| + Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings);
|
| + scheduler->SetCanStart();
|
| + scheduler->SetVisible(true);
|
| + scheduler->SetCanDraw(true);
|
| + InitializeOutputSurfaceAndFirstCommit(scheduler);
|
| +
|
| + // Request both draw and manage tiles. ManageTiles shouldn't
|
| + // be trigged until BeginFrame.
|
| + client.Reset();
|
| + scheduler->SetNeedsManageTiles();
|
| + scheduler->SetNeedsRedraw();
|
| + EXPECT_TRUE(scheduler->RedrawPending());
|
| + EXPECT_TRUE(scheduler->ManageTilesPending());
|
| + EXPECT_TRUE(client.needs_begin_frame());
|
| + EXPECT_EQ(0, client.num_draws());
|
| + EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles"));
|
| + EXPECT_FALSE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + // The actions should have occured, in the right order.
|
| + EXPECT_EQ(1, client.num_draws());
|
| + EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
|
| + EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles"));
|
| + EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"),
|
| + client.ActionIndex("ScheduledActionManageTiles"));
|
| + EXPECT_FALSE(scheduler->RedrawPending());
|
| + EXPECT_FALSE(scheduler->ManageTilesPending());
|
| +
|
| + // Request a draw. We don't need a ManageTiles yet.
|
| + client.Reset();
|
| + scheduler->SetNeedsRedraw();
|
| + EXPECT_TRUE(scheduler->RedrawPending());
|
| + EXPECT_FALSE(scheduler->ManageTilesPending());
|
| + EXPECT_TRUE(client.needs_begin_frame());
|
| + EXPECT_EQ(0, client.num_draws());
|
| +
|
| + // 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.
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_EQ(1, client.num_draws());
|
| + EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
|
| + EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles"));
|
| + EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"),
|
| + client.ActionIndex("ScheduledActionManageTiles"));
|
| + EXPECT_FALSE(scheduler->RedrawPending());
|
| + EXPECT_FALSE(scheduler->ManageTilesPending());
|
| +
|
| + // Now trigger a ManageTiles outside of a draw. We will then need
|
| + // a begin-frame for the ManageTiles, but we don't need a draw.
|
| + client.Reset();
|
| + EXPECT_FALSE(client.needs_begin_frame());
|
| + scheduler->SetNeedsManageTiles();
|
| + EXPECT_TRUE(client.needs_begin_frame());
|
| + EXPECT_TRUE(scheduler->ManageTilesPending());
|
| + EXPECT_FALSE(scheduler->RedrawPending());
|
| +
|
| + // BeginFrame. There will be no draw, only ManageTiles.
|
| + scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
|
| + EXPECT_EQ(0, client.num_draws());
|
| + EXPECT_FALSE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
|
| + EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles"));
|
| +}
|
| +
|
| } // namespace
|
| } // namespace cc
|
|
|