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()); 8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) root_pass->SetNew(RenderPassId(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()); 9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) root_pass->SetNew(RenderPassId(1, 1), 98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch root_output_rect, 99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch root_damage_rect, 100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch gfx::Transform()); 101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SharedQuadState* shared_quad_state = 103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) root_pass->CreateAndAppendSharedQuadState(); 104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch gfx::Rect rect = root_output_rect; 106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch gfx::Rect opaque_rect = root_output_rect; 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect visible_rect = root_output_rect; 108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // An invalid resource id! The resource isn't part of the frame. 109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unsigned resource_id = 5; 110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool premultiplied_alpha = false; 111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch gfx::PointF uv_top_left = gfx::PointF(0.f, 0.f); 112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch gfx::PointF uv_bottom_right = gfx::PointF(1.f, 1.f); 113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SkColor background_color = 0; 114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch float vertex_opacity[4] = {1.f, 1.f, 1.f, 1.f}; 115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool flipped = false; 116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TextureDrawQuad* invalid_draw_quad = 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch root_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); 119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) invalid_draw_quad->SetNew(shared_quad_state, 120ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch rect, 121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch opaque_rect, 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) visible_rect, 123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch resource_id, 124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch premultiplied_alpha, 125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch uv_top_left, 126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch uv_bottom_right, 127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch background_color, 128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch vertex_opacity, 129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch flipped); 130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch frame->render_pass_list.push_back(root_pass.Pass()); 132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return frame.Pass(); 133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 134ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AddTransferableResource(DelegatedFrameData* frame, 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider::ResourceId resource_id) { 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransferableResource resource; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resource.id = resource_id; 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resource.mailbox_holder.texture_target = GL_TEXTURE_2D; 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLbyte arbitrary_mailbox[GL_MAILBOX_SIZE_CHROMIUM] = { 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4}; 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resource.mailbox_holder.mailbox.SetName(arbitrary_mailbox); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->resource_list.push_back(resource); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AddTextureQuad(DelegatedFrameData* frame, 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider::ResourceId resource_id) { 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderPass* render_pass = frame->render_pass_list[0]; 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SharedQuadState* sqs = render_pass->CreateAndAppendSharedQuadState(); 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TextureDrawQuad* quad = 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float vertex_opacity[4] = { 1.f, 1.f, 1.f, 1.f }; 155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) quad->SetNew(sqs, 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(0, 0, 10, 10), 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(0, 0, 10, 10), 158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect(0, 0, 10, 10), 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resource_id, 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF(0.f, 0.f), 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::PointF(1.f, 1.f), 1637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SK_ColorTRANSPARENT, 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vertex_opacity, 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void AddRenderPass(DelegatedFrameData* frame, 16903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RenderPassId id, 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& output_rect, 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& damage_rect, 17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const FilterOperations& filters, 17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const FilterOperations& background_filters) { 17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t i = 0; i < frame->render_pass_list.size(); ++i) 17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(id != frame->render_pass_list[i]->id); 17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<RenderPass> pass(RenderPass::Create()); 17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) pass->SetNew(id, 17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) output_rect, 18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) damage_rect, 18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform()); 18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) frame->render_pass_list.push_back(pass.Pass()); 18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderPass* render_pass = frame->render_pass_list[0]; 185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SharedQuadState* sqs = render_pass->CreateAndAppendSharedQuadState(); 186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderPassDrawQuad* quad = 187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_pass->CreateAndAppendDrawQuad<RenderPassDrawQuad>(); 18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) quad->SetNew(sqs, 19058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) output_rect, 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) output_rect, 19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) id, 193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0, // mask_resource_id 19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Rect(0, 0, 1, 1), // mask_uv_rect 19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) filters, 1966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) gfx::Vector2dF(), 19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) background_filters); 19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch static ResourceProvider::ResourceId AppendResourceId( 201ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::vector<ResourceProvider::ResourceId>* resources_in_last_sent_frame, 202ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ResourceProvider::ResourceId resource_id) { 203ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch resources_in_last_sent_frame->push_back(resource_id); 204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return resource_id; 205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 206ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 207ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void ReturnUnusedResourcesFromParent(LayerTreeHostImpl* host_impl) { 208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DelegatedFrameData* delegated_frame_data = 209ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch output_surface()->last_sent_frame().delegated_frame_data.get(); 210ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!delegated_frame_data) 211ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 212ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 213ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::vector<ResourceProvider::ResourceId> resources_in_last_sent_frame; 2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (size_t i = 0; i < delegated_frame_data->resource_list.size(); ++i) { 2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resources_in_last_sent_frame.push_back( 2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_frame_data->resource_list[i].id); 217ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 218ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 219ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::vector<ResourceProvider::ResourceId> resources_to_return; 220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 221ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const TransferableResourceArray& resources_held_by_parent = 222ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch output_surface()->resources_held_by_parent(); 223ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch for (size_t i = 0; i < resources_held_by_parent.size(); ++i) { 224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ResourceProvider::ResourceId resource_in_parent = 225ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch resources_held_by_parent[i].id; 226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool resource_in_parent_is_not_part_of_frame = 227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::find(resources_in_last_sent_frame.begin(), 228ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch resources_in_last_sent_frame.end(), 229ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch resource_in_parent) == resources_in_last_sent_frame.end(); 230ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (resource_in_parent_is_not_part_of_frame) 231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch resources_to_return.push_back(resource_in_parent); 232ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 234ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (resources_to_return.empty()) 235ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 236ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 237ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch CompositorFrameAck ack; 238ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch for (size_t i = 0; i < resources_to_return.size(); ++i) 239ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch output_surface()->ReturnResource(resources_to_return[i], &ack); 240d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) host_impl->ReclaimResources(&ack); 241ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestCaseSingleDelegatedLayer 245b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) : public LayerTreeHostDelegatedTest, 2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public DelegatedFrameResourceCollectionClient { 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostDelegatedTestCaseSingleDelegatedLayer() 2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : resource_collection_(new DelegatedFrameResourceCollection), 2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) available_(false) { 2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->SetClient(this); 2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 25368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_ = Layer::Create(); 256c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch root_->SetBounds(gfx::Size(15, 15)); 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->SetBounds(gfx::Size(10, 10)); 2934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated->SetIsDrawable(true); 2944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_->AddChild(delegated); 2964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return delegated; 2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void AfterTest() OVERRIDE { resource_collection_->SetClient(NULL); } 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // DelegatedFrameProviderClient implementation. 30268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void UnusedResourcesAreAvailable() OVERRIDE { available_ = true; } 30368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 30468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool TestAndResetAvailable() { 30568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool available = available_; 30668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) available_ = false; 30768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return available; 30868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 309b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<DelegatedFrameResourceCollection> resource_collection_; 3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<DelegatedFrameProvider> frame_provider_; 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> root_; 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DelegatedRendererLayer> delegated_; 31568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool available_; 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestCreateChildId 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostDelegatedTestCreateChildId() 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(), 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) num_activates_(0), 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) did_reset_child_id_(false) {} 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (TestEnded()) 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1))); 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 3334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() < 1) 3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestContextProvider* context_provider = static_cast<TestContextProvider*>( 3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_impl->output_surface()->context_provider()); 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++num_activates_; 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (num_activates_) { 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(delegated_impl->ChildId()); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(did_reset_child_id_); 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context_provider->ContextGL()->LoseContextCHROMIUM( 3503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GL_GUILTY_CONTEXT_RESET_ARB, 3513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GL_INNOCENT_CONTEXT_RESET_ARB); 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context_provider->ContextGL()->Flush(); 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(delegated_impl->ChildId()); 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(did_reset_child_id_); 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InitializedRendererOnThread(LayerTreeHostImpl* host_impl, 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool success) OVERRIDE { 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(success); 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (num_activates_ < 2) 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, num_activates_); 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(delegated_impl->ChildId()); 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) did_reset_child_id_ = true; 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_activates_; 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool did_reset_child_id_; 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestCreateChildId); 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test that we can gracefully handle invalid frames after the context was lost. 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// For example, we might be trying to use the previous frame in that case and 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// have to make sure we don't crash because our resource accounting goes wrong. 3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostDelegatedTestInvalidFrameAfterContextLost 3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostDelegatedTestInvalidFrameAfterContextLost() 3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : num_activates_(0), num_output_surfaces_initialized_(0) {} 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DidCommit() OVERRIDE { 3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (TestEnded()) 3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<DelegatedFrameData> frame1 = 3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddTextureQuad(frame1.get(), 999); 4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddTransferableResource(frame1.get(), 999); 4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFrameData(frame1.Pass()); 4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void DidInitializeOutputSurface() OVERRIDE { 4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!num_output_surfaces_initialized_++) 4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<DelegatedRendererLayer> old_delegated = delegated_; 4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFrameData( 4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateInvalidFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1))); 4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Make sure we end up using the same layer, or we won't test the right 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // thing, which is to make sure we can handle an invalid frame when using 4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // a stale layer from before the context was lost. 4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(delegated_.get() == old_delegated.get()); 4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (host_impl->active_tree()->source_frame_number() < 1) 4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestContextProvider* context_provider = static_cast<TestContextProvider*>( 4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_impl->output_surface()->context_provider()); 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++num_activates_; 4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (num_activates_) { 4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 2: 4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context_provider->ContextGL()->LoseContextCHROMIUM( 4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GL_GUILTY_CONTEXT_RESET_ARB, 4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GL_INNOCENT_CONTEXT_RESET_ARB); 4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 3: 4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EndTest(); 4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void InitializedRendererOnThread(LayerTreeHostImpl* host_impl, 4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool success) OVERRIDE { 4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(success); 4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (num_activates_ < 2) 4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(2, num_activates_); 4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Resources should have gotten cleared after the context was lost. 4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0U, delegated_impl->Resources().size()); 4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void AfterTest() OVERRIDE { 4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostDelegatedTestCaseSingleDelegatedLayer::AfterTest(); 4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(2, num_output_surfaces_initialized_); 4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected: 4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int num_activates_; 4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int num_output_surfaces_initialized_; 4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostDelegatedTestInvalidFrameAfterContextLost); 4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestLayerUsesFrameDamage 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostDelegatedTestLayerUsesFrameDamage() 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(), 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_draw_for_source_frame_(true) {} 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 474bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int next_source_frame_number = layer_tree_host()->source_frame_number(); 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (next_source_frame_number) { 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The first time the layer gets a frame the whole layer should be 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // damaged. 4794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData( 4804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1))); 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 4834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // A different frame size will damage the whole layer. 4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData( 4854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(0, 0, 0, 0))); 4864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 4874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 3: 48846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Should create a total amount of gfx::Rect(2, 2, 8, 6) damage: 48946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // (2, 2, 10, 6) clamped to the root output rect. 4904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData( 4914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(2, 2, 5, 5))); 4924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData( 4934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(7, 2, 5, 6))); 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 4954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 4: 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should create zero damage. 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 4994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 5: 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should damage the full viewport. 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetBounds(gfx::Size(2, 2)); 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 5034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 6: 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should create zero damage. 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 5074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 7: 5084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Should damage the full layer, tho the frame size is not changing. 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetBounds(gfx::Size(6, 6)); 5104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData( 5114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(1, 1, 2, 2))); 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 5134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 8: 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should create zero damage. 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 5174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 9: 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should create zero damage. 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 521f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case 10: 5224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Changing the frame size damages the full layer. 5234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData( 5244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 5, 5), gfx::Rect(4, 4, 1, 1))); 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 526f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case 11: 527ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // An invalid frame isn't used, so it should not cause damage. 5284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(CreateInvalidFrameData(gfx::Rect(0, 0, 5, 5), 5294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Rect(4, 4, 1, 1))); 530ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch break; 531f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case 12: 53246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Should create gfx::Rect(1, 1, 2, 2) of damage. 5334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData( 5344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 5, 5), gfx::Rect(1, 1, 2, 2))); 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 536f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case 13: 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should create zero damage. 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 540f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case 14: 541d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Moving the layer out of the tree and back in will damage the whole 542d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // impl layer. 543d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) delegated_->RemoveFromParent(); 544d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(delegated_); 545d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) break; 546f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case 15: 547d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Make a larger frame with lots of damage. Then a frame smaller than 548d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // the first frame's damage. The entire layer should be damaged, but 549d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // nothing more. 5504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData( 5514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(0, 0, 10, 10))); 5524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData( 5534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 5, 5), gfx::Rect(1, 1, 2, 2))); 554d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) break; 555f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case 16: 5564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Make a frame with lots of damage. Then replace it with a frame with 5574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // no damage. The entire layer should be damaged, but nothing more. 5584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData( 5594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(0, 0, 10, 10))); 5604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData( 5614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(0, 0, 0, 0))); 562d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) break; 563f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case 17: 5644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Make another layer that uses the same frame provider. The new layer 5654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // should be damaged. 5661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delegated_copy_ = CreateDelegatedLayer(frame_provider_.get()); 5674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_copy_->SetPosition(gfx::Point(5, 0)); 5684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Also set a new frame. 5704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData( 5714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(4, 0, 1, 1))); 5724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 573f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case 18: 5744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Set another new frame, both layers should be damaged in the same 5754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // ways. 5764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData( 5774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(3, 3, 1, 1))); 57846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) break; 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_draw_for_source_frame_ = true; 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 583cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual DrawResult PrepareToDrawOnThread( 5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl* host_impl, 5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 586cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DrawResult draw_result) OVERRIDE { 587cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(DRAW_SUCCESS, draw_result); 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!first_draw_for_source_frame_) 5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gfx::Rect damage_rect; 593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!frame->has_no_damage) { 594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) damage_rect = frame->render_passes.back()->damage_rect; 595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If there is no damage, then we have no render passes to send. 597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(frame->render_passes.empty()); 598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (host_impl->active_tree()->source_frame_number()) { 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 0: 602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // First frame is damaged because of viewport resize. 603c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(gfx::Rect(15, 15).ToString(), damage_rect.ToString()); 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 606c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(gfx::Rect(10, 10).ToString(), damage_rect.ToString()); 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 609c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(gfx::Rect(10, 10).ToString(), damage_rect.ToString()); 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 61246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(gfx::Rect(2, 2, 8, 6).ToString(), damage_rect.ToString()); 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 4: 615c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(gfx::Rect().ToString(), damage_rect.ToString()); 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 5: 618c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(gfx::Rect(10, 10).ToString(), damage_rect.ToString()); 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 6: 621c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(gfx::Rect().ToString(), damage_rect.ToString()); 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 7: 624c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(gfx::Rect(6, 6).ToString(), damage_rect.ToString()); 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 8: 627c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(gfx::Rect().ToString(), damage_rect.ToString()); 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 9: 630f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(gfx::Rect().ToString(), damage_rect.ToString()); 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 10: 633f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(gfx::Rect(10, 10).ToString(), damage_rect.ToString()); 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 11: 636f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(gfx::Rect().ToString(), damage_rect.ToString()); 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 12: 639f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(gfx::Rect(1, 1, 2, 2).ToString(), damage_rect.ToString()); 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 13: 642f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(gfx::Rect().ToString(), damage_rect.ToString()); 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 14: 645f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(gfx::Rect(10, 10).ToString(), damage_rect.ToString()); 646ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch break; 647ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case 15: 648c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(gfx::Rect(10, 10).ToString(), damage_rect.ToString()); 649d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) break; 650d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) case 16: 651c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(gfx::Rect(10, 10).ToString(), damage_rect.ToString()); 652d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) break; 653d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) case 17: 654c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(gfx::UnionRects(gfx::Rect(5, 0, 10, 10), 655c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gfx::Rect(4, 0, 1, 1)).ToString(), 6564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) damage_rect.ToString()); 6574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 658f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case 18: 659c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(gfx::Rect(3, 3, 6, 1).ToString(), damage_rect.ToString()); 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 6684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<DelegatedRendererLayer> delegated_copy_; 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool first_draw_for_source_frame_; 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestLayerUsesFrameDamage); 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestMergeResources 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Push two frames to the delegated renderer layer with no commit between. 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The first frame has resource 999. 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame1 = 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame1.get(), 999); 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame1.get(), 999); 6854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame1.Pass()); 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The second frame uses resource 999 still, but also adds 555. 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame2 = 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame2.get(), 999); 6913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AddTransferableResource(frame2.get(), 999); 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame2.get(), 555); 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame2.get(), 555); 6944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame2.Pass()); 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // The resource 999 from frame1 is returned since it is still on the main 6973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // thread. 6983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ReturnedResourceArray returned_resources; 6994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor( 7004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &returned_resources); 7013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { 7023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned expected[] = {999}; 7033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_RESOURCES(expected, returned_resources); 70468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(TestAndResetAvailable()); 7053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 7063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceProvider::ResourceIdMap& map = 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider()->GetChildToParentMap( 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_impl->ChildId()); 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Both frames' resources should be in the parent's resource provider. 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, map.size()); 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(999)); 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, delegated_impl->Resources().size()); 72568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(999)); 72668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(555)); 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestMergeResources); 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestRemapResourcesInQuads 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Generate a frame with two resources in it. 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame = 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 7454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceProvider::ResourceIdMap& map = 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider()->GetChildToParentMap( 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_impl->ChildId()); 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The frame's resource should be in the parent's resource provider. 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, map.size()); 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(999)); 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider::ResourceId parent_resource_id1 = map.find(999)->second; 765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(parent_resource_id1, 999u); 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider::ResourceId parent_resource_id2 = map.find(555)->second; 767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(parent_resource_id2, 555u); 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The resources in the quads should be remapped to the parent's namespace. 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast( 7711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delegated_impl->RenderPassesInDrawOrder()[0]->quad_list.ElementAt(0)); 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(parent_resource_id1, quad1->resource_id); 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TextureDrawQuad* quad2 = TextureDrawQuad::MaterialCast( 7741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delegated_impl->RenderPassesInDrawOrder()[0]->quad_list.ElementAt(1)); 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(parent_resource_id2, quad2->resource_id); 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestRemapResourcesInQuads); 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestReturnUnusedResources 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 790ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 7923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ReturnedResourceArray resources; 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 794bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int next_source_frame_number = layer_tree_host()->source_frame_number(); 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (next_source_frame_number) { 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Generate a frame with two resources in it. 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 8034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All of the resources are in use. 8074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 80968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Keep using 999 but stop using 555. 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 81468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) AddTransferableResource(frame.get(), 999); 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 444); 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 444); 8174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 81968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case 3: 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 555 is no longer in use. 8214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 8223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { 8233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned expected[] = {555}; 8243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_RESOURCES(expected, resources); 82568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(TestAndResetAvailable()); 8263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Stop using any resources. 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 8304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 83268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case 4: 833ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Postpone collecting resources for a frame. They should still be there 834ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // the next frame. 835ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch layer_tree_host()->SetNeedsCommit(); 836ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 83768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case 5: 83868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // 444 and 999 are no longer in use. We sent two refs to 999, so we 83968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // should get two back. 8404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 8413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { 84268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) unsigned expected[] = {444, 999, 999}; 8433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_RESOURCES(expected, resources); 84468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(TestAndResetAvailable()); 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 85068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Resources are never immediately released. 8513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ReturnedResourceArray empty_resources; 8524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor( 8534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &empty_resources); 85468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(0u, empty_resources.size()); 85568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 858ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 859ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool result) OVERRIDE { 860ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ReturnUnusedResourcesFromParent(host_impl); 861ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 864ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_TEST_F( 865a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LayerTreeHostDelegatedTestReturnUnusedResources); 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestReusedResources 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 874ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 8763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ReturnedResourceArray resources; 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 878bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int next_source_frame_number = layer_tree_host()->source_frame_number(); 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (next_source_frame_number) { 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Generate a frame with some resources in it. 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 444); 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 444); 8894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All of the resources are in use. 8934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 89568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Keep using 999 but stop using 555 and 444. 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 90068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) AddTransferableResource(frame.get(), 999); 9014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Resource are not immediately released. 9044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 90668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now using 555 and 444 again, but not 999. 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 91168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) AddTransferableResource(frame.get(), 555); 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 444); 91368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) AddTransferableResource(frame.get(), 444); 9144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 91668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case 3: 91768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // The 999 resource is the only unused one. Two references were sent, so 91868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // two should be returned. 9194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 9203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { 92168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) unsigned expected[] = {999, 999}; 9223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_RESOURCES(expected, resources); 92368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(TestAndResetAvailable()); 9243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 930ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 931ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool result) OVERRIDE { 932ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ReturnUnusedResourcesFromParent(host_impl); 933ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 936ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestReusedResources); 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestFrameBeforeAck 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 945ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 9473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ReturnedResourceArray resources; 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 949bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int next_source_frame_number = layer_tree_host()->source_frame_number(); 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (next_source_frame_number) { 9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Generate a frame with some resources in it. 9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 444); 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 444); 9604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All of the resources are in use. 9644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 96668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Keep using 999 but stop using 555 and 444. 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 97168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) AddTransferableResource(frame.get(), 999); 9724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Resource are not immediately released. 9754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 97768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The parent compositor (this one) does a commit. 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 98168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case 3: 9824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 9833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { 9843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned expected[] = {444, 555}; 9853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_RESOURCES(expected, resources); 98668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(TestAndResetAvailable()); 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 98968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // The child compositor sends a frame referring to resources not in the 99068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // frame. 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 444); 9954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 100168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (host_impl->active_tree()->source_frame_number() != 3) 10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceProvider::ResourceIdMap& map = 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider()->GetChildToParentMap( 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_impl->ChildId()); 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The bad frame should be dropped. So we should only have one quad (the 10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // one with resource 999) on the impl tree. And only 999 will be present 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in the parent's resource provider. 10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.size()); 10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(999)); 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().size()); 101968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(999)); 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0]; 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, pass->quad_list.size()); 10231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const TextureDrawQuad* quad = 10241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TextureDrawQuad::MaterialCast(pass->quad_list.front()); 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(map.find(999)->second, quad->resource_id); 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1030ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 1031ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool result) OVERRIDE { 1032ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ReturnUnusedResourcesFromParent(host_impl); 1033ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1036ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestFrameBeforeAck); 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestFrameBeforeTakeResources 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1045ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 10473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ReturnedResourceArray resources; 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1049bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int next_source_frame_number = layer_tree_host()->source_frame_number(); 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (next_source_frame_number) { 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Generate a frame with some resources in it. 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 444); 10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 444); 10604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All of the resources are in use. 10644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 106668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Keep using 999 but stop using 555 and 444. 10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 10713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AddTransferableResource(frame.get(), 999); 10724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Resource are not immediately released. 10754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 107768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The parent compositor (this one) does a commit. 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 108168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case 3: 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The child compositor sends a frame before taking resources back 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // from the previous commit. This frame makes use of the resources 555 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and 444, which were just released during commit. 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 10873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AddTransferableResource(frame.get(), 999); 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 10893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AddTransferableResource(frame.get(), 555); 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 444); 10913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AddTransferableResource(frame.get(), 444); 10924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // The resources are used by the new frame but are returned anyway since 10953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // we passed them again. 10964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 10973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { 10983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned expected[] = {444, 555}; 10993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_RESOURCES(expected, resources); 110068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(TestAndResetAvailable()); 11013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 110368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case 4: 11044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 110668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 111368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (host_impl->active_tree()->source_frame_number() != 3) 11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceProvider::ResourceIdMap& map = 11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider()->GetChildToParentMap( 11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_impl->ChildId()); 11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The third frame has all of the resources in it again, the delegated 11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // renderer layer should continue to own the resources for it. 11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3u, map.size()); 11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(999)); 11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(444)); 11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3u, delegated_impl->Resources().size()); 113268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(999)); 113368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(555)); 113468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(444)); 11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0]; 11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3u, pass->quad_list.size()); 11381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const TextureDrawQuad* quad1 = 11391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TextureDrawQuad::MaterialCast(pass->quad_list.ElementAt(0)); 11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(map.find(999)->second, quad1->resource_id); 11411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const TextureDrawQuad* quad2 = 11421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TextureDrawQuad::MaterialCast(pass->quad_list.ElementAt(1)); 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(map.find(555)->second, quad2->resource_id); 11441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const TextureDrawQuad* quad3 = 11451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TextureDrawQuad::MaterialCast(pass->quad_list.ElementAt(2)); 11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(map.find(444)->second, quad3->resource_id); 11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 1150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool result) OVERRIDE { 1151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ReturnUnusedResourcesFromParent(host_impl); 1152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_TEST_F( 1156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostDelegatedTestFrameBeforeTakeResources); 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestBadFrame 11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 11673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ReturnedResourceArray resources; 11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1169bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int next_source_frame_number = layer_tree_host()->source_frame_number(); 11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (next_source_frame_number) { 11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Generate a frame with some resources in it. 11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 11784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All of the resources are in use. 11824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 118468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Generate a bad frame with a resource the layer doesn't have. The 11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 885 and 775 resources are unknown, while ownership of the legit 444 11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // resource is passed in here. The bad frame does not use any of the 11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // previous resources, 999 or 555. 11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A bad quad is present both before and after the good quad. 11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 885); 11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 444); 11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 444); 11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 775); 11964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The parent compositor (this one) does a commit. 11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 120068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case 3: 12014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 12024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 12034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 12044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 12054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Now send a good frame with 999 again. 12064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 12074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 12084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 12094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The bad frame's resource is given back to the child compositor. 12114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 12123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { 12133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned expected[] = {444}; 12143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_RESOURCES(expected, resources); 121568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(TestAndResetAvailable()); 12163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 121868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case 4: 12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The unused 555 from the last good frame is now released. 12204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 12213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { 12223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned expected[] = {555}; 12233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_RESOURCES(expected, resources); 122468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(TestAndResetAvailable()); 12253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 1233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool result) OVERRIDE { 12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() < 1) 12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1237ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ReturnUnusedResourcesFromParent(host_impl); 1238ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceProvider::ResourceIdMap& map = 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider()->GetChildToParentMap( 12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_impl->ChildId()); 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (host_impl->active_tree()->source_frame_number()) { 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: { 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We have the first good frame with just 990 and 555 in it. 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // layer. 12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, map.size()); 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(999)); 12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, delegated_impl->Resources().size()); 125668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(999)); 125768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(555)); 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0]; 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, pass->quad_list.size()); 12611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const TextureDrawQuad* quad1 = 12621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TextureDrawQuad::MaterialCast(pass->quad_list.ElementAt(0)); 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(map.find(999)->second, quad1->resource_id); 12641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const TextureDrawQuad* quad2 = 12651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TextureDrawQuad::MaterialCast(pass->quad_list.ElementAt(1)); 12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(map.find(555)->second, quad2->resource_id); 12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 126968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case 2: { 12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We only keep resources from the last valid frame. 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, map.size()); 12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(999)); 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, delegated_impl->Resources().size()); 127668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(999)); 127768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(555)); 12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The bad frame is dropped though, we still have the frame with 999 and 12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 555 in it. 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0]; 12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, pass->quad_list.size()); 12831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const TextureDrawQuad* quad1 = 12841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TextureDrawQuad::MaterialCast(pass->quad_list.ElementAt(0)); 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(map.find(999)->second, quad1->resource_id); 12861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const TextureDrawQuad* quad2 = 12871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TextureDrawQuad::MaterialCast(pass->quad_list.ElementAt(1)); 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(map.find(555)->second, quad2->resource_id); 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 129168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case 3: { 12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We have the new good frame with just 999 in it. 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.size()); 12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(999)); 12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().size()); 129768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(999)); 12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0]; 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, pass->quad_list.size()); 13011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const TextureDrawQuad* quad1 = 13021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TextureDrawQuad::MaterialCast(pass->quad_list.front()); 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(map.find(999)->second, quad1->resource_id); 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1310ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestBadFrame); 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestUnnamedResource 13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 13213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ReturnedResourceArray resources; 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1323bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int next_source_frame_number = layer_tree_host()->source_frame_number(); 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (next_source_frame_number) { 13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This frame includes two resources in it, but only uses one. 13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 13314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 13344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 13354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 13364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 13374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 13384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Now send an empty frame. 13394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 13404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 13414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The unused resource should be returned. 13434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 13443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { 13453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned expected[] = {999}; 13463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_RESOURCES(expected, resources); 134768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(TestAndResetAvailable()); 13483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() != 1) 13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceProvider::ResourceIdMap& map = 13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider()->GetChildToParentMap( 13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_impl->ChildId()); 13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The layer only held on to the resource that was used. 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.size()); 13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().size()); 137268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(555)); 13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestUnnamedResource); 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestDontLeakResource 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 138568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 13873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ReturnedResourceArray resources; 13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1389bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int next_source_frame_number = layer_tree_host()->source_frame_number(); 13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (next_source_frame_number) { 13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This frame includes two resources in it. 13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 13984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // But then we immediately stop using 999. 14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 14033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AddTransferableResource(frame.get(), 555); 14044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 14073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // The unused resources should be returned. 555 is still used, but it's 14083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // returned once to account for the first frame. 14094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 14103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { 14113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned expected[] = {555, 999}; 14123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_RESOURCES(expected, resources); 141368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(TestAndResetAvailable()); 14143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 14153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Send a frame with no resources in it. 14163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 14174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 14183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) break; 14193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case 3: 14203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // The now unused resource 555 should be returned. 14213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) resources.clear(); 14224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 14233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { 14243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned expected[] = {555}; 14253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_RESOURCES(expected, resources); 142668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(TestAndResetAvailable()); 14273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() != 1) 14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceProvider::ResourceIdMap& map = 14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider()->GetChildToParentMap( 14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_impl->ChildId()); 14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The layer only held on to the resource that was used. 14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.size()); 14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().size()); 145068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(555)); 14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 14543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool result) OVERRIDE { 14553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ReturnUnusedResourcesFromParent(host_impl); 14563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestDontLeakResource); 14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestResourceSentToParent 14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1464ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual void DidCommitAndDrawFrame() OVERRIDE { 14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 14663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ReturnedResourceArray resources; 14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1468bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int next_source_frame_number = layer_tree_host()->source_frame_number(); 14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (next_source_frame_number) { 14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This frame includes two resources in it. 14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 14774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 14804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 148268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 999 is in use in the grandparent compositor, generate a frame without 14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // it present. 14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 148868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) AddTransferableResource(frame.get(), 555); 14894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Since 999 is in the grandparent it is not returned. 14934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 149568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1497ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // The impl side will get back the resource at some point. 149868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ImplThreadTaskRunner()->PostTask(FROM_HERE, 149968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) receive_resource_on_thread_); 15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 150168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 150268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 150468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void ReceiveResourceOnThread(LayerTreeHostImpl* host_impl) { 150568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 150668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 150768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 150868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 150968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const ResourceProvider::ResourceIdMap& map = 151068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) host_impl->resource_provider()->GetChildToParentMap( 151168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) delegated_impl->ChildId()); 151268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 151368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Receive 999 back from the grandparent. 151468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CompositorFrameAck ack; 151568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) output_surface()->ReturnResource(map.find(999)->second, &ack); 151668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) host_impl->ReclaimResources(&ack); 151768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 151868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 151968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void UnusedResourcesAreAvailable() OVERRIDE { 152068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(3, layer_tree_host()->source_frame_number()); 152168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 152268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ReturnedResourceArray resources; 152368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 152468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // 999 was returned from the grandparent and could be released. 15254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 152668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) { 152768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) unsigned expected[] = {999}; 152868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_RESOURCES(expected, resources); 15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 153068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 153168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EndTest(); 15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() < 1) 15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceProvider::ResourceIdMap& map = 15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider()->GetChildToParentMap( 15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_impl->ChildId()); 15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (host_impl->active_tree()->source_frame_number()) { 15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: { 15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, map.size()); 15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(999)); 15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, delegated_impl->Resources().size()); 155368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(999)); 155468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(555)); 15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1556ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // The 999 resource will be sent to a grandparent compositor. 15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: { 15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, map.size()); 15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(999)); 15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1564ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // 999 is in the parent, so not held by delegated renderer layer. 15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().size()); 156668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(555)); 15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 156868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) receive_resource_on_thread_ = 156968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Bind(&LayerTreeHostDelegatedTestResourceSentToParent:: 157068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ReceiveResourceOnThread, 157168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Unretained(this), 157268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) host_impl); 15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 15742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 999 should be released. 15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.size()); 15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().size()); 15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second)); 1582ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch break; 15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 158668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Closure receive_resource_on_thread_; 15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1589ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSINGLE_AND_MULTI_THREAD_DELEGATING_RENDERER_TEST_F( 1590ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LayerTreeHostDelegatedTestResourceSentToParent); 15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostDelegatedTestCommitWithoutTake 15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 15942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Prevent drawing with resources that are sent to the grandparent. 1597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size()); 15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 16033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ReturnedResourceArray resources; 16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1605bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int next_source_frame_number = layer_tree_host()->source_frame_number(); 16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (next_source_frame_number) { 16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 444); 16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTransferableResource(frame.get(), 444); 16154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 16184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 162068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Stop using 999 and 444 in this frame and commit. 16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 16253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AddTransferableResource(frame.get(), 555); 16264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 16273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // 999 and 444 will be returned for frame 1, but not 555 since it's in 16283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // the current frame. 16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Don't take resources here, but set a new frame that uses 999 again. 16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 16343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AddTransferableResource(frame.get(), 999); 16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 16363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AddTransferableResource(frame.get(), 555); 16374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 4: 16403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // 555 from frame 1 and 2 isn't returned since it's still in use. 999 16413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // from frame 1 is returned though. 16424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 16433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { 16443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned expected[] = {444, 999}; 16453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_RESOURCES(expected, resources); 164668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(TestAndResetAvailable()); 16473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 16483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 16493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 16504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 16513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // 555 will be returned 3 times for frames 1 2 and 3, and 999 will be 16523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // returned once for frame 3. 16533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) break; 16543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case 5: 16554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 16563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { 16573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned expected[] = {555, 555, 555, 999}; 16583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_RESOURCES(expected, resources); 165968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_TRUE(TestAndResetAvailable()); 16603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() < 1) 16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root_impl = host_impl->active_tree()->root_layer(); 16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]); 16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceProvider::ResourceIdMap& map = 16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider()->GetChildToParentMap( 16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_impl->ChildId()); 16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (host_impl->active_tree()->source_frame_number()) { 16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3u, map.size()); 16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(999)); 16832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(444)); 16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3u, delegated_impl->Resources().size()); 168768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(999)); 168868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(555)); 168968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(444)); 16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.size()); 16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().size()); 169668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(555)); 16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, map.size()); 17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(999)); 17012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, map.count(555)); 17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, delegated_impl->Resources().size()); 170468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(999)); 170568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(1u, delegated_impl->Resources().count(555)); 17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestCommitWithoutTake); 17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1712424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class DelegatedFrameIsActivatedDuringCommit 1713424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 1714424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) protected: 17155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DelegatedFrameIsActivatedDuringCommit() : returned_resource_count_(0) {} 1716424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1717424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void BeginTest() OVERRIDE { 1718424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) activate_count_ = 0; 1719424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1720424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) scoped_ptr<DelegatedFrameData> frame = 1721424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1722424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) AddTextureQuad(frame.get(), 999); 1723424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) AddTransferableResource(frame.get(), 999); 17244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 1725424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1726424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 1727424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 1728424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1729424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1730424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ++activate_count_; 1731424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 1732424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 17335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DidCommit() OVERRIDE { 17345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (layer_tree_host()->source_frame_number()) { 1735424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) case 1: { 1736424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // The first frame has been activated. Set a new frame, and 1737424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // expect the next commit to finish *after* it is activated. 1738424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) scoped_ptr<DelegatedFrameData> frame = 1739424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 1740424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) AddTextureQuad(frame.get(), 555); 1741424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) AddTransferableResource(frame.get(), 555); 17424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 1743424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) break; 1744424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 1745424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) case 2: 1746424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // The second frame has been activated. Remove the layer from 1747424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // the tree to cause another commit/activation. The commit should 1748424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // finish *after* the layer is removed from the active tree. 1749424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) delegated_->RemoveFromParent(); 17505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 17515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 3: 17525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Finish the test by releasing resources on the next frame. 17535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<DelegatedFrameData> frame = 17545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 17555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFrameData(frame.Pass()); 1756424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) break; 1757424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 1758424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 1759424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 17605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 17615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (host_impl->active_tree()->source_frame_number()) { 1762116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case 0: { 1763116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The activate for the 1st frame should have happened before now. 1764116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(1, activate_count_); 1765116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 1766116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1767116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case 1: { 1768424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // The activate for the 2nd frame should have happened before now. 1769424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(2, activate_count_); 1770424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) break; 1771424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 1772116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case 2: { 1773424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // The activate to remove the layer should have happened before now. 1774424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(3, activate_count_); 1775424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) break; 1776424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 1777116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case 3: { 1778116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NOTREACHED(); 1779116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 1780116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1781424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 1782424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 1783424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1784f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 1785f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool result) OVERRIDE { 1786f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ReturnUnusedResourcesFromParent(host_impl); 1787f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1788f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1789f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void UnusedResourcesAreAvailable() OVERRIDE { 1790f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LayerTreeHostDelegatedTestCaseSingleDelegatedLayer:: 1791f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UnusedResourcesAreAvailable(); 1792f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ReturnedResourceArray resources; 1793f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 1794f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(TestAndResetAvailable()); 1795f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) returned_resource_count_ += resources.size(); 1796f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (returned_resource_count_ == 2) 1797f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EndTest(); 1798f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1799f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1800424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int activate_count_; 1801f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) size_t returned_resource_count_; 1802424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}; 1803424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1804424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 1805424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DelegatedFrameIsActivatedDuringCommit); 1806424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 18074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostDelegatedTestTwoImplLayers 18084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 18094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 18104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 18114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 18134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 18144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnedResourceArray resources; 18154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int next_source_frame_number = layer_tree_host()->source_frame_number(); 18174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (next_source_frame_number) { 18184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 1: 18194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 18204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 18214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 18224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 18234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 18244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 18254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 18264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 2: 18274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 18284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 18294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 18304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Remove the delegated layer and replace it with a new one. Use the 18324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // same frame and resources for it. 18334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_->RemoveFromParent(); 18344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_ = CreateDelegatedLayer(frame_provider_.get()); 18354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 18364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 3: 18374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 18384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 18394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 18404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Use a frame with no resources in it. 18424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 18434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 18444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 18454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 4: 18464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // We gave one frame to the frame provider, so we should get one 18474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // ref back for each resource. 18484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 18494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) { 18504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) unsigned expected[] = {555, 999}; 18514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_RESOURCES(expected, resources); 18524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(TestAndResetAvailable()); 18534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 18544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EndTest(); 18554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 18564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 18574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 18584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 18604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool result) OVERRIDE { 18614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnUnusedResourcesFromParent(host_impl); 18624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 18634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 18644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestTwoImplLayers); 18664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostDelegatedTestTwoImplLayersTwoFrames 18684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 18694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 18704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 18714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 18734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 18744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnedResourceArray resources; 18754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int next_source_frame_number = layer_tree_host()->source_frame_number(); 18774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (next_source_frame_number) { 18784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 1: 18794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 18804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 18814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 18824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 18834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 18844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 18854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 18864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 2: 18874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 18884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 18894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 18904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 18924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 18934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 18944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 18954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 18964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Remove the delegated layer and replace it with a new one. Make a new 18984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // frame but with the same resources for it. 18994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_->RemoveFromParent(); 19004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_ = NULL; 19014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 19024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame_provider_->SetFrameData(frame.Pass()); 19034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_ = CreateDelegatedLayer(frame_provider_.get()); 19044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 19054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 3: 19064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 19074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 19084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 19094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 19104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Use a frame with no resources in it. 19114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 19124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 19134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 19144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 4: 19154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // We gave two frames to the frame provider, so we should get two 19164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // refs back for each resource. 19174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 19184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) { 19194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) unsigned expected[] = {555, 555, 999, 999}; 19204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_RESOURCES(expected, resources); 19214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(TestAndResetAvailable()); 19224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 19234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EndTest(); 19244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 19254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 19264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 19274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 19284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 19294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool result) OVERRIDE { 19304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnUnusedResourcesFromParent(host_impl); 19314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 19324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 19334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 19344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 19354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostDelegatedTestTwoImplLayersTwoFrames); 19364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 19374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostDelegatedTestTwoLayers 19384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 19394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 19404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 19414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 19424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 19434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 19444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnedResourceArray resources; 19454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 19464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int next_source_frame_number = layer_tree_host()->source_frame_number(); 19474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (next_source_frame_number) { 19484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 1: 19494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 19504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 19514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 19524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 19534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 19544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 19554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Create a DelegatedRendererLayer using the frame. 19564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 19574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 19584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 2: 19594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Create a second DelegatedRendererLayer using the same frame provider. 19604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_thief_ = CreateDelegatedLayer(frame_provider_.get()); 19614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_->AddChild(delegated_thief_); 19624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 19634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // And drop our ref on the frame provider so only the layers keep it 19644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // alive. 19654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame_provider_ = NULL; 19664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 19674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 3: 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 one delegated layer from the tree. No resources should be 19734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // returned yet. 19744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_->RemoveFromParent(); 19754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 19764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 4: 19774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 19784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 19794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 19804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 19814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Put the first layer back, and remove the other layer and destroy it. 19824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // No resources should be returned yet. 19834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_->AddChild(delegated_); 19844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_thief_->RemoveFromParent(); 19854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_thief_ = NULL; 19864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 19874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 5: 19884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 19894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 19904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 19914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 19924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Remove the first layer from the tree again. The resources are still 19934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // held by the main thread layer. 19944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_->RemoveFromParent(); 19954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 19964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 6: 19974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 19984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 19994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 20004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 20014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Destroy the layer and the resources should be returned immediately. 20024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_ = NULL; 20034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 20044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 20054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) { 20064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) unsigned expected[] = {555, 999}; 20074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_RESOURCES(expected, resources); 20084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(TestAndResetAvailable()); 20094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 20104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EndTest(); 20114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 20124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 20134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 20144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 20154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 20164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool result) OVERRIDE { 20174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnUnusedResourcesFromParent(host_impl); 20184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 20194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 20204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<DelegatedRendererLayer> delegated_thief_; 20214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 20224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 20234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestTwoLayers); 20244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 20254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostDelegatedTestRemoveAndAddToTree 20264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 20274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 20284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 20294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 20304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 20314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 20324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnedResourceArray resources; 20334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 20344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int next_source_frame_number = layer_tree_host()->source_frame_number(); 20354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (next_source_frame_number) { 20364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 1: 20374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 20384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 20394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 20404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 20414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 20424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 20434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Create a DelegatedRendererLayer using the frame. 20444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 20454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 20464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 2: 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) // Remove the layer from the tree. The resources should not be returned 20524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // since they are still on the main thread layer. 20534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_->RemoveFromParent(); 20544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 20554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 3: 20564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 20574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 20584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 20594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 20604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Add the layer back to the tree. 20614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(delegated_); 20624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 20634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 4: 20644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 20654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 20664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 20674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 20684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Set a new frame. Resources should be returned. 20694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 20704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTextureQuad(frame.get(), 888); 20714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTransferableResource(frame.get(), 888); 20724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTextureQuad(frame.get(), 777); 20734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTransferableResource(frame.get(), 777); 20744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 20754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 20764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 5: 20774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 20784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) { 20794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) unsigned expected[] = {555, 999}; 20804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_RESOURCES(expected, resources); 20814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(TestAndResetAvailable()); 20824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 20834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 20844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Destroy the layer. 20854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_->RemoveFromParent(); 20864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_ = NULL; 20874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 20884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 6: 20894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 20904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 20914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 20924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 20934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Destroy the frame provider. Resources should be returned. 20944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame_provider_ = NULL; 20954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 20964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 20974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) { 20984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) unsigned expected[] = {777, 888}; 20994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_RESOURCES(expected, resources); 21004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(TestAndResetAvailable()); 21014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 21024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EndTest(); 21034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 21044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 21054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 21064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 21074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 21084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool result) OVERRIDE { 21094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnUnusedResourcesFromParent(host_impl); 21104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 21114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 21124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<DelegatedRendererLayer> delegated_thief_; 21134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 21144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 21154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestRemoveAndAddToTree); 21164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 21174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostDelegatedTestRemoveAndChangeResources 21184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { 21194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 21204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 21214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 21224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 21234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame; 21244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnedResourceArray resources; 21254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 21264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int next_source_frame_number = layer_tree_host()->source_frame_number(); 21274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (next_source_frame_number) { 21284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 1: 21294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 21304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTextureQuad(frame.get(), 999); 21314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTransferableResource(frame.get(), 999); 21324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTextureQuad(frame.get(), 555); 21334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTransferableResource(frame.get(), 555); 21344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 21354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Create a DelegatedRendererLayer using the frame. 21364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 21374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 21384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 2: 21394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 21404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 21414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 21424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 21434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Remove the layer from the tree. The resources should not be returned 21444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // since they are still on the main thread layer. 21454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_->RemoveFromParent(); 21464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 21474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 3: 21484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 21494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 21504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 21514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 21524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Set a new frame. Resources should be returned immediately. 21534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); 21544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTextureQuad(frame.get(), 888); 21554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTransferableResource(frame.get(), 888); 21564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTextureQuad(frame.get(), 777); 21574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddTransferableResource(frame.get(), 777); 21584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SetFrameData(frame.Pass()); 21594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 21604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 21614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) { 21624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) unsigned expected[] = {555, 999}; 21634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_RESOURCES(expected, resources); 21644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(TestAndResetAvailable()); 21654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resources.clear(); 21664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 21674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 21684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Destroy the frame provider. 21694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame_provider_ = NULL; 21704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 21714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 21724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(0u, resources.size()); 21734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(TestAndResetAvailable()); 21744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 21754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Destroy the layer. Resources should be returned. 21764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_ = NULL; 21774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 21784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); 21794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) { 21804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) unsigned expected[] = {777, 888}; 21814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_RESOURCES(expected, resources); 21824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(TestAndResetAvailable()); 21834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 21844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EndTest(); 21854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 21864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 21874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 21884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 21894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 21904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool result) OVERRIDE { 21914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnUnusedResourcesFromParent(host_impl); 21924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 21934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 21944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<DelegatedRendererLayer> delegated_thief_; 21954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 21964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 21974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 21984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostDelegatedTestRemoveAndChangeResources); 21994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 22002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 22012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 2202