Index: cc/scheduler/scheduler_unittest.cc |
diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc |
index 68aecaf9dc5794947668df2103ea45e08b093b80..bc7d5758155cc507d751ebcbcb07945a5504a918 100644 |
--- a/cc/scheduler/scheduler_unittest.cc |
+++ b/cc/scheduler/scheduler_unittest.cc |
@@ -30,7 +30,11 @@ namespace { |
class FakeSchedulerClient : public SchedulerClient { |
public: |
- FakeSchedulerClient() { Reset(); } |
+ FakeSchedulerClient() |
+ : needs_begin_frame_(false) { |
+ Reset(); |
+ } |
+ |
void Reset() { |
actions_.clear(); |
states_.clear(); |
@@ -39,15 +43,12 @@ class FakeSchedulerClient : public SchedulerClient { |
num_draws_ = 0; |
} |
- Scheduler* CreateScheduler( |
- scoped_ptr<FrameRateController> frame_rate_controller, |
- const SchedulerSettings& settings) { |
- scheduler_ = |
- Scheduler::Create(this, frame_rate_controller.Pass(), settings); |
+ Scheduler* CreateScheduler(const SchedulerSettings& settings) { |
+ scheduler_ = Scheduler::Create(this, settings); |
return scheduler_.get(); |
} |
- |
+ bool needs_begin_frame() { return needs_begin_frame_; } |
int num_draws() const { return num_draws_; } |
int num_actions_() const { return static_cast<int>(actions_.size()); } |
const char* Action(int i) const { return actions_[i]; } |
@@ -68,6 +69,11 @@ class FakeSchedulerClient : public SchedulerClient { |
} |
// Scheduler Implementation. |
+ virtual void SetNeedsBeginFrameOnImplThread(bool enable) OVERRIDE { |
+ actions_.push_back("SetNeedsBeginFrameOnImplThread"); |
+ states_.push_back(scheduler_->StateAsStringForTesting()); |
+ needs_begin_frame_ = enable; |
+ } |
virtual void ScheduledActionSendBeginFrameToMainThread() OVERRIDE { |
actions_.push_back("ScheduledActionSendBeginFrameToMainThread"); |
states_.push_back(scheduler_->StateAsStringForTesting()); |
@@ -111,6 +117,7 @@ class FakeSchedulerClient : public SchedulerClient { |
virtual void DidAnticipatedDrawTimeChange(base::TimeTicks) OVERRIDE {} |
protected: |
+ bool needs_begin_frame_; |
bool draw_will_happen_; |
bool swap_will_happen_if_draw_happens_; |
int num_draws_; |
@@ -121,11 +128,8 @@ class FakeSchedulerClient : public SchedulerClient { |
TEST(SchedulerTest, InitializeOutputSurfaceDoesNotBeginFrame) { |
FakeSchedulerClient client; |
- scoped_refptr<FakeTimeSource> time_source(new FakeTimeSource()); |
SchedulerSettings default_scheduler_settings; |
- Scheduler* scheduler = client.CreateScheduler( |
- make_scoped_ptr(new FrameRateController(time_source)), |
- default_scheduler_settings); |
+ Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
scheduler->SetCanStart(); |
scheduler->SetVisible(true); |
scheduler->SetCanDraw(true); |
@@ -138,11 +142,8 @@ TEST(SchedulerTest, InitializeOutputSurfaceDoesNotBeginFrame) { |
TEST(SchedulerTest, RequestCommit) { |
FakeSchedulerClient client; |
- scoped_refptr<FakeTimeSource> time_source(new FakeTimeSource()); |
SchedulerSettings default_scheduler_settings; |
- Scheduler* scheduler = client.CreateScheduler( |
- make_scoped_ptr(new FrameRateController(time_source)), |
- default_scheduler_settings); |
+ Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
scheduler->SetCanStart(); |
scheduler->SetVisible(true); |
scheduler->SetCanDraw(true); |
@@ -153,33 +154,29 @@ TEST(SchedulerTest, RequestCommit) { |
// SetNeedsCommit should begin the frame. |
scheduler->SetNeedsCommit(); |
- EXPECT_SINGLE_ACTION("ScheduledActionSendBeginFrameToMainThread", client); |
- EXPECT_FALSE(time_source->Active()); |
+ EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2); |
+ EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.Reset(); |
// FinishCommit should commit |
scheduler->FinishCommit(); |
EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
- EXPECT_TRUE(time_source->Active()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.Reset(); |
- // Tick should draw. |
- time_source->Tick(); |
- EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client); |
- EXPECT_FALSE(time_source->Active()); |
+ // BeginFrame should draw. |
+ scheduler->BeginFrame(base::TimeTicks::Now()); |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
+ EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
client.Reset(); |
- |
- // Timer should be off. |
- EXPECT_FALSE(time_source->Active()); |
} |
TEST(SchedulerTest, RequestCommitAfterBeginFrameSentToMainThread) { |
FakeSchedulerClient client; |
- scoped_refptr<FakeTimeSource> time_source(new FakeTimeSource()); |
SchedulerSettings default_scheduler_settings; |
- Scheduler* scheduler = client.CreateScheduler( |
- make_scoped_ptr(new FrameRateController(time_source)), |
- default_scheduler_settings); |
+ Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
scheduler->SetCanStart(); |
scheduler->SetVisible(true); |
scheduler->SetCanDraw(true); |
@@ -190,7 +187,8 @@ TEST(SchedulerTest, RequestCommitAfterBeginFrameSentToMainThread) { |
// SetNedsCommit should begin the frame. |
scheduler->SetNeedsCommit(); |
- EXPECT_SINGLE_ACTION("ScheduledActionSendBeginFrameToMainThread", client); |
+ EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2); |
+ EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); |
client.Reset(); |
// Now SetNeedsCommit again. Calling here means we need a second frame. |
@@ -203,78 +201,85 @@ TEST(SchedulerTest, RequestCommitAfterBeginFrameSentToMainThread) { |
client.Reset(); |
// Tick should draw but then begin another frame. |
- time_source->Tick(); |
- EXPECT_FALSE(time_source->Active()); |
+ scheduler->BeginFrame(base::TimeTicks::Now()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 1, 2); |
client.Reset(); |
+ |
+ // Go back to quiescent state and verify we no longer request BeginFrames. |
+ scheduler->FinishCommit(); |
+ scheduler->BeginFrame(base::TimeTicks::Now()); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
} |
TEST(SchedulerTest, TextureAcquisitionCausesCommitInsteadOfDraw) { |
FakeSchedulerClient client; |
- scoped_refptr<FakeTimeSource> time_source(new FakeTimeSource()); |
SchedulerSettings default_scheduler_settings; |
- Scheduler* scheduler = client.CreateScheduler( |
- make_scoped_ptr(new FrameRateController(time_source)), |
- default_scheduler_settings); |
+ Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
scheduler->SetCanStart(); |
scheduler->SetVisible(true); |
scheduler->SetCanDraw(true); |
- |
EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
+ |
client.Reset(); |
scheduler->DidCreateAndInitializeOutputSurface(); |
- |
scheduler->SetNeedsRedraw(); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(time_source->Active()); |
+ EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
- time_source->Tick(); |
- EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
- EXPECT_FALSE(scheduler->RedrawPending()); |
- EXPECT_FALSE(time_source->Active()); |
client.Reset(); |
+ scheduler->BeginFrame(base::TimeTicks::Now()); |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
+ EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); |
+ EXPECT_FALSE(scheduler->RedrawPending()); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
+ client.Reset(); |
scheduler->SetMainThreadNeedsLayerTextures(); |
EXPECT_ACTION("ScheduledActionAcquireLayerTexturesForMainThread", |
client, |
0, |
- 2); |
+ 3); |
// A commit was started by SetMainThreadNeedsLayerTextures(). |
- EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 1, 2); |
- client.Reset(); |
+ EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 1, 3); |
+ EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 2, 3); |
+ // We should request a BeginFrame in anticipation of a draw. |
+ client.Reset(); |
scheduler->SetNeedsRedraw(); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(time_source->Active()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
// No draw happens since the textures are acquired by the main thread. |
- time_source->Tick(); |
- EXPECT_EQ(0, client.num_actions_()); |
+ client.Reset(); |
+ scheduler->BeginFrame(base::TimeTicks::Now()); |
+ EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(time_source->Active()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
+ // Commit will release the texture. |
+ client.Reset(); |
scheduler->FinishCommit(); |
- EXPECT_ACTION("ScheduledActionCommit", client, 0, 1); |
+ EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(time_source->Active()); |
- client.Reset(); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
// Now we can draw again after the commit happens. |
- time_source->Tick(); |
- EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
+ client.Reset(); |
+ scheduler->BeginFrame(base::TimeTicks::Now()); |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
+ EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); |
EXPECT_FALSE(scheduler->RedrawPending()); |
- EXPECT_FALSE(time_source->Active()); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
client.Reset(); |
} |
TEST(SchedulerTest, TextureAcquisitionCollision) { |
FakeSchedulerClient client; |
- scoped_refptr<FakeTimeSource> time_source(new FakeTimeSource()); |
SchedulerSettings default_scheduler_settings; |
- Scheduler* scheduler = client.CreateScheduler( |
- make_scoped_ptr(new FrameRateController(time_source)), |
- default_scheduler_settings); |
+ Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
scheduler->SetCanStart(); |
scheduler->SetVisible(true); |
scheduler->SetCanDraw(true); |
@@ -285,19 +290,22 @@ TEST(SchedulerTest, TextureAcquisitionCollision) { |
scheduler->SetNeedsCommit(); |
scheduler->SetMainThreadNeedsLayerTextures(); |
- EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2); |
+ EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 3); |
+ EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 3); |
EXPECT_ACTION("ScheduledActionAcquireLayerTexturesForMainThread", |
client, |
- 1, |
- 2); |
+ 2, |
+ 3); |
client.Reset(); |
- // Compositor not scheduled to draw because textures are locked by main thread |
- EXPECT_FALSE(time_source->Active()); |
+ // Although the compositor cannot draw because textures are locked by main |
+ // thread, we continue requesting SetNeedsBeginFrame in anticipation of the |
+ // unlock. |
+ EXPECT_TRUE(client.needs_begin_frame()); |
// Trigger the commit |
scheduler->FinishCommit(); |
- EXPECT_TRUE(time_source->Active()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
client.Reset(); |
// Between commit and draw, texture acquisition for main thread delayed, |
@@ -307,7 +315,7 @@ TEST(SchedulerTest, TextureAcquisitionCollision) { |
client.Reset(); |
// Once compositor draw complete, the delayed texture acquisition fires. |
- time_source->Tick(); |
+ scheduler->BeginFrame(base::TimeTicks::Now()); |
EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 3); |
EXPECT_ACTION("ScheduledActionAcquireLayerTexturesForMainThread", |
client, |
@@ -319,11 +327,8 @@ TEST(SchedulerTest, TextureAcquisitionCollision) { |
TEST(SchedulerTest, VisibilitySwitchWithTextureAcquisition) { |
FakeSchedulerClient client; |
- scoped_refptr<FakeTimeSource> time_source(new FakeTimeSource()); |
SchedulerSettings default_scheduler_settings; |
- Scheduler* scheduler = client.CreateScheduler( |
- make_scoped_ptr(new FrameRateController(time_source)), |
- default_scheduler_settings); |
+ Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
scheduler->SetCanStart(); |
scheduler->SetVisible(true); |
scheduler->SetCanDraw(true); |
@@ -379,11 +384,8 @@ class SchedulerClientThatsetNeedsDrawInsideDraw : public FakeSchedulerClient { |
// 2. the scheduler drawing twice inside a single tick |
TEST(SchedulerTest, RequestRedrawInsideDraw) { |
SchedulerClientThatsetNeedsDrawInsideDraw client; |
- scoped_refptr<FakeTimeSource> time_source(new FakeTimeSource()); |
SchedulerSettings default_scheduler_settings; |
- Scheduler* scheduler = client.CreateScheduler( |
- make_scoped_ptr(new FrameRateController(time_source)), |
- default_scheduler_settings); |
+ Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
scheduler->SetCanStart(); |
scheduler->SetVisible(true); |
scheduler->SetCanDraw(true); |
@@ -391,28 +393,25 @@ TEST(SchedulerTest, RequestRedrawInsideDraw) { |
scheduler->SetNeedsRedraw(); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(time_source->Active()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
EXPECT_EQ(0, client.num_draws()); |
- time_source->Tick(); |
+ scheduler->BeginFrame(base::TimeTicks::Now()); |
EXPECT_EQ(1, client.num_draws()); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(time_source->Active()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
- time_source->Tick(); |
+ scheduler->BeginFrame(base::TimeTicks::Now()); |
EXPECT_EQ(2, client.num_draws()); |
EXPECT_FALSE(scheduler->RedrawPending()); |
- EXPECT_FALSE(time_source->Active()); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
} |
// Test that requesting redraw inside a failed draw doesn't lose the request. |
TEST(SchedulerTest, RequestRedrawInsideFailedDraw) { |
SchedulerClientThatsetNeedsDrawInsideDraw client; |
- scoped_refptr<FakeTimeSource> time_source(new FakeTimeSource()); |
SchedulerSettings default_scheduler_settings; |
- Scheduler* scheduler = client.CreateScheduler( |
- make_scoped_ptr(new FrameRateController(time_source)), |
- default_scheduler_settings); |
+ Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
scheduler->SetCanStart(); |
scheduler->SetVisible(true); |
scheduler->SetCanDraw(true); |
@@ -422,33 +421,33 @@ TEST(SchedulerTest, RequestRedrawInsideFailedDraw) { |
scheduler->SetNeedsRedraw(); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(time_source->Active()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
EXPECT_EQ(0, client.num_draws()); |
// Fail the draw. |
- time_source->Tick(); |
+ scheduler->BeginFrame(base::TimeTicks::Now()); |
EXPECT_EQ(1, client.num_draws()); |
// We have a commit pending and the draw failed, and we didn't lose the redraw |
// request. |
EXPECT_TRUE(scheduler->CommitPending()); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(time_source->Active()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
// Fail the draw again. |
- time_source->Tick(); |
+ scheduler->BeginFrame(base::TimeTicks::Now()); |
EXPECT_EQ(2, client.num_draws()); |
EXPECT_TRUE(scheduler->CommitPending()); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(time_source->Active()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
// Draw successfully. |
client.SetDrawWillHappen(true); |
- time_source->Tick(); |
+ scheduler->BeginFrame(base::TimeTicks::Now()); |
EXPECT_EQ(3, client.num_draws()); |
EXPECT_TRUE(scheduler->CommitPending()); |
EXPECT_FALSE(scheduler->RedrawPending()); |
- EXPECT_FALSE(time_source->Active()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
} |
class SchedulerClientThatsetNeedsCommitInsideDraw : public FakeSchedulerClient { |
@@ -477,11 +476,8 @@ class SchedulerClientThatsetNeedsCommitInsideDraw : public FakeSchedulerClient { |
// happen inside a ScheduledActionDrawAndSwap |
TEST(SchedulerTest, RequestCommitInsideDraw) { |
SchedulerClientThatsetNeedsCommitInsideDraw client; |
- scoped_refptr<FakeTimeSource> time_source(new FakeTimeSource()); |
SchedulerSettings default_scheduler_settings; |
- Scheduler* scheduler = client.CreateScheduler( |
- make_scoped_ptr(new FrameRateController(time_source)), |
- default_scheduler_settings); |
+ Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
scheduler->SetCanStart(); |
scheduler->SetVisible(true); |
scheduler->SetCanDraw(true); |
@@ -490,28 +486,26 @@ TEST(SchedulerTest, RequestCommitInsideDraw) { |
scheduler->SetNeedsRedraw(); |
EXPECT_TRUE(scheduler->RedrawPending()); |
EXPECT_EQ(0, client.num_draws()); |
- EXPECT_TRUE(time_source->Active()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
- time_source->Tick(); |
- EXPECT_FALSE(time_source->Active()); |
+ scheduler->BeginFrame(base::TimeTicks::Now()); |
EXPECT_EQ(1, client.num_draws()); |
EXPECT_TRUE(scheduler->CommitPending()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
scheduler->FinishCommit(); |
- time_source->Tick(); |
- EXPECT_EQ(2, client.num_draws()); |
- EXPECT_FALSE(time_source->Active()); |
+ scheduler->BeginFrame(base::TimeTicks::Now()); |
+ EXPECT_EQ(2, client.num_draws());; |
EXPECT_FALSE(scheduler->RedrawPending()); |
+ EXPECT_FALSE(scheduler->CommitPending()); |
+ EXPECT_FALSE(client.needs_begin_frame()); |
} |
// Tests that when a draw fails then the pending commit should not be dropped. |
TEST(SchedulerTest, RequestCommitInsideFailedDraw) { |
SchedulerClientThatsetNeedsDrawInsideDraw client; |
- scoped_refptr<FakeTimeSource> time_source(new FakeTimeSource()); |
SchedulerSettings default_scheduler_settings; |
- Scheduler* scheduler = client.CreateScheduler( |
- make_scoped_ptr(new FrameRateController(time_source)), |
- default_scheduler_settings); |
+ Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
scheduler->SetCanStart(); |
scheduler->SetVisible(true); |
scheduler->SetCanDraw(true); |
@@ -521,128 +515,77 @@ TEST(SchedulerTest, RequestCommitInsideFailedDraw) { |
scheduler->SetNeedsRedraw(); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(time_source->Active()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
EXPECT_EQ(0, client.num_draws()); |
// Fail the draw. |
- time_source->Tick(); |
+ scheduler->BeginFrame(base::TimeTicks::Now()); |
EXPECT_EQ(1, client.num_draws()); |
// We have a commit pending and the draw failed, and we didn't lose the commit |
// request. |
EXPECT_TRUE(scheduler->CommitPending()); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(time_source->Active()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
// Fail the draw again. |
- time_source->Tick(); |
+ scheduler->BeginFrame(base::TimeTicks::Now()); |
EXPECT_EQ(2, client.num_draws()); |
EXPECT_TRUE(scheduler->CommitPending()); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(time_source->Active()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
// Draw successfully. |
client.SetDrawWillHappen(true); |
- time_source->Tick(); |
+ scheduler->BeginFrame(base::TimeTicks::Now()); |
EXPECT_EQ(3, client.num_draws()); |
EXPECT_TRUE(scheduler->CommitPending()); |
EXPECT_FALSE(scheduler->RedrawPending()); |
- EXPECT_FALSE(time_source->Active()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
} |
TEST(SchedulerTest, NoSwapWhenDrawFails) { |
- scoped_refptr<FakeTimeSource> time_source(new FakeTimeSource()); |
SchedulerClientThatsetNeedsCommitInsideDraw client; |
- scoped_ptr<FakeFrameRateController> controller( |
- new FakeFrameRateController(time_source)); |
- FakeFrameRateController* controller_ptr = controller.get(); |
SchedulerSettings default_scheduler_settings; |
- Scheduler* scheduler = client.CreateScheduler( |
- controller.PassAs<FrameRateController>(), |
- default_scheduler_settings); |
+ Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
scheduler->SetCanStart(); |
scheduler->SetVisible(true); |
scheduler->SetCanDraw(true); |
scheduler->DidCreateAndInitializeOutputSurface(); |
- EXPECT_EQ(0, controller_ptr->NumFramesPending()); |
- |
scheduler->SetNeedsRedraw(); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(time_source->Active()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
EXPECT_EQ(0, client.num_draws()); |
// Draw successfully, this starts a new frame. |
- time_source->Tick(); |
+ scheduler->BeginFrame(base::TimeTicks::Now()); |
EXPECT_EQ(1, client.num_draws()); |
- EXPECT_EQ(1, controller_ptr->NumFramesPending()); |
- scheduler->DidSwapBuffersComplete(); |
- EXPECT_EQ(0, controller_ptr->NumFramesPending()); |
scheduler->SetNeedsRedraw(); |
EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(time_source->Active()); |
+ EXPECT_TRUE(client.needs_begin_frame()); |
// Fail to draw, this should not start a frame. |
client.SetDrawWillHappen(false); |
- time_source->Tick(); |
+ scheduler->BeginFrame(base::TimeTicks::Now()); |
EXPECT_EQ(2, client.num_draws()); |
- EXPECT_EQ(0, controller_ptr->NumFramesPending()); |
} |
TEST(SchedulerTest, NoSwapWhenSwapFailsDuringForcedCommit) { |
- scoped_refptr<FakeTimeSource> time_source(new FakeTimeSource()); |
FakeSchedulerClient client; |
- scoped_ptr<FakeFrameRateController> controller( |
- new FakeFrameRateController(time_source)); |
- FakeFrameRateController* controller_ptr = controller.get(); |
SchedulerSettings default_scheduler_settings; |
- Scheduler* scheduler = client.CreateScheduler( |
- controller.PassAs<FrameRateController>(), |
- default_scheduler_settings); |
- |
- EXPECT_EQ(0, controller_ptr->NumFramesPending()); |
+ Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
// Tell the client that it will fail to swap. |
client.SetDrawWillHappen(true); |
client.SetSwapWillHappenIfDrawHappens(false); |
// Get the compositor to do a ScheduledActionDrawAndSwapForced. |
+ scheduler->SetCanDraw(true); |
scheduler->SetNeedsRedraw(); |
scheduler->SetNeedsForcedRedraw(); |
EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapForced")); |
- |
- // We should not have told the frame rate controller that we began a frame. |
- EXPECT_EQ(0, controller_ptr->NumFramesPending()); |
-} |
- |
-TEST(SchedulerTest, RecreateOutputSurfaceClearsPendingDrawCount) { |
- scoped_refptr<FakeTimeSource> time_source(new FakeTimeSource()); |
- FakeSchedulerClient client; |
- scoped_ptr<FakeFrameRateController> controller( |
- new FakeFrameRateController(time_source)); |
- FakeFrameRateController* controller_ptr = controller.get(); |
- SchedulerSettings default_scheduler_settings; |
- Scheduler* scheduler = client.CreateScheduler( |
- controller.PassAs<FrameRateController>(), |
- default_scheduler_settings); |
- |
- scheduler->SetCanStart(); |
- scheduler->SetVisible(true); |
- scheduler->SetCanDraw(true); |
- scheduler->DidCreateAndInitializeOutputSurface(); |
- |
- // Draw successfully, this starts a new frame. |
- scheduler->SetNeedsRedraw(); |
- time_source->Tick(); |
- EXPECT_EQ(1, controller_ptr->NumFramesPending()); |
- |
- scheduler->DidLoseOutputSurface(); |
- // Verifying that it's 1 so that we know that it's reset on recreate. |
- EXPECT_EQ(1, controller_ptr->NumFramesPending()); |
- |
- scheduler->DidCreateAndInitializeOutputSurface(); |
- EXPECT_EQ(0, controller_ptr->NumFramesPending()); |
} |
} // namespace |