layer_tree_host_unittest_delegated.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
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"
17b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "cc/layers/delegated_renderer_layer_client.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/delegated_renderer_layer_impl.h"
19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "cc/output/compositor_frame.h"
20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "cc/output/compositor_frame_ack.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/delegated_frame_data.h"
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "cc/quads/render_pass_draw_quad.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/shared_quad_state.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/texture_draw_quad.h"
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/resources/returned_resource.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer_impl.h"
28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "cc/test/fake_output_surface.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h"
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebGraphicsContext3D.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool ReturnedResourceLower(const ReturnedResource& a,
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                           const ReturnedResource& b) {
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return a.id < b.id;
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Tests if the list of resources matches an expectation, modulo the order.
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool ResourcesMatch(ReturnedResourceArray actual,
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    unsigned* expected,
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    size_t expected_count) {
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::sort(actual.begin(), actual.end(), ReturnedResourceLower);
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::sort(expected, expected + expected_count);
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  size_t actual_index = 0;
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // for each element of the expected array, count off one of the actual array
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // (after checking it matches).
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  for (size_t expected_index = 0; expected_index < expected_count;
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)       ++expected_index) {
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_LT(actual_index, actual.size());
553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (actual_index >= actual.size())
563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return false;
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_EQ(actual[actual_index].id, expected[expected_index]);
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (actual[actual_index].id != expected[expected_index])
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return false;
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_GT(actual[actual_index].count, 0);
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (actual[actual_index].count <= 0) {
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return false;
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    } else {
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      --actual[actual_index].count;
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      if (actual[actual_index].count == 0)
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ++actual_index;
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(actual_index, actual.size());
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return actual_index == actual.size();
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define EXPECT_RESOURCES(expected, actual) \
743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_TRUE(ResourcesMatch(actual, expected, arraysize(expected)));
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These tests deal with delegated renderer layers.
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTest : public LayerTreeTest {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<DelegatedFrameData> CreateFrameData(gfx::Rect root_output_rect,
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 gfx::Rect root_damage_rect) {
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame(new DelegatedFrameData);
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<RenderPass> root_pass(RenderPass::Create());
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_pass->SetNew(RenderPass::Id(1, 1),
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      root_output_rect,
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      root_damage_rect,
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      gfx::Transform());
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frame->render_pass_list.push_back(root_pass.Pass());
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return frame.Pass();
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  scoped_ptr<DelegatedFrameData> CreateInvalidFrameData(
93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      gfx::Rect root_output_rect,
94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      gfx::Rect root_damage_rect) {
95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_ptr<DelegatedFrameData> frame(new DelegatedFrameData);
96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_ptr<RenderPass> root_pass(RenderPass::Create());
98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    root_pass->SetNew(RenderPass::Id(1, 1),
99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                      root_output_rect,
100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                      root_damage_rect,
101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                      gfx::Transform());
102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_ptr<SharedQuadState> shared_quad_state = SharedQuadState::Create();
104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    gfx::Rect rect = root_output_rect;
106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    gfx::Rect opaque_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,
120ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              resource_id,
121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              premultiplied_alpha,
122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              uv_top_left,
123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              uv_bottom_right,
124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              background_color,
125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              vertex_opacity,
126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              flipped);
127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    root_pass->quad_list.push_back(invalid_draw_quad.PassAs<DrawQuad>());
128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    root_pass->shared_quad_state_list.push_back(shared_quad_state.Pass());
130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    frame->render_pass_list.push_back(root_pass.Pass());
132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return frame.Pass();
133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
134ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddTransferableResource(DelegatedFrameData* frame,
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               ResourceProvider::ResourceId resource_id) {
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TransferableResource resource;
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resource.id = resource_id;
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    resource.target = GL_TEXTURE_2D;
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frame->resource_list.push_back(resource);
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddTextureQuad(DelegatedFrameData* frame,
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      ResourceProvider::ResourceId resource_id) {
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<SharedQuadState> sqs = SharedQuadState::Create();
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<TextureDrawQuad> quad = TextureDrawQuad::Create();
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float vertex_opacity[4] = { 1.f, 1.f, 1.f, 1.f };
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    quad->SetNew(sqs.get(),
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 gfx::Rect(0, 0, 10, 10),
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 gfx::Rect(0, 0, 10, 10),
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 resource_id,
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 false,
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 gfx::PointF(0.f, 0.f),
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 gfx::PointF(1.f, 1.f),
1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 SK_ColorTRANSPARENT,
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 vertex_opacity,
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 false);
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frame->render_pass_list[0]->shared_quad_state_list.push_back(sqs.Pass());
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frame->render_pass_list[0]->quad_list.push_back(quad.PassAs<DrawQuad>());
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void AddRenderPass(DelegatedFrameData* frame,
16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     RenderPass::Id id,
16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     gfx::Rect output_rect,
16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     gfx::Rect damage_rect,
16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     const FilterOperations& filters,
16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     const FilterOperations& background_filters) {
16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    for (size_t i = 0; i < frame->render_pass_list.size(); ++i)
16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      DCHECK(id != frame->render_pass_list[i]->id);
17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<RenderPass> pass(RenderPass::Create());
17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    pass->SetNew(id,
17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 output_rect,
17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 damage_rect,
17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 gfx::Transform());
17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    frame->render_pass_list.push_back(pass.Pass());
17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<SharedQuadState> sqs = SharedQuadState::Create();
17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<RenderPassDrawQuad> quad = RenderPassDrawQuad::Create();
18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    quad->SetNew(sqs.get(),
18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 output_rect,
18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 id,
18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 false,  // is_replica
18558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 0,  // mask_resource_id
18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 damage_rect,
18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 gfx::Rect(0, 0, 1, 1),  // mask_uv_rect
18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 filters,
18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 background_filters);
19058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    frame->render_pass_list[0]->shared_quad_state_list.push_back(sqs.Pass());
19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    frame->render_pass_list[0]->quad_list.push_back(quad.PassAs<DrawQuad>());
19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  static ResourceProvider::ResourceId AppendResourceId(
195ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      std::vector<ResourceProvider::ResourceId>* resources_in_last_sent_frame,
196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      ResourceProvider::ResourceId resource_id) {
197ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    resources_in_last_sent_frame->push_back(resource_id);
198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return resource_id;
199ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
201ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void ReturnUnusedResourcesFromParent(LayerTreeHostImpl* host_impl) {
202ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    DelegatedFrameData* delegated_frame_data =
203ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        output_surface()->last_sent_frame().delegated_frame_data.get();
204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (!delegated_frame_data)
205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return;
206ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
207ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    std::vector<ResourceProvider::ResourceId> resources_in_last_sent_frame;
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    for (size_t i = 0; i < delegated_frame_data->resource_list.size(); ++i) {
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      resources_in_last_sent_frame.push_back(
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          delegated_frame_data->resource_list[i].id);
211ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
212ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
213ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    std::vector<ResourceProvider::ResourceId> resources_to_return;
214ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
215ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const TransferableResourceArray& resources_held_by_parent =
216ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        output_surface()->resources_held_by_parent();
217ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    for (size_t i = 0; i < resources_held_by_parent.size(); ++i) {
218ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      ResourceProvider::ResourceId resource_in_parent =
219ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          resources_held_by_parent[i].id;
220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      bool resource_in_parent_is_not_part_of_frame =
221ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          std::find(resources_in_last_sent_frame.begin(),
222ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                    resources_in_last_sent_frame.end(),
223ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                    resource_in_parent) == resources_in_last_sent_frame.end();
224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (resource_in_parent_is_not_part_of_frame)
225ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        resources_to_return.push_back(resource_in_parent);
226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
228ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (resources_to_return.empty())
229ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return;
230ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    CompositorFrameAck ack;
232ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    for (size_t i = 0; i < resources_to_return.size(); ++i)
233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      output_surface()->ReturnResource(resources_to_return[i], &ack);
234d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    host_impl->ReclaimResources(&ack);
235d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    host_impl->OnSwapBuffersComplete();
236ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestCaseSingleDelegatedLayer
240b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    : public LayerTreeHostDelegatedTest,
2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      public DelegatedRendererLayerClient,
2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      public DelegatedFrameResourceCollectionClient {
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LayerTreeHostDelegatedTestCaseSingleDelegatedLayer()
2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : resource_collection_(new DelegatedFrameResourceCollection),
2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        available_(false) {
2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    resource_collection_->SetClient(this);
2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
24968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_ = Layer::Create();
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->SetAnchorPoint(gfx::PointF());
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->SetBounds(gfx::Size(10, 10));
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_);
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostDelegatedTest::SetupTree();
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
2604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    resource_collection_->SetClient(this);
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void SetFrameData(scoped_ptr<DelegatedFrameData> frame_data) {
2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    RenderPass* root_pass = frame_data->render_pass_list.back();
2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    gfx::Size frame_size = root_pass->output_rect.size();
2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (frame_provider_.get() && frame_size == frame_provider_->frame_size()) {
2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      frame_provider_->SetFrameData(frame_data.Pass());
2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return;
2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
2724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (delegated_.get()) {
2744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      delegated_->RemoveFromParent();
2754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      delegated_ = NULL;
2764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      frame_provider_ = NULL;
2774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
2784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    frame_provider_ = new DelegatedFrameProvider(resource_collection_.get(),
2804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                 frame_data.Pass());
2814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated_ = CreateDelegatedLayer(frame_provider_.get());
2834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedRendererLayer> CreateDelegatedLayer(
2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      DelegatedFrameProvider* frame_provider) {
2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<DelegatedRendererLayer> delegated =
2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        FakeDelegatedRendererLayer::Create(this, frame_provider);
2894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated->SetAnchorPoint(gfx::PointF());
2904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated->SetBounds(gfx::Size(10, 10));
2914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated->SetIsDrawable(true);
2924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root_->AddChild(delegated);
2944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return delegated;
2954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void AfterTest() OVERRIDE { resource_collection_->SetClient(NULL); }
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // DelegatedRendererLayerClient implementation.
300b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidCommitFrameData() OVERRIDE {}
3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // DelegatedFrameProviderClient implementation.
30368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void UnusedResourcesAreAvailable() OVERRIDE { available_ = true; }
30468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
30568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool TestAndResetAvailable() {
30668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    bool available = available_;
30768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    available_ = false;
30868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return available;
30968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
310b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedFrameResourceCollection> resource_collection_;
3134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedFrameProvider> frame_provider_;
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> root_;
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<DelegatedRendererLayer> delegated_;
31668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool available_;
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
319b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class LayerTreeHostDelegatedTestClientDidCommitCallback
320b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
321b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public:
322b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  LayerTreeHostDelegatedTestClientDidCommitCallback()
323b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(),
324b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        num_did_commit_frame_data_(0) {}
325b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
326b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
327b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (TestEnded())
328b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      return;
329b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
330b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    EXPECT_EQ(1, num_did_commit_frame_data_);
331b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    EndTest();
332b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
333b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
334b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)));
336b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
337b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
338b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
339b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual void DidCommitFrameData() OVERRIDE {
340b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    num_did_commit_frame_data_++;
341b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
342b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
343b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) protected:
344b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  int num_did_commit_frame_data_;
345b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)};
346b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
347b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
348b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    LayerTreeHostDelegatedTestClientDidCommitCallback);
349b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestCreateChildId
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostDelegatedTestCreateChildId()
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(),
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        num_activates_(0),
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        did_reset_child_id_(false) {}
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (TestEnded())
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
3614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)));
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
3654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() < 1)
3664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return;
3674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ContextProvider* context_provider =
3733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        host_impl->output_surface()->context_provider();
374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++num_activates_;
376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (num_activates_) {
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(delegated_impl->ChildId());
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_FALSE(did_reset_child_id_);
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        context_provider->Context3d()->loseContextCHROMIUM(
3823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            GL_GUILTY_CONTEXT_RESET_ARB,
3833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            GL_INNOCENT_CONTEXT_RESET_ARB);
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 3:
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(delegated_impl->ChildId());
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(did_reset_child_id_);
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void InitializedRendererOnThread(LayerTreeHostImpl* host_impl,
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           bool success) OVERRIDE {
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(success);
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (num_activates_ < 2)
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2, num_activates_);
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(delegated_impl->ChildId());
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    did_reset_child_id_ = true;
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_activates_;
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool did_reset_child_id_;
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestCreateChildId);
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
41658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LayerTreeHostDelegatedTestOffscreenContext_NoFilters
41758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
41858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
41958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
42058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame =
42158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1),
42258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        gfx::Rect(0, 0, 1, 1));
4234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(frame.Pass());
42458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
42558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
42658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
42758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
42858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
42958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_FALSE(host_impl->offscreen_context_provider());
43058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EndTest();
43158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
43258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
43358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
43458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
43558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostDelegatedTestOffscreenContext_NoFilters);
43658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
43758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LayerTreeHostDelegatedTestOffscreenContext_Filters
43858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
43958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
44058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
44158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame =
44258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1),
44358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        gfx::Rect(0, 0, 1, 1));
44458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
44558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    FilterOperations filters;
44658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f));
44758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    AddRenderPass(frame.get(),
44858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  RenderPass::Id(2, 1),
44958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  gfx::Rect(0, 0, 1, 1),
45058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  gfx::Rect(0, 0, 1, 1),
45158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  filters,
45258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  FilterOperations());
4534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(frame.Pass());
45458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
45558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
45658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
45758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
45858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
45958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool expect_context = !delegating_renderer();
46058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(expect_context, !!host_impl->offscreen_context_provider());
46158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EndTest();
46258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
46358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
46458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
46558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
46658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostDelegatedTestOffscreenContext_Filters);
46758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
46858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LayerTreeHostDelegatedTestOffscreenContext_BackgroundFilters
46958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
47058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
47158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
47258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame =
47358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1),
47458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        gfx::Rect(0, 0, 1, 1));
47558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
47658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    FilterOperations filters;
47758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f));
47858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    AddRenderPass(frame.get(),
47958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  RenderPass::Id(2, 1),
48058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  gfx::Rect(0, 0, 1, 1),
48158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  gfx::Rect(0, 0, 1, 1),
48258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  FilterOperations(),
48358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  filters);
4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(frame.Pass());
48558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
48658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
48758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
48858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
48958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
49058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool expect_context = !delegating_renderer();
49158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(expect_context, !!host_impl->offscreen_context_provider());
49258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EndTest();
49358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
49458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
49558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
49658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
49758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostDelegatedTestOffscreenContext_BackgroundFilters);
49858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
49958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LayerTreeHostDelegatedTestOffscreenContext_Filters_AddedToTree
50058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
50158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
50258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
5034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame_no_filters =
5044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
5054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame_with_filters =
5074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
50858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
50958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    FilterOperations filters;
51058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f));
5114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    AddRenderPass(frame_with_filters.get(),
51258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  RenderPass::Id(2, 1),
51358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  gfx::Rect(0, 0, 1, 1),
51458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  gfx::Rect(0, 0, 1, 1),
51558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  filters,
51658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  FilterOperations());
51758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(frame_no_filters.Pass());
51958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    delegated_->RemoveFromParent();
5204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(frame_with_filters.Pass());
52158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(delegated_);
52258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
52358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
52458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
52558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
52658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
52758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool expect_context = !delegating_renderer();
52858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(expect_context, !!host_impl->offscreen_context_provider());
52958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EndTest();
53058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
53158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
53258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
53358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
53458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostDelegatedTestOffscreenContext_Filters_AddedToTree);
53558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestLayerUsesFrameDamage
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostDelegatedTestLayerUsesFrameDamage()
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(),
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        first_draw_for_source_frame_(true) {}
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
544bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The first time the layer gets a frame the whole layer should be
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // damaged.
5494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
5504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)));
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
5534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // A different frame size will damage the whole layer.
5544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
5554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(0, 0, 0, 0)));
5564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
5574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should create a total amount of gfx::Rect(2, 2, 10, 6) damage.
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The frame size is 20x20 while the layer is 10x10, so this should
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // produce a gfx::Rect(1, 1, 5, 3) damage rect.
5614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
5624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(2, 2, 5, 5)));
5634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
5644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(7, 2, 5, 6)));
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 4:
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should create zero damage.
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 5:
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should damage the full viewport.
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delegated_->SetBounds(gfx::Size(2, 2));
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 6:
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should create zero damage.
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 7:
5794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Should damage the full layer, tho the frame size is not changing.
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delegated_->SetBounds(gfx::Size(6, 6));
5814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
5824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(1, 1, 2, 2)));
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 8:
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should create zero damage.
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 9:
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should damage the full layer.
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delegated_->SetDisplaySize(gfx::Size(10, 10));
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 10:
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should create zero damage.
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 11:
5974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Changing the frame size damages the full layer.
5984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
5994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 5, 5), gfx::Rect(4, 4, 1, 1)));
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 12:
602ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // An invalid frame isn't used, so it should not cause damage.
6034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(CreateInvalidFrameData(gfx::Rect(0, 0, 5, 5),
6044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                            gfx::Rect(4, 4, 1, 1)));
605ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        break;
6064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 13:
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should create gfx::Rect(1, 1, 2, 2) of damage. The frame size is
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // 5x5 and the display size is now set to 10x10, so this should result
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // in a gfx::Rect(2, 2, 4, 4) damage rect.
6104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
6114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 5, 5), gfx::Rect(1, 1, 2, 2)));
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 14:
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should create zero damage.
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 15:
618d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        // Moving the layer out of the tree and back in will damage the whole
619d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        // impl layer.
620d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        delegated_->RemoveFromParent();
621d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        layer_tree_host()->root_layer()->AddChild(delegated_);
622d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        break;
6234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 16:
624d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        // Make a larger frame with lots of damage. Then a frame smaller than
625d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        // the first frame's damage. The entire layer should be damaged, but
626d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        // nothing more.
6274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
6284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(0, 0, 10, 10)));
6294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
6304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 5, 5), gfx::Rect(1, 1, 2, 2)));
631d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        break;
6324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 17:
6334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Make a frame with lots of damage. Then replace it with a frame with
6344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // no damage. The entire layer should be damaged, but nothing more.
6354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
6364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(0, 0, 10, 10)));
6374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
6384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(0, 0, 0, 0)));
639d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        break;
6404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 18:
6414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Make another layer that uses the same frame provider. The new layer
6424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // should be damaged.
6434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_copy_ = CreateDelegatedLayer(frame_provider_);
6444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_copy_->SetPosition(gfx::Point(5, 0));
6454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Also set a new frame.
6474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
6484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(4, 0, 1, 1)));
6494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
6504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 19:
6514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Set another new frame, both layers should be damaged in the same
6524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // ways.
6534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
6544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(3, 3, 1, 1)));
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    first_draw_for_source_frame_ = true;
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     LayerTreeHostImpl::FrameData* frame,
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     bool result) OVERRIDE {
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(result);
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!first_draw_for_source_frame_)
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return result;
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::RectF damage_rect;
668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!frame->has_no_damage) {
669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      damage_rect = frame->render_passes.back()->damage_rect;
670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // If there is no damage, then we have no render passes to send.
672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_TRUE(frame->render_passes.empty());
673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (host_impl->active_tree()->source_frame_number()) {
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 0:
677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // First frame is damaged because of viewport resize.
678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
6864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 3:
6904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(1.f, 1.f, 5.f, 3.f).ToString(),
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 4:
6944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 5:
6984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 6:
7024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 7:
7064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 8:
7104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 9:
7144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 10:
7184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 11:
7224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 12:
7264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 13:
7304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(2.f, 2.f, 4.f, 4.f).ToString(),
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 14:
7344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
735ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                  damage_rect.ToString());
736ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        break;
737ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      case 15:
7384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
740d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        break;
741d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      case 16:
7424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
743d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                  damage_rect.ToString());
744d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        break;
745d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      case 17:
7464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
747d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                  damage_rect.ToString());
748d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        break;
749d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      case 18:
7504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::UnionRects(gfx::RectF(5.f, 0.f, 10.f, 10.f),
7514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                  gfx::RectF(4.f, 0.f, 1.f, 1.f)).ToString(),
7524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  damage_rect.ToString());
7534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
7544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 19:
7554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(3.f, 3.f, 6.f, 1.f).ToString(),
756d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                  damage_rect.ToString());
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return result;
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
7654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedRendererLayer> delegated_copy_;
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool first_draw_for_source_frame_;
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestLayerUsesFrameDamage);
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestMergeResources
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Push two frames to the delegated renderer layer with no commit between.
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The first frame has resource 999.
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame1 =
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTextureQuad(frame1.get(), 999);
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTransferableResource(frame1.get(), 999);
7824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(frame1.Pass());
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The second frame uses resource 999 still, but also adds 555.
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame2 =
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTextureQuad(frame2.get(), 999);
7883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    AddTransferableResource(frame2.get(), 999);
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTextureQuad(frame2.get(), 555);
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTransferableResource(frame2.get(), 555);
7914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(frame2.Pass());
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // The resource 999 from frame1 is returned since it is still on the main
7943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // thread.
7953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray returned_resources;
7964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    resource_collection_->TakeUnusedResourcesForChildCompositor(
7974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        &returned_resources);
7983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    {
7993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      unsigned expected[] = {999};
8003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      EXPECT_RESOURCES(expected, returned_resources);
80168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      EXPECT_TRUE(TestAndResetAvailable());
8023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
8033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Both frames' resources should be in the parent's resource provider.
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2u, map.size());
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(999));
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(555));
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2u, delegated_impl->Resources().size());
82268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(999));
82368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(555));
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EndTest();
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestMergeResources);
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestRemapResourcesInQuads
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Generate a frame with two resources in it.
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame =
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTextureQuad(frame.get(), 999);
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTransferableResource(frame.get(), 999);
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTextureQuad(frame.get(), 555);
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTransferableResource(frame.get(), 555);
8424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(frame.Pass());
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The frame's resource should be in the parent's resource provider.
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2u, map.size());
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(999));
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(555));
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResourceProvider::ResourceId parent_resource_id1 = map.find(999)->second;
862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_NE(parent_resource_id1, 999u);
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResourceProvider::ResourceId parent_resource_id2 = map.find(555)->second;
864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_NE(parent_resource_id2, 555u);
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The resources in the quads should be remapped to the parent's namespace.
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast(
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delegated_impl->RenderPassesInDrawOrder()[0]->quad_list[0]);
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(parent_resource_id1, quad1->resource_id);
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const TextureDrawQuad* quad2 = TextureDrawQuad::MaterialCast(
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delegated_impl->RenderPassesInDrawOrder()[0]->quad_list[1]);
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(parent_resource_id2, quad2->resource_id);
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EndTest();
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestRemapResourcesInQuads);
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestReturnUnusedResources
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 two 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);
9004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // All of the resources are in use.
9044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
90668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Keep using 999 but stop using 555.
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
91168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        AddTransferableResource(frame.get(), 999);
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 444);
9144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
91668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 3:
9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // 555 is no longer in use.
9184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
9193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
9203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {555};
9213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
92268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
9233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Stop using any resources.
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
9274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
92968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 4:
930ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // Postpone collecting resources for a frame. They should still be there
931ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // the next frame.
932ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        layer_tree_host()->SetNeedsCommit();
933ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        return;
93468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 5:
93568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // 444 and 999 are no longer in use. We sent two refs to 999, so we
93668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // should get two back.
9374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
9383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
93968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          unsigned expected[] = {444, 999, 999};
9403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
94168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
94768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Resources are never immediately released.
9483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray empty_resources;
9494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    resource_collection_->TakeUnusedResourcesForChildCompositor(
9504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        &empty_resources);
95168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(0u, empty_resources.size());
95268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_FALSE(TestAndResetAvailable());
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
955ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
956ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                   bool result) OVERRIDE {
957ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ReturnUnusedResourcesFromParent(host_impl);
958ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
961ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_TEST_F(
962a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    LayerTreeHostDelegatedTestReturnUnusedResources);
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestReusedResources
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
971ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
9733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
975bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Generate a frame with some resources in it.
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 444);
9864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // All of the resources are in use.
9904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
99268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Keep using 999 but stop using 555 and 444.
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
99768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        AddTransferableResource(frame.get(), 999);
9984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Resource are not immediately released.
10014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
100368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Now using 555 and 444 again, but not 999.
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
100868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        AddTransferableResource(frame.get(), 555);
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
101068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        AddTransferableResource(frame.get(), 444);
10114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
101368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 3:
101468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // The 999 resource is the only unused one. Two references were sent, so
101568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // two should be returned.
10164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
10173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
101868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          unsigned expected[] = {999, 999};
10193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
102068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
10213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1027ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
1028ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                   bool result) OVERRIDE {
1029ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ReturnUnusedResourcesFromParent(host_impl);
1030ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1033ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestReusedResources);
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestFrameBeforeAck
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
10443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1046bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Generate a frame with some resources in it.
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 444);
10574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // All of the resources are in use.
10614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
106368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Keep using 999 but stop using 555 and 444.
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
106868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        AddTransferableResource(frame.get(), 999);
10694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Resource are not immediately released.
10724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
107468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The parent compositor (this one) does a commit.
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
107868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 3:
10794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
10803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
10813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {444, 555};
10823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
108368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
108668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // The child compositor sends a frame referring to resources not in the
108768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // frame.
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
10924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
109868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() != 3)
10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The bad frame should be dropped. So we should only have one quad (the
11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // one with resource 999) on the impl tree. And only 999 will be present
11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // in the parent's resource provider.
11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.size());
11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(999));
11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().size());
111668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(999));
11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0];
11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, pass->quad_list.size());
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const TextureDrawQuad* quad = TextureDrawQuad::MaterialCast(
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pass->quad_list[0]);
11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(map.find(999)->second, quad->resource_id);
11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EndTest();
11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
1128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                   bool result) OVERRIDE {
1129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ReturnUnusedResourcesFromParent(host_impl);
1130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestFrameBeforeAck);
11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestFrameBeforeTakeResources
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
11443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1146bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Generate a frame with some resources in it.
11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 444);
11574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // All of the resources are in use.
11614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
116368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Keep using 999 but stop using 555 and 444.
11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
11683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 999);
11694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Resource are not immediately released.
11724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
117468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The parent compositor (this one) does a commit.
11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
117868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 3:
11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The child compositor sends a frame before taking resources back
11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // from the previous commit. This frame makes use of the resources 555
11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // and 444, which were just released during commit.
11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
11843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 999);
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
11863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 555);
11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
11883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 444);
11894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // The resources are used by the new frame but are returned anyway since
11923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // we passed them again.
11934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
11943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
11953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {444, 555};
11963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
119768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
11983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
120068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 4:
12014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
120368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
121068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() != 3)
12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The third frame has all of the resources in it again, the delegated
12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // renderer layer should continue to own the resources for it.
12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(3u, map.size());
12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(999));
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(555));
12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(444));
12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(3u, delegated_impl->Resources().size());
122968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(999));
123068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(555));
123168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(444));
12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0];
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(3u, pass->quad_list.size());
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast(
12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pass->quad_list[0]);
12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(map.find(999)->second, quad1->resource_id);
12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const TextureDrawQuad* quad2 = TextureDrawQuad::MaterialCast(
12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pass->quad_list[1]);
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(map.find(555)->second, quad2->resource_id);
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const TextureDrawQuad* quad3 = TextureDrawQuad::MaterialCast(
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pass->quad_list[2]);
12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(map.find(444)->second, quad3->resource_id);
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1246ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
1247ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                   bool result) OVERRIDE {
1248ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ReturnUnusedResourcesFromParent(host_impl);
1249ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_TEST_F(
1253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostDelegatedTestFrameBeforeTakeResources);
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestBadFrame
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1262ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
12643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1266bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Generate a frame with some resources in it.
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
12754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // All of the resources are in use.
12794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
128168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Generate a bad frame with a resource the layer doesn't have. The
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // 885 and 775 resources are unknown, while ownership of the legit 444
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // resource is passed in here. The bad frame does not use any of the
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // previous resources, 999 or 555.
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // A bad quad is present both before and after the good quad.
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 885);
12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 444);
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 775);
12934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The parent compositor (this one) does a commit.
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
129768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 3:
12984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
12994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
13004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
13014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
13024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Now send a good frame with 999 again.
13034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
13044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
13054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
13064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The bad frame's resource is given back to the child compositor.
13084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
13093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
13103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {444};
13113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
131268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
13133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
131568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 4:
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The unused 555 from the last good frame is now released.
13174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
13183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
13193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {555};
13203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
132168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
13223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1329ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
1330ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                   bool result) OVERRIDE {
13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() < 1)
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1334ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ReturnUnusedResourcesFromParent(host_impl);
1335ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (host_impl->active_tree()->source_frame_number()) {
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1: {
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // We have the first good frame with just 990 and 555 in it.
13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // layer.
13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, map.size());
13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(999));
13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, delegated_impl->Resources().size());
135368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(999));
135468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(555));
13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0];
13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, pass->quad_list.size());
13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast(
13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            pass->quad_list[0]);
13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(map.find(999)->second, quad1->resource_id);
13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const TextureDrawQuad* quad2 = TextureDrawQuad::MaterialCast(
13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            pass->quad_list[1]);
13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(map.find(555)->second, quad2->resource_id);
13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
136668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 2: {
13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // We only keep resources from the last valid frame.
13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, map.size());
13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(999));
13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, delegated_impl->Resources().size());
137368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(999));
137468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(555));
13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The bad frame is dropped though, we still have the frame with 999 and
13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // 555 in it.
13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0];
13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, pass->quad_list.size());
13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast(
13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            pass->quad_list[0]);
13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(map.find(999)->second, quad1->resource_id);
13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const TextureDrawQuad* quad2 = TextureDrawQuad::MaterialCast(
13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            pass->quad_list[1]);
13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(map.find(555)->second, quad2->resource_id);
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
138868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 3: {
13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // We have the new good frame with just 999 in it.
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.size());
13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(999));
13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().size());
139468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(999));
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0];
13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, pass->quad_list.size());
13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast(
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            pass->quad_list[0]);
14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(map.find(999)->second, quad1->resource_id);
14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1407ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestBadFrame);
14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestUnnamedResource
14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
14183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1420bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // This frame includes two resources in it, but only uses one.
14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
14284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
14314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
14324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
14334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
14344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
14354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Now send an empty frame.
14364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
14374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
14384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The unused resource should be returned.
14404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
14413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
14423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {999};
14433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
144468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
14453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() != 1)
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The layer only held on to the resource that was used.
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.size());
14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(555));
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().size());
146968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(555));
14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestUnnamedResource);
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestDontLeakResource
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
148268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
14843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1486bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // This frame includes two resources in it.
14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
14954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // But then we immediately stop using 999.
14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
15003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 555);
15014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
15043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // The unused resources should be returned. 555 is still used, but it's
15053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // returned once to account for the first frame.
15064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
15073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
15083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {555, 999};
15093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
151068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
15113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
15123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // Send a frame with no resources in it.
15133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
15144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
15153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        break;
15163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case 3:
15173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // The now unused resource 555 should be returned.
15183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        resources.clear();
15194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
15203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
15213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {555};
15223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
152368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
15243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() != 1)
15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The layer only held on to the resource that was used.
15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.size());
15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(555));
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().size());
154768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(555));
15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
15513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                   bool result) OVERRIDE {
15523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnUnusedResourcesFromParent(host_impl);
15533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestDontLeakResource);
15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestResourceSentToParent
15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1561ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
15633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1565bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // This frame includes two resources in it.
15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
15744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
15774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
157968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // 999 is in use in the grandparent compositor, generate a frame without
15822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // it present.
15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
158568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        AddTransferableResource(frame.get(), 555);
15864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 3:
15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Since 999 is in the grandparent it is not returned.
15904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
159268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1594ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // The impl side will get back the resource at some point.
159568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        ImplThreadTaskRunner()->PostTask(FROM_HERE,
159668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                         receive_resource_on_thread_);
15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
159868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
159968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
160168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void ReceiveResourceOnThread(LayerTreeHostImpl* host_impl) {
160268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
160368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
160468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
160568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
160668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
160768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
160868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            delegated_impl->ChildId());
160968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
161068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Receive 999 back from the grandparent.
161168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    CompositorFrameAck ack;
161268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    output_surface()->ReturnResource(map.find(999)->second, &ack);
161368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    host_impl->ReclaimResources(&ack);
161468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    host_impl->OnSwapBuffersComplete();
161568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
161668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
161768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void UnusedResourcesAreAvailable() OVERRIDE {
161868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(3, layer_tree_host()->source_frame_number());
161968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
162068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ReturnedResourceArray resources;
162168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
162268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // 999 was returned from the grandparent and could be released.
16234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
162468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    {
162568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      unsigned expected[] = {999};
162668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      EXPECT_RESOURCES(expected, resources);
16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
162868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
162968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EndTest();
16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() < 1)
16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (host_impl->active_tree()->source_frame_number()) {
16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1: {
16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, map.size());
16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(999));
16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, delegated_impl->Resources().size());
165168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(999));
165268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(555));
16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1654ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // The 999 resource will be sent to a grandparent compositor.
16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2: {
16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, map.size());
16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(999));
16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1662ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // 999 is in the parent, so not held by delegated renderer layer.
16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().size());
166468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(555));
16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
166668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        receive_resource_on_thread_ =
166768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            base::Bind(&LayerTreeHostDelegatedTestResourceSentToParent::
166868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                            ReceiveResourceOnThread,
166968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                       base::Unretained(this),
167068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                       host_impl);
16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 3:
16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // 999 should be released.
16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.size());
16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().size());
16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second));
1680ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        break;
16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
168468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::Closure receive_resource_on_thread_;
16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1687ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_DELEGATING_RENDERER_TEST_F(
1688ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    LayerTreeHostDelegatedTestResourceSentToParent);
16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestCommitWithoutTake
16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Prevent drawing with resources that are sent to the grandparent.
1695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size());
16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
17013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1703bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 444);
17134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
17164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
171868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Stop using 999 and 444 in this frame and commit.
17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
17233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 555);
17244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
17253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // 999 and 444 will be returned for frame 1, but not 555 since it's in
17263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // the current frame.
17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 3:
17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Don't take resources here, but set a new frame that uses 999 again.
17302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
17312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
17323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 999);
17332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
17343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 555);
17354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 4:
17383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // 555 from frame 1 and 2 isn't returned since it's still in use. 999
17393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // from frame 1 is returned though.
17404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
17413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
17423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {444, 999};
17433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
174468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
17453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
17463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
17473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
17484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
17493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // 555 will be returned 3 times for frames 1 2 and 3, and 999 will be
17503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // returned once for frame 3.
17513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        break;
17523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case 5:
17534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
17543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
17553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {555, 555, 555, 999};
17563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
175768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
17583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() < 1)
17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (host_impl->active_tree()->source_frame_number()) {
17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(3u, map.size());
17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(999));
17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
17822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(444));
17832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(3u, delegated_impl->Resources().size());
178568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(999));
178668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(555));
178768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(444));
17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.size());
17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().size());
179468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(555));
17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 3:
17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, map.size());
17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(999));
17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, delegated_impl->Resources().size());
180268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(999));
180368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(555));
18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestCommitWithoutTake);
18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1810424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class DelegatedFrameIsActivatedDuringCommit
1811424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
1812424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) protected:
1813424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DelegatedFrameIsActivatedDuringCommit()
1814424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      : wait_thread_("WAIT"),
1815424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        wait_event_(false, false) {
1816424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    wait_thread_.Start();
1817424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
1818424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1819424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1820424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    activate_count_ = 0;
1821424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1822424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame =
1823424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1824424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    AddTextureQuad(frame.get(), 999);
1825424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    AddTransferableResource(frame.get(), 999);
18264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(frame.Pass());
1827424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1828424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    PostSetNeedsCommitToMainThread();
1829424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
1830424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1831424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1832424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // Slow down activation so the main thread DidCommit() will run if
1833424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // not blocked.
1834424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    wait_thread_.message_loop()->PostDelayedTask(
1835424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        FROM_HERE,
1836424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        base::Bind(&base::WaitableEvent::Signal,
1837424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                   base::Unretained(&wait_event_)),
1838424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        base::TimeDelta::FromMilliseconds(10));
1839424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    wait_event_.Wait();
1840424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1841424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    base::AutoLock lock(activate_lock_);
1842424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    ++activate_count_;
1843424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
1844424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1845424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1846424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // The main thread is awake now, and will run DidCommit() immediately.
1847424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // Run DidActivate() afterwards by posting it now.
1848424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    proxy()->MainThreadTaskRunner()->PostTask(
1849424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        FROM_HERE,
1850424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        base::Bind(&DelegatedFrameIsActivatedDuringCommit::DidActivate,
1851424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                   base::Unretained(this)));
1852424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
1853424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1854424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  void DidActivate() {
1855424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    base::AutoLock lock(activate_lock_);
1856424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    switch (activate_count_) {
1857424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      case 1: {
1858424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // The first frame has been activated. Set a new frame, and
1859424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // expect the next commit to finish *after* it is activated.
1860424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        scoped_ptr<DelegatedFrameData> frame =
1861424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1862424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        AddTextureQuad(frame.get(), 555);
1863424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        AddTransferableResource(frame.get(), 555);
18644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
1865424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // So this commit number should complete after the second activate.
1866424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        EXPECT_EQ(1, layer_tree_host()->source_frame_number());
1867424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        break;
1868424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      }
1869424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      case 2:
1870424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // The second frame has been activated. Remove the layer from
1871424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // the tree to cause another commit/activation. The commit should
1872424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // finish *after* the layer is removed from the active tree.
1873424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        delegated_->RemoveFromParent();
1874424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // So this commit number should complete after the third activate.
1875424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        EXPECT_EQ(2, layer_tree_host()->source_frame_number());
1876424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        break;
1877424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      case 3:
1878424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        EndTest();
1879424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        break;
1880424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
1881424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
1882424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1883424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void DidCommit() OVERRIDE {
1884424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    switch (layer_tree_host()->source_frame_number()) {
1885424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      case 2: {
1886424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // The activate for the 2nd frame should have happened before now.
1887424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        base::AutoLock lock(activate_lock_);
1888424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        EXPECT_EQ(2, activate_count_);
1889424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        break;
1890424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      }
1891424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      case 3: {
1892424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // The activate to remove the layer should have happened before now.
1893424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        base::AutoLock lock(activate_lock_);
1894424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        EXPECT_EQ(3, activate_count_);
18954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        scoped_ptr<DelegatedFrameData> frame =
18974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
18984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
18994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        ReturnedResourceArray resources;
19014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
19024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        {
19034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          unsigned expected[] = {999, 555};
19044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
19054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
19064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
1907424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        break;
1908424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      }
1909424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
1910424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
1911424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1912424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::Thread wait_thread_;
1913424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::WaitableEvent wait_event_;
1914424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::Lock activate_lock_;
1915424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  int activate_count_;
1916424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
1917424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1918424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
1919424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DelegatedFrameIsActivatedDuringCommit);
1920424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
19214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostDelegatedTestTwoImplLayers
19224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
19234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
19244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
19254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
19274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
19284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnedResourceArray resources;
19294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int next_source_frame_number = layer_tree_host()->source_frame_number();
19314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (next_source_frame_number) {
19324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
19334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
19344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
19354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
19364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
19374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
19384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
19394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
19404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
19414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
19424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
19434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
19444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Remove the delegated layer and replace it with a new one. Use the
19464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // same frame and resources for it.
19474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_->RemoveFromParent();
19484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_ = CreateDelegatedLayer(frame_provider_.get());
19494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
19504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
19514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
19524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
19534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
19544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Use a frame with no resources in it.
19564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
19574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
19584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
19594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 4:
19604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // We gave one frame to the frame provider, so we should get one
19614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // ref back for each resource.
19624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
19634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        {
19644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          unsigned expected[] = {555, 999};
19654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
19664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
19674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
19684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EndTest();
19694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
19704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
19714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
19724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
19744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   bool result) OVERRIDE {
19754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnUnusedResourcesFromParent(host_impl);
19764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
19774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
19784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestTwoImplLayers);
19804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostDelegatedTestTwoImplLayersTwoFrames
19824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
19834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
19844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
19854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
19874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
19884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnedResourceArray resources;
19894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int next_source_frame_number = layer_tree_host()->source_frame_number();
19914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (next_source_frame_number) {
19924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
19934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
19944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
19954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
19964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
19974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
19984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
19994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
20004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
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)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
20064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
20074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
20084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
20094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
20104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Remove the delegated layer and replace it with a new one. Make a new
20124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // frame but with the same resources for it.
20134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_->RemoveFromParent();
20144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_ = NULL;
20154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame_provider_->SetFrameData(frame.Pass());
20174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_ = CreateDelegatedLayer(frame_provider_.get());
20184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
20194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
20204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
20214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
20224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
20234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Use a frame with no resources in it.
20254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
20264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
20274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
20284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 4:
20294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // We gave two frames to the frame provider, so we should get two
20304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // refs back for each resource.
20314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
20324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        {
20334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          unsigned expected[] = {555, 555, 999, 999};
20344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
20354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
20364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
20374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EndTest();
20384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
20394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
20404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
20414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
20434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   bool result) OVERRIDE {
20444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnUnusedResourcesFromParent(host_impl);
20454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
20464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
20474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
20494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostDelegatedTestTwoImplLayersTwoFrames);
20504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostDelegatedTestTwoLayers
20524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
20534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
20544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
20554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
20574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
20584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnedResourceArray resources;
20594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int next_source_frame_number = layer_tree_host()->source_frame_number();
20614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (next_source_frame_number) {
20624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
20634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
20644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
20654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
20664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
20674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
20684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Create a DelegatedRendererLayer using the frame.
20704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
20714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
20724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
20734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Create a second DelegatedRendererLayer using the same frame provider.
20744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_thief_ = CreateDelegatedLayer(frame_provider_.get());
20754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        root_->AddChild(delegated_thief_);
20764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // And drop our ref on the frame provider so only the layers keep it
20784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // alive.
20794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame_provider_ = NULL;
20804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
20814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
20824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
20834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
20844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
20854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Remove one delegated layer from the tree. No resources should be
20874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // returned yet.
20884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_->RemoveFromParent();
20894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
20904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 4:
20914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
20924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
20934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
20944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Put the first layer back, and remove the other layer and destroy it.
20964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // No resources should be returned yet.
20974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        root_->AddChild(delegated_);
20984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_thief_->RemoveFromParent();
20994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_thief_ = NULL;
21004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
21014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 5:
21024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
21034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
21044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
21054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Remove the first layer from the tree again. The resources are still
21074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // held by the main thread layer.
21084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_->RemoveFromParent();
21094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
21104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 6:
21114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
21124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
21134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
21144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Destroy the layer and the resources should be returned immediately.
21164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_ = NULL;
21174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
21194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        {
21204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          unsigned expected[] = {555, 999};
21214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
21224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
21234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
21244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EndTest();
21254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
21264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
21274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
21284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
21304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   bool result) OVERRIDE {
21314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnUnusedResourcesFromParent(host_impl);
21324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
21334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedRendererLayer> delegated_thief_;
21354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
21364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestTwoLayers);
21384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostDelegatedTestRemoveAndAddToTree
21404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
21414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
21424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
21434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
21454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
21464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnedResourceArray resources;
21474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int next_source_frame_number = layer_tree_host()->source_frame_number();
21494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (next_source_frame_number) {
21504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
21514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
21524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
21534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
21544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
21554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
21564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Create a DelegatedRendererLayer using the frame.
21584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
21594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
21604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
21614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
21624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
21634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
21644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Remove the layer from the tree. The resources should not be returned
21664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // since they are still on the main thread layer.
21674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_->RemoveFromParent();
21684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
21694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
21704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
21714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
21724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
21734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Add the layer back to the tree.
21754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        layer_tree_host()->root_layer()->AddChild(delegated_);
21764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
21774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 4:
21784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
21794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
21804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
21814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Set a new frame. Resources should be returned.
21834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
21844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 888);
21854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 888);
21864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 777);
21874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 777);
21884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
21894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
21904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 5:
21914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
21924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        {
21934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          unsigned expected[] = {555, 999};
21944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
21954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
21964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
21974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Destroy the layer.
21994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_->RemoveFromParent();
22004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_ = NULL;
22014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 6:
22034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
22044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
22054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
22064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Destroy the frame provider. Resources should be returned.
22084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame_provider_ = NULL;
22094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
22114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        {
22124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          unsigned expected[] = {777, 888};
22134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
22144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
22154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
22164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EndTest();
22174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
22194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
22204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
22224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   bool result) OVERRIDE {
22234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnUnusedResourcesFromParent(host_impl);
22244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
22254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedRendererLayer> delegated_thief_;
22274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
22284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestRemoveAndAddToTree);
22304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostDelegatedTestRemoveAndChangeResources
22324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
22334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
22344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
22354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
22374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
22384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnedResourceArray resources;
22394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int next_source_frame_number = layer_tree_host()->source_frame_number();
22414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (next_source_frame_number) {
22424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
22434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
22444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
22454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
22464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
22474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
22484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Create a DelegatedRendererLayer using the frame.
22504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
22514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
22534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
22544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
22554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
22564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Remove the layer from the tree. The resources should not be returned
22584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // since they are still on the main thread layer.
22594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_->RemoveFromParent();
22604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
22624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
22634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
22644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
22654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Set a new frame. Resources should be returned immediately.
22674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
22684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 888);
22694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 888);
22704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 777);
22714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 777);
22724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
22734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
22754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        {
22764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          unsigned expected[] = {555, 999};
22774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
22784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
22794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          resources.clear();
22804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
22814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Destroy the frame provider.
22834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame_provider_ = NULL;
22844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
22864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
22874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
22884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Destroy the layer. Resources should be returned.
22904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_ = NULL;
22914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
22934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        {
22944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          unsigned expected[] = {777, 888};
22954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
22964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
22974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
22984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EndTest();
22994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
23004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
23014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
23024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
23044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   bool result) OVERRIDE {
23054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnUnusedResourcesFromParent(host_impl);
23064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
23074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedRendererLayer> delegated_thief_;
23094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
23104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
23124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostDelegatedTestRemoveAndChangeResources);
23134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
23152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
2316