Index: cc/scheduler/scheduler_unittest.cc |
diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc |
index 67a064b59d6e93cfefa37f02dc34dfb25edcc217..c40185063dc8d2d7016d929b6a1c0972a7d0b619 100644 |
--- a/cc/scheduler/scheduler_unittest.cc |
+++ b/cc/scheduler/scheduler_unittest.cc |
@@ -150,10 +150,6 @@ class FakeSchedulerClient : public SchedulerClient { |
actions_.push_back("ScheduledActionBeginOutputSurfaceCreation"); |
states_.push_back(scheduler_->StateAsValue().release()); |
} |
- virtual void ScheduledActionAcquireLayerTexturesForMainThread() OVERRIDE { |
- actions_.push_back("ScheduledActionAcquireLayerTexturesForMainThread"); |
- states_.push_back(scheduler_->StateAsValue().release()); |
- } |
virtual void ScheduledActionManageTiles() OVERRIDE { |
actions_.push_back("ScheduledActionManageTiles"); |
states_.push_back(scheduler_->StateAsValue().release()); |
@@ -366,248 +362,6 @@ TEST(SchedulerTest, RequestCommitAfterBeginMainFrameSent) { |
client.Reset(); |
} |
-TEST(SchedulerTest, TextureAcquisitionCausesCommitInsteadOfDraw) { |
- FakeSchedulerClient client; |
- SchedulerSettings scheduler_settings; |
- Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
- scheduler->SetCanStart(); |
- scheduler->SetVisible(true); |
- scheduler->SetCanDraw(true); |
- EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
- |
- InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
- client.Reset(); |
- scheduler->SetNeedsRedraw(); |
- EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
- |
- client.Reset(); |
- scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
- EXPECT_EQ(client.num_actions_(), 0); |
- EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
- client.Reset(); |
- scheduler->OnBeginImplFrameDeadline(); |
- EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
- EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); |
- EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_FALSE(scheduler->RedrawPending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
- |
- client.Reset(); |
- scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
- EXPECT_EQ(client.num_actions_(), 0); |
- EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
- client.Reset(); |
- scheduler->OnBeginImplFrameDeadline(); |
- EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); |
- EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_FALSE(scheduler->RedrawPending()); |
- EXPECT_FALSE(client.needs_begin_impl_frame()); |
- |
- client.Reset(); |
- scheduler->SetMainThreadNeedsLayerTextures(); |
- EXPECT_SINGLE_ACTION("ScheduledActionAcquireLayerTexturesForMainThread", |
- client); |
- |
- // We should request a BeginImplFrame in anticipation of a draw. |
- client.Reset(); |
- scheduler->SetNeedsRedraw(); |
- EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
- |
- // No draw happens since the textures are acquired by the main thread. |
- client.Reset(); |
- scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
- EXPECT_EQ(client.num_actions_(), 0); |
- EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
- client.Reset(); |
- scheduler->OnBeginImplFrameDeadline(); |
- EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); |
- EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_TRUE(scheduler->RedrawPending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
- |
- client.Reset(); |
- scheduler->SetNeedsCommit(); |
- EXPECT_EQ(0, client.num_actions_()); |
- |
- client.Reset(); |
- scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
- EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client); |
- EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
- |
- // Commit will release the texture. |
- client.Reset(); |
- scheduler->NotifyBeginMainFrameStarted(); |
- scheduler->NotifyReadyToCommit(); |
- EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
- EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_TRUE(scheduler->RedrawPending()); |
- |
- // Now we can draw again after the commit happens. |
- client.Reset(); |
- scheduler->OnBeginImplFrameDeadline(); |
- EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
- EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); |
- EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_FALSE(scheduler->RedrawPending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
- |
- // Make sure we stop requesting BeginImplFrames if we don't swap. |
- client.Reset(); |
- scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
- EXPECT_EQ(client.num_actions_(), 0); |
- EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
- client.Reset(); |
- scheduler->OnBeginImplFrameDeadline(); |
- EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); |
- EXPECT_FALSE(client.needs_begin_impl_frame()); |
-} |
- |
-TEST(SchedulerTest, TextureAcquisitionCollision) { |
- FakeSchedulerClient client; |
- SchedulerSettings scheduler_settings; |
- Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
- scheduler->SetCanStart(); |
- scheduler->SetVisible(true); |
- scheduler->SetCanDraw(true); |
- |
- EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
- InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
- |
- client.Reset(); |
- scheduler->SetNeedsCommit(); |
- EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); |
- |
- client.Reset(); |
- scheduler->SetMainThreadNeedsLayerTextures(); |
- EXPECT_SINGLE_ACTION( |
- "ScheduledActionAcquireLayerTexturesForMainThread", client); |
- |
- client.Reset(); |
- scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
- EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client); |
- EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
- |
- client.Reset(); |
- scheduler->OnBeginImplFrameDeadline(); |
- EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); |
- |
- // Although the compositor cannot draw because textures are locked by main |
- // thread, we continue requesting SetNeedsBeginImplFrame in anticipation of |
- // the unlock. |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
- |
- // Trigger the commit. |
- scheduler->NotifyBeginMainFrameStarted(); |
- scheduler->NotifyReadyToCommit(); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
- |
- // Between commit and draw, texture acquisition for main thread delayed, |
- // and main thread blocks. |
- client.Reset(); |
- scheduler->SetMainThreadNeedsLayerTextures(); |
- EXPECT_EQ(0, client.num_actions_()); |
- |
- // No implicit commit is expected. |
- client.Reset(); |
- scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
- EXPECT_EQ(client.num_actions_(), 0); |
- EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
- |
- client.Reset(); |
- scheduler->OnBeginImplFrameDeadline(); |
- EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 3); |
- EXPECT_ACTION( |
- "ScheduledActionAcquireLayerTexturesForMainThread", client, 1, 3); |
- EXPECT_ACTION("SetNeedsBeginImplFrame", client, 2, 3); |
- EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
- |
- // The compositor should not draw because textures are locked by main |
- // thread. |
- client.Reset(); |
- scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
- EXPECT_EQ(client.num_actions_(), 0); |
- EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
- client.Reset(); |
- scheduler->OnBeginImplFrameDeadline(); |
- EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); |
- EXPECT_FALSE(client.needs_begin_impl_frame()); |
- EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
- |
- // The impl thread need an explicit commit from the main thread to lock |
- // the textures. |
- client.Reset(); |
- scheduler->SetNeedsCommit(); |
- EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
- |
- client.Reset(); |
- scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
- EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client); |
- EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
- client.Reset(); |
- |
- // Trigger the commit, which will trigger the deadline task early. |
- scheduler->NotifyBeginMainFrameStarted(); |
- scheduler->NotifyReadyToCommit(); |
- EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
- EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
- client.Reset(); |
- |
- // Verify we draw on the next BeginImplFrame deadline |
- scheduler->OnBeginImplFrameDeadline(); |
- EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
- EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
- EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
- client.Reset(); |
-} |
- |
-TEST(SchedulerTest, VisibilitySwitchWithTextureAcquisition) { |
- FakeSchedulerClient client; |
- SchedulerSettings scheduler_settings; |
- Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
- scheduler->SetCanStart(); |
- scheduler->SetVisible(true); |
- scheduler->SetCanDraw(true); |
- |
- EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
- client.Reset(); |
- scheduler->DidCreateAndInitializeOutputSurface(); |
- |
- scheduler->SetNeedsCommit(); |
- scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
- scheduler->OnBeginImplFrameDeadline(); |
- scheduler->NotifyBeginMainFrameStarted(); |
- scheduler->NotifyReadyToCommit(); |
- scheduler->SetMainThreadNeedsLayerTextures(); |
- scheduler->SetNeedsCommit(); |
- client.Reset(); |
- // Verify that pending texture acquisition fires when visibility |
- // is lost in order to avoid a deadlock. |
- scheduler->SetVisible(false); |
- EXPECT_SINGLE_ACTION("ScheduledActionAcquireLayerTexturesForMainThread", |
- client); |
- |
- client.Reset(); |
- scheduler->SetVisible(true); |
- EXPECT_EQ(0, client.num_actions_()); |
- EXPECT_TRUE(client.needs_begin_impl_frame()); |
- |
- // Regaining visibility with textures acquired by main thread while |
- // compositor is waiting for first draw should result in a request |
- // for a new frame in order to escape a deadlock. |
- client.Reset(); |
- scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
- EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client); |
- EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
-} |
- |
class SchedulerClientThatsetNeedsDrawInsideDraw : public FakeSchedulerClient { |
public: |
virtual void ScheduledActionSendBeginMainFrame() OVERRIDE {} |