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