Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3999)

Unified Diff: cc/trees/layer_tree_host_unittest_delegated.cc

Issue 1057283003: Remove parts of //cc we aren't using (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/trees/layer_tree_host_unittest_damage.cc ('k') | cc/trees/layer_tree_host_unittest_no_message_loop.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « cc/trees/layer_tree_host_unittest_damage.cc ('k') | cc/trees/layer_tree_host_unittest_no_message_loop.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698