Index: cc/layers/texture_layer_unittest.cc |
diff --git a/cc/layers/texture_layer_unittest.cc b/cc/layers/texture_layer_unittest.cc |
index 7d10bf7ee4ae7739693a0d58c5afe75ac8d6d3fe..f992b1938c034ab5bf7dffd27b200ba6a529a04f 100644 |
--- a/cc/layers/texture_layer_unittest.cc |
+++ b/cc/layers/texture_layer_unittest.cc |
@@ -643,15 +643,74 @@ class TextureLayerImplWithMailboxThreadedCallback : public LayerTreeTest { |
bool synchronous_composite = |
!HasImplThread() && |
!layer_tree_host()->GetSettings().single_thread_proxy_scheduler; |
- // Allow relaim resources for this test so that mailboxes in the display |
- // will be returned inside the commit that replaces them. |
- bool force_disable_reclaim_resources = false; |
return base::MakeUnique<TestCompositorFrameSink>( |
compositor_context_provider, std::move(worker_context_provider), |
shared_bitmap_manager(), gpu_memory_buffer_manager(), |
layer_tree_host()->GetSettings().renderer_settings, |
- ImplThreadTaskRunner(), synchronous_composite, |
- force_disable_reclaim_resources); |
+ ImplThreadTaskRunner(), synchronous_composite); |
+ } |
+ |
+ void AdvanceTestCase() { |
+ ++test_case_; |
+ switch (test_case_) { |
+ case 1: |
+ // Case #1: change mailbox before the commit. The old mailbox should be |
+ // released immediately. |
+ SetMailbox('2'); |
+ EXPECT_EQ(1, callback_count_); |
+ PostSetNeedsCommitToMainThread(); |
+ |
+ // Case 2 does not rely on callbacks to advance. |
+ pending_callback_ = false; |
+ break; |
+ case 2: |
+ // Case #2: change mailbox after the commit (and draw), where the |
+ // layer draws. The old mailbox should be released during the next |
+ // commit. |
+ SetMailbox('3'); |
+ EXPECT_EQ(1, callback_count_); |
+ |
+ // Cases 3-5 rely on a callback to advance. |
+ pending_callback_ = true; |
+ break; |
+ case 3: |
+ EXPECT_EQ(2, callback_count_); |
+ // Case #3: change mailbox when the layer doesn't draw. The old |
+ // mailbox should be released during the next commit. |
+ layer_->SetBounds(gfx::Size()); |
+ SetMailbox('4'); |
+ break; |
+ case 4: |
+ EXPECT_EQ(3, callback_count_); |
+ // Case #4: release mailbox that was committed but never drawn. The |
+ // old mailbox should be released during the next commit. |
+ layer_->SetTextureMailbox(TextureMailbox(), nullptr); |
+ break; |
+ case 5: |
+ EXPECT_EQ(4, callback_count_); |
+ // Restore a mailbox for the next step. |
+ SetMailbox('5'); |
+ |
+ // Cases 6 and 7 do not rely on callbacks to advance. |
+ pending_callback_ = false; |
+ break; |
+ case 6: |
+ // Case #5: remove layer from tree. Callback should *not* be called, the |
+ // mailbox is returned to the main thread. |
+ EXPECT_EQ(4, callback_count_); |
+ layer_->RemoveFromParent(); |
+ break; |
+ case 7: |
+ EXPECT_EQ(4, callback_count_); |
+ // Resetting the mailbox will call the callback now. |
+ layer_->SetTextureMailbox(TextureMailbox(), nullptr); |
+ EXPECT_EQ(5, callback_count_); |
+ EndTest(); |
+ break; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
} |
// Make sure callback is received on main and doesn't block the impl thread. |
@@ -661,6 +720,10 @@ class TextureLayerImplWithMailboxThreadedCallback : public LayerTreeTest { |
EXPECT_EQ(true, main_thread_.CalledOnValidThread()); |
EXPECT_FALSE(lost_resource); |
++callback_count_; |
+ |
+ // If we are waiting on a callback, advance now. |
+ if (pending_callback_) |
+ AdvanceTestCase(); |
} |
void SetMailbox(char mailbox_char) { |
@@ -696,58 +759,14 @@ class TextureLayerImplWithMailboxThreadedCallback : public LayerTreeTest { |
SetMailbox('1'); |
EXPECT_EQ(0, callback_count_); |
- // Case #1: change mailbox before the commit. The old mailbox should be |
- // released immediately. |
- SetMailbox('2'); |
- EXPECT_EQ(1, callback_count_); |
- PostSetNeedsCommitToMainThread(); |
+ // Setup is complete - advance to test case 1. |
+ AdvanceTestCase(); |
} |
void DidCommit() override { |
- ++commit_count_; |
- switch (commit_count_) { |
- case 1: |
- // Case #2: change mailbox after the commit (and draw), where the |
- // layer draws. The old mailbox should be released during the next |
- // commit. |
- SetMailbox('3'); |
- EXPECT_EQ(1, callback_count_); |
- break; |
- case 2: |
- EXPECT_EQ(2, callback_count_); |
- // Case #3: change mailbox when the layer doesn't draw. The old |
- // mailbox should be released during the next commit. |
- layer_->SetBounds(gfx::Size()); |
- SetMailbox('4'); |
- break; |
- case 3: |
- EXPECT_EQ(3, callback_count_); |
- // Case #4: release mailbox that was committed but never drawn. The |
- // old mailbox should be released during the next commit. |
- layer_->SetTextureMailbox(TextureMailbox(), nullptr); |
- break; |
- case 4: |
- EXPECT_EQ(4, callback_count_); |
- // Restore a mailbox for the next step. |
- SetMailbox('5'); |
- break; |
- case 5: |
- // Case #5: remove layer from tree. Callback should *not* be called, the |
- // mailbox is returned to the main thread. |
- EXPECT_EQ(4, callback_count_); |
- layer_->RemoveFromParent(); |
- break; |
- case 6: |
- EXPECT_EQ(4, callback_count_); |
- // Resetting the mailbox will call the callback now. |
- layer_->SetTextureMailbox(TextureMailbox(), nullptr); |
- EXPECT_EQ(5, callback_count_); |
- EndTest(); |
- break; |
- default: |
- NOTREACHED(); |
- break; |
- } |
+ // If we are not waiting on a callback, advance now. |
+ if (!pending_callback_) |
+ AdvanceTestCase(); |
} |
void AfterTest() override {} |
@@ -755,7 +774,9 @@ class TextureLayerImplWithMailboxThreadedCallback : public LayerTreeTest { |
private: |
base::ThreadChecker main_thread_; |
int callback_count_ = 0; |
- int commit_count_ = 0; |
+ int test_case_ = 0; |
+ // Whether we are waiting on a callback to advance the test case. |
+ bool pending_callback_ = false; |
scoped_refptr<Layer> root_; |
scoped_refptr<TextureLayer> layer_; |
}; |