layer_tree_host_unittest_delegated.cc revision b2df76ea8fec9e32f6f3718986dba0d95315b29c
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/delegated_renderer_layer.h" 8b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "cc/layers/delegated_renderer_layer_client.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/delegated_renderer_layer_impl.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/delegated_frame_data.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/shared_quad_state.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/texture_draw_quad.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer_impl.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These tests deal with delegated renderer layers. 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTest : public LayerTreeTest { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> CreateFrameData(gfx::Rect root_output_rect, 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect root_damage_rect) { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame(new DelegatedFrameData); 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<RenderPass> root_pass(RenderPass::Create()); 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_pass->SetNew(RenderPass::Id(1, 1), 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_output_rect, 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_damage_rect, 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform()); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_pass_list.push_back(root_pass.Pass()); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return frame.Pass(); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AddTransferableResource(DelegatedFrameData* frame, 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider::ResourceId resource_id) { 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransferableResource resource; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resource.id = resource_id; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->resource_list.push_back(resource); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AddTextureQuad(DelegatedFrameData* frame, 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider::ResourceId resource_id) { 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<SharedQuadState> sqs = SharedQuadState::Create(); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TextureDrawQuad> quad = TextureDrawQuad::Create(); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float vertex_opacity[4] = { 1.f, 1.f, 1.f, 1.f }; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quad->SetNew(sqs.get(), 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(0, 0, 10, 10), 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(0, 0, 10, 10), 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resource_id, 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF(0.f, 0.f), 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF(1.f, 1.f), 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vertex_opacity, 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_pass_list[0]->shared_quad_state_list.push_back(sqs.Pass()); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_pass_list[0]->quad_list.push_back(quad.PassAs<DrawQuad>()); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> CreateEmptyFrameData() { 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame(new DelegatedFrameData); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return frame.Pass(); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestCaseSingleDelegatedLayer 70b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) : public LayerTreeHostDelegatedTest, 71b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public DelegatedRendererLayerClient { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_ = Layer::Create(); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->SetAnchorPoint(gfx::PointF()); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->SetBounds(gfx::Size(10, 10)); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 78b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) delegated_ = FakeDelegatedRendererLayer::Create(this); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetAnchorPoint(gfx::PointF()); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetBounds(gfx::Size(10, 10)); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetIsDrawable(true); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->AddChild(delegated_); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostDelegatedTest::SetupTree(); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 94b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidCommitFrameData() OVERRIDE {} 95b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> root_; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DelegatedRendererLayer> delegated_; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 101b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class LayerTreeHostDelegatedTestClientDidCommitCallback 102b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 103b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public: 104b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) LayerTreeHostDelegatedTestClientDidCommitCallback() 105b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(), 106b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) num_did_commit_frame_data_(0) {} 107b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 108b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 109b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (TestEnded()) 110b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return; 111b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 112b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(1, num_did_commit_frame_data_); 113b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EndTest(); 114b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 115b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 116b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 117b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1), 118b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) gfx::Rect(0, 0, 1, 1))); 119b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 120b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 121b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 122b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidCommitFrameData() OVERRIDE { 123b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) num_did_commit_frame_data_++; 124b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 125b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 126b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) protected: 127b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) int num_did_commit_frame_data_; 128b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}; 129b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 130b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 131b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) LayerTreeHostDelegatedTestClientDidCommitCallback); 132b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestCreateChildId 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostDelegatedTestCreateChildId() 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(), 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) num_activates_(0), 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) did_reset_child_id_(false) {} 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (TestEnded()) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1), 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(0, 0, 1, 1))); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TreeActivatedOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WebGraphicsContext3D* context = 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host_impl->resource_provider()->GraphicsContext3D(); 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++num_activates_; 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (num_activates_) { 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(delegated_impl->ChildId()); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(did_reset_child_id_); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context->loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB, 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_INNOCENT_CONTEXT_RESET_ARB); 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(delegated_impl->ChildId()); 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(did_reset_child_id_); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InitializedRendererOnThread(LayerTreeHostImpl* host_impl, 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool success) OVERRIDE { 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(success); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (num_activates_ < 2) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, num_activates_); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(delegated_impl->ChildId()); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) did_reset_child_id_ = true; 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_activates_; 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool did_reset_child_id_; 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestCreateChildId); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestLayerUsesFrameDamage 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostDelegatedTestLayerUsesFrameDamage() 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(), 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_draw_for_source_frame_(true) {} 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int next_source_frame_number = layer_tree_host()->commit_number(); 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (next_source_frame_number) { 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The first time the layer gets a frame the whole layer should be 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // damaged. 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1), 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(0, 0, 1, 1))); 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should create a total amount of gfx::Rect(2, 2, 10, 6) damage. 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The frame size is 20x20 while the layer is 10x10, so this should 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // produce a gfx::Rect(1, 1, 5, 3) damage rect. 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 20, 20), 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(2, 2, 5, 5))); 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 20, 20), 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(7, 2, 5, 6))); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should create zero damage. 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 4: 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should damage the full viewport. 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetBounds(gfx::Size(2, 2)); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 5: 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should create zero damage. 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 6: 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should damage the full layer. 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetBounds(gfx::Size(6, 6)); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 5, 5), 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(1, 1, 2, 2))); 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 7: 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should create zero damage. 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 8: 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should damage the full layer. 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetDisplaySize(gfx::Size(10, 10)); 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 9: 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should create zero damage. 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 10: 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Setting an empty frame should damage the whole layer the 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // first time. 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(CreateEmptyFrameData()); 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 11: 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Setting an empty frame shouldn't damage anything after the 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // first time. 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(CreateEmptyFrameData()); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 12: 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Having valid content to display agains should damage the whole layer. 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 10, 10), 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(5, 5, 1, 1))); 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 13: 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should create gfx::Rect(1, 1, 2, 2) of damage. The frame size is 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 5x5 and the display size is now set to 10x10, so this should result 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in a gfx::Rect(2, 2, 4, 4) damage rect. 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 5, 5), 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(1, 1, 2, 2))); 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 14: 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should create zero damage. 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_draw_for_source_frame_ = true; 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool result) OVERRIDE { 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(result); 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!first_draw_for_source_frame_) 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::RectF damage_rect; 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!frame->has_no_damage) { 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) damage_rect = frame->render_passes.back()->damage_rect; 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If there is no damage, then we have no render passes to send. 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(frame->render_passes.empty()); 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (host_impl->active_tree()->source_frame_number()) { 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 0: 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // First frame is damaged because of viewport resize. 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(), 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_rect.ToString()); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(), 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_rect.ToString()); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::RectF(1.f, 1.f, 5.f, 3.f).ToString(), 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_rect.ToString()); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(), 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_rect.ToString()); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 4: 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(), 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_rect.ToString()); 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 5: 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(), 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_rect.ToString()); 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 6: 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(), 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_rect.ToString()); 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 7: 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(), 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_rect.ToString()); 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 8: 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(), 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_rect.ToString()); 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 9: 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(), 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_rect.ToString()); 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 10: 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(), 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_rect.ToString()); 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 11: 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(), 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_rect.ToString()); 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 12: 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(), 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_rect.ToString()); 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 13: 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::RectF(2.f, 2.f, 4.f, 4.f).ToString(), 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_rect.ToString()); 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 14: 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(), 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) damage_rect.ToString()); 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool first_draw_for_source_frame_; 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestLayerUsesFrameDamage); 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestMergeResources 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Push two frames to the delegated renderer layer with no commit between. 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The first frame has resource 999. 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame1 = 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame1.get(), 999); 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame1.get(), 999); 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame1.Pass()); 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The second frame uses resource 999 still, but also adds 555. 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame2 = 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame2.get(), 999); 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame2.get(), 555); 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame2.get(), 555); 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame2.Pass()); 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TreeActivatedOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceProvider::ResourceIdMap& map = 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider()->GetChildToParentMap( 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_impl->ChildId()); 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Both frames' resources should be in the parent's resource provider. 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, map.size()); 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(999)); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, delegated_impl->Resources().size()); 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(999)->second)); 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestMergeResources); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestRemapResourcesInQuads 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Generate a frame with two resources in it. 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame = 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TreeActivatedOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceProvider::ResourceIdMap& map = 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider()->GetChildToParentMap( 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_impl->ChildId()); 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The frame's resource should be in the parent's resource provider. 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, map.size()); 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(999)); 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider::ResourceId parent_resource_id1 = map.find(999)->second; 454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(parent_resource_id1, 999u); 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider::ResourceId parent_resource_id2 = map.find(555)->second; 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(parent_resource_id2, 555u); 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The resources in the quads should be remapped to the parent's namespace. 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast( 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_impl->RenderPassesInDrawOrder()[0]->quad_list[0]); 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(parent_resource_id1, quad1->resource_id); 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TextureDrawQuad* quad2 = TextureDrawQuad::MaterialCast( 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_impl->RenderPassesInDrawOrder()[0]->quad_list[1]); 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(parent_resource_id2, quad2->resource_id); 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestRemapResourcesInQuads); 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestReturnUnusedResources 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransferableResourceArray resources; 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int next_source_frame_number = layer_tree_host()->commit_number(); 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (next_source_frame_number) { 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Generate a frame with two resources in it. 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All of the resources are in use. 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Keep using 999 but stop using 555. 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 444); 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 444); 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 555 is no longer in use. 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, resources.size()); 512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(555u, resources[0].id); 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Stop using any resources. 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 4: 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 444 and 999 are no longer in use. 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, resources.size()); 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (resources[0].id == 999) { 523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(999u, resources[0].id); 524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(444u, resources[1].id); 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(444u, resources[0].id); 527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(999u, resources[1].id); 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Resource are never immediately released. 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransferableResourceArray empty_resources; 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&empty_resources); 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(empty_resources.empty()); 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestReturnUnusedResources); 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestReusedResources 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransferableResourceArray resources; 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int next_source_frame_number = layer_tree_host()->commit_number(); 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (next_source_frame_number) { 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Generate a frame with some resources in it. 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 444); 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 444); 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All of the resources are in use. 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Keep using 999 but stop using 555 and 444. 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Resource are not immediately released. 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now using 555 and 444 again, but not 999. 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 444); 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The 999 resource is the only unused one. 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, resources.size()); 592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(999u, resources[0].id); 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestReusedResources); 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestFrameBeforeAck 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransferableResourceArray resources; 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int next_source_frame_number = layer_tree_host()->commit_number(); 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (next_source_frame_number) { 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Generate a frame with some resources in it. 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 444); 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 444); 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All of the resources are in use. 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Keep using 999 but stop using 555 and 444. 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Resource are not immediately released. 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The parent compositor (this one) does a commit. 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, resources.size()); 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (resources[0].id == 555) { 647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(555u, resources[0].id); 648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(444u, resources[1].id); 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(444u, resources[0].id); 651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(555u, resources[1].id); 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The child compositor sends a frame before receiving an for the 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // second frame. It uses 999, 444, and 555 again. 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 444); 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TreeActivatedOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() != 3) 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceProvider::ResourceIdMap& map = 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider()->GetChildToParentMap( 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_impl->ChildId()); 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The bad frame should be dropped. So we should only have one quad (the 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // one with resource 999) on the impl tree. And only 999 will be present 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in the parent's resource provider. 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.size()); 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(999)); 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().size()); 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(999)->second)); 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0]; 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, pass->quad_list.size()); 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TextureDrawQuad* quad = TextureDrawQuad::MaterialCast( 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass->quad_list[0]); 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(map.find(999)->second, quad->resource_id); 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestFrameBeforeAck); 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestFrameBeforeTakeResources 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransferableResourceArray resources; 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int next_source_frame_number = layer_tree_host()->commit_number(); 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (next_source_frame_number) { 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Generate a frame with some resources in it. 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 444); 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 444); 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All of the resources are in use. 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Keep using 999 but stop using 555 and 444. 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Resource are not immediately released. 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The parent compositor (this one) does a commit. 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The child compositor sends a frame before taking resources back 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // from the previous commit. This frame makes use of the resources 555 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and 444, which were just released during commit. 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 444); 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The resources are used by the new frame so are not returned. 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 4: 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TreeActivatedOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() != 3) 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceProvider::ResourceIdMap& map = 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider()->GetChildToParentMap( 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_impl->ChildId()); 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The third frame has all of the resources in it again, the delegated 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer layer should continue to own the resources for it. 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3u, map.size()); 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(999)); 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(444)); 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3u, delegated_impl->Resources().size()); 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(999)->second)); 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(444)->second)); 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0]; 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3u, pass->quad_list.size()); 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast( 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass->quad_list[0]); 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(map.find(999)->second, quad1->resource_id); 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TextureDrawQuad* quad2 = TextureDrawQuad::MaterialCast( 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass->quad_list[1]); 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(map.find(555)->second, quad2->resource_id); 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TextureDrawQuad* quad3 = TextureDrawQuad::MaterialCast( 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass->quad_list[2]); 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(map.find(444)->second, quad3->resource_id); 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostDelegatedTestFrameBeforeTakeResources); 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestBadFrame 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransferableResourceArray resources; 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int next_source_frame_number = layer_tree_host()->commit_number(); 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (next_source_frame_number) { 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Generate a frame with some resources in it. 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All of the resources are in use. 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Generate a bad frame with a resource the layer doesn't have. The 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 885 and 775 resources are unknown, while ownership of the legit 444 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // resource is passed in here. The bad frame does not use any of the 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // previous resources, 999 or 555. 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A bad quad is present both before and after the good quad. 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 885); 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 444); 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 444); 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 775); 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The parent compositor (this one) does a commit. 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The bad frame's resource is given back to the child compositor. 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, resources.size()); 850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(444u, resources[0].id); 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now send a good frame with 999 again. 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 4: 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The unused 555 from the last good frame is now released. 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, resources.size()); 861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(555u, resources[0].id); 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TreeActivatedOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() < 1) 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceProvider::ResourceIdMap& map = 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider()->GetChildToParentMap( 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_impl->ChildId()); 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (host_impl->active_tree()->source_frame_number()) { 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: { 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We have the first good frame with just 990 and 555 in it. 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // layer. 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, map.size()); 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(999)); 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, delegated_impl->Resources().size()); 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(999)->second)); 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0]; 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, pass->quad_list.size()); 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast( 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass->quad_list[0]); 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(map.find(999)->second, quad1->resource_id); 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TextureDrawQuad* quad2 = TextureDrawQuad::MaterialCast( 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass->quad_list[1]); 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(map.find(555)->second, quad2->resource_id); 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: { 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We only keep resources from the last valid frame. 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, map.size()); 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(999)); 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, delegated_impl->Resources().size()); 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(999)->second)); 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The bad frame is dropped though, we still have the frame with 999 and 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 555 in it. 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0]; 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, pass->quad_list.size()); 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast( 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass->quad_list[0]); 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(map.find(999)->second, quad1->resource_id); 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TextureDrawQuad* quad2 = TextureDrawQuad::MaterialCast( 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass->quad_list[1]); 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(map.find(555)->second, quad2->resource_id); 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: { 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We have the new good frame with just 999 in it. 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.size()); 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(999)); 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().size()); 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(999)->second)); 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0]; 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, pass->quad_list.size()); 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast( 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass->quad_list[0]); 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(map.find(999)->second, quad1->resource_id); 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestBadFrame); 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestUnnamedResource 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransferableResourceArray resources; 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int next_source_frame_number = layer_tree_host()->commit_number(); 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (next_source_frame_number) { 9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This frame includes two resources in it, but only uses one. 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The unused resource should be returned. 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, resources.size()); 972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(999u, resources[0].id); 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TreeActivatedOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() != 1) 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceProvider::ResourceIdMap& map = 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider()->GetChildToParentMap( 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_impl->ChildId()); 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The layer only held on to the resource that was used. 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.size()); 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().size()); 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestUnnamedResource); 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestDontLeakResource 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransferableResourceArray resources; 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int next_source_frame_number = layer_tree_host()->commit_number(); 10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (next_source_frame_number) { 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This frame includes two resources in it. 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // But then we immediately stop using 999. 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The unused resource should be returned. 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, resources.size()); 1035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(999u, resources[0].id); 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TreeActivatedOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() != 1) 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceProvider::ResourceIdMap& map = 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider()->GetChildToParentMap( 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_impl->ChildId()); 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The layer only held on to the resource that was used. 10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.size()); 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().size()); 10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); 10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestDontLeakResource); 10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestResourceSentToParent 10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Prevent drawing with resources that are sent to the grandparent. 1072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size()); 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransferableResourceArray resources; 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int next_source_frame_number = layer_tree_host()->commit_number(); 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (next_source_frame_number) { 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This frame includes two resources in it. 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 999 is in use in the grandparent compositor, generate a frame without 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // it present. 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Since 999 is in the grandparent it is not returned. 11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 4: 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 999 was returned from the grandparent and could be released. 11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, resources.size()); 1112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(999u, resources[0].id); 11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TreeActivatedOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() < 1) 11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceProvider::ResourceIdMap& map = 11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider()->GetChildToParentMap( 11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_impl->ChildId()); 11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (host_impl->active_tree()->source_frame_number()) { 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: { 11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, map.size()); 11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(999)); 11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, delegated_impl->Resources().size()); 11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(999)->second)); 11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); 11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The 999 resource is sent to a grandparent compositor. 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider::ResourceIdArray resources_for_parent; 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resources_for_parent.push_back(map.find(999)->second); 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransferableResourceArray transferable_resources; 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider()->PrepareSendToParent( 11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resources_for_parent, &transferable_resources); 1147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resource_in_grandparent = transferable_resources[0]; 1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(map.find(999)->second, resource_in_grandparent.id); 11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: { 11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, map.size()); 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(999)); 11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// 999 is in the parent, so not held by delegated renderer layer. 11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().size()); 11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Receive 999 back from the grandparent. 1162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(map.find(999)->second, resource_in_grandparent.id); 11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransferableResourceArray transferable_resources; 1164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transferable_resources.push_back(resource_in_grandparent); 1165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider()->ReceiveFromParent( 11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transferable_resources); 11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 999 should be released. 11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.size()); 11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().size()); 11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); 11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TransferableResource resource_in_grandparent; 11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestResourceSentToParent); 11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestCommitWithoutTake 11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Prevent drawing with resources that are sent to the grandparent. 1192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size()); 11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransferableResourceArray resources; 11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int next_source_frame_number = layer_tree_host()->commit_number(); 12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (next_source_frame_number) { 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 444); 12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 444); 12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Stop using 999 and 444 in this frame and commit. 12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Don't take resources here, but set a new frame that uses 999 again. 12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetFrameData(frame.Pass()); 12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 4: 12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 999 and 555 are in use, but 444 should be returned now. 12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->TakeUnusedResourcesForChildCompositor(&resources); 12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, resources.size()); 1232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(444u, resources[0].id); 12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TreeActivatedOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() < 1) 12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceProvider::ResourceIdMap& map = 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider()->GetChildToParentMap( 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_impl->ChildId()); 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (host_impl->active_tree()->source_frame_number()) { 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3u, map.size()); 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(999)); 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(444)); 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3u, delegated_impl->Resources().size()); 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(999)->second)); 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); 12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(444)->second)); 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.size()); 12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().size()); 12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); 12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, map.size()); 12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(999)); 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, delegated_impl->Resources().size()); 12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(999)->second)); 12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); 12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestCommitWithoutTake); 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 1288