Index: cc/layer_tree_host_unittest_delegated.cc |
diff --git a/cc/layer_tree_host_unittest_delegated.cc b/cc/layer_tree_host_unittest_delegated.cc |
index 098a941af5b858bd42be2881f72482e4c25858e3..df90a13467568770fe40d8deac6f7b10081c71c6 100644 |
--- a/cc/layer_tree_host_unittest_delegated.cc |
+++ b/cc/layer_tree_host_unittest_delegated.cc |
@@ -364,7 +364,6 @@ class LayerTreeHostDelegatedTestMergeResources |
EXPECT_EQ(1u, map.count(999)); |
EXPECT_EQ(1u, map.count(555)); |
- // Both frames' resources should be saved on the layer. |
EXPECT_EQ(2u, delegated_impl->Resources().size()); |
EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(999)->second)); |
EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); |
@@ -704,20 +703,11 @@ class LayerTreeHostDelegatedTestFrameBeforeTakeResources |
AddTextureQuad(frame.get(), 444); |
delegated_->SetFrameData(frame.Pass()); |
- // When we take resources, it should have the resources that were |
- // released during the last valid frame committed. |
+ // The resources are used by the new frame so are not returned. |
delegated_->TakeUnusedResourcesForChildCompositor(&resources); |
- EXPECT_EQ(2u, resources.size()); |
- if (resources[0].id == 555) { |
- EXPECT_EQ(555, resources[0].id); |
- EXPECT_EQ(444, resources[1].id); |
- } else { |
- EXPECT_EQ(444, resources[0].id); |
- EXPECT_EQ(555, resources[1].id); |
- } |
+ EXPECT_EQ(0u, resources.size()); |
break; |
case 4: |
- // The invalid frame doesn't cause anything to be released. |
delegated_->TakeUnusedResourcesForChildCompositor(&resources); |
EXPECT_EQ(0u, resources.size()); |
endTest(); |
@@ -737,20 +727,29 @@ class LayerTreeHostDelegatedTestFrameBeforeTakeResources |
host_impl->resourceProvider()->getChildToParentMap( |
delegated_impl->ChildId()); |
- // The bad frame should be dropped. So we should only have one quad (the |
- // one with resource 999) on the impl tree. And only 999 will be present |
- // in the parent's resource provider. |
- EXPECT_EQ(1u, map.size()); |
+ // The third frame has all of the resources in it again, the delegated |
+ // renderer layer should continue to own the resources for it. |
+ EXPECT_EQ(3u, map.size()); |
EXPECT_EQ(1u, map.count(999)); |
+ EXPECT_EQ(1u, map.count(555)); |
+ EXPECT_EQ(1u, map.count(444)); |
- EXPECT_EQ(1u, delegated_impl->Resources().size()); |
+ EXPECT_EQ(3u, delegated_impl->Resources().size()); |
EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(999)->second)); |
+ EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); |
+ EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(444)->second)); |
const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0]; |
- EXPECT_EQ(1u, pass->quad_list.size()); |
- const TextureDrawQuad* quad = TextureDrawQuad::MaterialCast( |
+ EXPECT_EQ(3u, pass->quad_list.size()); |
+ const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast( |
pass->quad_list[0]); |
- EXPECT_EQ(map.find(999)->second, quad->resource_id); |
+ EXPECT_EQ(map.find(999)->second, quad1->resource_id); |
+ const TextureDrawQuad* quad2 = TextureDrawQuad::MaterialCast( |
+ pass->quad_list[1]); |
+ EXPECT_EQ(map.find(555)->second, quad2->resource_id); |
+ const TextureDrawQuad* quad3 = TextureDrawQuad::MaterialCast( |
+ pass->quad_list[2]); |
+ EXPECT_EQ(map.find(444)->second, quad3->resource_id); |
} |
virtual void afterTest() OVERRIDE {} |
@@ -801,10 +800,10 @@ class LayerTreeHostDelegatedTestBadFrame |
// The parent compositor (this one) does a commit. |
break; |
case 3: |
- // The bad frame does not cause resources to be released, and the |
- // resources given in it are held onto. |
+ // The bad frame's resource is given back to the child compositor. |
delegated_->TakeUnusedResourcesForChildCompositor(&resources); |
- EXPECT_EQ(0u, resources.size()); |
+ EXPECT_EQ(1u, resources.size()); |
+ EXPECT_EQ(444, resources[0].id); |
// Now send a good frame with 999 again. |
frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); |
@@ -812,17 +811,10 @@ class LayerTreeHostDelegatedTestBadFrame |
delegated_->SetFrameData(frame.Pass()); |
break; |
case 4: |
- // The unused 444 resource from the bad frame will be released along |
- // with the unused 555. |
+ // The unused 555 from the last good frame is now released. |
delegated_->TakeUnusedResourcesForChildCompositor(&resources); |
- EXPECT_EQ(2u, resources.size()); |
- if (resources[0].id == 555) { |
- EXPECT_EQ(555, resources[0].id); |
- EXPECT_EQ(444, resources[1].id); |
- } else { |
- EXPECT_EQ(444, resources[0].id); |
- EXPECT_EQ(555, resources[1].id); |
- } |
+ EXPECT_EQ(1u, resources.size()); |
+ EXPECT_EQ(555, resources[0].id); |
endTest(); |
break; |
@@ -864,17 +856,14 @@ class LayerTreeHostDelegatedTestBadFrame |
break; |
} |
case 2: { |
- // We have all resources whose ownership has been given to the delegated |
- // layer. |
- EXPECT_EQ(3u, map.size()); |
+ // We only keep resources from the last valid frame. |
+ EXPECT_EQ(2u, map.size()); |
EXPECT_EQ(1u, map.count(999)); |
EXPECT_EQ(1u, map.count(555)); |
- EXPECT_EQ(1u, map.count(444)); |
- EXPECT_EQ(3u, delegated_impl->Resources().size()); |
+ EXPECT_EQ(2u, delegated_impl->Resources().size()); |
EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(999)->second)); |
EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); |
- EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(444)->second)); |
// The bad frame is dropped though, we still have the frame with 999 and |
// 555 in it. |
@@ -911,5 +900,339 @@ class LayerTreeHostDelegatedTestBadFrame |
SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestBadFrame) |
+class LayerTreeHostDelegatedTestUnnamedResource |
+ : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { |
+ public: |
+ virtual void beginTest() OVERRIDE { |
+ postSetNeedsCommitToMainThread(); |
+ } |
+ |
+ virtual void didCommit() OVERRIDE { |
+ scoped_ptr<DelegatedFrameData> frame; |
+ TransferableResourceArray resources; |
+ |
+ int next_source_frame_number = m_layerTreeHost->commitNumber(); |
+ switch (next_source_frame_number) { |
+ case 1: |
+ // This frame includes two resources in it, but only uses one. |
+ frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); |
+ AddTransferableResource(frame.get(), 999); |
+ AddTextureQuad(frame.get(), 555); |
+ AddTransferableResource(frame.get(), 555); |
+ delegated_->SetFrameData(frame.Pass()); |
+ break; |
+ case 2: |
+ // The unused resource should be returned. |
+ delegated_->TakeUnusedResourcesForChildCompositor(&resources); |
+ EXPECT_EQ(1u, resources.size()); |
+ EXPECT_EQ(999, resources[0].id); |
+ |
+ endTest(); |
+ break; |
+ } |
+ } |
+ |
+ virtual void treeActivatedOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { |
+ if (host_impl->activeTree()->source_frame_number() != 1) |
+ return; |
+ |
+ LayerImpl* root_impl = host_impl->activeTree()->RootLayer(); |
+ FakeDelegatedRendererLayerImpl* delegated_impl = |
+ static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); |
+ |
+ const ResourceProvider::ResourceIdMap& map = |
+ host_impl->resourceProvider()->getChildToParentMap( |
+ delegated_impl->ChildId()); |
+ |
+ // The layer only held on to the resource that was used. |
+ EXPECT_EQ(1u, map.size()); |
+ EXPECT_EQ(1u, map.count(555)); |
+ |
+ EXPECT_EQ(1u, delegated_impl->Resources().size()); |
+ EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); |
+ } |
+ |
+ virtual void afterTest() OVERRIDE {} |
+}; |
+ |
+SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestUnnamedResource) |
+ |
+class LayerTreeHostDelegatedTestDontLeakResource |
+ : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { |
+ public: |
+ virtual void beginTest() OVERRIDE { |
+ postSetNeedsCommitToMainThread(); |
+ } |
+ |
+ virtual void didCommit() OVERRIDE { |
+ scoped_ptr<DelegatedFrameData> frame; |
+ TransferableResourceArray resources; |
+ |
+ int next_source_frame_number = m_layerTreeHost->commitNumber(); |
+ switch (next_source_frame_number) { |
+ case 1: |
+ // This frame includes two resources in it. |
+ frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); |
+ AddTextureQuad(frame.get(), 999); |
+ AddTransferableResource(frame.get(), 999); |
+ AddTextureQuad(frame.get(), 555); |
+ AddTransferableResource(frame.get(), 555); |
+ delegated_->SetFrameData(frame.Pass()); |
+ |
+ // But then we immediately stop using 999. |
+ frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); |
+ AddTextureQuad(frame.get(), 555); |
+ delegated_->SetFrameData(frame.Pass()); |
+ break; |
+ case 2: |
+ // The unused resource should be returned. |
+ delegated_->TakeUnusedResourcesForChildCompositor(&resources); |
+ EXPECT_EQ(1u, resources.size()); |
+ EXPECT_EQ(999, resources[0].id); |
+ |
+ endTest(); |
+ break; |
+ } |
+ } |
+ |
+ virtual void treeActivatedOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { |
+ if (host_impl->activeTree()->source_frame_number() != 1) |
+ return; |
+ |
+ LayerImpl* root_impl = host_impl->activeTree()->RootLayer(); |
+ FakeDelegatedRendererLayerImpl* delegated_impl = |
+ static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); |
+ |
+ const ResourceProvider::ResourceIdMap& map = |
+ host_impl->resourceProvider()->getChildToParentMap( |
+ delegated_impl->ChildId()); |
+ |
+ // The layer only held on to the resource that was used. |
+ EXPECT_EQ(1u, map.size()); |
+ EXPECT_EQ(1u, map.count(555)); |
+ |
+ EXPECT_EQ(1u, delegated_impl->Resources().size()); |
+ EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); |
+ } |
+ |
+ virtual void afterTest() OVERRIDE {} |
+}; |
+ |
+SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestDontLeakResource) |
+ |
+class LayerTreeHostDelegatedTestResourceSentToParent |
+ : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { |
+ public: |
+ virtual void beginTest() OVERRIDE { |
+ // Prevent drawing with resources that are sent to the grandparent. |
+ m_layerTreeHost->setViewportSize(gfx::Size(10, 10), gfx::Size()); |
+ postSetNeedsCommitToMainThread(); |
+ } |
+ |
+ virtual void didCommit() OVERRIDE { |
+ scoped_ptr<DelegatedFrameData> frame; |
+ TransferableResourceArray resources; |
+ |
+ int next_source_frame_number = m_layerTreeHost->commitNumber(); |
+ switch (next_source_frame_number) { |
+ case 1: |
+ // This frame includes two resources in it. |
+ frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); |
+ AddTextureQuad(frame.get(), 999); |
+ AddTransferableResource(frame.get(), 999); |
+ AddTextureQuad(frame.get(), 555); |
+ AddTransferableResource(frame.get(), 555); |
+ delegated_->SetFrameData(frame.Pass()); |
+ break; |
+ case 2: |
+ delegated_->TakeUnusedResourcesForChildCompositor(&resources); |
+ EXPECT_EQ(0u, resources.size()); |
+ |
+ // 999 is in use in the grandparent compositor, generate a frame without |
+ // it present. |
+ frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); |
+ AddTextureQuad(frame.get(), 555); |
+ delegated_->SetFrameData(frame.Pass()); |
+ break; |
+ case 3: |
+ // Since 999 is in the grandparent it is not returned. |
+ delegated_->TakeUnusedResourcesForChildCompositor(&resources); |
+ EXPECT_EQ(0u, resources.size()); |
+ |
+ m_layerTreeHost->setNeedsCommit(); |
+ break; |
+ case 4: |
+ // 999 was returned from the grandparent and could be released. |
+ delegated_->TakeUnusedResourcesForChildCompositor(&resources); |
+ EXPECT_EQ(1u, resources.size()); |
+ EXPECT_EQ(999, resources[0].id); |
+ |
+ endTest(); |
+ break; |
+ } |
+ } |
+ |
+ virtual void treeActivatedOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { |
+ if (host_impl->activeTree()->source_frame_number() < 1) |
+ return; |
+ |
+ LayerImpl* root_impl = host_impl->activeTree()->RootLayer(); |
+ FakeDelegatedRendererLayerImpl* delegated_impl = |
+ static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); |
+ |
+ const ResourceProvider::ResourceIdMap& map = |
+ host_impl->resourceProvider()->getChildToParentMap( |
+ delegated_impl->ChildId()); |
+ |
+ switch (host_impl->activeTree()->source_frame_number()) { |
+ case 1: { |
+ EXPECT_EQ(2u, map.size()); |
+ EXPECT_EQ(1u, map.count(999)); |
+ EXPECT_EQ(1u, map.count(555)); |
+ |
+ EXPECT_EQ(2u, delegated_impl->Resources().size()); |
+ EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(999)->second)); |
+ EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); |
+ |
+ // The 999 resource is sent to a grandparent compositor. |
+ ResourceProvider::ResourceIdArray resources_for_parent; |
+ resources_for_parent.push_back(map.find(999)->second); |
+ TransferableResourceArray transferable_resources; |
+ host_impl->resourceProvider()->prepareSendToParent( |
+ resources_for_parent, &transferable_resources); |
+ break; |
+ } |
+ case 2: { |
+ EXPECT_EQ(2u, map.size()); |
+ EXPECT_EQ(1u, map.count(999)); |
+ EXPECT_EQ(1u, map.count(555)); |
+ |
+ /// 999 is in the parent, so not held by delegated renderer layer. |
+ EXPECT_EQ(1u, delegated_impl->Resources().size()); |
+ EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); |
+ |
+ // Receive 999 back from the grandparent. |
+ TransferableResource resource; |
+ resource.id = map.find(999)->second; |
+ TransferableResourceArray transferable_resources; |
+ transferable_resources.push_back(resource); |
+ host_impl->resourceProvider()->receiveFromParent( |
+ transferable_resources); |
+ break; |
+ } |
+ case 3: |
+ // 999 should be released. |
+ EXPECT_EQ(1u, map.size()); |
+ EXPECT_EQ(1u, map.count(555)); |
+ |
+ EXPECT_EQ(1u, delegated_impl->Resources().size()); |
+ EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); |
+ } |
+ } |
+ |
+ virtual void afterTest() OVERRIDE {} |
+}; |
+ |
+SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestResourceSentToParent) |
+ |
+class LayerTreeHostDelegatedTestCommitWithoutTake |
+ : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { |
+ public: |
+ virtual void beginTest() OVERRIDE { |
+ // Prevent drawing with resources that are sent to the grandparent. |
+ m_layerTreeHost->setViewportSize(gfx::Size(10, 10), gfx::Size()); |
+ postSetNeedsCommitToMainThread(); |
+ } |
+ |
+ virtual void didCommit() OVERRIDE { |
+ scoped_ptr<DelegatedFrameData> frame; |
+ TransferableResourceArray resources; |
+ |
+ int next_source_frame_number = m_layerTreeHost->commitNumber(); |
+ switch (next_source_frame_number) { |
+ case 1: |
+ frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); |
+ AddTextureQuad(frame.get(), 999); |
+ AddTransferableResource(frame.get(), 999); |
+ AddTextureQuad(frame.get(), 555); |
+ AddTransferableResource(frame.get(), 555); |
+ AddTextureQuad(frame.get(), 444); |
+ AddTransferableResource(frame.get(), 444); |
+ delegated_->SetFrameData(frame.Pass()); |
+ break; |
+ case 2: |
+ delegated_->TakeUnusedResourcesForChildCompositor(&resources); |
+ EXPECT_EQ(0u, resources.size()); |
+ |
+ // Stop using 999 and 444 in this frame and commit. |
+ frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); |
+ AddTextureQuad(frame.get(), 555); |
+ delegated_->SetFrameData(frame.Pass()); |
+ break; |
+ case 3: |
+ // Don't take resources here, but set a new frame that uses 999 again. |
+ frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); |
+ AddTextureQuad(frame.get(), 999); |
+ AddTextureQuad(frame.get(), 555); |
+ delegated_->SetFrameData(frame.Pass()); |
+ break; |
+ case 4: |
+ // 999 and 555 are in use, but 444 should be returned now. |
+ delegated_->TakeUnusedResourcesForChildCompositor(&resources); |
+ EXPECT_EQ(1u, resources.size()); |
+ EXPECT_EQ(444, resources[0].id); |
+ |
+ endTest(); |
+ break; |
+ } |
+ } |
+ |
+ virtual void treeActivatedOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { |
+ if (host_impl->activeTree()->source_frame_number() < 1) |
+ return; |
+ |
+ LayerImpl* root_impl = host_impl->activeTree()->RootLayer(); |
+ FakeDelegatedRendererLayerImpl* delegated_impl = |
+ static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); |
+ |
+ const ResourceProvider::ResourceIdMap& map = |
+ host_impl->resourceProvider()->getChildToParentMap( |
+ delegated_impl->ChildId()); |
+ |
+ switch (host_impl->activeTree()->source_frame_number()) { |
+ case 1: |
+ EXPECT_EQ(3u, map.size()); |
+ EXPECT_EQ(1u, map.count(999)); |
+ EXPECT_EQ(1u, map.count(555)); |
+ EXPECT_EQ(1u, map.count(444)); |
+ |
+ EXPECT_EQ(3u, delegated_impl->Resources().size()); |
+ EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(999)->second)); |
+ EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); |
+ EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(444)->second)); |
+ break; |
+ case 2: |
+ EXPECT_EQ(1u, map.size()); |
+ EXPECT_EQ(1u, map.count(555)); |
+ |
+ EXPECT_EQ(1u, delegated_impl->Resources().size()); |
+ EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); |
+ break; |
+ case 3: |
+ EXPECT_EQ(2u, map.size()); |
+ EXPECT_EQ(1u, map.count(999)); |
+ EXPECT_EQ(1u, map.count(555)); |
+ |
+ EXPECT_EQ(2u, delegated_impl->Resources().size()); |
+ EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(999)->second)); |
+ EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); |
+ } |
+ } |
+ |
+ virtual void afterTest() OVERRIDE {} |
+}; |
+ |
+SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestCommitWithoutTake) |
+ |
} // namespace |
} // namespace cc |