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