layer_tree_host_unittest_delegated.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <algorithm>
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
9ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/bind.h"
1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/location.h"
11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/synchronization/waitable_event.h"
12424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/threading/thread.h"
13424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/time/time.h"
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/delegated_frame_provider.h"
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/delegated_frame_resource_collection.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/delegated_renderer_layer.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/delegated_renderer_layer_impl.h"
18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "cc/output/compositor_frame.h"
19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "cc/output/compositor_frame_ack.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/delegated_frame_data.h"
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "cc/quads/render_pass_draw_quad.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/shared_quad_state.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/texture_draw_quad.h"
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/resources/returned_resource.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer_impl.h"
27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "cc/test/fake_output_surface.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool ReturnedResourceLower(const ReturnedResource& a,
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                           const ReturnedResource& b) {
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return a.id < b.id;
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Tests if the list of resources matches an expectation, modulo the order.
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool ResourcesMatch(ReturnedResourceArray actual,
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    unsigned* expected,
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    size_t expected_count) {
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::sort(actual.begin(), actual.end(), ReturnedResourceLower);
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::sort(expected, expected + expected_count);
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  size_t actual_index = 0;
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // for each element of the expected array, count off one of the actual array
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // (after checking it matches).
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  for (size_t expected_index = 0; expected_index < expected_count;
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)       ++expected_index) {
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_LT(actual_index, actual.size());
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (actual_index >= actual.size())
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return false;
553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_EQ(actual[actual_index].id, expected[expected_index]);
563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (actual[actual_index].id != expected[expected_index])
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return false;
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_GT(actual[actual_index].count, 0);
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (actual[actual_index].count <= 0) {
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return false;
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    } else {
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      --actual[actual_index].count;
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      if (actual[actual_index].count == 0)
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ++actual_index;
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(actual_index, actual.size());
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return actual_index == actual.size();
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define EXPECT_RESOURCES(expected, actual) \
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_TRUE(ResourcesMatch(actual, expected, arraysize(expected)));
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These tests deal with delegated renderer layers.
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTest : public LayerTreeTest {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<DelegatedFrameData> CreateFrameData(
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const gfx::Rect& root_output_rect,
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const gfx::Rect& root_damage_rect) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame(new DelegatedFrameData);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<RenderPass> root_pass(RenderPass::Create());
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_pass->SetNew(RenderPass::Id(1, 1),
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      root_output_rect,
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      root_damage_rect,
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      gfx::Transform());
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frame->render_pass_list.push_back(root_pass.Pass());
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return frame.Pass();
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  scoped_ptr<DelegatedFrameData> CreateInvalidFrameData(
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const gfx::Rect& root_output_rect,
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const gfx::Rect& root_damage_rect) {
94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_ptr<DelegatedFrameData> frame(new DelegatedFrameData);
95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_ptr<RenderPass> root_pass(RenderPass::Create());
97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    root_pass->SetNew(RenderPass::Id(1, 1),
98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                      root_output_rect,
99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                      root_damage_rect,
100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                      gfx::Transform());
101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_ptr<SharedQuadState> shared_quad_state = SharedQuadState::Create();
103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    gfx::Rect rect = root_output_rect;
105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    gfx::Rect opaque_rect = root_output_rect;
106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // An invalid resource id! The resource isn't part of the frame.
107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    unsigned resource_id = 5;
108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    bool premultiplied_alpha = false;
109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    gfx::PointF uv_top_left = gfx::PointF(0.f, 0.f);
110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    gfx::PointF uv_bottom_right = gfx::PointF(1.f, 1.f);
111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    SkColor background_color = 0;
112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    float vertex_opacity[4] = {1.f, 1.f, 1.f, 1.f};
113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    bool flipped = false;
114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_ptr<TextureDrawQuad> invalid_draw_quad = TextureDrawQuad::Create();
116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    invalid_draw_quad->SetNew(shared_quad_state.get(),
117ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              rect,
118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              opaque_rect,
119ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              resource_id,
120ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              premultiplied_alpha,
121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              uv_top_left,
122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              uv_bottom_right,
123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              background_color,
124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              vertex_opacity,
125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              flipped);
126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    root_pass->quad_list.push_back(invalid_draw_quad.PassAs<DrawQuad>());
127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    root_pass->shared_quad_state_list.push_back(shared_quad_state.Pass());
129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    frame->render_pass_list.push_back(root_pass.Pass());
131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return frame.Pass();
132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddTransferableResource(DelegatedFrameData* frame,
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               ResourceProvider::ResourceId resource_id) {
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TransferableResource resource;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resource.id = resource_id;
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resource.mailbox_holder.texture_target = GL_TEXTURE_2D;
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLbyte arbitrary_mailbox[GL_MAILBOX_SIZE_CHROMIUM] = {
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2,
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4,
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4};
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resource.mailbox_holder.mailbox.SetName(arbitrary_mailbox);
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frame->resource_list.push_back(resource);
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddTextureQuad(DelegatedFrameData* frame,
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      ResourceProvider::ResourceId resource_id) {
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<SharedQuadState> sqs = SharedQuadState::Create();
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<TextureDrawQuad> quad = TextureDrawQuad::Create();
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float vertex_opacity[4] = { 1.f, 1.f, 1.f, 1.f };
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    quad->SetNew(sqs.get(),
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 gfx::Rect(0, 0, 10, 10),
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 gfx::Rect(0, 0, 10, 10),
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 resource_id,
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 false,
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 gfx::PointF(0.f, 0.f),
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 gfx::PointF(1.f, 1.f),
1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 SK_ColorTRANSPARENT,
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 vertex_opacity,
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 false);
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frame->render_pass_list[0]->shared_quad_state_list.push_back(sqs.Pass());
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    frame->render_pass_list[0]->quad_list.push_back(quad.PassAs<DrawQuad>());
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void AddRenderPass(DelegatedFrameData* frame,
16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     RenderPass::Id id,
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     const gfx::Rect& output_rect,
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     const gfx::Rect& damage_rect,
17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     const FilterOperations& filters,
17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     const FilterOperations& background_filters) {
17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    for (size_t i = 0; i < frame->render_pass_list.size(); ++i)
17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      DCHECK(id != frame->render_pass_list[i]->id);
17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<RenderPass> pass(RenderPass::Create());
17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    pass->SetNew(id,
17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 output_rect,
17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 damage_rect,
17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 gfx::Transform());
18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    frame->render_pass_list.push_back(pass.Pass());
18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<SharedQuadState> sqs = SharedQuadState::Create();
18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<RenderPassDrawQuad> quad = RenderPassDrawQuad::Create();
18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    quad->SetNew(sqs.get(),
18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 output_rect,
18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 id,
18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 false,  // is_replica
18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 0,  // mask_resource_id
19058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 damage_rect,
19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 gfx::Rect(0, 0, 1, 1),  // mask_uv_rect
19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 filters,
19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 background_filters);
19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    frame->render_pass_list[0]->shared_quad_state_list.push_back(sqs.Pass());
19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    frame->render_pass_list[0]->quad_list.push_back(quad.PassAs<DrawQuad>());
19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  static ResourceProvider::ResourceId AppendResourceId(
199ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      std::vector<ResourceProvider::ResourceId>* resources_in_last_sent_frame,
200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      ResourceProvider::ResourceId resource_id) {
201ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    resources_in_last_sent_frame->push_back(resource_id);
202ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return resource_id;
203ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void ReturnUnusedResourcesFromParent(LayerTreeHostImpl* host_impl) {
206ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    DelegatedFrameData* delegated_frame_data =
207ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        output_surface()->last_sent_frame().delegated_frame_data.get();
208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (!delegated_frame_data)
209ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return;
210ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
211ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    std::vector<ResourceProvider::ResourceId> resources_in_last_sent_frame;
2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    for (size_t i = 0; i < delegated_frame_data->resource_list.size(); ++i) {
2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      resources_in_last_sent_frame.push_back(
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          delegated_frame_data->resource_list[i].id);
215ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
216ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
217ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    std::vector<ResourceProvider::ResourceId> resources_to_return;
218ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
219ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const TransferableResourceArray& resources_held_by_parent =
220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        output_surface()->resources_held_by_parent();
221ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    for (size_t i = 0; i < resources_held_by_parent.size(); ++i) {
222ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      ResourceProvider::ResourceId resource_in_parent =
223ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          resources_held_by_parent[i].id;
224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      bool resource_in_parent_is_not_part_of_frame =
225ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          std::find(resources_in_last_sent_frame.begin(),
226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                    resources_in_last_sent_frame.end(),
227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                    resource_in_parent) == resources_in_last_sent_frame.end();
228ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (resource_in_parent_is_not_part_of_frame)
229ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        resources_to_return.push_back(resource_in_parent);
230ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
232ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (resources_to_return.empty())
233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return;
234ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
235ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    CompositorFrameAck ack;
236ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    for (size_t i = 0; i < resources_to_return.size(); ++i)
237ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      output_surface()->ReturnResource(resources_to_return[i], &ack);
238d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    host_impl->ReclaimResources(&ack);
239d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    host_impl->OnSwapBuffersComplete();
240ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestCaseSingleDelegatedLayer
244b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    : public LayerTreeHostDelegatedTest,
2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      public DelegatedFrameResourceCollectionClient {
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  LayerTreeHostDelegatedTestCaseSingleDelegatedLayer()
2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : resource_collection_(new DelegatedFrameResourceCollection),
2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        available_(false) {
2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    resource_collection_->SetClient(this);
2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
25268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetupTree() OVERRIDE {
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_ = Layer::Create();
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->SetAnchorPoint(gfx::PointF());
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_->SetBounds(gfx::Size(10, 10));
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host()->SetRootLayer(root_);
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostDelegatedTest::SetupTree();
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    resource_collection_->SetClient(this);
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void SetFrameData(scoped_ptr<DelegatedFrameData> frame_data) {
2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    RenderPass* root_pass = frame_data->render_pass_list.back();
2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    gfx::Size frame_size = root_pass->output_rect.size();
2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (frame_provider_.get() && frame_size == frame_provider_->frame_size()) {
2724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      frame_provider_->SetFrameData(frame_data.Pass());
2734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return;
2744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
2754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (delegated_.get()) {
2774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      delegated_->RemoveFromParent();
2784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      delegated_ = NULL;
2794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      frame_provider_ = NULL;
2804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
2814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    frame_provider_ = new DelegatedFrameProvider(resource_collection_.get(),
2834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                 frame_data.Pass());
2844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated_ = CreateDelegatedLayer(frame_provider_.get());
2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedRendererLayer> CreateDelegatedLayer(
2894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      DelegatedFrameProvider* frame_provider) {
2904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<DelegatedRendererLayer> delegated =
291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        FakeDelegatedRendererLayer::Create(frame_provider);
2924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated->SetAnchorPoint(gfx::PointF());
2934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated->SetBounds(gfx::Size(10, 10));
2944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegated->SetIsDrawable(true);
2954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    root_->AddChild(delegated);
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return delegated;
2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void AfterTest() OVERRIDE { resource_collection_->SetClient(NULL); }
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (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)
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestCreateChildId
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostDelegatedTestCreateChildId()
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(),
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        num_activates_(0),
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        did_reset_child_id_(false) {}
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (TestEnded())
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
3304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)));
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() < 1)
3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return;
3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestContextProvider* context_provider = static_cast<TestContextProvider*>(
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        host_impl->output_surface()->context_provider().get());
343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++num_activates_;
345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (num_activates_) {
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(delegated_impl->ChildId());
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_FALSE(did_reset_child_id_);
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        context_provider->ContextGL()->LoseContextCHROMIUM(
3513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            GL_GUILTY_CONTEXT_RESET_ARB,
3523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            GL_INNOCENT_CONTEXT_RESET_ARB);
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        context_provider->ContextGL()->Flush();
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 3:
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(delegated_impl->ChildId());
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(did_reset_child_id_);
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void InitializedRendererOnThread(LayerTreeHostImpl* host_impl,
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           bool success) OVERRIDE {
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(success);
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (num_activates_ < 2)
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2, num_activates_);
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(delegated_impl->ChildId());
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    did_reset_child_id_ = true;
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_activates_;
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool did_reset_child_id_;
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestCreateChildId);
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test that we can gracefully handle invalid frames after the context was lost.
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// For example, we might be trying to use the previous frame in that case and
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// have to make sure we don't crash because our resource accounting goes wrong.
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostDelegatedTestInvalidFrameAfterContextLost
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LayerTreeHostDelegatedTestInvalidFrameAfterContextLost()
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : num_activates_(0), num_output_surfaces_initialized_(0) {}
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void DidCommit() OVERRIDE {
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (TestEnded())
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame1 =
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    AddTextureQuad(frame1.get(), 999);
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    AddTransferableResource(frame1.get(), 999);
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetFrameData(frame1.Pass());
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!num_output_surfaces_initialized_++)
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_refptr<DelegatedRendererLayer> old_delegated = delegated_;
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetFrameData(
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        CreateInvalidFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)));
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Make sure we end up using the same layer, or we won't test the right
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // thing, which is to make sure we can handle an invalid frame when using
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // a stale layer from before the context was lost.
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DCHECK(delegated_.get() == old_delegated.get());
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() < 1)
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestContextProvider* context_provider = static_cast<TestContextProvider*>(
4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        host_impl->output_surface()->context_provider().get());
4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ++num_activates_;
4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (num_activates_) {
4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 2:
4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        context_provider->ContextGL()->LoseContextCHROMIUM(
4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            GL_GUILTY_CONTEXT_RESET_ARB,
4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            GL_INNOCENT_CONTEXT_RESET_ARB);
4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 3:
4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EndTest();
4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void InitializedRendererOnThread(LayerTreeHostImpl* host_impl,
4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                           bool success) OVERRIDE {
4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(success);
4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (num_activates_ < 2)
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(2, num_activates_);
4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Resources should have gotten cleared after the context was lost.
4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(0U, delegated_impl->Resources().size());
4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void AfterTest() OVERRIDE {
4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    LayerTreeHostDelegatedTestCaseSingleDelegatedLayer::AfterTest();
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(2, num_output_surfaces_initialized_);
4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected:
4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int num_activates_;
4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int num_output_surfaces_initialized_;
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    LayerTreeHostDelegatedTestInvalidFrameAfterContextLost);
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
46758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LayerTreeHostDelegatedTestOffscreenContext_NoFilters
46858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
46958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
47058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
47158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame =
47258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1),
47358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        gfx::Rect(0, 0, 1, 1));
4744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(frame.Pass());
47558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
47658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
47758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
47858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
47958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
48058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_FALSE(host_impl->offscreen_context_provider());
48158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EndTest();
48258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
48358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
48458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
48558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
48658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostDelegatedTestOffscreenContext_NoFilters);
48758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
48858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LayerTreeHostDelegatedTestOffscreenContext_Filters
48958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
49058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
49158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
49258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame =
49358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1),
49458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        gfx::Rect(0, 0, 1, 1));
49558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
49658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    FilterOperations filters;
49758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f));
49858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    AddRenderPass(frame.get(),
49958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  RenderPass::Id(2, 1),
50058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  gfx::Rect(0, 0, 1, 1),
50158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  gfx::Rect(0, 0, 1, 1),
50258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  filters,
50358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  FilterOperations());
5044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(frame.Pass());
50558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
50658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
50758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
50858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
50958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
51058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool expect_context = !delegating_renderer();
51158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(expect_context, !!host_impl->offscreen_context_provider());
51258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EndTest();
51358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
51458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
51558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
51658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
51758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostDelegatedTestOffscreenContext_Filters);
51858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
51958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LayerTreeHostDelegatedTestOffscreenContext_BackgroundFilters
52058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
52158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
52258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
52358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame =
52458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1),
52558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        gfx::Rect(0, 0, 1, 1));
52658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
52758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    FilterOperations filters;
52858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f));
52958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    AddRenderPass(frame.get(),
53058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  RenderPass::Id(2, 1),
53158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  gfx::Rect(0, 0, 1, 1),
53258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  gfx::Rect(0, 0, 1, 1),
53358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  FilterOperations(),
53458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  filters);
5354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(frame.Pass());
53658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
53758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
53858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
53958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
54058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
54158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool expect_context = !delegating_renderer();
54258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(expect_context, !!host_impl->offscreen_context_provider());
54358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EndTest();
54458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
54558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
54658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
54758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
54858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostDelegatedTestOffscreenContext_BackgroundFilters);
54958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
55058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LayerTreeHostDelegatedTestOffscreenContext_Filters_AddedToTree
55158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
55258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
55358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
5544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame_no_filters =
5554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
5564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame_with_filters =
5584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
55958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
56058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    FilterOperations filters;
56158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f));
5624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    AddRenderPass(frame_with_filters.get(),
56358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  RenderPass::Id(2, 1),
56458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  gfx::Rect(0, 0, 1, 1),
56558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  gfx::Rect(0, 0, 1, 1),
56658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  filters,
56758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  FilterOperations());
56858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(frame_no_filters.Pass());
57058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    delegated_->RemoveFromParent();
5714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(frame_with_filters.Pass());
57258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    layer_tree_host()->root_layer()->AddChild(delegated_);
57358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
57458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
57558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
57658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
57758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
57858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool expect_context = !delegating_renderer();
57958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(expect_context, !!host_impl->offscreen_context_provider());
58058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EndTest();
58158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
58258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
58358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
58458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
58558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    LayerTreeHostDelegatedTestOffscreenContext_Filters_AddedToTree);
58658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestLayerUsesFrameDamage
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostDelegatedTestLayerUsesFrameDamage()
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(),
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        first_draw_for_source_frame_(true) {}
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
595bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The first time the layer gets a frame the whole layer should be
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // damaged.
6004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
6014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)));
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
6044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // A different frame size will damage the whole layer.
6054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
6064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(0, 0, 0, 0)));
6074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
6084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should create a total amount of gfx::Rect(2, 2, 10, 6) damage.
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The frame size is 20x20 while the layer is 10x10, so this should
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // produce a gfx::Rect(1, 1, 5, 3) damage rect.
6124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
6134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(2, 2, 5, 5)));
6144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
6154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(7, 2, 5, 6)));
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 4:
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should create zero damage.
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 5:
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should damage the full viewport.
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delegated_->SetBounds(gfx::Size(2, 2));
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 6:
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should create zero damage.
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 7:
6304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Should damage the full layer, tho the frame size is not changing.
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delegated_->SetBounds(gfx::Size(6, 6));
6324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
6334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(1, 1, 2, 2)));
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 8:
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should create zero damage.
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 9:
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should damage the full layer.
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delegated_->SetDisplaySize(gfx::Size(10, 10));
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 10:
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should create zero damage.
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 11:
6484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Changing the frame size damages the full layer.
6494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
6504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 5, 5), gfx::Rect(4, 4, 1, 1)));
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 12:
653ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // An invalid frame isn't used, so it should not cause damage.
6544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(CreateInvalidFrameData(gfx::Rect(0, 0, 5, 5),
6554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                            gfx::Rect(4, 4, 1, 1)));
656ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        break;
6574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 13:
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should create gfx::Rect(1, 1, 2, 2) of damage. The frame size is
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // 5x5 and the display size is now set to 10x10, so this should result
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // in a gfx::Rect(2, 2, 4, 4) damage rect.
6614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
6624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 5, 5), gfx::Rect(1, 1, 2, 2)));
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 14:
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should create zero damage.
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 15:
669d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        // Moving the layer out of the tree and back in will damage the whole
670d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        // impl layer.
671d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        delegated_->RemoveFromParent();
672d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        layer_tree_host()->root_layer()->AddChild(delegated_);
673d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        break;
6744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 16:
675d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        // Make a larger frame with lots of damage. Then a frame smaller than
676d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        // the first frame's damage. The entire layer should be damaged, but
677d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        // nothing more.
6784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
6794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(0, 0, 10, 10)));
6804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
6814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 5, 5), gfx::Rect(1, 1, 2, 2)));
682d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        break;
6834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 17:
6844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Make a frame with lots of damage. Then replace it with a frame with
6854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // no damage. The entire layer should be damaged, but nothing more.
6864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
6874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(0, 0, 10, 10)));
6884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
6894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(0, 0, 0, 0)));
690d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        break;
6914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 18:
6924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Make another layer that uses the same frame provider. The new layer
6934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // should be damaged.
6944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_copy_ = CreateDelegatedLayer(frame_provider_);
6954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_copy_->SetPosition(gfx::Point(5, 0));
6964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Also set a new frame.
6984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
6994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(4, 0, 1, 1)));
7004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
7014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 19:
7024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Set another new frame, both layers should be damaged in the same
7034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // ways.
7044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(
7054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(3, 3, 1, 1)));
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    first_draw_for_source_frame_ = true;
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread(
7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl* host_impl,
7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerTreeHostImpl::FrameData* frame,
7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE {
7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(DrawSwapReadbackResult::DRAW_SUCCESS, draw_result);
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!first_draw_for_source_frame_)
7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return draw_result;
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::RectF damage_rect;
720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!frame->has_no_damage) {
721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      damage_rect = frame->render_passes.back()->damage_rect;
722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // If there is no damage, then we have no render passes to send.
724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_TRUE(frame->render_passes.empty());
725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (host_impl->active_tree()->source_frame_number()) {
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 0:
729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // First frame is damaged because of viewport resize.
730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
7384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 3:
7424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(1.f, 1.f, 5.f, 3.f).ToString(),
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 4:
7464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 5:
7504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 6:
7544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 7:
7584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 8:
7624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 9:
7664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 10:
7704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 11:
7744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 12:
7784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 13:
7824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(2.f, 2.f, 4.f, 4.f).ToString(),
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 14:
7864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
787ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                  damage_rect.ToString());
788ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        break;
789ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      case 15:
7904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  damage_rect.ToString());
792d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        break;
793d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      case 16:
7944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
795d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                  damage_rect.ToString());
796d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        break;
797d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      case 17:
7984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
799d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                  damage_rect.ToString());
800d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        break;
801d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      case 18:
8024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::UnionRects(gfx::RectF(5.f, 0.f, 10.f, 10.f),
8034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                  gfx::RectF(4.f, 0.f, 1.f, 1.f)).ToString(),
8044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  damage_rect.ToString());
8054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
8064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 19:
8074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(gfx::RectF(3.f, 3.f, 6.f, 1.f).ToString(),
808d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                  damage_rect.ToString());
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return draw_result;
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
8174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedRendererLayer> delegated_copy_;
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool first_draw_for_source_frame_;
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestLayerUsesFrameDamage);
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestMergeResources
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Push two frames to the delegated renderer layer with no commit between.
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The first frame has resource 999.
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame1 =
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTextureQuad(frame1.get(), 999);
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTransferableResource(frame1.get(), 999);
8344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(frame1.Pass());
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The second frame uses resource 999 still, but also adds 555.
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame2 =
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTextureQuad(frame2.get(), 999);
8403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    AddTransferableResource(frame2.get(), 999);
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTextureQuad(frame2.get(), 555);
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTransferableResource(frame2.get(), 555);
8434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(frame2.Pass());
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // The resource 999 from frame1 is returned since it is still on the main
8463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // thread.
8473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray returned_resources;
8484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    resource_collection_->TakeUnusedResourcesForChildCompositor(
8494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        &returned_resources);
8503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    {
8513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      unsigned expected[] = {999};
8523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      EXPECT_RESOURCES(expected, returned_resources);
85368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      EXPECT_TRUE(TestAndResetAvailable());
8543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
8553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Both frames' resources should be in the parent's resource provider.
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2u, map.size());
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(999));
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(555));
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2u, delegated_impl->Resources().size());
87468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(999));
87568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(555));
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EndTest();
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestMergeResources);
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestRemapResourcesInQuads
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Generate a frame with two resources in it.
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame =
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTextureQuad(frame.get(), 999);
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTransferableResource(frame.get(), 999);
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTextureQuad(frame.get(), 555);
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTransferableResource(frame.get(), 555);
8944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(frame.Pass());
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The frame's resource should be in the parent's resource provider.
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2u, map.size());
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(999));
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(555));
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResourceProvider::ResourceId parent_resource_id1 = map.find(999)->second;
914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_NE(parent_resource_id1, 999u);
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResourceProvider::ResourceId parent_resource_id2 = map.find(555)->second;
916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_NE(parent_resource_id2, 555u);
9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The resources in the quads should be remapped to the parent's namespace.
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast(
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delegated_impl->RenderPassesInDrawOrder()[0]->quad_list[0]);
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(parent_resource_id1, quad1->resource_id);
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const TextureDrawQuad* quad2 = TextureDrawQuad::MaterialCast(
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delegated_impl->RenderPassesInDrawOrder()[0]->quad_list[1]);
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(parent_resource_id2, quad2->resource_id);
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EndTest();
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestRemapResourcesInQuads);
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestReturnUnusedResources
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
939ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
9413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
943bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Generate a frame with two resources in it.
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
9524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // All of the resources are in use.
9564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
95868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Keep using 999 but stop using 555.
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
96368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        AddTransferableResource(frame.get(), 999);
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 444);
9664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
96868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 3:
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // 555 is no longer in use.
9704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
9713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
9723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {555};
9733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
97468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
9753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Stop using any resources.
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
9794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
98168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 4:
982ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // Postpone collecting resources for a frame. They should still be there
983ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // the next frame.
984ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        layer_tree_host()->SetNeedsCommit();
985ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        return;
98668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 5:
98768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // 444 and 999 are no longer in use. We sent two refs to 999, so we
98868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // should get two back.
9894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
9903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
99168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          unsigned expected[] = {444, 999, 999};
9923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
99368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
99968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Resources are never immediately released.
10003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray empty_resources;
10014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    resource_collection_->TakeUnusedResourcesForChildCompositor(
10024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        &empty_resources);
100368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(0u, empty_resources.size());
100468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_FALSE(TestAndResetAvailable());
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1007ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
1008ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                   bool result) OVERRIDE {
1009ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ReturnUnusedResourcesFromParent(host_impl);
1010ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1013ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_TEST_F(
1014a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    LayerTreeHostDelegatedTestReturnUnusedResources);
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestReusedResources
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1023ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
10253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1027bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Generate a frame with some resources in it.
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 444);
10384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // All of the resources are in use.
10424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
104468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Keep using 999 but stop using 555 and 444.
10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
104968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        AddTransferableResource(frame.get(), 999);
10504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Resource are not immediately released.
10534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
105568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Now using 555 and 444 again, but not 999.
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
106068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        AddTransferableResource(frame.get(), 555);
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
106268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        AddTransferableResource(frame.get(), 444);
10634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
106568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 3:
106668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // The 999 resource is the only unused one. Two references were sent, so
106768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // two should be returned.
10684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
10693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
107068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          unsigned expected[] = {999, 999};
10713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
107268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
10733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1079ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
1080ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                   bool result) OVERRIDE {
1081ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ReturnUnusedResourcesFromParent(host_impl);
1082ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1085ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestReusedResources);
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestFrameBeforeAck
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1094ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
10963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1098bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Generate a frame with some resources in it.
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 444);
11094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // All of the resources are in use.
11134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
111568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Keep using 999 but stop using 555 and 444.
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
112068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        AddTransferableResource(frame.get(), 999);
11214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Resource are not immediately released.
11244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
112668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The parent compositor (this one) does a commit.
11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
113068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 3:
11314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
11323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
11333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {444, 555};
11343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
113568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
113868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // The child compositor sends a frame referring to resources not in the
113968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        // frame.
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
11444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
115068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() != 3)
11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The bad frame should be dropped. So we should only have one quad (the
11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // one with resource 999) on the impl tree. And only 999 will be present
11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // in the parent's resource provider.
11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.size());
11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(999));
11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().size());
116868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(999));
11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0];
11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, pass->quad_list.size());
11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const TextureDrawQuad* quad = TextureDrawQuad::MaterialCast(
11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pass->quad_list[0]);
11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(map.find(999)->second, quad->resource_id);
11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EndTest();
11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
1180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                   bool result) OVERRIDE {
1181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ReturnUnusedResourcesFromParent(host_impl);
1182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestFrameBeforeAck);
11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestFrameBeforeTakeResources
11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
11963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1198bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Generate a frame with some resources in it.
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 444);
12094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // All of the resources are in use.
12134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
121568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Keep using 999 but stop using 555 and 444.
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
12203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 999);
12214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Resource are not immediately released.
12244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
122668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The parent compositor (this one) does a commit.
12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
123068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 3:
12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The child compositor sends a frame before taking resources back
12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // from the previous commit. This frame makes use of the resources 555
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // and 444, which were just released during commit.
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
12363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 999);
12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
12383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 555);
12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
12403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 444);
12414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // The resources are used by the new frame but are returned anyway since
12443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // we passed them again.
12454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
12463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
12473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {444, 555};
12483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
124968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
12503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
125268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 4:
12534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
125568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
126268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() != 3)
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The third frame has all of the resources in it again, the delegated
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // renderer layer should continue to own the resources for it.
12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(3u, map.size());
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(999));
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(555));
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(444));
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(3u, delegated_impl->Resources().size());
128168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(999));
128268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(555));
128368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(444));
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0];
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(3u, pass->quad_list.size());
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast(
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pass->quad_list[0]);
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(map.find(999)->second, quad1->resource_id);
12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const TextureDrawQuad* quad2 = TextureDrawQuad::MaterialCast(
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pass->quad_list[1]);
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(map.find(555)->second, quad2->resource_id);
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const TextureDrawQuad* quad3 = TextureDrawQuad::MaterialCast(
12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pass->quad_list[2]);
12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(map.find(444)->second, quad3->resource_id);
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1298ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
1299ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                   bool result) OVERRIDE {
1300ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ReturnUnusedResourcesFromParent(host_impl);
1301ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1304ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_TEST_F(
1305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerTreeHostDelegatedTestFrameBeforeTakeResources);
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestBadFrame
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1314ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
13163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1318bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Generate a frame with some resources in it.
13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
13274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // All of the resources are in use.
13314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
133368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Generate a bad frame with a resource the layer doesn't have. The
13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // 885 and 775 resources are unknown, while ownership of the legit 444
13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // resource is passed in here. The bad frame does not use any of the
13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // previous resources, 999 or 555.
13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // A bad quad is present both before and after the good quad.
13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 885);
13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 444);
13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 775);
13454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The parent compositor (this one) does a commit.
13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
134968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 3:
13504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
13514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
13524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
13534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
13544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Now send a good frame with 999 again.
13554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
13564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
13574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
13584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The bad frame's resource is given back to the child compositor.
13604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
13613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
13623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {444};
13633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
136468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
13653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
136768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 4:
13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The unused 555 from the last good frame is now released.
13694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
13703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
13713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {555};
13723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
137368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
13743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
1382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                   bool result) OVERRIDE {
13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() < 1)
13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1386ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ReturnUnusedResourcesFromParent(host_impl);
1387ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (host_impl->active_tree()->source_frame_number()) {
13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1: {
13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // We have the first good frame with just 990 and 555 in it.
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // layer.
14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, map.size());
14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(999));
14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, delegated_impl->Resources().size());
140568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(999));
140668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(555));
14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0];
14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, pass->quad_list.size());
14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast(
14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            pass->quad_list[0]);
14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(map.find(999)->second, quad1->resource_id);
14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const TextureDrawQuad* quad2 = TextureDrawQuad::MaterialCast(
14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            pass->quad_list[1]);
14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(map.find(555)->second, quad2->resource_id);
14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
141868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 2: {
14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // We only keep resources from the last valid frame.
14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, map.size());
14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(999));
14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, delegated_impl->Resources().size());
142568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(999));
142668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(555));
14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The bad frame is dropped though, we still have the frame with 999 and
14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // 555 in it.
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0];
14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, pass->quad_list.size());
14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast(
14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            pass->quad_list[0]);
14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(map.find(999)->second, quad1->resource_id);
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const TextureDrawQuad* quad2 = TextureDrawQuad::MaterialCast(
14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            pass->quad_list[1]);
14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(map.find(555)->second, quad2->resource_id);
14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
144068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      case 3: {
14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // We have the new good frame with just 999 in it.
14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.size());
14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(999));
14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().size());
144668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(999));
14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0];
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, pass->quad_list.size());
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast(
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            pass->quad_list[0]);
14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(map.find(999)->second, quad1->resource_id);
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1459ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestBadFrame);
14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestUnnamedResource
14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
14703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1472bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // This frame includes two resources in it, but only uses one.
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
14804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
14834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
14844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
14854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
14864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
14874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Now send an empty frame.
14884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
14894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
14904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The unused resource should be returned.
14924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
14933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
14943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {999};
14953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
149668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
14973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() != 1)
15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The layer only held on to the resource that was used.
15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.size());
15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(555));
15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().size());
152168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(555));
15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestUnnamedResource);
15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestDontLeakResource
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
153468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
15363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1538bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // This frame includes two resources in it.
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
15474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // But then we immediately stop using 999.
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
15523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 555);
15534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
15563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // The unused resources should be returned. 555 is still used, but it's
15573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // returned once to account for the first frame.
15584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
15593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
15603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {555, 999};
15613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
156268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
15633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
15643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // Send a frame with no resources in it.
15653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
15664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
15673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        break;
15683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case 3:
15693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // The now unused resource 555 should be returned.
15703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        resources.clear();
15714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
15723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
15733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {555};
15743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
157568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
15763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() != 1)
15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The layer only held on to the resource that was used.
15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.size());
15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, map.count(555));
15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().size());
159968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1u, delegated_impl->Resources().count(555));
16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
16033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                   bool result) OVERRIDE {
16043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnUnusedResourcesFromParent(host_impl);
16053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestDontLeakResource);
16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestResourceSentToParent
16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1613ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual void DidCommitAndDrawFrame() OVERRIDE {
16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
16153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1617bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // This frame includes two resources in it.
16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
16264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
16294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
163168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // 999 is in use in the grandparent compositor, generate a frame without
16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // it present.
16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
163768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        AddTransferableResource(frame.get(), 555);
16384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 3:
16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Since 999 is in the grandparent it is not returned.
16424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
164468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1646ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // The impl side will get back the resource at some point.
164768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        ImplThreadTaskRunner()->PostTask(FROM_HERE,
164868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                         receive_resource_on_thread_);
16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
165068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
165168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
165368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void ReceiveResourceOnThread(LayerTreeHostImpl* host_impl) {
165468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
165568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
165668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
165768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
165868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
165968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
166068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            delegated_impl->ChildId());
166168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
166268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Receive 999 back from the grandparent.
166368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    CompositorFrameAck ack;
166468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    output_surface()->ReturnResource(map.find(999)->second, &ack);
166568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    host_impl->ReclaimResources(&ack);
166668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    host_impl->OnSwapBuffersComplete();
166768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
166868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
166968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void UnusedResourcesAreAvailable() OVERRIDE {
167068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(3, layer_tree_host()->source_frame_number());
167168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
167268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ReturnedResourceArray resources;
167368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
167468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // 999 was returned from the grandparent and could be released.
16754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
167668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    {
167768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      unsigned expected[] = {999};
167868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      EXPECT_RESOURCES(expected, resources);
16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
168068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
168168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EndTest();
16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() < 1)
16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (host_impl->active_tree()->source_frame_number()) {
16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1: {
16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, map.size());
16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(999));
17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
17012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, delegated_impl->Resources().size());
170368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(999));
170468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(555));
17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1706ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // The 999 resource will be sent to a grandparent compositor.
17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2: {
17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, map.size());
17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(999));
17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1714ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // 999 is in the parent, so not held by delegated renderer layer.
17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().size());
171668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(555));
17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
171868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        receive_resource_on_thread_ =
171968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            base::Bind(&LayerTreeHostDelegatedTestResourceSentToParent::
172068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                            ReceiveResourceOnThread,
172168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                       base::Unretained(this),
172268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                       host_impl);
17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 3:
17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // 999 should be released.
17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.size());
17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().size());
17312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second));
1732ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        break;
17332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
17342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
17352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
173668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::Closure receive_resource_on_thread_;
17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1739ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_DELEGATING_RENDERER_TEST_F(
1740ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    LayerTreeHostDelegatedTestResourceSentToParent);
17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestCommitWithoutTake
17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BeginTest() OVERRIDE {
17462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Prevent drawing with resources that are sent to the grandparent.
1747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_tree_host()->SetViewportSize(gfx::Size());
17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostSetNeedsCommitToMainThread();
17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidCommit() OVERRIDE {
17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
17533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ReturnedResourceArray resources;
17542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1755bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    int next_source_frame_number = layer_tree_host()->source_frame_number();
17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (next_source_frame_number) {
17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 444);
17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTransferableResource(frame.get(), 444);
17654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
17684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
177068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Stop using 999 and 444 in this frame and commit.
17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
17753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 555);
17764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
17773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // 999 and 444 will be returned for frame 1, but not 555 since it's in
17783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // the current frame.
17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 3:
17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Don't take resources here, but set a new frame that uses 999 again.
17822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
17832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
17843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 999);
17852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
17863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddTransferableResource(frame.get(), 555);
17874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 4:
17903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // 555 from frame 1 and 2 isn't returned since it's still in use. 999
17913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // from frame 1 is returned though.
17924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
17933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
17943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {444, 999};
17953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
179668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
17973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
17983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
17993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
18004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
18013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // 555 will be returned 3 times for frames 1 2 and 3, and 999 will be
18023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        // returned once for frame 3.
18033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        break;
18043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case 5:
18054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
18063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        {
18073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          unsigned expected[] = {555, 555, 555, 999};
18083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
180968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
18103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (host_impl->active_tree()->source_frame_number() < 1)
18192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_impl = host_impl->active_tree()->root_layer();
18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeDelegatedRendererLayerImpl* delegated_impl =
18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
18242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResourceProvider::ResourceIdMap& map =
18262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_impl->resource_provider()->GetChildToParentMap(
18272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            delegated_impl->ChildId());
18282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (host_impl->active_tree()->source_frame_number()) {
18302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 1:
18312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(3u, map.size());
18322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(999));
18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(444));
18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(3u, delegated_impl->Resources().size());
183768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(999));
183868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(555));
183968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(444));
18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 2:
18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.size());
18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().size());
184668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(555));
18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case 3:
18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, map.size());
18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(999));
18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1u, map.count(555));
18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, delegated_impl->Resources().size());
185468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(999));
185568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        EXPECT_EQ(1u, delegated_impl->Resources().count(555));
18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestCommitWithoutTake);
18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1862424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class DelegatedFrameIsActivatedDuringCommit
1863424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
1864424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) protected:
18655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DelegatedFrameIsActivatedDuringCommit() : returned_resource_count_(0) {}
1866424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1867424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void BeginTest() OVERRIDE {
1868424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    activate_count_ = 0;
1869424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1870424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame =
1871424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1872424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    AddTextureQuad(frame.get(), 999);
1873424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    AddTransferableResource(frame.get(), 999);
18744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SetFrameData(frame.Pass());
1875424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1876424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    PostSetNeedsCommitToMainThread();
1877424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
1878424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1879424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1880424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    ++activate_count_;
1881424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
1882424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
18835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void DidCommit() OVERRIDE {
18845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (layer_tree_host()->source_frame_number()) {
1885424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      case 1: {
1886424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // The first frame has been activated. Set a new frame, and
1887424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // expect the next commit to finish *after* it is activated.
1888424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        scoped_ptr<DelegatedFrameData> frame =
1889424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
1890424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        AddTextureQuad(frame.get(), 555);
1891424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        AddTransferableResource(frame.get(), 555);
18924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
1893424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        break;
1894424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      }
1895424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      case 2:
1896424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // The second frame has been activated. Remove the layer from
1897424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // the tree to cause another commit/activation. The commit should
1898424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // finish *after* the layer is removed from the active tree.
1899424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        delegated_->RemoveFromParent();
19005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
19015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case 3:
19025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Finish the test by releasing resources on the next frame.
19035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        scoped_ptr<DelegatedFrameData> frame =
19045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
19055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        SetFrameData(frame.Pass());
1906424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        break;
1907424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
1908424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
1909424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
19105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
19115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (host_impl->active_tree()->source_frame_number()) {
1912424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      case 2: {
1913424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // The activate for the 2nd frame should have happened before now.
1914424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        EXPECT_EQ(2, activate_count_);
1915424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        break;
1916424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      }
1917424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      case 3: {
1918424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        // The activate to remove the layer should have happened before now.
1919424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        EXPECT_EQ(3, activate_count_);
1920424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        break;
1921424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      }
1922424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
1923424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
1924424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1925f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
1926f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                   bool result) OVERRIDE {
1927f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ReturnUnusedResourcesFromParent(host_impl);
1928f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1929f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1930f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void UnusedResourcesAreAvailable() OVERRIDE {
1931f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    LayerTreeHostDelegatedTestCaseSingleDelegatedLayer::
1932f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        UnusedResourcesAreAvailable();
1933f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ReturnedResourceArray resources;
1934f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
1935f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_TRUE(TestAndResetAvailable());
1936f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    returned_resource_count_ += resources.size();
1937f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (returned_resource_count_ == 2)
1938f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EndTest();
1939f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1940f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1941424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  int activate_count_;
1942f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  size_t returned_resource_count_;
1943424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
1944424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1945424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
1946424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DelegatedFrameIsActivatedDuringCommit);
1947424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
19484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostDelegatedTestTwoImplLayers
19494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
19504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
19514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
19524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
19544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
19554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnedResourceArray resources;
19564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int next_source_frame_number = layer_tree_host()->source_frame_number();
19584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (next_source_frame_number) {
19594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
19604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
19614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
19624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
19634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
19644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
19654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
19664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
19674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
19684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
19694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
19704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
19714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Remove the delegated layer and replace it with a new one. Use the
19734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // same frame and resources for it.
19744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_->RemoveFromParent();
19754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_ = CreateDelegatedLayer(frame_provider_.get());
19764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
19774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
19784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
19794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
19804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
19814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Use a frame with no resources in it.
19834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
19844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
19854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
19864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 4:
19874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // We gave one frame to the frame provider, so we should get one
19884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // ref back for each resource.
19894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
19904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        {
19914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          unsigned expected[] = {555, 999};
19924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
19934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
19944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
19954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EndTest();
19964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
19974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
19984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
19994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
20014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   bool result) OVERRIDE {
20024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnUnusedResourcesFromParent(host_impl);
20034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
20044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
20054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestTwoImplLayers);
20074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostDelegatedTestTwoImplLayersTwoFrames
20094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
20104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
20114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
20124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
20144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
20154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnedResourceArray resources;
20164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int next_source_frame_number = layer_tree_host()->source_frame_number();
20184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (next_source_frame_number) {
20194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
20204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
20214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
20224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
20234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
20244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
20254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
20264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
20274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
20284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
20294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
20304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
20314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
20334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
20344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
20354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
20364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
20374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Remove the delegated layer and replace it with a new one. Make a new
20394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // frame but with the same resources for it.
20404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_->RemoveFromParent();
20414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_ = NULL;
20424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame_provider_->SetFrameData(frame.Pass());
20444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_ = CreateDelegatedLayer(frame_provider_.get());
20454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
20464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
20474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
20484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
20494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
20504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Use a frame with no resources in it.
20524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
20534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
20544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
20554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 4:
20564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // We gave two frames to the frame provider, so we should get two
20574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // refs back for each resource.
20584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
20594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        {
20604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          unsigned expected[] = {555, 555, 999, 999};
20614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
20624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
20634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
20644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EndTest();
20654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
20664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
20674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
20684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
20704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   bool result) OVERRIDE {
20714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnUnusedResourcesFromParent(host_impl);
20724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
20734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
20744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
20764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostDelegatedTestTwoImplLayersTwoFrames);
20774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostDelegatedTestTwoLayers
20794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
20804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
20814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
20824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
20844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
20854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnedResourceArray resources;
20864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int next_source_frame_number = layer_tree_host()->source_frame_number();
20884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (next_source_frame_number) {
20894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
20904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
20914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
20924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
20934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
20944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
20954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Create a DelegatedRendererLayer using the frame.
20974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
20984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
20994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
21004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Create a second DelegatedRendererLayer using the same frame provider.
21014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_thief_ = CreateDelegatedLayer(frame_provider_.get());
21024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        root_->AddChild(delegated_thief_);
21034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // And drop our ref on the frame provider so only the layers keep it
21054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // alive.
21064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame_provider_ = NULL;
21074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
21084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
21094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
21104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
21114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
21124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Remove one delegated layer from the tree. No resources should be
21144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // returned yet.
21154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_->RemoveFromParent();
21164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
21174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 4:
21184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
21194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
21204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
21214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Put the first layer back, and remove the other layer and destroy it.
21234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // No resources should be returned yet.
21244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        root_->AddChild(delegated_);
21254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_thief_->RemoveFromParent();
21264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_thief_ = NULL;
21274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
21284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 5:
21294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
21304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
21314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
21324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Remove the first layer from the tree again. The resources are still
21344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // held by the main thread layer.
21354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_->RemoveFromParent();
21364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
21374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 6:
21384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
21394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
21404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
21414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Destroy the layer and the resources should be returned immediately.
21434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_ = NULL;
21444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
21464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        {
21474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          unsigned expected[] = {555, 999};
21484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
21494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
21504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
21514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EndTest();
21524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
21534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
21544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
21554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
21574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   bool result) OVERRIDE {
21584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnUnusedResourcesFromParent(host_impl);
21594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
21604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedRendererLayer> delegated_thief_;
21624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
21634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestTwoLayers);
21654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostDelegatedTestRemoveAndAddToTree
21674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
21684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
21694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
21704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
21724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
21734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnedResourceArray resources;
21744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int next_source_frame_number = layer_tree_host()->source_frame_number();
21764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (next_source_frame_number) {
21774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
21784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
21794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
21804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
21814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
21824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
21834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Create a DelegatedRendererLayer using the frame.
21854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
21864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
21874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
21884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
21894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
21904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
21914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Remove the layer from the tree. The resources should not be returned
21934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // since they are still on the main thread layer.
21944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_->RemoveFromParent();
21954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
21964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
21974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
21984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
21994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
22004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Add the layer back to the tree.
22024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        layer_tree_host()->root_layer()->AddChild(delegated_);
22034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 4:
22054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
22064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
22074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
22084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Set a new frame. Resources should be returned.
22104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
22114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 888);
22124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 888);
22134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 777);
22144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 777);
22154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
22164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 5:
22184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
22194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        {
22204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          unsigned expected[] = {555, 999};
22214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
22224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
22234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
22244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Destroy the layer.
22264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_->RemoveFromParent();
22274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_ = NULL;
22284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 6:
22304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
22314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
22324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
22334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Destroy the frame provider. Resources should be returned.
22354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame_provider_ = NULL;
22364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
22384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        {
22394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          unsigned expected[] = {777, 888};
22404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
22414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
22424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
22434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EndTest();
22444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
22464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
22474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
22494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   bool result) OVERRIDE {
22504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnUnusedResourcesFromParent(host_impl);
22514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
22524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedRendererLayer> delegated_thief_;
22544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
22554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestRemoveAndAddToTree);
22574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostDelegatedTestRemoveAndChangeResources
22594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
22604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
22614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
22624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {
22644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<DelegatedFrameData> frame;
22654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnedResourceArray resources;
22664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int next_source_frame_number = layer_tree_host()->source_frame_number();
22684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    switch (next_source_frame_number) {
22694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 1:
22704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
22714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 999);
22724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 999);
22734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 555);
22744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 555);
22754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Create a DelegatedRendererLayer using the frame.
22774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
22784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 2:
22804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
22814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
22824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
22834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Remove the layer from the tree. The resources should not be returned
22854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // since they are still on the main thread layer.
22864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_->RemoveFromParent();
22874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
22884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      case 3:
22894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
22904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
22914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
22924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Set a new frame. Resources should be returned immediately.
22944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
22954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 888);
22964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 888);
22974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTextureQuad(frame.get(), 777);
22984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddTransferableResource(frame.get(), 777);
22994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SetFrameData(frame.Pass());
23004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
23024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        {
23034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          unsigned expected[] = {555, 999};
23044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
23054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
23064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          resources.clear();
23074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
23084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Destroy the frame provider.
23104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        frame_provider_ = NULL;
23114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
23134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_EQ(0u, resources.size());
23144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EXPECT_FALSE(TestAndResetAvailable());
23154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Destroy the layer. Resources should be returned.
23174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        delegated_ = NULL;
23184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
23204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        {
23214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          unsigned expected[] = {777, 888};
23224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_RESOURCES(expected, resources);
23234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EXPECT_TRUE(TestAndResetAvailable());
23244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
23254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        EndTest();
23264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        break;
23274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
23284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
23294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl,
23314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   bool result) OVERRIDE {
23324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ReturnUnusedResourcesFromParent(host_impl);
23334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
23344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<DelegatedRendererLayer> delegated_thief_;
23364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
23374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(
23394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LayerTreeHostDelegatedTestRemoveAndChangeResources);
23404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
23422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
2343