Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4058)

Unified Diff: cc/layer_tree_host_unittest_delegated.cc

Issue 12385085: cc: Unused resources should be given back to the child compositor (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/delegated_renderer_layer_impl.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « cc/delegated_renderer_layer_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698