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