layer_tree_host_unittest_delegated.cc revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
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)
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <algorithm>
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
9ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/bind.h"
1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/location.h"
11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/synchronization/waitable_event.h"
12424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/threading/thread.h"
13424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/time/time.h"
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/delegated_frame_provider.h"
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/delegated_frame_resource_collection.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/delegated_renderer_layer.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/delegated_renderer_layer_impl.h"
18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "cc/output/compositor_frame.h"
19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "cc/output/compositor_frame_ack.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/delegated_frame_data.h"
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "cc/quads/render_pass_draw_quad.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/shared_quad_state.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/texture_draw_quad.h"
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/resources/returned_resource.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer_impl.h"
27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "cc/test/fake_output_surface.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool ReturnedResourceLower(const ReturnedResource& a,
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                           const ReturnedResource& b) {
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return a.id < b.id;
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Tests if the list of resources matches an expectation, modulo the order.
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool ResourcesMatch(ReturnedResourceArray actual,
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    unsigned* expected,
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    size_t expected_count) {
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::sort(actual.begin(), actual.end(), ReturnedResourceLower);
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::sort(expected, expected + expected_count);
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  size_t actual_index = 0;
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // for each element of the expected array, count off one of the actual array
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // (after checking it matches).
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  for (size_t expected_index = 0; expected_index < expected_count;
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)       ++expected_index) {
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_LT(actual_index, actual.size());
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (actual_index >= actual.size())
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return false;
553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_EQ(actual[actual_index].id, expected[expected_index]);
563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (actual[actual_index].id != expected[expected_index])
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return false;
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_GT(actual[actual_index].count, 0);
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (actual[actual_index].count <= 0) {
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return false;
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    } else {
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      --actual[actual_index].count;
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      if (actual[actual_index].count == 0)
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ++actual_index;
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(actual_index, actual.size());
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return actual_index == actual.size();
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define EXPECT_RESOURCES(expected, actual) \
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_TRUE(ResourcesMatch(actual, expected, arraysize(expected)));
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These tests deal with delegated renderer layers.
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTest : public LayerTreeTest {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<DelegatedFrameData> CreateFrameData(
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const gfx::Rect& root_output_rect,
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const gfx::Rect& root_damage_rect) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame(new DelegatedFrameData);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<RenderPass> root_pass(RenderPass::Create());
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_pass->SetNew(RenderPass::Id(1, 1),
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      root_output_rect,
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      root_damage_rect,
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      gfx::Transform());
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frame->render_pass_list.push_back(root_pass.Pass());
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return frame.Pass();
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  scoped_ptr<DelegatedFrameData> CreateInvalidFrameData(
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const gfx::Rect& root_output_rect,
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const gfx::Rect& root_damage_rect) {
94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_ptr<DelegatedFrameData> frame(new DelegatedFrameData);
95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_ptr<RenderPass> root_pass(RenderPass::Create());
97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    root_pass->SetNew(RenderPass::Id(1, 1),
98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                      root_output_rect,
99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                      root_damage_rect,
100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                      gfx::Transform());
101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_ptr<SharedQuadState> shared_quad_state = SharedQuadState::Create();
103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    gfx::Rect rect = root_output_rect;
105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    gfx::Rect opaque_rect = root_output_rect;
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gfx::Rect visible_rect = root_output_rect;
107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // An invalid resource id! The resource isn't part of the frame.
108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    unsigned resource_id = 5;
109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    bool premultiplied_alpha = false;
110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    gfx::PointF uv_top_left = gfx::PointF(0.f, 0.f);
111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    gfx::PointF uv_bottom_right = gfx::PointF(1.f, 1.f);
112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SkColor background_color = 0;
113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    float vertex_opacity[4] = {1.f, 1.f, 1.f, 1.f};
114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    bool flipped = false;
115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_ptr<TextureDrawQuad> invalid_draw_quad = TextureDrawQuad::Create();
117ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    invalid_draw_quad->SetNew(shared_quad_state.get(),
118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              rect,
119ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              opaque_rect,
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                              visible_rect,
121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              resource_id,
122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              premultiplied_alpha,
123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              uv_top_left,
124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              uv_bottom_right,
125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              background_color,
126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              vertex_opacity,
127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              flipped);
128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    root_pass->quad_list.push_back(invalid_draw_quad.PassAs<DrawQuad>());
129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    root_pass->shared_quad_state_list.push_back(shared_quad_state.Pass());
131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    frame->render_pass_list.push_back(root_pass.Pass());
133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return frame.Pass();
134ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
135ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddTransferableResource(DelegatedFrameData* frame,
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               ResourceProvider::ResourceId resource_id) {
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TransferableResource resource;
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resource.id = resource_id;
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resource.mailbox_holder.texture_target = GL_TEXTURE_2D;
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLbyte arbitrary_mailbox[GL_MAILBOX_SIZE_CHROMIUM] = {
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2,
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4,
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4};
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resource.mailbox_holder.mailbox.SetName(arbitrary_mailbox);
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frame->resource_list.push_back(resource);
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddTextureQuad(DelegatedFrameData* frame,
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      ResourceProvider::ResourceId resource_id) {
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<SharedQuadState> sqs = SharedQuadState::Create();
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<TextureDrawQuad> quad = TextureDrawQuad::Create();
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float vertex_opacity[4] = { 1.f, 1.f, 1.f, 1.f };
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    quad->SetNew(sqs.get(),
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 gfx::Rect(0, 0, 10, 10),
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 gfx::Rect(0, 0, 10, 10),
157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 gfx::Rect(0, 0, 10, 10),
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 resource_id,
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 false,
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 gfx::PointF(0.f, 0.f),
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 gfx::PointF(1.f, 1.f),
1627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 SK_ColorTRANSPARENT,
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 vertex_opacity,
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 false);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frame->render_pass_list[0]->shared_quad_state_list.push_back(sqs.Pass());
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frame->render_pass_list[0]->quad_list.push_back(quad.PassAs<DrawQuad>());
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void AddRenderPass(DelegatedFrameData* frame,
17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     RenderPass::Id id,
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     const gfx::Rect& output_rect,
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     const gfx::Rect& damage_rect,
17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     const FilterOperations& filters,
17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     const FilterOperations& background_filters) {
17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    for (size_t i = 0; i < frame->render_pass_list.size(); ++i)
17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      DCHECK(id != frame->render_pass_list[i]->id);
17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<RenderPass> pass(RenderPass::Create());
17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    pass->SetNew(id,
18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 output_rect,
18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 damage_rect,
18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 gfx::Transform());
18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    frame->render_pass_list.push_back(pass.Pass());
18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<SharedQuadState> sqs = SharedQuadState::Create();
18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<RenderPassDrawQuad> quad = RenderPassDrawQuad::Create();
18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    quad->SetNew(sqs.get(),
18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 output_rect,
190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 output_rect,
19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 id,
19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 false,  // is_replica
193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 0,      // mask_resource_id
19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 damage_rect,
19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 gfx::Rect(0, 0, 1, 1),  // mask_uv_rect
19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 filters,
19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 background_filters);
19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    frame->render_pass_list[0]->shared_quad_state_list.push_back(sqs.Pass());
19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    frame->render_pass_list[0]->quad_list.push_back(quad.PassAs<DrawQuad>());
20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
202ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  static ResourceProvider::ResourceId AppendResourceId(
203ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      std::vector<ResourceProvider::ResourceId>* resources_in_last_sent_frame,
204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      ResourceProvider::ResourceId resource_id) {
205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    resources_in_last_sent_frame->push_back(resource_id);
206ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return resource_id;
207ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
209ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void ReturnUnusedResourcesFromParent(LayerTreeHostImpl* host_impl) {
210ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    DelegatedFrameData* delegated_frame_data =
211ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        output_surface()->last_sent_frame().delegated_frame_data.get();
212ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (!delegated_frame_data)
213ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return;
214ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
215ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    std::vector<ResourceProvider::ResourceId> resources_in_last_sent_frame;
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    for (size_t i = 0; i < delegated_frame_data->resource_list.size(); ++i) {
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      resources_in_last_sent_frame.push_back(
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          delegated_frame_data->resource_list[i].id);
219ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
221ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    std::vector<ResourceProvider::ResourceId> resources_to_return;
222ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
223ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const TransferableResourceArray& resources_held_by_parent =
224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        output_surface()->resources_held_by_parent();
225ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    for (size_t i = 0; i < resources_held_by_parent.size(); ++i) {
226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      ResourceProvider::ResourceId resource_in_parent =
227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          resources_held_by_parent[i].id;
228ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      bool resource_in_parent_is_not_part_of_frame =
229ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          std::find(resources_in_last_sent_frame.begin(),
230ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                    resources_in_last_sent_frame.end(),
231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                    resource_in_parent) == resources_in_last_sent_frame.end();
232ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (resource_in_parent_is_not_part_of_frame)
233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        resources_to_return.push_back(resource_in_parent);
234ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
235ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
236ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (resources_to_return.empty())
237ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return;
238ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
239ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    CompositorFrameAck ack;
240ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    for (size_t i = 0; i < resources_to_return.size(); ++i)
241ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      output_surface()->ReturnResource(resources_to_return[i], &ack);
242d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    host_impl->ReclaimResources(&ack);
243ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestCaseSingleDelegatedLayer
247b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    : public LayerTreeHostDelegatedTest,
2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      public DelegatedFrameResourceCollectionClient {
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LayerTreeHostDelegatedTestCaseSingleDelegatedLayer()
2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : resource_collection_(new DelegatedFrameResourceCollection),
2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        available_(false) {
2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    resource_collection_->SetClient(this);
2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
25568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_ = Layer::Create();
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->SetAnchorPoint(gfx::PointF());
259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    root_->SetBounds(gfx::Size(15, 15));
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_);
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostDelegatedTest::SetupTree();
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    resource_collection_->SetClient(this);
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void SetFrameData(scoped_ptr<DelegatedFrameData> frame_data) {
2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    RenderPass* root_pass = frame_data->render_pass_list.back();
2724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    gfx::Size frame_size = root_pass->output_rect.size();
2734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (frame_provider_.get() && frame_size == frame_provider_->frame_size()) {
2754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      frame_provider_->SetFrameData(frame_data.Pass());
2764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return;
2774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
2784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (delegated_.get()) {
2804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      delegated_->RemoveFromParent();
2814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      delegated_ = NULL;
2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      frame_provider_ = NULL;
2834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
2844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    frame_provider_ = new DelegatedFrameProvider(resource_collection_.get(),
2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                 frame_data.Pass());
2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated_ = CreateDelegatedLayer(frame_provider_.get());
2894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedRendererLayer> CreateDelegatedLayer(
2924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      DelegatedFrameProvider* frame_provider) {
2934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<DelegatedRendererLayer> delegated =
294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        FakeDelegatedRendererLayer::Create(frame_provider);
2954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated->SetAnchorPoint(gfx::PointF());
2964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated->SetBounds(gfx::Size(10, 10));
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated->SetIsDrawable(true);
2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root_->AddChild(delegated);
3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return delegated;
3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
3024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void AfterTest() OVERRIDE { resource_collection_->SetClient(NULL); }
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // DelegatedFrameProviderClient implementation.
30668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void UnusedResourcesAreAvailable() OVERRIDE { available_ = true; }
30768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
30868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool TestAndResetAvailable() {
30968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    bool available = available_;
31068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    available_ = false;
31168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return available;
31268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
313b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
3154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedFrameResourceCollection> resource_collection_;
3164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedFrameProvider> frame_provider_;
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> root_;
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<DelegatedRendererLayer> delegated_;
31968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool available_;
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestCreateChildId
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostDelegatedTestCreateChildId()
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(),
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        num_activates_(0),
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        did_reset_child_id_(false) {}
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (TestEnded())
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
3334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)));
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
3374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() < 1)
3384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return;
3394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestContextProvider* context_provider = static_cast<TestContextProvider*>(
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        host_impl->output_surface()->context_provider().get());
346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++num_activates_;
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (num_activates_) {
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(delegated_impl->ChildId());
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_FALSE(did_reset_child_id_);
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        context_provider->ContextGL()->LoseContextCHROMIUM(
3543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            GL_GUILTY_CONTEXT_RESET_ARB,
3553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            GL_INNOCENT_CONTEXT_RESET_ARB);
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        context_provider->ContextGL()->Flush();
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 3:
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(delegated_impl->ChildId());
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(did_reset_child_id_);
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void InitializedRendererOnThread(LayerTreeHostImpl* host_impl,
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           bool success) OVERRIDE {
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(success);
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (num_activates_ < 2)
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2, num_activates_);
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(delegated_impl->ChildId());
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    did_reset_child_id_ = true;
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_activates_;
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool did_reset_child_id_;
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestCreateChildId);
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test that we can gracefully handle invalid frames after the context was lost.
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// For example, we might be trying to use the previous frame in that case and
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// have to make sure we don't crash because our resource accounting goes wrong.
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostDelegatedTestInvalidFrameAfterContextLost
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LayerTreeHostDelegatedTestInvalidFrameAfterContextLost()
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : num_activates_(0), num_output_surfaces_initialized_(0) {}
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void DidCommit() OVERRIDE {
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (TestEnded())
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame1 =
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    AddTextureQuad(frame1.get(), 999);
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    AddTransferableResource(frame1.get(), 999);
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetFrameData(frame1.Pass());
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void DidInitializeOutputSurface() OVERRIDE {
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!num_output_surfaces_initialized_++)
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_refptr<DelegatedRendererLayer> old_delegated = delegated_;
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetFrameData(
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        CreateInvalidFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)));
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Make sure we end up using the same layer, or we won't test the right
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // thing, which is to make sure we can handle an invalid frame when using
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // a stale layer from before the context was lost.
4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DCHECK(delegated_.get() == old_delegated.get());
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() < 1)
4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestContextProvider* context_provider = static_cast<TestContextProvider*>(
4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        host_impl->output_surface()->context_provider().get());
4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ++num_activates_;
4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (num_activates_) {
4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 2:
4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        context_provider->ContextGL()->LoseContextCHROMIUM(
4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            GL_GUILTY_CONTEXT_RESET_ARB,
4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            GL_INNOCENT_CONTEXT_RESET_ARB);
4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 3:
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EndTest();
4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void InitializedRendererOnThread(LayerTreeHostImpl* host_impl,
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                           bool success) OVERRIDE {
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(success);
4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (num_activates_ < 2)
4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(2, num_activates_);
4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Resources should have gotten cleared after the context was lost.
4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(0U, delegated_impl->Resources().size());
4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {
4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    LayerTreeHostDelegatedTestCaseSingleDelegatedLayer::AfterTest();
4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(2, num_output_surfaces_initialized_);
4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected:
4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int num_activates_;
4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int num_output_surfaces_initialized_;
4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    LayerTreeHostDelegatedTestInvalidFrameAfterContextLost);
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestLayerUsesFrameDamage
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostDelegatedTestLayerUsesFrameDamage()
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(),
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        first_draw_for_source_frame_(true) {}
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
478bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The first time the layer gets a frame the whole layer should be
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // damaged.
4834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)));
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
4874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // A different frame size will damage the whole layer.
4884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
4894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(0, 0, 0, 0)));
4904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
4914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should create a total amount of gfx::Rect(2, 2, 10, 6) damage.
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The frame size is 20x20 while the layer is 10x10, so this should
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // produce a gfx::Rect(1, 1, 5, 3) damage rect.
4954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
4964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(2, 2, 5, 5)));
4974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
4984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(7, 2, 5, 6)));
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 4:
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should create zero damage.
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 5:
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should damage the full viewport.
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delegated_->SetBounds(gfx::Size(2, 2));
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 6:
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should create zero damage.
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 7:
5134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Should damage the full layer, tho the frame size is not changing.
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delegated_->SetBounds(gfx::Size(6, 6));
5154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
5164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(1, 1, 2, 2)));
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 8:
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should create zero damage.
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 9:
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should damage the full layer.
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delegated_->SetDisplaySize(gfx::Size(10, 10));
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 10:
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should create zero damage.
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 11:
5314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Changing the frame size damages the full layer.
5324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
5334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 5, 5), gfx::Rect(4, 4, 1, 1)));
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 12:
536ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // An invalid frame isn't used, so it should not cause damage.
5374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(CreateInvalidFrameData(gfx::Rect(0, 0, 5, 5),
5384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                            gfx::Rect(4, 4, 1, 1)));
539ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        break;
5404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 13:
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should create gfx::Rect(1, 1, 2, 2) of damage. The frame size is
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // 5x5 and the display size is now set to 10x10, so this should result
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // in a gfx::Rect(2, 2, 4, 4) damage rect.
5444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
5454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 5, 5), gfx::Rect(1, 1, 2, 2)));
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 14:
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should create zero damage.
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 15:
552d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        // Moving the layer out of the tree and back in will damage the whole
553d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        // impl layer.
554d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        delegated_->RemoveFromParent();
555d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        layer_tree_host()->root_layer()->AddChild(delegated_);
556d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        break;
5574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 16:
558d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        // Make a larger frame with lots of damage. Then a frame smaller than
559d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        // the first frame's damage. The entire layer should be damaged, but
560d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        // nothing more.
5614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
5624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(0, 0, 10, 10)));
5634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
5644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 5, 5), gfx::Rect(1, 1, 2, 2)));
565d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        break;
5664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 17:
5674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Make a frame with lots of damage. Then replace it with a frame with
5684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // no damage. The entire layer should be damaged, but nothing more.
5694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
5704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(0, 0, 10, 10)));
5714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
5724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(0, 0, 0, 0)));
573d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        break;
5744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 18:
5754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Make another layer that uses the same frame provider. The new layer
5764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // should be damaged.
5774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_copy_ = CreateDelegatedLayer(frame_provider_);
5784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_copy_->SetPosition(gfx::Point(5, 0));
5794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Also set a new frame.
5814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
5824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(4, 0, 1, 1)));
5834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
5844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 19:
5854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Set another new frame, both layers should be damaged in the same
5864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // ways.
5874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
5884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(3, 3, 1, 1)));
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    first_draw_for_source_frame_ = true;
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread(
5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl* host_impl,
5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl::FrameData* frame,
5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE {
5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(DrawSwapReadbackResult::DRAW_SUCCESS, draw_result);
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!first_draw_for_source_frame_)
6005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return draw_result;
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    gfx::Rect damage_rect;
603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!frame->has_no_damage) {
604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      damage_rect = frame->render_passes.back()->damage_rect;
605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // If there is no damage, then we have no render passes to send.
607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_TRUE(frame->render_passes.empty());
608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (host_impl->active_tree()->source_frame_number()) {
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 0:
612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // First frame is damaged because of viewport resize.
613c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        EXPECT_EQ(gfx::Rect(15, 15).ToString(), damage_rect.ToString());
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
616c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        EXPECT_EQ(gfx::Rect(10, 10).ToString(), damage_rect.ToString());
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
619c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        EXPECT_EQ(gfx::Rect(10, 10).ToString(), damage_rect.ToString());
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 3:
622c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        EXPECT_EQ(gfx::Rect(1, 1, 5, 3).ToString(), damage_rect.ToString());
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 4:
625c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        EXPECT_EQ(gfx::Rect().ToString(), damage_rect.ToString());
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 5:
628c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        EXPECT_EQ(gfx::Rect(10, 10).ToString(), damage_rect.ToString());
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 6:
631c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        EXPECT_EQ(gfx::Rect().ToString(), damage_rect.ToString());
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 7:
634c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        EXPECT_EQ(gfx::Rect(6, 6).ToString(), damage_rect.ToString());
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 8:
637c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        EXPECT_EQ(gfx::Rect().ToString(), damage_rect.ToString());
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 9:
640c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        EXPECT_EQ(gfx::Rect(6, 6).ToString(), damage_rect.ToString());
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 10:
643c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        EXPECT_EQ(gfx::Rect().ToString(), damage_rect.ToString());
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 11:
646c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        EXPECT_EQ(gfx::Rect(10, 10).ToString(), damage_rect.ToString());
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 12:
649c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        EXPECT_EQ(gfx::Rect().ToString(), damage_rect.ToString());
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 13:
652c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        EXPECT_EQ(gfx::Rect(2, 2, 4, 4).ToString(), damage_rect.ToString());
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 14:
655c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        EXPECT_EQ(gfx::Rect().ToString(), damage_rect.ToString());
656ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        break;
657ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      case 15:
658c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        EXPECT_EQ(gfx::Rect(10, 10).ToString(), damage_rect.ToString());
659d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        break;
660d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      case 16:
661c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        EXPECT_EQ(gfx::Rect(10, 10).ToString(), damage_rect.ToString());
662d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        break;
663d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      case 17:
664c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        EXPECT_EQ(gfx::Rect(10, 10).ToString(), damage_rect.ToString());
665d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        break;
666d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      case 18:
667c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        EXPECT_EQ(gfx::UnionRects(gfx::Rect(5, 0, 10, 10),
668c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                  gfx::Rect(4, 0, 1, 1)).ToString(),
6694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  damage_rect.ToString());
6704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
6714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 19:
672c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        EXPECT_EQ(gfx::Rect(3, 3, 6, 1).ToString(), damage_rect.ToString());
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return draw_result;
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
6814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedRendererLayer> delegated_copy_;
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool first_draw_for_source_frame_;
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestLayerUsesFrameDamage);
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestMergeResources
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Push two frames to the delegated renderer layer with no commit between.
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The first frame has resource 999.
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame1 =
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTextureQuad(frame1.get(), 999);
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTransferableResource(frame1.get(), 999);
6984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(frame1.Pass());
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The second frame uses resource 999 still, but also adds 555.
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame2 =
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTextureQuad(frame2.get(), 999);
7043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    AddTransferableResource(frame2.get(), 999);
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTextureQuad(frame2.get(), 555);
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTransferableResource(frame2.get(), 555);
7074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(frame2.Pass());
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // The resource 999 from frame1 is returned since it is still on the main
7103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // thread.
7113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray returned_resources;
7124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    resource_collection_->TakeUnusedResourcesForChildCompositor(
7134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        &returned_resources);
7143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    {
7153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      unsigned expected[] = {999};
7163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      EXPECT_RESOURCES(expected, returned_resources);
71768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      EXPECT_TRUE(TestAndResetAvailable());
7183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
7193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Both frames' resources should be in the parent's resource provider.
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2u, map.size());
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(999));
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(555));
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2u, delegated_impl->Resources().size());
73868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(999));
73968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(555));
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EndTest();
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestMergeResources);
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestRemapResourcesInQuads
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Generate a frame with two resources in it.
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame =
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTextureQuad(frame.get(), 999);
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTransferableResource(frame.get(), 999);
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTextureQuad(frame.get(), 555);
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTransferableResource(frame.get(), 555);
7584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(frame.Pass());
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The frame's resource should be in the parent's resource provider.
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2u, map.size());
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(999));
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(555));
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResourceProvider::ResourceId parent_resource_id1 = map.find(999)->second;
778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_NE(parent_resource_id1, 999u);
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResourceProvider::ResourceId parent_resource_id2 = map.find(555)->second;
780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_NE(parent_resource_id2, 555u);
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The resources in the quads should be remapped to the parent's namespace.
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast(
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delegated_impl->RenderPassesInDrawOrder()[0]->quad_list[0]);
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(parent_resource_id1, quad1->resource_id);
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const TextureDrawQuad* quad2 = TextureDrawQuad::MaterialCast(
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delegated_impl->RenderPassesInDrawOrder()[0]->quad_list[1]);
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(parent_resource_id2, quad2->resource_id);
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EndTest();
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestRemapResourcesInQuads);
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestReturnUnusedResources
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
803ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
8053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
807bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Generate a frame with two resources in it.
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
8164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // All of the resources are in use.
8204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
82268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Keep using 999 but stop using 555.
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
82768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        AddTransferableResource(frame.get(), 999);
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 444);
8304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
83268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 3:
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // 555 is no longer in use.
8344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
8353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
8363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {555};
8373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
83868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
8393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Stop using any resources.
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
8434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
84568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 4:
846ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // Postpone collecting resources for a frame. They should still be there
847ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // the next frame.
848ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        layer_tree_host()->SetNeedsCommit();
849ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        return;
85068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 5:
85168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // 444 and 999 are no longer in use. We sent two refs to 999, so we
85268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // should get two back.
8534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
8543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
85568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          unsigned expected[] = {444, 999, 999};
8563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
85768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
86368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Resources are never immediately released.
8643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray empty_resources;
8654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    resource_collection_->TakeUnusedResourcesForChildCompositor(
8664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        &empty_resources);
86768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(0u, empty_resources.size());
86868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_FALSE(TestAndResetAvailable());
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
871ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
872ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                   bool result) OVERRIDE {
873ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ReturnUnusedResourcesFromParent(host_impl);
874ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
877ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_TEST_F(
878a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    LayerTreeHostDelegatedTestReturnUnusedResources);
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestReusedResources
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
887ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
8893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
891bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Generate a frame with some resources in it.
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 444);
9024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // All of the resources are in use.
9064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
90868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Keep using 999 but stop using 555 and 444.
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
91368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        AddTransferableResource(frame.get(), 999);
9144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Resource are not immediately released.
9174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
91968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Now using 555 and 444 again, but not 999.
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
92468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        AddTransferableResource(frame.get(), 555);
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
92668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        AddTransferableResource(frame.get(), 444);
9274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
92968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 3:
93068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // The 999 resource is the only unused one. Two references were sent, so
93168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // two should be returned.
9324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
9333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
93468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          unsigned expected[] = {999, 999};
9353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
93668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
9373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
943ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
944ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                   bool result) OVERRIDE {
945ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ReturnUnusedResourcesFromParent(host_impl);
946ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
949ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestReusedResources);
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestFrameBeforeAck
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
958ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
9603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Generate a frame with some resources in it.
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 444);
9734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // All of the resources are in use.
9774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
97968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Keep using 999 but stop using 555 and 444.
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
98468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        AddTransferableResource(frame.get(), 999);
9854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Resource are not immediately released.
9884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
99068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The parent compositor (this one) does a commit.
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
99468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 3:
9954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
9963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
9973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {444, 555};
9983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
99968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
100268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // The child compositor sends a frame referring to resources not in the
100368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // frame.
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
10084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
101468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() != 3)
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The bad frame should be dropped. So we should only have one quad (the
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // one with resource 999) on the impl tree. And only 999 will be present
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // in the parent's resource provider.
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.size());
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(999));
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().size());
103268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(999));
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0];
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, pass->quad_list.size());
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const TextureDrawQuad* quad = TextureDrawQuad::MaterialCast(
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pass->quad_list[0]);
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(map.find(999)->second, quad->resource_id);
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EndTest();
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1043ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
1044ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                   bool result) OVERRIDE {
1045ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ReturnUnusedResourcesFromParent(host_impl);
1046ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1049ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestFrameBeforeAck);
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestFrameBeforeTakeResources
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1058ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
10603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Generate a frame with some resources in it.
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 444);
10734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // All of the resources are in use.
10774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
107968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Keep using 999 but stop using 555 and 444.
10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
10843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 999);
10854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Resource are not immediately released.
10884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
109068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The parent compositor (this one) does a commit.
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
109468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 3:
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The child compositor sends a frame before taking resources back
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // from the previous commit. This frame makes use of the resources 555
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // and 444, which were just released during commit.
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
11003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 999);
11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
11023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 555);
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
11043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 444);
11054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // The resources are used by the new frame but are returned anyway since
11083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // we passed them again.
11094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
11103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
11113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {444, 555};
11123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
111368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
11143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
111668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 4:
11174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
111968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
112668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() != 3)
11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The third frame has all of the resources in it again, the delegated
11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // renderer layer should continue to own the resources for it.
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(3u, map.size());
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(999));
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(555));
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(444));
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(3u, delegated_impl->Resources().size());
114568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(999));
114668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(555));
114768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(444));
11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0];
11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(3u, pass->quad_list.size());
11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast(
11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pass->quad_list[0]);
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(map.find(999)->second, quad1->resource_id);
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const TextureDrawQuad* quad2 = TextureDrawQuad::MaterialCast(
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pass->quad_list[1]);
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(map.find(555)->second, quad2->resource_id);
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const TextureDrawQuad* quad3 = TextureDrawQuad::MaterialCast(
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pass->quad_list[2]);
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(map.find(444)->second, quad3->resource_id);
11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
1163ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                   bool result) OVERRIDE {
1164ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ReturnUnusedResourcesFromParent(host_impl);
1165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1168ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_TEST_F(
1169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostDelegatedTestFrameBeforeTakeResources);
11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestBadFrame
11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
11803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1182bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Generate a frame with some resources in it.
11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
11914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // All of the resources are in use.
11954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
119768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Generate a bad frame with a resource the layer doesn't have. The
12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // 885 and 775 resources are unknown, while ownership of the legit 444
12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // resource is passed in here. The bad frame does not use any of the
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // previous resources, 999 or 555.
12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // A bad quad is present both before and after the good quad.
12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 885);
12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 444);
12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 775);
12094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The parent compositor (this one) does a commit.
12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
121368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 3:
12144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
12154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
12164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
12174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Now send a good frame with 999 again.
12194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
12204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
12214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
12224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The bad frame's resource is given back to the child compositor.
12244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
12253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
12263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {444};
12273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
122868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
12293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
123168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 4:
12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The unused 555 from the last good frame is now released.
12334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
12343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
12353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {555};
12363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
123768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
12383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1245ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
1246ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                   bool result) OVERRIDE {
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() < 1)
12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1250ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ReturnUnusedResourcesFromParent(host_impl);
1251ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (host_impl->active_tree()->source_frame_number()) {
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1: {
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // We have the first good frame with just 990 and 555 in it.
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // layer.
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, map.size());
12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(999));
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, delegated_impl->Resources().size());
126968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(999));
127068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(555));
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0];
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, pass->quad_list.size());
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast(
12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            pass->quad_list[0]);
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(map.find(999)->second, quad1->resource_id);
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const TextureDrawQuad* quad2 = TextureDrawQuad::MaterialCast(
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            pass->quad_list[1]);
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(map.find(555)->second, quad2->resource_id);
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
128268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 2: {
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // We only keep resources from the last valid frame.
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, map.size());
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(999));
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, delegated_impl->Resources().size());
128968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(999));
129068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(555));
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The bad frame is dropped though, we still have the frame with 999 and
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // 555 in it.
12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0];
12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, pass->quad_list.size());
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast(
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            pass->quad_list[0]);
12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(map.find(999)->second, quad1->resource_id);
12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const TextureDrawQuad* quad2 = TextureDrawQuad::MaterialCast(
13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            pass->quad_list[1]);
13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(map.find(555)->second, quad2->resource_id);
13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
130468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 3: {
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // We have the new good frame with just 999 in it.
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.size());
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(999));
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().size());
131068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(999));
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0];
13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, pass->quad_list.size());
13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast(
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            pass->quad_list[0]);
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(map.find(999)->second, quad1->resource_id);
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1323ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestBadFrame);
13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestUnnamedResource
13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
13343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1336bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // This frame includes two resources in it, but only uses one.
13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
13444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
13474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
13484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
13494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
13504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
13514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Now send an empty frame.
13524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
13534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
13544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The unused resource should be returned.
13564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
13573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
13583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {999};
13593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
136068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
13613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() != 1)
13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The layer only held on to the resource that was used.
13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.size());
13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(555));
13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().size());
138568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(555));
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestUnnamedResource);
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestDontLeakResource
13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
139868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
14003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // This frame includes two resources in it.
14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
14114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // But then we immediately stop using 999.
14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
14163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 555);
14174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
14203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // The unused resources should be returned. 555 is still used, but it's
14213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // returned once to account for the first frame.
14224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
14233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
14243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {555, 999};
14253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
142668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
14273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
14283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // Send a frame with no resources in it.
14293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
14304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
14313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        break;
14323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case 3:
14333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // The now unused resource 555 should be returned.
14343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        resources.clear();
14354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
14363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
14373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {555};
14383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
143968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
14403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() != 1)
14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The layer only held on to the resource that was used.
14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.size());
14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(555));
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().size());
146368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(555));
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
14673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                   bool result) OVERRIDE {
14683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnUnusedResourcesFromParent(host_impl);
14693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestDontLeakResource);
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestResourceSentToParent
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1477ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
14793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1481bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // This frame includes two resources in it.
14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
14904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
14934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
149568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // 999 is in use in the grandparent compositor, generate a frame without
14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // it present.
14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
150168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        AddTransferableResource(frame.get(), 555);
15024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 3:
15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Since 999 is in the grandparent it is not returned.
15064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
150868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1510ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // The impl side will get back the resource at some point.
151168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        ImplThreadTaskRunner()->PostTask(FROM_HERE,
151268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                         receive_resource_on_thread_);
15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
151468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
151568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
151768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void ReceiveResourceOnThread(LayerTreeHostImpl* host_impl) {
151868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
151968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
152068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
152168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
152268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
152368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
152468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            delegated_impl->ChildId());
152568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
152668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Receive 999 back from the grandparent.
152768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    CompositorFrameAck ack;
152868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    output_surface()->ReturnResource(map.find(999)->second, &ack);
152968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    host_impl->ReclaimResources(&ack);
153068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
153168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
153268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void UnusedResourcesAreAvailable() OVERRIDE {
153368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(3, layer_tree_host()->source_frame_number());
153468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
153568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ReturnedResourceArray resources;
153668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
153768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // 999 was returned from the grandparent and could be released.
15384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
153968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    {
154068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      unsigned expected[] = {999};
154168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      EXPECT_RESOURCES(expected, resources);
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
154368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
154468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EndTest();
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() < 1)
15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (host_impl->active_tree()->source_frame_number()) {
15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1: {
15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, map.size());
15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(999));
15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, delegated_impl->Resources().size());
156668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(999));
156768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(555));
15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1569ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // The 999 resource will be sent to a grandparent compositor.
15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2: {
15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, map.size());
15742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(999));
15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1577ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // 999 is in the parent, so not held by delegated renderer layer.
15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().size());
157968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(555));
15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
158168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        receive_resource_on_thread_ =
158268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            base::Bind(&LayerTreeHostDelegatedTestResourceSentToParent::
158368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                            ReceiveResourceOnThread,
158468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                       base::Unretained(this),
158568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                       host_impl);
15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 3:
15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // 999 should be released.
15902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.size());
15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().size());
15942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second));
1595ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        break;
15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
159968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::Closure receive_resource_on_thread_;
16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1602ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_DELEGATING_RENDERER_TEST_F(
1603ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    LayerTreeHostDelegatedTestResourceSentToParent);
16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestCommitWithoutTake
16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Prevent drawing with resources that are sent to the grandparent.
1610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size());
16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
16163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1618bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 444);
16284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
16314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
163368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Stop using 999 and 444 in this frame and commit.
16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
16383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 555);
16394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
16403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // 999 and 444 will be returned for frame 1, but not 555 since it's in
16413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // the current frame.
16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 3:
16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Don't take resources here, but set a new frame that uses 999 again.
16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
16473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 999);
16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
16493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 555);
16504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 4:
16533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // 555 from frame 1 and 2 isn't returned since it's still in use. 999
16543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // from frame 1 is returned though.
16554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
16563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
16573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {444, 999};
16583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
165968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
16603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
16613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
16623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
16634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
16643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // 555 will be returned 3 times for frames 1 2 and 3, and 999 will be
16653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // returned once for frame 3.
16663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        break;
16673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case 5:
16684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
16693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
16703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {555, 555, 555, 999};
16713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
167268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
16733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() < 1)
16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
16832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (host_impl->active_tree()->source_frame_number()) {
16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(3u, map.size());
16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(999));
16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(444));
16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(3u, delegated_impl->Resources().size());
170068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(999));
170168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(555));
170268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(444));
17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.size());
17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().size());
170968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(555));
17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 3:
17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, map.size());
17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(999));
17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, delegated_impl->Resources().size());
171768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(999));
171868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(555));
17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestCommitWithoutTake);
17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1725424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class DelegatedFrameIsActivatedDuringCommit
1726424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
1727424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) protected:
17285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DelegatedFrameIsActivatedDuringCommit() : returned_resource_count_(0) {}
1729424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1730424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1731424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    activate_count_ = 0;
1732424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1733424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame =
1734424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1735424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    AddTextureQuad(frame.get(), 999);
1736424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    AddTransferableResource(frame.get(), 999);
17374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(frame.Pass());
1738424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1739424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    PostSetNeedsCommitToMainThread();
1740424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
1741424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1742424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1743424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    ++activate_count_;
1744424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
1745424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
17465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void DidCommit() OVERRIDE {
17475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (layer_tree_host()->source_frame_number()) {
1748424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      case 1: {
1749424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // The first frame has been activated. Set a new frame, and
1750424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // expect the next commit to finish *after* it is activated.
1751424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        scoped_ptr<DelegatedFrameData> frame =
1752424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1753424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        AddTextureQuad(frame.get(), 555);
1754424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        AddTransferableResource(frame.get(), 555);
17554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
1756424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        break;
1757424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      }
1758424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      case 2:
1759424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // The second frame has been activated. Remove the layer from
1760424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // the tree to cause another commit/activation. The commit should
1761424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // finish *after* the layer is removed from the active tree.
1762424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        delegated_->RemoveFromParent();
17635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
17645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 3:
17655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Finish the test by releasing resources on the next frame.
17665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        scoped_ptr<DelegatedFrameData> frame =
17675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
17685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        SetFrameData(frame.Pass());
1769424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        break;
1770424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
1771424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
1772424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
17735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
17745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (host_impl->active_tree()->source_frame_number()) {
1775424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      case 2: {
1776424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // The activate for the 2nd frame should have happened before now.
1777424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        EXPECT_EQ(2, activate_count_);
1778424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        break;
1779424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      }
1780424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      case 3: {
1781424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // The activate to remove the layer should have happened before now.
1782424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        EXPECT_EQ(3, activate_count_);
1783424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        break;
1784424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      }
1785424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
1786424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
1787424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1788f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
1789f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                   bool result) OVERRIDE {
1790f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ReturnUnusedResourcesFromParent(host_impl);
1791f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1792f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1793f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void UnusedResourcesAreAvailable() OVERRIDE {
1794f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    LayerTreeHostDelegatedTestCaseSingleDelegatedLayer::
1795f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        UnusedResourcesAreAvailable();
1796f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ReturnedResourceArray resources;
1797f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1798f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_TRUE(TestAndResetAvailable());
1799f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    returned_resource_count_ += resources.size();
1800f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (returned_resource_count_ == 2)
1801f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EndTest();
1802f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1803f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1804424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  int activate_count_;
1805f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  size_t returned_resource_count_;
1806424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
1807424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1808424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
1809424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DelegatedFrameIsActivatedDuringCommit);
1810424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
18114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostDelegatedTestTwoImplLayers
18124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
18134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
18144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
18154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
18174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
18184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnedResourceArray resources;
18194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int next_source_frame_number = layer_tree_host()->source_frame_number();
18214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (next_source_frame_number) {
18224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
18234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
18244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
18254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
18264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
18274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
18284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
18294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
18304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
18314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
18324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
18334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
18344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Remove the delegated layer and replace it with a new one. Use the
18364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // same frame and resources for it.
18374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_->RemoveFromParent();
18384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_ = CreateDelegatedLayer(frame_provider_.get());
18394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
18404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
18414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
18424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
18434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
18444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Use a frame with no resources in it.
18464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
18474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
18484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
18494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 4:
18504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // We gave one frame to the frame provider, so we should get one
18514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // ref back for each resource.
18524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
18534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        {
18544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          unsigned expected[] = {555, 999};
18554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
18564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
18574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
18584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EndTest();
18594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
18604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
18614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
18624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
18644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   bool result) OVERRIDE {
18654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnUnusedResourcesFromParent(host_impl);
18664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
18674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
18684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestTwoImplLayers);
18704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostDelegatedTestTwoImplLayersTwoFrames
18724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
18734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
18744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
18754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
18774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
18784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnedResourceArray resources;
18794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int next_source_frame_number = layer_tree_host()->source_frame_number();
18814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (next_source_frame_number) {
18824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
18834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
18844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
18854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
18864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
18874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
18884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
18894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
18904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
18914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
18924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
18934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
18944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
18964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
18974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
18984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
18994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
19004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Remove the delegated layer and replace it with a new one. Make a new
19024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // frame but with the same resources for it.
19034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_->RemoveFromParent();
19044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_ = NULL;
19054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame_provider_->SetFrameData(frame.Pass());
19074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_ = CreateDelegatedLayer(frame_provider_.get());
19084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
19094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
19104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
19114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
19124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
19134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Use a frame with no resources in it.
19154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
19164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
19174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
19184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 4:
19194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // We gave two frames to the frame provider, so we should get two
19204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // refs back for each resource.
19214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
19224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        {
19234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          unsigned expected[] = {555, 555, 999, 999};
19244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
19254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
19264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
19274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EndTest();
19284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
19294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
19304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
19314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
19334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   bool result) OVERRIDE {
19344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnUnusedResourcesFromParent(host_impl);
19354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
19364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
19374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
19394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostDelegatedTestTwoImplLayersTwoFrames);
19404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostDelegatedTestTwoLayers
19424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
19434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
19444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
19454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
19474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
19484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnedResourceArray resources;
19494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int next_source_frame_number = layer_tree_host()->source_frame_number();
19514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (next_source_frame_number) {
19524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
19534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
19544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
19554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
19564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
19574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
19584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Create a DelegatedRendererLayer using the frame.
19604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
19614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
19624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
19634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Create a second DelegatedRendererLayer using the same frame provider.
19644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_thief_ = CreateDelegatedLayer(frame_provider_.get());
19654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        root_->AddChild(delegated_thief_);
19664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // And drop our ref on the frame provider so only the layers keep it
19684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // alive.
19694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame_provider_ = NULL;
19704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
19714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
19724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
19734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
19744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
19754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Remove one delegated layer from the tree. No resources should be
19774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // returned yet.
19784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_->RemoveFromParent();
19794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
19804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 4:
19814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
19824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
19834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
19844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Put the first layer back, and remove the other layer and destroy it.
19864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // No resources should be returned yet.
19874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        root_->AddChild(delegated_);
19884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_thief_->RemoveFromParent();
19894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_thief_ = NULL;
19904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
19914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 5:
19924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
19934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
19944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
19954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Remove the first layer from the tree again. The resources are still
19974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // held by the main thread layer.
19984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_->RemoveFromParent();
19994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
20004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 6:
20014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
20024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
20034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
20044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Destroy the layer and the resources should be returned immediately.
20064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_ = NULL;
20074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
20094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        {
20104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          unsigned expected[] = {555, 999};
20114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
20124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
20134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
20144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EndTest();
20154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
20164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
20174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
20184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
20204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   bool result) OVERRIDE {
20214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnUnusedResourcesFromParent(host_impl);
20224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
20234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedRendererLayer> delegated_thief_;
20254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
20264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestTwoLayers);
20284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostDelegatedTestRemoveAndAddToTree
20304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
20314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
20324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
20334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
20354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
20364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnedResourceArray resources;
20374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int next_source_frame_number = layer_tree_host()->source_frame_number();
20394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (next_source_frame_number) {
20404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
20414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
20424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
20434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
20444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
20454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
20464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Create a DelegatedRendererLayer using the frame.
20484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
20494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
20504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
20514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
20524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
20534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
20544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Remove the layer from the tree. The resources should not be returned
20564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // since they are still on the main thread layer.
20574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_->RemoveFromParent();
20584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
20594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
20604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
20614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
20624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
20634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Add the layer back to the tree.
20654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        layer_tree_host()->root_layer()->AddChild(delegated_);
20664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
20674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 4:
20684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
20694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
20704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
20714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Set a new frame. Resources should be returned.
20734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
20744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 888);
20754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 888);
20764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 777);
20774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 777);
20784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
20794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
20804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 5:
20814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
20824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        {
20834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          unsigned expected[] = {555, 999};
20844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
20854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
20864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
20874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Destroy the layer.
20894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_->RemoveFromParent();
20904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_ = NULL;
20914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
20924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 6:
20934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
20944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
20954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
20964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Destroy the frame provider. Resources should be returned.
20984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame_provider_ = NULL;
20994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
21014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        {
21024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          unsigned expected[] = {777, 888};
21034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
21044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
21054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
21064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EndTest();
21074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
21084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
21094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
21104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
21124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   bool result) OVERRIDE {
21134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnUnusedResourcesFromParent(host_impl);
21144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
21154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedRendererLayer> delegated_thief_;
21174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
21184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestRemoveAndAddToTree);
21204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostDelegatedTestRemoveAndChangeResources
21224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
21234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
21244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
21254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
21274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
21284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnedResourceArray resources;
21294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int next_source_frame_number = layer_tree_host()->source_frame_number();
21314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (next_source_frame_number) {
21324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
21334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
21344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
21354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
21364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
21374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
21384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Create a DelegatedRendererLayer using the frame.
21404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
21414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
21424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
21434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
21444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
21454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
21464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Remove the layer from the tree. The resources should not be returned
21484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // since they are still on the main thread layer.
21494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_->RemoveFromParent();
21504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
21514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
21524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
21534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
21544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
21554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Set a new frame. Resources should be returned immediately.
21574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
21584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 888);
21594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 888);
21604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 777);
21614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 777);
21624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
21634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
21654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        {
21664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          unsigned expected[] = {555, 999};
21674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
21684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
21694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          resources.clear();
21704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
21714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Destroy the frame provider.
21734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame_provider_ = NULL;
21744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
21764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
21774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
21784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Destroy the layer. Resources should be returned.
21804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_ = NULL;
21814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
21834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        {
21844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          unsigned expected[] = {777, 888};
21854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
21864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
21874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
21884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EndTest();
21894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
21904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
21914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
21924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
21944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   bool result) OVERRIDE {
21954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnUnusedResourcesFromParent(host_impl);
21964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
21974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedRendererLayer> delegated_thief_;
21994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
22004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
22024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostDelegatedTestRemoveAndChangeResources);
22034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
22052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
2206