| Index: cc/trees/layer_tree_host_unittest_delegated.cc
|
| diff --git a/cc/trees/layer_tree_host_unittest_delegated.cc b/cc/trees/layer_tree_host_unittest_delegated.cc
|
| deleted file mode 100644
|
| index 87f667cefe2fcafbd1dcf3eda742e8f08eb6f3b4..0000000000000000000000000000000000000000
|
| --- a/cc/trees/layer_tree_host_unittest_delegated.cc
|
| +++ /dev/null
|
| @@ -1,2169 +0,0 @@
|
| -// Copyright 2013 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "cc/trees/layer_tree_host.h"
|
| -
|
| -#include <algorithm>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/location.h"
|
| -#include "base/synchronization/waitable_event.h"
|
| -#include "base/threading/thread.h"
|
| -#include "base/time/time.h"
|
| -#include "cc/layers/delegated_frame_provider.h"
|
| -#include "cc/layers/delegated_frame_resource_collection.h"
|
| -#include "cc/layers/delegated_renderer_layer.h"
|
| -#include "cc/layers/delegated_renderer_layer_impl.h"
|
| -#include "cc/output/compositor_frame.h"
|
| -#include "cc/output/compositor_frame_ack.h"
|
| -#include "cc/output/delegated_frame_data.h"
|
| -#include "cc/quads/render_pass_draw_quad.h"
|
| -#include "cc/quads/shared_quad_state.h"
|
| -#include "cc/quads/texture_draw_quad.h"
|
| -#include "cc/resources/returned_resource.h"
|
| -#include "cc/test/fake_delegated_renderer_layer.h"
|
| -#include "cc/test/fake_delegated_renderer_layer_impl.h"
|
| -#include "cc/test/fake_output_surface.h"
|
| -#include "cc/test/layer_tree_test.h"
|
| -#include "cc/trees/layer_tree_impl.h"
|
| -#include "gpu/GLES2/gl2extchromium.h"
|
| -
|
| -namespace cc {
|
| -namespace {
|
| -
|
| -bool ReturnedResourceLower(const ReturnedResource& a,
|
| - const ReturnedResource& b) {
|
| - return a.id < b.id;
|
| -}
|
| -
|
| -// Tests if the list of resources matches an expectation, modulo the order.
|
| -bool ResourcesMatch(ReturnedResourceArray actual,
|
| - unsigned* expected,
|
| - size_t expected_count) {
|
| - std::sort(actual.begin(), actual.end(), ReturnedResourceLower);
|
| - std::sort(expected, expected + expected_count);
|
| - size_t actual_index = 0;
|
| -
|
| - // for each element of the expected array, count off one of the actual array
|
| - // (after checking it matches).
|
| - for (size_t expected_index = 0; expected_index < expected_count;
|
| - ++expected_index) {
|
| - EXPECT_LT(actual_index, actual.size());
|
| - if (actual_index >= actual.size())
|
| - return false;
|
| - EXPECT_EQ(actual[actual_index].id, expected[expected_index]);
|
| - if (actual[actual_index].id != expected[expected_index])
|
| - return false;
|
| - EXPECT_GT(actual[actual_index].count, 0);
|
| - if (actual[actual_index].count <= 0) {
|
| - return false;
|
| - } else {
|
| - --actual[actual_index].count;
|
| - if (actual[actual_index].count == 0)
|
| - ++actual_index;
|
| - }
|
| - }
|
| - EXPECT_EQ(actual_index, actual.size());
|
| - return actual_index == actual.size();
|
| -}
|
| -
|
| -#define EXPECT_RESOURCES(expected, actual) \
|
| - EXPECT_TRUE(ResourcesMatch(actual, expected, arraysize(expected)));
|
| -
|
| -// These tests deal with delegated renderer layers.
|
| -class LayerTreeHostDelegatedTest : public LayerTreeTest {
|
| - protected:
|
| - scoped_ptr<DelegatedFrameData> CreateFrameData(
|
| - const gfx::Rect& root_output_rect,
|
| - const gfx::Rect& root_damage_rect) {
|
| - scoped_ptr<DelegatedFrameData> frame(new DelegatedFrameData);
|
| -
|
| - scoped_ptr<RenderPass> root_pass(RenderPass::Create());
|
| - root_pass->SetNew(RenderPassId(1, 1),
|
| - root_output_rect,
|
| - root_damage_rect,
|
| - gfx::Transform());
|
| - frame->render_pass_list.push_back(root_pass.Pass());
|
| - return frame.Pass();
|
| - }
|
| -
|
| - scoped_ptr<DelegatedFrameData> CreateInvalidFrameData(
|
| - const gfx::Rect& root_output_rect,
|
| - const gfx::Rect& root_damage_rect) {
|
| - scoped_ptr<DelegatedFrameData> frame(new DelegatedFrameData);
|
| -
|
| - scoped_ptr<RenderPass> root_pass(RenderPass::Create());
|
| - root_pass->SetNew(RenderPassId(1, 1),
|
| - root_output_rect,
|
| - root_damage_rect,
|
| - gfx::Transform());
|
| -
|
| - SharedQuadState* shared_quad_state =
|
| - root_pass->CreateAndAppendSharedQuadState();
|
| -
|
| - gfx::Rect rect = root_output_rect;
|
| - gfx::Rect opaque_rect = root_output_rect;
|
| - gfx::Rect visible_rect = root_output_rect;
|
| - // An invalid resource id! The resource isn't part of the frame.
|
| - unsigned resource_id = 5;
|
| - bool premultiplied_alpha = false;
|
| - gfx::PointF uv_top_left = gfx::PointF(0.f, 0.f);
|
| - gfx::PointF uv_bottom_right = gfx::PointF(1.f, 1.f);
|
| - SkColor background_color = 0;
|
| - float vertex_opacity[4] = {1.f, 1.f, 1.f, 1.f};
|
| - bool flipped = false;
|
| - bool nearest_neighbor = false;
|
| -
|
| - TextureDrawQuad* invalid_draw_quad =
|
| - root_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
|
| - invalid_draw_quad->SetNew(shared_quad_state,
|
| - rect,
|
| - opaque_rect,
|
| - visible_rect,
|
| - resource_id,
|
| - premultiplied_alpha,
|
| - uv_top_left,
|
| - uv_bottom_right,
|
| - background_color,
|
| - vertex_opacity,
|
| - flipped,
|
| - nearest_neighbor);
|
| -
|
| - frame->render_pass_list.push_back(root_pass.Pass());
|
| - return frame.Pass();
|
| - }
|
| -
|
| - void AddTransferableResource(DelegatedFrameData* frame,
|
| - ResourceProvider::ResourceId resource_id) {
|
| - TransferableResource resource;
|
| - resource.id = resource_id;
|
| - resource.mailbox_holder.texture_target = GL_TEXTURE_2D;
|
| - GLbyte arbitrary_mailbox[GL_MAILBOX_SIZE_CHROMIUM] = {
|
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2,
|
| - 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4,
|
| - 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4};
|
| - resource.mailbox_holder.mailbox.SetName(arbitrary_mailbox);
|
| - frame->resource_list.push_back(resource);
|
| - }
|
| -
|
| - void AddTextureQuad(DelegatedFrameData* frame,
|
| - ResourceProvider::ResourceId resource_id) {
|
| - RenderPass* render_pass = frame->render_pass_list[0];
|
| - SharedQuadState* sqs = render_pass->CreateAndAppendSharedQuadState();
|
| - TextureDrawQuad* quad =
|
| - render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
|
| - float vertex_opacity[4] = { 1.f, 1.f, 1.f, 1.f };
|
| - quad->SetNew(sqs,
|
| - gfx::Rect(0, 0, 10, 10),
|
| - gfx::Rect(0, 0, 10, 10),
|
| - gfx::Rect(0, 0, 10, 10),
|
| - resource_id,
|
| - false,
|
| - gfx::PointF(0.f, 0.f),
|
| - gfx::PointF(1.f, 1.f),
|
| - SK_ColorTRANSPARENT,
|
| - vertex_opacity,
|
| - false,
|
| - false);
|
| - }
|
| -
|
| - void AddRenderPass(DelegatedFrameData* frame,
|
| - RenderPassId id,
|
| - const gfx::Rect& output_rect,
|
| - const gfx::Rect& damage_rect,
|
| - const FilterOperations& filters,
|
| - const FilterOperations& background_filters) {
|
| - for (size_t i = 0; i < frame->render_pass_list.size(); ++i)
|
| - DCHECK(id != frame->render_pass_list[i]->id);
|
| -
|
| - scoped_ptr<RenderPass> pass(RenderPass::Create());
|
| - pass->SetNew(id,
|
| - output_rect,
|
| - damage_rect,
|
| - gfx::Transform());
|
| - frame->render_pass_list.push_back(pass.Pass());
|
| -
|
| - RenderPass* render_pass = frame->render_pass_list[0];
|
| - SharedQuadState* sqs = render_pass->CreateAndAppendSharedQuadState();
|
| - RenderPassDrawQuad* quad =
|
| - render_pass->CreateAndAppendDrawQuad<RenderPassDrawQuad>();
|
| -
|
| - quad->SetNew(sqs,
|
| - output_rect,
|
| - output_rect,
|
| - id,
|
| - 0,
|
| - gfx::Vector2dF(),
|
| - gfx::Size(),
|
| - filters,
|
| - gfx::Vector2dF(),
|
| - background_filters);
|
| - }
|
| -
|
| - static ResourceProvider::ResourceId AppendResourceId(
|
| - std::vector<ResourceProvider::ResourceId>* resources_in_last_sent_frame,
|
| - ResourceProvider::ResourceId resource_id) {
|
| - resources_in_last_sent_frame->push_back(resource_id);
|
| - return resource_id;
|
| - }
|
| -
|
| - void ReturnUnusedResourcesFromParent(LayerTreeHostImpl* host_impl) {
|
| - DelegatedFrameData* delegated_frame_data =
|
| - output_surface()->last_sent_frame().delegated_frame_data.get();
|
| - if (!delegated_frame_data)
|
| - return;
|
| -
|
| - std::vector<ResourceProvider::ResourceId> resources_in_last_sent_frame;
|
| - for (size_t i = 0; i < delegated_frame_data->resource_list.size(); ++i) {
|
| - resources_in_last_sent_frame.push_back(
|
| - delegated_frame_data->resource_list[i].id);
|
| - }
|
| -
|
| - std::vector<ResourceProvider::ResourceId> resources_to_return;
|
| -
|
| - const TransferableResourceArray& resources_held_by_parent =
|
| - output_surface()->resources_held_by_parent();
|
| - for (size_t i = 0; i < resources_held_by_parent.size(); ++i) {
|
| - ResourceProvider::ResourceId resource_in_parent =
|
| - resources_held_by_parent[i].id;
|
| - bool resource_in_parent_is_not_part_of_frame =
|
| - std::find(resources_in_last_sent_frame.begin(),
|
| - resources_in_last_sent_frame.end(),
|
| - resource_in_parent) == resources_in_last_sent_frame.end();
|
| - if (resource_in_parent_is_not_part_of_frame)
|
| - resources_to_return.push_back(resource_in_parent);
|
| - }
|
| -
|
| - if (resources_to_return.empty())
|
| - return;
|
| -
|
| - CompositorFrameAck ack;
|
| - for (size_t i = 0; i < resources_to_return.size(); ++i)
|
| - output_surface()->ReturnResource(resources_to_return[i], &ack);
|
| - host_impl->ReclaimResources(&ack);
|
| - }
|
| -};
|
| -
|
| -class LayerTreeHostDelegatedTestCaseSingleDelegatedLayer
|
| - : public LayerTreeHostDelegatedTest,
|
| - public DelegatedFrameResourceCollectionClient {
|
| - public:
|
| - LayerTreeHostDelegatedTestCaseSingleDelegatedLayer()
|
| - : resource_collection_(new DelegatedFrameResourceCollection),
|
| - available_(false) {
|
| - resource_collection_->SetClient(this);
|
| - }
|
| -
|
| - void SetupTree() override {
|
| - root_ = Layer::Create();
|
| - root_->SetBounds(gfx::Size(15, 15));
|
| -
|
| - layer_tree_host()->SetRootLayer(root_);
|
| - LayerTreeHostDelegatedTest::SetupTree();
|
| - }
|
| -
|
| - void BeginTest() override {
|
| - resource_collection_->SetClient(this);
|
| - PostSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - void SetFrameData(scoped_ptr<DelegatedFrameData> frame_data) {
|
| - RenderPass* root_pass = frame_data->render_pass_list.back();
|
| - gfx::Size frame_size = root_pass->output_rect.size();
|
| -
|
| - if (frame_provider_.get() && frame_size == frame_provider_->frame_size()) {
|
| - frame_provider_->SetFrameData(frame_data.Pass());
|
| - return;
|
| - }
|
| -
|
| - if (delegated_.get()) {
|
| - delegated_->RemoveFromParent();
|
| - delegated_ = NULL;
|
| - frame_provider_ = NULL;
|
| - }
|
| -
|
| - frame_provider_ = new DelegatedFrameProvider(resource_collection_.get(),
|
| - frame_data.Pass());
|
| -
|
| - delegated_ = CreateDelegatedLayer(frame_provider_.get());
|
| - }
|
| -
|
| - scoped_refptr<DelegatedRendererLayer> CreateDelegatedLayer(
|
| - DelegatedFrameProvider* frame_provider) {
|
| - scoped_refptr<DelegatedRendererLayer> delegated =
|
| - FakeDelegatedRendererLayer::Create(frame_provider);
|
| - delegated->SetBounds(gfx::Size(10, 10));
|
| - delegated->SetIsDrawable(true);
|
| -
|
| - root_->AddChild(delegated);
|
| - return delegated;
|
| - }
|
| -
|
| - void AfterTest() override { resource_collection_->SetClient(NULL); }
|
| -
|
| - // DelegatedFrameProviderClient implementation.
|
| - void UnusedResourcesAreAvailable() override { available_ = true; }
|
| -
|
| - bool TestAndResetAvailable() {
|
| - bool available = available_;
|
| - available_ = false;
|
| - return available;
|
| - }
|
| -
|
| - protected:
|
| - scoped_refptr<DelegatedFrameResourceCollection> resource_collection_;
|
| - scoped_refptr<DelegatedFrameProvider> frame_provider_;
|
| - scoped_refptr<Layer> root_;
|
| - scoped_refptr<DelegatedRendererLayer> delegated_;
|
| - bool available_;
|
| -};
|
| -
|
| -class LayerTreeHostDelegatedTestCreateChildId
|
| - : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
|
| - public:
|
| - LayerTreeHostDelegatedTestCreateChildId()
|
| - : LayerTreeHostDelegatedTestCaseSingleDelegatedLayer(),
|
| - num_activates_(0),
|
| - did_reset_child_id_(false) {}
|
| -
|
| - void DidCommit() override {
|
| - if (TestEnded())
|
| - return;
|
| - SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)));
|
| - }
|
| -
|
| - void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override {
|
| - if (host_impl->active_tree()->source_frame_number() < 1)
|
| - return;
|
| -
|
| - LayerImpl* root_impl = host_impl->active_tree()->root_layer();
|
| - FakeDelegatedRendererLayerImpl* delegated_impl =
|
| - static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
|
| -
|
| - TestContextProvider* context_provider = static_cast<TestContextProvider*>(
|
| - host_impl->output_surface()->context_provider());
|
| -
|
| - ++num_activates_;
|
| - switch (num_activates_) {
|
| - case 2:
|
| - EXPECT_TRUE(delegated_impl->ChildId());
|
| - EXPECT_FALSE(did_reset_child_id_);
|
| -
|
| - context_provider->ContextGL()->LoseContextCHROMIUM(
|
| - GL_GUILTY_CONTEXT_RESET_ARB,
|
| - GL_INNOCENT_CONTEXT_RESET_ARB);
|
| - context_provider->ContextGL()->Flush();
|
| - break;
|
| - case 3:
|
| - EXPECT_TRUE(delegated_impl->ChildId());
|
| - EXPECT_TRUE(did_reset_child_id_);
|
| - EndTest();
|
| - break;
|
| - }
|
| - }
|
| -
|
| - void InitializedRendererOnThread(LayerTreeHostImpl* host_impl,
|
| - bool success) override {
|
| - EXPECT_TRUE(success);
|
| -
|
| - if (num_activates_ < 2)
|
| - return;
|
| -
|
| - LayerImpl* root_impl = host_impl->active_tree()->root_layer();
|
| - FakeDelegatedRendererLayerImpl* delegated_impl =
|
| - static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
|
| -
|
| - EXPECT_EQ(2, num_activates_);
|
| - EXPECT_FALSE(delegated_impl->ChildId());
|
| - did_reset_child_id_ = true;
|
| - }
|
| -
|
| - protected:
|
| - int num_activates_;
|
| - bool did_reset_child_id_;
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestCreateChildId);
|
| -
|
| -// Test that we can gracefully handle invalid frames after the context was lost.
|
| -// For example, we might be trying to use the previous frame in that case and
|
| -// have to make sure we don't crash because our resource accounting goes wrong.
|
| -class LayerTreeHostDelegatedTestInvalidFrameAfterContextLost
|
| - : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
|
| - public:
|
| - LayerTreeHostDelegatedTestInvalidFrameAfterContextLost()
|
| - : num_activates_(0), num_output_surfaces_initialized_(0) {}
|
| -
|
| - void DidCommit() override {
|
| - if (TestEnded())
|
| - return;
|
| - scoped_ptr<DelegatedFrameData> frame1 =
|
| - CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame1.get(), 999);
|
| - AddTransferableResource(frame1.get(), 999);
|
| - SetFrameData(frame1.Pass());
|
| - }
|
| -
|
| - void DidInitializeOutputSurface() override {
|
| - if (!num_output_surfaces_initialized_++)
|
| - return;
|
| -
|
| - scoped_refptr<DelegatedRendererLayer> old_delegated = delegated_;
|
| - SetFrameData(
|
| - CreateInvalidFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)));
|
| - // Make sure we end up using the same layer, or we won't test the right
|
| - // thing, which is to make sure we can handle an invalid frame when using
|
| - // a stale layer from before the context was lost.
|
| - DCHECK(delegated_.get() == old_delegated.get());
|
| - }
|
| -
|
| - void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override {
|
| - if (host_impl->active_tree()->source_frame_number() < 1)
|
| - return;
|
| -
|
| - TestContextProvider* context_provider = static_cast<TestContextProvider*>(
|
| - host_impl->output_surface()->context_provider());
|
| -
|
| - ++num_activates_;
|
| - switch (num_activates_) {
|
| - case 2:
|
| - context_provider->ContextGL()->LoseContextCHROMIUM(
|
| - GL_GUILTY_CONTEXT_RESET_ARB,
|
| - GL_INNOCENT_CONTEXT_RESET_ARB);
|
| - break;
|
| - case 3:
|
| - EndTest();
|
| - break;
|
| - }
|
| - }
|
| -
|
| - void InitializedRendererOnThread(LayerTreeHostImpl* host_impl,
|
| - bool success) override {
|
| - EXPECT_TRUE(success);
|
| -
|
| - if (num_activates_ < 2)
|
| - return;
|
| -
|
| - LayerImpl* root_impl = host_impl->active_tree()->root_layer();
|
| - FakeDelegatedRendererLayerImpl* delegated_impl =
|
| - static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
|
| -
|
| - EXPECT_EQ(2, num_activates_);
|
| - // Resources should have gotten cleared after the context was lost.
|
| - EXPECT_EQ(0U, delegated_impl->Resources().size());
|
| - }
|
| -
|
| - void AfterTest() override {
|
| - LayerTreeHostDelegatedTestCaseSingleDelegatedLayer::AfterTest();
|
| - EXPECT_EQ(2, num_output_surfaces_initialized_);
|
| - }
|
| -
|
| - protected:
|
| - int num_activates_;
|
| - int num_output_surfaces_initialized_;
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(
|
| - LayerTreeHostDelegatedTestInvalidFrameAfterContextLost);
|
| -
|
| -class LayerTreeHostDelegatedTestLayerUsesFrameDamage
|
| - : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
|
| - public:
|
| - void DidCommit() override {
|
| - int next_source_frame_number = layer_tree_host()->source_frame_number();
|
| - switch (next_source_frame_number) {
|
| - case 1:
|
| - // The first time the layer gets a frame the whole layer should be
|
| - // damaged.
|
| - SetFrameData(
|
| - CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)));
|
| - break;
|
| - case 2:
|
| - // A different frame size will damage the whole layer.
|
| - SetFrameData(
|
| - CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(0, 0, 0, 0)));
|
| - break;
|
| - case 3:
|
| - // Should create a total amount of gfx::Rect(2, 2, 8, 6) damage:
|
| - // (2, 2, 10, 6) clamped to the root output rect.
|
| - SetFrameData(
|
| - CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(2, 2, 5, 5)));
|
| - SetFrameData(
|
| - CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(7, 2, 5, 6)));
|
| - break;
|
| - case 4:
|
| - // Should create zero damage.
|
| - layer_tree_host()->SetNeedsCommit();
|
| - break;
|
| - case 5:
|
| - // Should damage the full viewport.
|
| - delegated_->SetBounds(gfx::Size(2, 2));
|
| - break;
|
| - case 6:
|
| - // Should create zero damage.
|
| - layer_tree_host()->SetNeedsCommit();
|
| - break;
|
| - case 7:
|
| - // Should damage the full layer, tho the frame size is not changing.
|
| - delegated_->SetBounds(gfx::Size(6, 6));
|
| - SetFrameData(
|
| - CreateFrameData(gfx::Rect(0, 0, 20, 20), gfx::Rect(1, 1, 2, 2)));
|
| - break;
|
| - case 8:
|
| - // Should create zero damage.
|
| - layer_tree_host()->SetNeedsCommit();
|
| - break;
|
| - case 9:
|
| - // Should create zero damage.
|
| - layer_tree_host()->SetNeedsCommit();
|
| - break;
|
| - case 10:
|
| - // Changing the frame size damages the full layer.
|
| - SetFrameData(
|
| - CreateFrameData(gfx::Rect(0, 0, 5, 5), gfx::Rect(4, 4, 1, 1)));
|
| - break;
|
| - case 11:
|
| - // An invalid frame isn't used, so it should not cause damage.
|
| - SetFrameData(CreateInvalidFrameData(gfx::Rect(0, 0, 5, 5),
|
| - gfx::Rect(4, 4, 1, 1)));
|
| - break;
|
| - case 12:
|
| - // Should create gfx::Rect(1, 1, 2, 2) of damage.
|
| - SetFrameData(
|
| - CreateFrameData(gfx::Rect(0, 0, 5, 5), gfx::Rect(1, 1, 2, 2)));
|
| - break;
|
| - case 13:
|
| - // Should create zero damage.
|
| - layer_tree_host()->SetNeedsCommit();
|
| - break;
|
| - case 14:
|
| - // Moving the layer out of the tree and back in will damage the whole
|
| - // impl layer.
|
| - delegated_->RemoveFromParent();
|
| - layer_tree_host()->root_layer()->AddChild(delegated_);
|
| - break;
|
| - case 15:
|
| - // Make a larger frame with lots of damage. Then a frame smaller than
|
| - // the first frame's damage. The entire layer should be damaged, but
|
| - // nothing more.
|
| - SetFrameData(
|
| - CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(0, 0, 10, 10)));
|
| - SetFrameData(
|
| - CreateFrameData(gfx::Rect(0, 0, 5, 5), gfx::Rect(1, 1, 2, 2)));
|
| - break;
|
| - case 16:
|
| - // Make a frame with lots of damage. Then replace it with a frame with
|
| - // no damage. The entire layer should be damaged, but nothing more.
|
| - SetFrameData(
|
| - CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(0, 0, 10, 10)));
|
| - SetFrameData(
|
| - CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(0, 0, 0, 0)));
|
| - break;
|
| - case 17:
|
| - // Make another layer that uses the same frame provider. The new layer
|
| - // should be damaged.
|
| - delegated_copy_ = CreateDelegatedLayer(frame_provider_.get());
|
| - delegated_copy_->SetPosition(gfx::Point(5, 0));
|
| -
|
| - // Also set a new frame.
|
| - SetFrameData(
|
| - CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(4, 0, 1, 1)));
|
| - break;
|
| - case 18:
|
| - // Set another new frame, both layers should be damaged in the same
|
| - // ways.
|
| - SetFrameData(
|
| - CreateFrameData(gfx::Rect(0, 0, 10, 10), gfx::Rect(3, 3, 1, 1)));
|
| - break;
|
| - }
|
| - }
|
| -
|
| - DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
|
| - LayerTreeHostImpl::FrameData* frame,
|
| - DrawResult draw_result) override {
|
| - EXPECT_EQ(DRAW_SUCCESS, draw_result);
|
| -
|
| - gfx::Rect damage_rect;
|
| - if (!frame->has_no_damage) {
|
| - damage_rect = frame->render_passes.back()->damage_rect;
|
| - } else {
|
| - // If there is no damage, then we have no render passes to send.
|
| - EXPECT_TRUE(frame->render_passes.empty());
|
| - }
|
| -
|
| - switch (host_impl->active_tree()->source_frame_number()) {
|
| - case 0:
|
| - // First frame is damaged because of viewport resize.
|
| - EXPECT_EQ(gfx::Rect(15, 15).ToString(), damage_rect.ToString());
|
| - break;
|
| - case 1:
|
| - EXPECT_EQ(gfx::Rect(10, 10).ToString(), damage_rect.ToString());
|
| - break;
|
| - case 2:
|
| - EXPECT_EQ(gfx::Rect(10, 10).ToString(), damage_rect.ToString());
|
| - break;
|
| - case 3:
|
| - EXPECT_EQ(gfx::Rect(2, 2, 8, 6).ToString(), damage_rect.ToString());
|
| - break;
|
| - case 4:
|
| - EXPECT_EQ(gfx::Rect().ToString(), damage_rect.ToString());
|
| - break;
|
| - case 5:
|
| - EXPECT_EQ(gfx::Rect(10, 10).ToString(), damage_rect.ToString());
|
| - break;
|
| - case 6:
|
| - EXPECT_EQ(gfx::Rect().ToString(), damage_rect.ToString());
|
| - break;
|
| - case 7:
|
| - EXPECT_EQ(gfx::Rect(6, 6).ToString(), damage_rect.ToString());
|
| - break;
|
| - case 8:
|
| - EXPECT_EQ(gfx::Rect().ToString(), damage_rect.ToString());
|
| - break;
|
| - case 9:
|
| - EXPECT_EQ(gfx::Rect().ToString(), damage_rect.ToString());
|
| - break;
|
| - case 10:
|
| - EXPECT_EQ(gfx::Rect(10, 10).ToString(), damage_rect.ToString());
|
| - break;
|
| - case 11:
|
| - EXPECT_EQ(gfx::Rect().ToString(), damage_rect.ToString());
|
| - break;
|
| - case 12:
|
| - EXPECT_EQ(gfx::Rect(1, 1, 2, 2).ToString(), damage_rect.ToString());
|
| - break;
|
| - case 13:
|
| - EXPECT_EQ(gfx::Rect().ToString(), damage_rect.ToString());
|
| - break;
|
| - case 14:
|
| - EXPECT_EQ(gfx::Rect(10, 10).ToString(), damage_rect.ToString());
|
| - break;
|
| - case 15:
|
| - EXPECT_EQ(gfx::Rect(10, 10).ToString(), damage_rect.ToString());
|
| - break;
|
| - case 16:
|
| - EXPECT_EQ(gfx::Rect(10, 10).ToString(), damage_rect.ToString());
|
| - break;
|
| - case 17:
|
| - EXPECT_EQ(gfx::UnionRects(gfx::Rect(5, 0, 10, 10),
|
| - gfx::Rect(4, 0, 1, 1)).ToString(),
|
| - damage_rect.ToString());
|
| - break;
|
| - case 18:
|
| - EXPECT_EQ(gfx::Rect(3, 3, 6, 1).ToString(), damage_rect.ToString());
|
| - EndTest();
|
| - break;
|
| - }
|
| -
|
| - return draw_result;
|
| - }
|
| -
|
| - protected:
|
| - scoped_refptr<DelegatedRendererLayer> delegated_copy_;
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestLayerUsesFrameDamage);
|
| -
|
| -class LayerTreeHostDelegatedTestMergeResources
|
| - : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
|
| - public:
|
| - void BeginTest() override {
|
| - // Push two frames to the delegated renderer layer with no commit between.
|
| -
|
| - // The first frame has resource 999.
|
| - scoped_ptr<DelegatedFrameData> frame1 =
|
| - CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame1.get(), 999);
|
| - AddTransferableResource(frame1.get(), 999);
|
| - SetFrameData(frame1.Pass());
|
| -
|
| - // The second frame uses resource 999 still, but also adds 555.
|
| - scoped_ptr<DelegatedFrameData> frame2 =
|
| - CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame2.get(), 999);
|
| - AddTransferableResource(frame2.get(), 999);
|
| - AddTextureQuad(frame2.get(), 555);
|
| - AddTransferableResource(frame2.get(), 555);
|
| - SetFrameData(frame2.Pass());
|
| -
|
| - // The resource 999 from frame1 is returned since it is still on the main
|
| - // thread.
|
| - ReturnedResourceArray returned_resources;
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(
|
| - &returned_resources);
|
| - {
|
| - unsigned expected[] = {999};
|
| - EXPECT_RESOURCES(expected, returned_resources);
|
| - EXPECT_TRUE(TestAndResetAvailable());
|
| - }
|
| -
|
| - PostSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override {
|
| - LayerImpl* root_impl = host_impl->active_tree()->root_layer();
|
| - FakeDelegatedRendererLayerImpl* delegated_impl =
|
| - static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
|
| -
|
| - const ResourceProvider::ResourceIdMap& map =
|
| - host_impl->resource_provider()->GetChildToParentMap(
|
| - delegated_impl->ChildId());
|
| -
|
| - // Both frames' resources should be in the parent's resource provider.
|
| - EXPECT_EQ(2u, map.size());
|
| - EXPECT_EQ(1u, map.count(999));
|
| - EXPECT_EQ(1u, map.count(555));
|
| -
|
| - EXPECT_EQ(2u, delegated_impl->Resources().size());
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(999));
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(555));
|
| -
|
| - EndTest();
|
| - }
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestMergeResources);
|
| -
|
| -class LayerTreeHostDelegatedTestRemapResourcesInQuads
|
| - : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
|
| - public:
|
| - void BeginTest() override {
|
| - // Generate a frame with two resources in it.
|
| - scoped_ptr<DelegatedFrameData> frame =
|
| - CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTransferableResource(frame.get(), 999);
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| - SetFrameData(frame.Pass());
|
| -
|
| - PostSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override {
|
| - LayerImpl* root_impl = host_impl->active_tree()->root_layer();
|
| - FakeDelegatedRendererLayerImpl* delegated_impl =
|
| - static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
|
| -
|
| - const ResourceProvider::ResourceIdMap& map =
|
| - host_impl->resource_provider()->GetChildToParentMap(
|
| - delegated_impl->ChildId());
|
| -
|
| - // The frame's resource should be in the parent's resource provider.
|
| - EXPECT_EQ(2u, map.size());
|
| - EXPECT_EQ(1u, map.count(999));
|
| - EXPECT_EQ(1u, map.count(555));
|
| -
|
| - ResourceProvider::ResourceId parent_resource_id1 = map.find(999)->second;
|
| - EXPECT_NE(parent_resource_id1, 999u);
|
| - ResourceProvider::ResourceId parent_resource_id2 = map.find(555)->second;
|
| - EXPECT_NE(parent_resource_id2, 555u);
|
| -
|
| - // The resources in the quads should be remapped to the parent's namespace.
|
| - const TextureDrawQuad* quad1 = TextureDrawQuad::MaterialCast(
|
| - delegated_impl->RenderPassesInDrawOrder()[0]->quad_list.ElementAt(0));
|
| - EXPECT_EQ(parent_resource_id1, quad1->resource_id);
|
| - const TextureDrawQuad* quad2 = TextureDrawQuad::MaterialCast(
|
| - delegated_impl->RenderPassesInDrawOrder()[0]->quad_list.ElementAt(1));
|
| - EXPECT_EQ(parent_resource_id2, quad2->resource_id);
|
| -
|
| - EndTest();
|
| - }
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestRemapResourcesInQuads);
|
| -
|
| -class LayerTreeHostDelegatedTestReturnUnusedResources
|
| - : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
|
| - public:
|
| - void BeginTest() override { PostSetNeedsCommitToMainThread(); }
|
| -
|
| - void DidCommitAndDrawFrame() override {
|
| - scoped_ptr<DelegatedFrameData> frame;
|
| - ReturnedResourceArray resources;
|
| -
|
| - int next_source_frame_number = layer_tree_host()->source_frame_number();
|
| - switch (next_source_frame_number) {
|
| - case 1:
|
| - // Generate a frame with two resources in it.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTransferableResource(frame.get(), 999);
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 2:
|
| - // All of the resources are in use.
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Keep using 999 but stop using 555.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTransferableResource(frame.get(), 999);
|
| - AddTextureQuad(frame.get(), 444);
|
| - AddTransferableResource(frame.get(), 444);
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 3:
|
| - // 555 is no longer in use.
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - {
|
| - unsigned expected[] = {555};
|
| - EXPECT_RESOURCES(expected, resources);
|
| - EXPECT_TRUE(TestAndResetAvailable());
|
| - }
|
| -
|
| - // Stop using any resources.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 4:
|
| - // Postpone collecting resources for a frame. They should still be there
|
| - // the next frame.
|
| - layer_tree_host()->SetNeedsCommit();
|
| - return;
|
| - case 5:
|
| - // 444 and 999 are no longer in use. We sent two refs to 999, so we
|
| - // should get two back.
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - {
|
| - unsigned expected[] = {444, 999, 999};
|
| - EXPECT_RESOURCES(expected, resources);
|
| - EXPECT_TRUE(TestAndResetAvailable());
|
| - }
|
| - EndTest();
|
| - break;
|
| - }
|
| -
|
| - // Resources are never immediately released.
|
| - ReturnedResourceArray empty_resources;
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(
|
| - &empty_resources);
|
| - EXPECT_EQ(0u, empty_resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| - }
|
| -
|
| - void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override {
|
| - ReturnUnusedResourcesFromParent(host_impl);
|
| - }
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(
|
| - LayerTreeHostDelegatedTestReturnUnusedResources);
|
| -
|
| -class LayerTreeHostDelegatedTestReusedResources
|
| - : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
|
| - public:
|
| - void BeginTest() override { PostSetNeedsCommitToMainThread(); }
|
| -
|
| - void DidCommitAndDrawFrame() override {
|
| - scoped_ptr<DelegatedFrameData> frame;
|
| - ReturnedResourceArray resources;
|
| -
|
| - int next_source_frame_number = layer_tree_host()->source_frame_number();
|
| - switch (next_source_frame_number) {
|
| - case 1:
|
| - // Generate a frame with some resources in it.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTransferableResource(frame.get(), 999);
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| - AddTextureQuad(frame.get(), 444);
|
| - AddTransferableResource(frame.get(), 444);
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 2:
|
| - // All of the resources are in use.
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Keep using 999 but stop using 555 and 444.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTransferableResource(frame.get(), 999);
|
| - SetFrameData(frame.Pass());
|
| -
|
| - // Resource are not immediately released.
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Now using 555 and 444 again, but not 999.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| - AddTextureQuad(frame.get(), 444);
|
| - AddTransferableResource(frame.get(), 444);
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 3:
|
| - // The 999 resource is the only unused one. Two references were sent, so
|
| - // two should be returned.
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - {
|
| - unsigned expected[] = {999, 999};
|
| - EXPECT_RESOURCES(expected, resources);
|
| - EXPECT_TRUE(TestAndResetAvailable());
|
| - }
|
| - EndTest();
|
| - break;
|
| - }
|
| - }
|
| -
|
| - void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override {
|
| - ReturnUnusedResourcesFromParent(host_impl);
|
| - }
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestReusedResources);
|
| -
|
| -class LayerTreeHostDelegatedTestFrameBeforeAck
|
| - : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
|
| - public:
|
| - void BeginTest() override { PostSetNeedsCommitToMainThread(); }
|
| -
|
| - void DidCommitAndDrawFrame() override {
|
| - scoped_ptr<DelegatedFrameData> frame;
|
| - ReturnedResourceArray resources;
|
| -
|
| - int next_source_frame_number = layer_tree_host()->source_frame_number();
|
| - switch (next_source_frame_number) {
|
| - case 1:
|
| - // Generate a frame with some resources in it.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTransferableResource(frame.get(), 999);
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| - AddTextureQuad(frame.get(), 444);
|
| - AddTransferableResource(frame.get(), 444);
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 2:
|
| - // All of the resources are in use.
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Keep using 999 but stop using 555 and 444.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTransferableResource(frame.get(), 999);
|
| - SetFrameData(frame.Pass());
|
| -
|
| - // Resource are not immediately released.
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // The parent compositor (this one) does a commit.
|
| - break;
|
| - case 3:
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - {
|
| - unsigned expected[] = {444, 555};
|
| - EXPECT_RESOURCES(expected, resources);
|
| - EXPECT_TRUE(TestAndResetAvailable());
|
| - }
|
| -
|
| - // The child compositor sends a frame referring to resources not in the
|
| - // frame.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTextureQuad(frame.get(), 444);
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - }
|
| - }
|
| -
|
| - void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override {
|
| - if (host_impl->active_tree()->source_frame_number() != 3)
|
| - return;
|
| -
|
| - LayerImpl* root_impl = host_impl->active_tree()->root_layer();
|
| - FakeDelegatedRendererLayerImpl* delegated_impl =
|
| - static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
|
| -
|
| - const ResourceProvider::ResourceIdMap& map =
|
| - host_impl->resource_provider()->GetChildToParentMap(
|
| - delegated_impl->ChildId());
|
| -
|
| - // The bad frame should be dropped. So we should only have one quad (the
|
| - // one with resource 999) on the impl tree. And only 999 will be present
|
| - // in the parent's resource provider.
|
| - EXPECT_EQ(1u, map.size());
|
| - EXPECT_EQ(1u, map.count(999));
|
| -
|
| - EXPECT_EQ(1u, delegated_impl->Resources().size());
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(999));
|
| -
|
| - const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0];
|
| - EXPECT_EQ(1u, pass->quad_list.size());
|
| - const TextureDrawQuad* quad =
|
| - TextureDrawQuad::MaterialCast(pass->quad_list.front());
|
| - EXPECT_EQ(map.find(999)->second, quad->resource_id);
|
| -
|
| - EndTest();
|
| - }
|
| -
|
| - void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override {
|
| - ReturnUnusedResourcesFromParent(host_impl);
|
| - }
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestFrameBeforeAck);
|
| -
|
| -class LayerTreeHostDelegatedTestFrameBeforeTakeResources
|
| - : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
|
| - public:
|
| - void BeginTest() override { PostSetNeedsCommitToMainThread(); }
|
| -
|
| - void DidCommitAndDrawFrame() override {
|
| - scoped_ptr<DelegatedFrameData> frame;
|
| - ReturnedResourceArray resources;
|
| -
|
| - int next_source_frame_number = layer_tree_host()->source_frame_number();
|
| - switch (next_source_frame_number) {
|
| - case 1:
|
| - // Generate a frame with some resources in it.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTransferableResource(frame.get(), 999);
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| - AddTextureQuad(frame.get(), 444);
|
| - AddTransferableResource(frame.get(), 444);
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 2:
|
| - // All of the resources are in use.
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Keep using 999 but stop using 555 and 444.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTransferableResource(frame.get(), 999);
|
| - SetFrameData(frame.Pass());
|
| -
|
| - // Resource are not immediately released.
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // The parent compositor (this one) does a commit.
|
| - break;
|
| - case 3:
|
| - // The child compositor sends a frame before taking resources back
|
| - // from the previous commit. This frame makes use of the resources 555
|
| - // and 444, which were just released during commit.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTransferableResource(frame.get(), 999);
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| - AddTextureQuad(frame.get(), 444);
|
| - AddTransferableResource(frame.get(), 444);
|
| - SetFrameData(frame.Pass());
|
| -
|
| - // The resources are used by the new frame but are returned anyway since
|
| - // we passed them again.
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - {
|
| - unsigned expected[] = {444, 555};
|
| - EXPECT_RESOURCES(expected, resources);
|
| - EXPECT_TRUE(TestAndResetAvailable());
|
| - }
|
| - break;
|
| - case 4:
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| - EndTest();
|
| - break;
|
| - }
|
| - }
|
| -
|
| - void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override {
|
| - if (host_impl->active_tree()->source_frame_number() != 3)
|
| - return;
|
| -
|
| - LayerImpl* root_impl = host_impl->active_tree()->root_layer();
|
| - FakeDelegatedRendererLayerImpl* delegated_impl =
|
| - static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
|
| -
|
| - const ResourceProvider::ResourceIdMap& map =
|
| - host_impl->resource_provider()->GetChildToParentMap(
|
| - delegated_impl->ChildId());
|
| -
|
| - // The third frame has all of the resources in it again, the delegated
|
| - // renderer layer should continue to own the resources for it.
|
| - EXPECT_EQ(3u, map.size());
|
| - EXPECT_EQ(1u, map.count(999));
|
| - EXPECT_EQ(1u, map.count(555));
|
| - EXPECT_EQ(1u, map.count(444));
|
| -
|
| - EXPECT_EQ(3u, delegated_impl->Resources().size());
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(999));
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(555));
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(444));
|
| -
|
| - const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0];
|
| - EXPECT_EQ(3u, pass->quad_list.size());
|
| - const TextureDrawQuad* quad1 =
|
| - TextureDrawQuad::MaterialCast(pass->quad_list.ElementAt(0));
|
| - EXPECT_EQ(map.find(999)->second, quad1->resource_id);
|
| - const TextureDrawQuad* quad2 =
|
| - TextureDrawQuad::MaterialCast(pass->quad_list.ElementAt(1));
|
| - EXPECT_EQ(map.find(555)->second, quad2->resource_id);
|
| - const TextureDrawQuad* quad3 =
|
| - TextureDrawQuad::MaterialCast(pass->quad_list.ElementAt(2));
|
| - EXPECT_EQ(map.find(444)->second, quad3->resource_id);
|
| - }
|
| -
|
| - void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override {
|
| - ReturnUnusedResourcesFromParent(host_impl);
|
| - }
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(
|
| - LayerTreeHostDelegatedTestFrameBeforeTakeResources);
|
| -
|
| -class LayerTreeHostDelegatedTestBadFrame
|
| - : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
|
| - public:
|
| - void BeginTest() override { PostSetNeedsCommitToMainThread(); }
|
| -
|
| - void DidCommitAndDrawFrame() override {
|
| - scoped_ptr<DelegatedFrameData> frame;
|
| - ReturnedResourceArray resources;
|
| -
|
| - int next_source_frame_number = layer_tree_host()->source_frame_number();
|
| - switch (next_source_frame_number) {
|
| - case 1:
|
| - // Generate a frame with some resources in it.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTransferableResource(frame.get(), 999);
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 2:
|
| - // All of the resources are in use.
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Generate a bad frame with a resource the layer doesn't have. The
|
| - // 885 and 775 resources are unknown, while ownership of the legit 444
|
| - // resource is passed in here. The bad frame does not use any of the
|
| - // previous resources, 999 or 555.
|
| - // A bad quad is present both before and after the good quad.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 885);
|
| - AddTextureQuad(frame.get(), 444);
|
| - AddTransferableResource(frame.get(), 444);
|
| - AddTextureQuad(frame.get(), 775);
|
| - SetFrameData(frame.Pass());
|
| -
|
| - // The parent compositor (this one) does a commit.
|
| - break;
|
| - case 3:
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Now send a good frame with 999 again.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - SetFrameData(frame.Pass());
|
| -
|
| - // The bad frame's resource is given back to the child compositor.
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - {
|
| - unsigned expected[] = {444};
|
| - EXPECT_RESOURCES(expected, resources);
|
| - EXPECT_TRUE(TestAndResetAvailable());
|
| - }
|
| - break;
|
| - case 4:
|
| - // The unused 555 from the last good frame is now released.
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - {
|
| - unsigned expected[] = {555};
|
| - EXPECT_RESOURCES(expected, resources);
|
| - EXPECT_TRUE(TestAndResetAvailable());
|
| - }
|
| -
|
| - EndTest();
|
| - break;
|
| - }
|
| - }
|
| -
|
| - void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override {
|
| - if (host_impl->active_tree()->source_frame_number() < 1)
|
| - return;
|
| -
|
| - ReturnUnusedResourcesFromParent(host_impl);
|
| -
|
| - LayerImpl* root_impl = host_impl->active_tree()->root_layer();
|
| - FakeDelegatedRendererLayerImpl* delegated_impl =
|
| - static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
|
| -
|
| - const ResourceProvider::ResourceIdMap& map =
|
| - host_impl->resource_provider()->GetChildToParentMap(
|
| - delegated_impl->ChildId());
|
| -
|
| - switch (host_impl->active_tree()->source_frame_number()) {
|
| - case 1: {
|
| - // We have the first good frame with just 990 and 555 in it.
|
| - // layer.
|
| - EXPECT_EQ(2u, map.size());
|
| - EXPECT_EQ(1u, map.count(999));
|
| - EXPECT_EQ(1u, map.count(555));
|
| -
|
| - EXPECT_EQ(2u, delegated_impl->Resources().size());
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(999));
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(555));
|
| -
|
| - const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0];
|
| - EXPECT_EQ(2u, pass->quad_list.size());
|
| - const TextureDrawQuad* quad1 =
|
| - TextureDrawQuad::MaterialCast(pass->quad_list.ElementAt(0));
|
| - EXPECT_EQ(map.find(999)->second, quad1->resource_id);
|
| - const TextureDrawQuad* quad2 =
|
| - TextureDrawQuad::MaterialCast(pass->quad_list.ElementAt(1));
|
| - EXPECT_EQ(map.find(555)->second, quad2->resource_id);
|
| - break;
|
| - }
|
| - case 2: {
|
| - // We only keep resources from the last valid frame.
|
| - EXPECT_EQ(2u, map.size());
|
| - EXPECT_EQ(1u, map.count(999));
|
| - EXPECT_EQ(1u, map.count(555));
|
| -
|
| - EXPECT_EQ(2u, delegated_impl->Resources().size());
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(999));
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(555));
|
| -
|
| - // The bad frame is dropped though, we still have the frame with 999 and
|
| - // 555 in it.
|
| - const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0];
|
| - EXPECT_EQ(2u, pass->quad_list.size());
|
| - const TextureDrawQuad* quad1 =
|
| - TextureDrawQuad::MaterialCast(pass->quad_list.ElementAt(0));
|
| - EXPECT_EQ(map.find(999)->second, quad1->resource_id);
|
| - const TextureDrawQuad* quad2 =
|
| - TextureDrawQuad::MaterialCast(pass->quad_list.ElementAt(1));
|
| - EXPECT_EQ(map.find(555)->second, quad2->resource_id);
|
| - break;
|
| - }
|
| - case 3: {
|
| - // We have the new good frame with just 999 in it.
|
| - EXPECT_EQ(1u, map.size());
|
| - EXPECT_EQ(1u, map.count(999));
|
| -
|
| - EXPECT_EQ(1u, delegated_impl->Resources().size());
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(999));
|
| -
|
| - const RenderPass* pass = delegated_impl->RenderPassesInDrawOrder()[0];
|
| - EXPECT_EQ(1u, pass->quad_list.size());
|
| - const TextureDrawQuad* quad1 =
|
| - TextureDrawQuad::MaterialCast(pass->quad_list.front());
|
| - EXPECT_EQ(map.find(999)->second, quad1->resource_id);
|
| - break;
|
| - }
|
| - }
|
| - }
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestBadFrame);
|
| -
|
| -class LayerTreeHostDelegatedTestUnnamedResource
|
| - : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
|
| - public:
|
| - void BeginTest() override { PostSetNeedsCommitToMainThread(); }
|
| -
|
| - void DidCommit() override {
|
| - scoped_ptr<DelegatedFrameData> frame;
|
| - ReturnedResourceArray resources;
|
| -
|
| - int next_source_frame_number = layer_tree_host()->source_frame_number();
|
| - switch (next_source_frame_number) {
|
| - case 1:
|
| - // This frame includes two resources in it, but only uses one.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTransferableResource(frame.get(), 999);
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 2:
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Now send an empty frame.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - SetFrameData(frame.Pass());
|
| -
|
| - // The unused resource should be returned.
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - {
|
| - unsigned expected[] = {999};
|
| - EXPECT_RESOURCES(expected, resources);
|
| - EXPECT_TRUE(TestAndResetAvailable());
|
| - }
|
| -
|
| - EndTest();
|
| - break;
|
| - }
|
| - }
|
| -
|
| - void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override {
|
| - if (host_impl->active_tree()->source_frame_number() != 1)
|
| - return;
|
| -
|
| - LayerImpl* root_impl = host_impl->active_tree()->root_layer();
|
| - FakeDelegatedRendererLayerImpl* delegated_impl =
|
| - static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
|
| -
|
| - const ResourceProvider::ResourceIdMap& map =
|
| - host_impl->resource_provider()->GetChildToParentMap(
|
| - delegated_impl->ChildId());
|
| -
|
| - // The layer only held on to the resource that was used.
|
| - EXPECT_EQ(1u, map.size());
|
| - EXPECT_EQ(1u, map.count(555));
|
| -
|
| - EXPECT_EQ(1u, delegated_impl->Resources().size());
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(555));
|
| - }
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestUnnamedResource);
|
| -
|
| -class LayerTreeHostDelegatedTestDontLeakResource
|
| - : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
|
| - public:
|
| - void BeginTest() override { PostSetNeedsCommitToMainThread(); }
|
| -
|
| - void DidCommitAndDrawFrame() override {
|
| - scoped_ptr<DelegatedFrameData> frame;
|
| - ReturnedResourceArray resources;
|
| -
|
| - int next_source_frame_number = layer_tree_host()->source_frame_number();
|
| - switch (next_source_frame_number) {
|
| - case 1:
|
| - // This frame includes two resources in it.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTransferableResource(frame.get(), 999);
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| - SetFrameData(frame.Pass());
|
| -
|
| - // But then we immediately stop using 999.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 2:
|
| - // The unused resources should be returned. 555 is still used, but it's
|
| - // returned once to account for the first frame.
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - {
|
| - unsigned expected[] = {555, 999};
|
| - EXPECT_RESOURCES(expected, resources);
|
| - EXPECT_TRUE(TestAndResetAvailable());
|
| - }
|
| - // Send a frame with no resources in it.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 3:
|
| - // The now unused resource 555 should be returned.
|
| - resources.clear();
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - {
|
| - unsigned expected[] = {555};
|
| - EXPECT_RESOURCES(expected, resources);
|
| - EXPECT_TRUE(TestAndResetAvailable());
|
| - }
|
| - EndTest();
|
| - break;
|
| - }
|
| - }
|
| -
|
| - void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override {
|
| - if (host_impl->active_tree()->source_frame_number() != 1)
|
| - return;
|
| -
|
| - LayerImpl* root_impl = host_impl->active_tree()->root_layer();
|
| - FakeDelegatedRendererLayerImpl* delegated_impl =
|
| - static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
|
| -
|
| - const ResourceProvider::ResourceIdMap& map =
|
| - host_impl->resource_provider()->GetChildToParentMap(
|
| - delegated_impl->ChildId());
|
| -
|
| - // The layer only held on to the resource that was used.
|
| - EXPECT_EQ(1u, map.size());
|
| - EXPECT_EQ(1u, map.count(555));
|
| -
|
| - EXPECT_EQ(1u, delegated_impl->Resources().size());
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(555));
|
| - }
|
| -
|
| - void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override {
|
| - ReturnUnusedResourcesFromParent(host_impl);
|
| - }
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestDontLeakResource);
|
| -
|
| -class LayerTreeHostDelegatedTestResourceSentToParent
|
| - : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
|
| - public:
|
| - void DidCommitAndDrawFrame() override {
|
| - scoped_ptr<DelegatedFrameData> frame;
|
| - ReturnedResourceArray resources;
|
| -
|
| - int next_source_frame_number = layer_tree_host()->source_frame_number();
|
| - switch (next_source_frame_number) {
|
| - case 1:
|
| - // This frame includes two resources in it.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTransferableResource(frame.get(), 999);
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 2:
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // 999 is in use in the grandparent compositor, generate a frame without
|
| - // it present.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 3:
|
| - // Since 999 is in the grandparent it is not returned.
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // The impl side will get back the resource at some point.
|
| - ImplThreadTaskRunner()->PostTask(FROM_HERE,
|
| - receive_resource_on_thread_);
|
| - break;
|
| - }
|
| - }
|
| -
|
| - void ReceiveResourceOnThread(LayerTreeHostImpl* host_impl) {
|
| - LayerImpl* root_impl = host_impl->active_tree()->root_layer();
|
| - FakeDelegatedRendererLayerImpl* delegated_impl =
|
| - static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
|
| -
|
| - const ResourceProvider::ResourceIdMap& map =
|
| - host_impl->resource_provider()->GetChildToParentMap(
|
| - delegated_impl->ChildId());
|
| -
|
| - // Receive 999 back from the grandparent.
|
| - CompositorFrameAck ack;
|
| - output_surface()->ReturnResource(map.find(999)->second, &ack);
|
| - host_impl->ReclaimResources(&ack);
|
| - }
|
| -
|
| - void UnusedResourcesAreAvailable() override {
|
| - EXPECT_EQ(3, layer_tree_host()->source_frame_number());
|
| -
|
| - ReturnedResourceArray resources;
|
| -
|
| - // 999 was returned from the grandparent and could be released.
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - {
|
| - unsigned expected[] = {999};
|
| - EXPECT_RESOURCES(expected, resources);
|
| - }
|
| -
|
| - EndTest();
|
| - }
|
| -
|
| - void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override {
|
| - if (host_impl->active_tree()->source_frame_number() < 1)
|
| - return;
|
| -
|
| - LayerImpl* root_impl = host_impl->active_tree()->root_layer();
|
| - FakeDelegatedRendererLayerImpl* delegated_impl =
|
| - static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
|
| -
|
| - const ResourceProvider::ResourceIdMap& map =
|
| - host_impl->resource_provider()->GetChildToParentMap(
|
| - delegated_impl->ChildId());
|
| -
|
| - switch (host_impl->active_tree()->source_frame_number()) {
|
| - case 1: {
|
| - EXPECT_EQ(2u, map.size());
|
| - EXPECT_EQ(1u, map.count(999));
|
| - EXPECT_EQ(1u, map.count(555));
|
| -
|
| - EXPECT_EQ(2u, delegated_impl->Resources().size());
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(999));
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(555));
|
| -
|
| - // The 999 resource will be sent to a grandparent compositor.
|
| - break;
|
| - }
|
| - case 2: {
|
| - EXPECT_EQ(2u, map.size());
|
| - EXPECT_EQ(1u, map.count(999));
|
| - EXPECT_EQ(1u, map.count(555));
|
| -
|
| - // 999 is in the parent, so not held by delegated renderer layer.
|
| - EXPECT_EQ(1u, delegated_impl->Resources().size());
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(555));
|
| -
|
| - receive_resource_on_thread_ =
|
| - base::Bind(&LayerTreeHostDelegatedTestResourceSentToParent::
|
| - ReceiveResourceOnThread,
|
| - base::Unretained(this),
|
| - host_impl);
|
| - break;
|
| - }
|
| - case 3:
|
| - // 999 should be released.
|
| - EXPECT_EQ(1u, map.size());
|
| - EXPECT_EQ(1u, map.count(555));
|
| -
|
| - EXPECT_EQ(1u, delegated_impl->Resources().size());
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(map.find(555)->second));
|
| - break;
|
| - }
|
| - }
|
| -
|
| - base::Closure receive_resource_on_thread_;
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_DELEGATING_RENDERER_TEST_F(
|
| - LayerTreeHostDelegatedTestResourceSentToParent);
|
| -
|
| -class LayerTreeHostDelegatedTestCommitWithoutTake
|
| - : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
|
| - public:
|
| - void BeginTest() override {
|
| - // Prevent drawing with resources that are sent to the grandparent.
|
| - layer_tree_host()->SetViewportSize(gfx::Size());
|
| - PostSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - void DidCommit() override {
|
| - scoped_ptr<DelegatedFrameData> frame;
|
| - ReturnedResourceArray resources;
|
| -
|
| - int next_source_frame_number = layer_tree_host()->source_frame_number();
|
| - switch (next_source_frame_number) {
|
| - case 1:
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTransferableResource(frame.get(), 999);
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| - AddTextureQuad(frame.get(), 444);
|
| - AddTransferableResource(frame.get(), 444);
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 2:
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Stop using 999 and 444 in this frame and commit.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| - SetFrameData(frame.Pass());
|
| - // 999 and 444 will be returned for frame 1, but not 555 since it's in
|
| - // the current frame.
|
| - break;
|
| - case 3:
|
| - // Don't take resources here, but set a new frame that uses 999 again.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTransferableResource(frame.get(), 999);
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 4:
|
| - // 555 from frame 1 and 2 isn't returned since it's still in use. 999
|
| - // from frame 1 is returned though.
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - {
|
| - unsigned expected[] = {444, 999};
|
| - EXPECT_RESOURCES(expected, resources);
|
| - EXPECT_TRUE(TestAndResetAvailable());
|
| - }
|
| -
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - SetFrameData(frame.Pass());
|
| - // 555 will be returned 3 times for frames 1 2 and 3, and 999 will be
|
| - // returned once for frame 3.
|
| - break;
|
| - case 5:
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - {
|
| - unsigned expected[] = {555, 555, 555, 999};
|
| - EXPECT_RESOURCES(expected, resources);
|
| - EXPECT_TRUE(TestAndResetAvailable());
|
| - }
|
| -
|
| - EndTest();
|
| - break;
|
| - }
|
| - }
|
| -
|
| - void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override {
|
| - if (host_impl->active_tree()->source_frame_number() < 1)
|
| - return;
|
| -
|
| - LayerImpl* root_impl = host_impl->active_tree()->root_layer();
|
| - FakeDelegatedRendererLayerImpl* delegated_impl =
|
| - static_cast<FakeDelegatedRendererLayerImpl*>(root_impl->children()[0]);
|
| -
|
| - const ResourceProvider::ResourceIdMap& map =
|
| - host_impl->resource_provider()->GetChildToParentMap(
|
| - delegated_impl->ChildId());
|
| -
|
| - switch (host_impl->active_tree()->source_frame_number()) {
|
| - case 1:
|
| - EXPECT_EQ(3u, map.size());
|
| - EXPECT_EQ(1u, map.count(999));
|
| - EXPECT_EQ(1u, map.count(555));
|
| - EXPECT_EQ(1u, map.count(444));
|
| -
|
| - EXPECT_EQ(3u, delegated_impl->Resources().size());
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(999));
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(555));
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(444));
|
| - break;
|
| - case 2:
|
| - EXPECT_EQ(1u, map.size());
|
| - EXPECT_EQ(1u, map.count(555));
|
| -
|
| - EXPECT_EQ(1u, delegated_impl->Resources().size());
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(555));
|
| - break;
|
| - case 3:
|
| - EXPECT_EQ(2u, map.size());
|
| - EXPECT_EQ(1u, map.count(999));
|
| - EXPECT_EQ(1u, map.count(555));
|
| -
|
| - EXPECT_EQ(2u, delegated_impl->Resources().size());
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(999));
|
| - EXPECT_EQ(1u, delegated_impl->Resources().count(555));
|
| - }
|
| - }
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestCommitWithoutTake);
|
| -
|
| -class DelegatedFrameIsActivatedDuringCommit
|
| - : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
|
| - protected:
|
| - DelegatedFrameIsActivatedDuringCommit() : returned_resource_count_(0) {}
|
| -
|
| - void BeginTest() override {
|
| - activate_count_ = 0;
|
| -
|
| - scoped_ptr<DelegatedFrameData> frame =
|
| - CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTransferableResource(frame.get(), 999);
|
| - SetFrameData(frame.Pass());
|
| -
|
| - PostSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - void WillActivateTreeOnThread(LayerTreeHostImpl* impl) override {
|
| - ++activate_count_;
|
| - }
|
| -
|
| - void DidCommit() override {
|
| - switch (layer_tree_host()->source_frame_number()) {
|
| - case 1: {
|
| - // The first frame has been activated. Set a new frame, and
|
| - // expect the next commit to finish *after* it is activated.
|
| - scoped_ptr<DelegatedFrameData> frame =
|
| - CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - }
|
| - case 2:
|
| - // The second frame has been activated. Remove the layer from
|
| - // the tree to cause another commit/activation. The commit should
|
| - // finish *after* the layer is removed from the active tree.
|
| - delegated_->RemoveFromParent();
|
| - break;
|
| - case 3:
|
| - // Finish the test by releasing resources on the next frame.
|
| - scoped_ptr<DelegatedFrameData> frame =
|
| - CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - }
|
| - }
|
| -
|
| - void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) override {
|
| - switch (host_impl->active_tree()->source_frame_number()) {
|
| - case 0: {
|
| - // The activate for the 1st frame should have happened before now.
|
| - EXPECT_EQ(1, activate_count_);
|
| - break;
|
| - }
|
| - case 1: {
|
| - // The activate for the 2nd frame should have happened before now.
|
| - EXPECT_EQ(2, activate_count_);
|
| - break;
|
| - }
|
| - case 2: {
|
| - // The activate to remove the layer should have happened before now.
|
| - EXPECT_EQ(3, activate_count_);
|
| - break;
|
| - }
|
| - case 3: {
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| - }
|
| - }
|
| -
|
| - void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override {
|
| - ReturnUnusedResourcesFromParent(host_impl);
|
| - }
|
| -
|
| - void UnusedResourcesAreAvailable() override {
|
| - LayerTreeHostDelegatedTestCaseSingleDelegatedLayer::
|
| - UnusedResourcesAreAvailable();
|
| - ReturnedResourceArray resources;
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_TRUE(TestAndResetAvailable());
|
| - returned_resource_count_ += resources.size();
|
| - if (returned_resource_count_ == 2)
|
| - EndTest();
|
| - }
|
| -
|
| - int activate_count_;
|
| - size_t returned_resource_count_;
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(
|
| - DelegatedFrameIsActivatedDuringCommit);
|
| -
|
| -class LayerTreeHostDelegatedTestTwoImplLayers
|
| - : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
|
| - public:
|
| - void BeginTest() override { PostSetNeedsCommitToMainThread(); }
|
| -
|
| - void DidCommitAndDrawFrame() override {
|
| - scoped_ptr<DelegatedFrameData> frame;
|
| - ReturnedResourceArray resources;
|
| -
|
| - int next_source_frame_number = layer_tree_host()->source_frame_number();
|
| - switch (next_source_frame_number) {
|
| - case 1:
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTransferableResource(frame.get(), 999);
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 2:
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Remove the delegated layer and replace it with a new one. Use the
|
| - // same frame and resources for it.
|
| - delegated_->RemoveFromParent();
|
| - delegated_ = CreateDelegatedLayer(frame_provider_.get());
|
| - break;
|
| - case 3:
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Use a frame with no resources in it.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 4:
|
| - // We gave one frame to the frame provider, so we should get one
|
| - // ref back for each resource.
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - {
|
| - unsigned expected[] = {555, 999};
|
| - EXPECT_RESOURCES(expected, resources);
|
| - EXPECT_TRUE(TestAndResetAvailable());
|
| - }
|
| - EndTest();
|
| - break;
|
| - }
|
| - }
|
| -
|
| - void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override {
|
| - ReturnUnusedResourcesFromParent(host_impl);
|
| - }
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestTwoImplLayers);
|
| -
|
| -class LayerTreeHostDelegatedTestTwoImplLayersTwoFrames
|
| - : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
|
| - public:
|
| - void BeginTest() override { PostSetNeedsCommitToMainThread(); }
|
| -
|
| - void DidCommitAndDrawFrame() override {
|
| - scoped_ptr<DelegatedFrameData> frame;
|
| - ReturnedResourceArray resources;
|
| -
|
| - int next_source_frame_number = layer_tree_host()->source_frame_number();
|
| - switch (next_source_frame_number) {
|
| - case 1:
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTransferableResource(frame.get(), 999);
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 2:
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTransferableResource(frame.get(), 999);
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| -
|
| - // Remove the delegated layer and replace it with a new one. Make a new
|
| - // frame but with the same resources for it.
|
| - delegated_->RemoveFromParent();
|
| - delegated_ = NULL;
|
| -
|
| - frame_provider_->SetFrameData(frame.Pass());
|
| - delegated_ = CreateDelegatedLayer(frame_provider_.get());
|
| - break;
|
| - case 3:
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Use a frame with no resources in it.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 4:
|
| - // We gave two frames to the frame provider, so we should get two
|
| - // refs back for each resource.
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - {
|
| - unsigned expected[] = {555, 555, 999, 999};
|
| - EXPECT_RESOURCES(expected, resources);
|
| - EXPECT_TRUE(TestAndResetAvailable());
|
| - }
|
| - EndTest();
|
| - break;
|
| - }
|
| - }
|
| -
|
| - void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override {
|
| - ReturnUnusedResourcesFromParent(host_impl);
|
| - }
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(
|
| - LayerTreeHostDelegatedTestTwoImplLayersTwoFrames);
|
| -
|
| -class LayerTreeHostDelegatedTestTwoLayers
|
| - : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
|
| - public:
|
| - void BeginTest() override { PostSetNeedsCommitToMainThread(); }
|
| -
|
| - void DidCommitAndDrawFrame() override {
|
| - scoped_ptr<DelegatedFrameData> frame;
|
| - ReturnedResourceArray resources;
|
| -
|
| - int next_source_frame_number = layer_tree_host()->source_frame_number();
|
| - switch (next_source_frame_number) {
|
| - case 1:
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTransferableResource(frame.get(), 999);
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| -
|
| - // Create a DelegatedRendererLayer using the frame.
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 2:
|
| - // Create a second DelegatedRendererLayer using the same frame provider.
|
| - delegated_thief_ = CreateDelegatedLayer(frame_provider_.get());
|
| - root_->AddChild(delegated_thief_);
|
| -
|
| - // And drop our ref on the frame provider so only the layers keep it
|
| - // alive.
|
| - frame_provider_ = NULL;
|
| - break;
|
| - case 3:
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Remove one delegated layer from the tree. No resources should be
|
| - // returned yet.
|
| - delegated_->RemoveFromParent();
|
| - break;
|
| - case 4:
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Put the first layer back, and remove the other layer and destroy it.
|
| - // No resources should be returned yet.
|
| - root_->AddChild(delegated_);
|
| - delegated_thief_->RemoveFromParent();
|
| - delegated_thief_ = NULL;
|
| - break;
|
| - case 5:
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Remove the first layer from the tree again. The resources are still
|
| - // held by the main thread layer.
|
| - delegated_->RemoveFromParent();
|
| - break;
|
| - case 6:
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Destroy the layer and the resources should be returned immediately.
|
| - delegated_ = NULL;
|
| -
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - {
|
| - unsigned expected[] = {555, 999};
|
| - EXPECT_RESOURCES(expected, resources);
|
| - EXPECT_TRUE(TestAndResetAvailable());
|
| - }
|
| - EndTest();
|
| - break;
|
| - }
|
| - }
|
| -
|
| - void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override {
|
| - ReturnUnusedResourcesFromParent(host_impl);
|
| - }
|
| -
|
| - scoped_refptr<DelegatedRendererLayer> delegated_thief_;
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestTwoLayers);
|
| -
|
| -class LayerTreeHostDelegatedTestRemoveAndAddToTree
|
| - : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
|
| - public:
|
| - void BeginTest() override { PostSetNeedsCommitToMainThread(); }
|
| -
|
| - void DidCommitAndDrawFrame() override {
|
| - scoped_ptr<DelegatedFrameData> frame;
|
| - ReturnedResourceArray resources;
|
| -
|
| - int next_source_frame_number = layer_tree_host()->source_frame_number();
|
| - switch (next_source_frame_number) {
|
| - case 1:
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTransferableResource(frame.get(), 999);
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| -
|
| - // Create a DelegatedRendererLayer using the frame.
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 2:
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Remove the layer from the tree. The resources should not be returned
|
| - // since they are still on the main thread layer.
|
| - delegated_->RemoveFromParent();
|
| - break;
|
| - case 3:
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Add the layer back to the tree.
|
| - layer_tree_host()->root_layer()->AddChild(delegated_);
|
| - break;
|
| - case 4:
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Set a new frame. Resources should be returned.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 888);
|
| - AddTransferableResource(frame.get(), 888);
|
| - AddTextureQuad(frame.get(), 777);
|
| - AddTransferableResource(frame.get(), 777);
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 5:
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - {
|
| - unsigned expected[] = {555, 999};
|
| - EXPECT_RESOURCES(expected, resources);
|
| - EXPECT_TRUE(TestAndResetAvailable());
|
| - }
|
| -
|
| - // Destroy the layer.
|
| - delegated_->RemoveFromParent();
|
| - delegated_ = NULL;
|
| - break;
|
| - case 6:
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Destroy the frame provider. Resources should be returned.
|
| - frame_provider_ = NULL;
|
| -
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - {
|
| - unsigned expected[] = {777, 888};
|
| - EXPECT_RESOURCES(expected, resources);
|
| - EXPECT_TRUE(TestAndResetAvailable());
|
| - }
|
| - EndTest();
|
| - break;
|
| - }
|
| - }
|
| -
|
| - void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override {
|
| - ReturnUnusedResourcesFromParent(host_impl);
|
| - }
|
| -
|
| - scoped_refptr<DelegatedRendererLayer> delegated_thief_;
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestRemoveAndAddToTree);
|
| -
|
| -class LayerTreeHostDelegatedTestRemoveAndChangeResources
|
| - : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer {
|
| - public:
|
| - void BeginTest() override { PostSetNeedsCommitToMainThread(); }
|
| -
|
| - void DidCommitAndDrawFrame() override {
|
| - scoped_ptr<DelegatedFrameData> frame;
|
| - ReturnedResourceArray resources;
|
| -
|
| - int next_source_frame_number = layer_tree_host()->source_frame_number();
|
| - switch (next_source_frame_number) {
|
| - case 1:
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 999);
|
| - AddTransferableResource(frame.get(), 999);
|
| - AddTextureQuad(frame.get(), 555);
|
| - AddTransferableResource(frame.get(), 555);
|
| -
|
| - // Create a DelegatedRendererLayer using the frame.
|
| - SetFrameData(frame.Pass());
|
| - break;
|
| - case 2:
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Remove the layer from the tree. The resources should not be returned
|
| - // since they are still on the main thread layer.
|
| - delegated_->RemoveFromParent();
|
| - break;
|
| - case 3:
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Set a new frame. Resources should be returned immediately.
|
| - frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1));
|
| - AddTextureQuad(frame.get(), 888);
|
| - AddTransferableResource(frame.get(), 888);
|
| - AddTextureQuad(frame.get(), 777);
|
| - AddTransferableResource(frame.get(), 777);
|
| - SetFrameData(frame.Pass());
|
| -
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - {
|
| - unsigned expected[] = {555, 999};
|
| - EXPECT_RESOURCES(expected, resources);
|
| - EXPECT_TRUE(TestAndResetAvailable());
|
| - resources.clear();
|
| - }
|
| -
|
| - // Destroy the frame provider.
|
| - frame_provider_ = NULL;
|
| -
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - EXPECT_EQ(0u, resources.size());
|
| - EXPECT_FALSE(TestAndResetAvailable());
|
| -
|
| - // Destroy the layer. Resources should be returned.
|
| - delegated_ = NULL;
|
| -
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(&resources);
|
| - {
|
| - unsigned expected[] = {777, 888};
|
| - EXPECT_RESOURCES(expected, resources);
|
| - EXPECT_TRUE(TestAndResetAvailable());
|
| - }
|
| - EndTest();
|
| - break;
|
| - }
|
| - }
|
| -
|
| - void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override {
|
| - ReturnUnusedResourcesFromParent(host_impl);
|
| - }
|
| -
|
| - scoped_refptr<DelegatedRendererLayer> delegated_thief_;
|
| -};
|
| -
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(
|
| - LayerTreeHostDelegatedTestRemoveAndChangeResources);
|
| -
|
| -} // namespace
|
| -} // namespace cc
|
|
|