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

Unified Diff: cc/trees/layer_tree_host_unittest_copyrequest.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_context.cc ('k') | cc/trees/layer_tree_host_unittest_damage.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_copyrequest.cc
diff --git a/cc/trees/layer_tree_host_unittest_copyrequest.cc b/cc/trees/layer_tree_host_unittest_copyrequest.cc
deleted file mode 100644
index 5766a192106ae001a53df07f64c1d7c258da0f85..0000000000000000000000000000000000000000
--- a/cc/trees/layer_tree_host_unittest_copyrequest.cc
+++ /dev/null
@@ -1,1087 +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/layers/layer_iterator.h"
-#include "cc/output/copy_output_request.h"
-#include "cc/output/copy_output_result.h"
-#include "cc/test/fake_content_layer.h"
-#include "cc/test/fake_content_layer_client.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 {
-
-// These tests only use direct rendering, as there is no output to copy for
-// delegated renderers.
-class LayerTreeHostCopyRequestTest : public LayerTreeTest {};
-
-class LayerTreeHostCopyRequestTestMultipleRequests
- : public LayerTreeHostCopyRequestTest {
- protected:
- void SetupTree() override {
- root = FakeContentLayer::Create(&client_);
- root->SetBounds(gfx::Size(20, 20));
-
- child = FakeContentLayer::Create(&client_);
- child->SetBounds(gfx::Size(10, 10));
- root->AddChild(child);
-
- layer_tree_host()->SetRootLayer(root);
- LayerTreeHostCopyRequestTest::SetupTree();
- }
-
- void BeginTest() override { PostSetNeedsCommitToMainThread(); }
-
- void DidCommitAndDrawFrame() override { WaitForCallback(); }
-
- void WaitForCallback() {
- base::MessageLoop::current()->PostTask(
- FROM_HERE,
- base::Bind(&LayerTreeHostCopyRequestTestMultipleRequests::NextStep,
- base::Unretained(this)));
- }
-
- void NextStep() {
- int frame = layer_tree_host()->source_frame_number();
- switch (frame) {
- case 1:
- child->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest(
- base::Bind(&LayerTreeHostCopyRequestTestMultipleRequests::
- CopyOutputCallback,
- base::Unretained(this))));
- EXPECT_EQ(0u, callbacks_.size());
- break;
- case 2:
- if (callbacks_.size() < 1u) {
- WaitForCallback();
- return;
- }
- EXPECT_EQ(1u, callbacks_.size());
- EXPECT_EQ(gfx::Size(10, 10).ToString(), callbacks_[0].ToString());
-
- child->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest(
- base::Bind(&LayerTreeHostCopyRequestTestMultipleRequests::
- CopyOutputCallback,
- base::Unretained(this))));
- root->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest(
- base::Bind(&LayerTreeHostCopyRequestTestMultipleRequests::
- CopyOutputCallback,
- base::Unretained(this))));
- child->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest(
- base::Bind(&LayerTreeHostCopyRequestTestMultipleRequests::
- CopyOutputCallback,
- base::Unretained(this))));
- EXPECT_EQ(1u, callbacks_.size());
- break;
- case 3:
- if (callbacks_.size() < 4u) {
- WaitForCallback();
- return;
- }
- EXPECT_EQ(4u, callbacks_.size());
- // The child was copied to a bitmap and passed back twice.
- EXPECT_EQ(gfx::Size(10, 10).ToString(), callbacks_[1].ToString());
- EXPECT_EQ(gfx::Size(10, 10).ToString(), callbacks_[2].ToString());
- // The root was copied to a bitmap and passed back also.
- EXPECT_EQ(gfx::Size(20, 20).ToString(), callbacks_[3].ToString());
- EndTest();
- break;
- }
- }
-
- void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) {
- EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
- EXPECT_TRUE(result->HasBitmap());
- scoped_ptr<SkBitmap> bitmap = result->TakeBitmap().Pass();
- EXPECT_EQ(result->size().ToString(),
- gfx::Size(bitmap->width(), bitmap->height()).ToString());
- callbacks_.push_back(result->size());
- }
-
- void AfterTest() override { EXPECT_EQ(4u, callbacks_.size()); }
-
- scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface() override {
- if (use_gl_renderer_)
- return FakeOutputSurface::Create3d();
- return FakeOutputSurface::CreateSoftware(
- make_scoped_ptr(new SoftwareOutputDevice));
- }
-
- bool use_gl_renderer_;
- std::vector<gfx::Size> callbacks_;
- FakeContentLayerClient client_;
- scoped_refptr<FakeContentLayer> root;
- scoped_refptr<FakeContentLayer> child;
-};
-
-// Readback can't be done with a delegating renderer.
-// Disabled due to flake: http://crbug.com/448521
-TEST_F(LayerTreeHostCopyRequestTestMultipleRequests,
- DISABLED_GLRenderer_RunSingleThread) {
- use_gl_renderer_ = true;
- RunTest(false, false, false);
-}
-
-TEST_F(LayerTreeHostCopyRequestTestMultipleRequests,
- GLRenderer_RunMultiThread_MainThreadPainting) {
- use_gl_renderer_ = true;
- RunTest(true, false, false);
-}
-
-TEST_F(LayerTreeHostCopyRequestTestMultipleRequests,
- SoftwareRenderer_RunSingleThread) {
- use_gl_renderer_ = false;
- RunTest(false, false, false);
-}
-
-TEST_F(LayerTreeHostCopyRequestTestMultipleRequests,
- SoftwareRenderer_RunMultiThread_MainThreadPainting) {
- use_gl_renderer_ = false;
- RunTest(true, false, false);
-}
-
-class LayerTreeHostCopyRequestTestLayerDestroyed
- : public LayerTreeHostCopyRequestTest {
- protected:
- void SetupTree() override {
- root_ = FakeContentLayer::Create(&client_);
- root_->SetBounds(gfx::Size(20, 20));
-
- main_destroyed_ = FakeContentLayer::Create(&client_);
- main_destroyed_->SetBounds(gfx::Size(15, 15));
- root_->AddChild(main_destroyed_);
-
- impl_destroyed_ = FakeContentLayer::Create(&client_);
- impl_destroyed_->SetBounds(gfx::Size(10, 10));
- root_->AddChild(impl_destroyed_);
-
- layer_tree_host()->SetRootLayer(root_);
- LayerTreeHostCopyRequestTest::SetupTree();
- }
-
- void BeginTest() override {
- callback_count_ = 0;
- PostSetNeedsCommitToMainThread();
- }
-
- void DidCommit() override {
- int frame = layer_tree_host()->source_frame_number();
- switch (frame) {
- case 1:
- main_destroyed_->RequestCopyOfOutput(
- CopyOutputRequest::CreateBitmapRequest(base::Bind(
- &LayerTreeHostCopyRequestTestLayerDestroyed::CopyOutputCallback,
- base::Unretained(this))));
- impl_destroyed_->RequestCopyOfOutput(
- CopyOutputRequest::CreateBitmapRequest(base::Bind(
- &LayerTreeHostCopyRequestTestLayerDestroyed::CopyOutputCallback,
- base::Unretained(this))));
- EXPECT_EQ(0, callback_count_);
-
- // Destroy the main thread layer right away.
- main_destroyed_->RemoveFromParent();
- main_destroyed_ = NULL;
-
- // Should callback with a NULL bitmap.
- EXPECT_EQ(1, callback_count_);
-
- // Prevent drawing so we can't make a copy of the impl_destroyed layer.
- layer_tree_host()->SetViewportSize(gfx::Size());
- break;
- case 2:
- // Flush the message loops and make sure the callbacks run.
- layer_tree_host()->SetNeedsCommit();
- break;
- case 3:
- // No drawing means no readback yet.
- EXPECT_EQ(1, callback_count_);
-
- // Destroy the impl thread layer.
- impl_destroyed_->RemoveFromParent();
- impl_destroyed_ = NULL;
-
- // No callback yet because it's on the impl side.
- EXPECT_EQ(1, callback_count_);
- break;
- case 4:
- // Flush the message loops and make sure the callbacks run.
- layer_tree_host()->SetNeedsCommit();
- break;
- case 5:
- // We should get another callback with a NULL bitmap.
- EXPECT_EQ(2, callback_count_);
- EndTest();
- break;
- }
- }
-
- void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) {
- EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
- EXPECT_TRUE(result->IsEmpty());
- ++callback_count_;
- }
-
- void AfterTest() override {}
-
- int callback_count_;
- FakeContentLayerClient client_;
- scoped_refptr<FakeContentLayer> root_;
- scoped_refptr<FakeContentLayer> main_destroyed_;
- scoped_refptr<FakeContentLayer> impl_destroyed_;
-};
-
-SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostCopyRequestTestLayerDestroyed);
-
-class LayerTreeHostCopyRequestTestInHiddenSubtree
- : public LayerTreeHostCopyRequestTest {
- protected:
- void SetupTree() override {
- root_ = FakeContentLayer::Create(&client_);
- root_->SetBounds(gfx::Size(20, 20));
-
- grand_parent_layer_ = FakeContentLayer::Create(&client_);
- grand_parent_layer_->SetBounds(gfx::Size(15, 15));
- root_->AddChild(grand_parent_layer_);
-
- // parent_layer_ owns a render surface.
- parent_layer_ = FakeContentLayer::Create(&client_);
- parent_layer_->SetBounds(gfx::Size(15, 15));
- parent_layer_->SetForceRenderSurface(true);
- grand_parent_layer_->AddChild(parent_layer_);
-
- copy_layer_ = FakeContentLayer::Create(&client_);
- copy_layer_->SetBounds(gfx::Size(10, 10));
- parent_layer_->AddChild(copy_layer_);
-
- layer_tree_host()->SetRootLayer(root_);
- LayerTreeHostCopyRequestTest::SetupTree();
- }
-
- void AddCopyRequest(Layer* layer) {
- layer->RequestCopyOfOutput(
- CopyOutputRequest::CreateBitmapRequest(base::Bind(
- &LayerTreeHostCopyRequestTestInHiddenSubtree::CopyOutputCallback,
- base::Unretained(this))));
- }
-
- void BeginTest() override {
- callback_count_ = 0;
- PostSetNeedsCommitToMainThread();
-
- AddCopyRequest(copy_layer_.get());
- }
-
- void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) {
- ++callback_count_;
- EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
- EXPECT_EQ(copy_layer_->bounds().ToString(), result->size().ToString())
- << callback_count_;
- switch (callback_count_) {
- case 1:
- // Hide the copy request layer.
- grand_parent_layer_->SetHideLayerAndSubtree(false);
- parent_layer_->SetHideLayerAndSubtree(false);
- copy_layer_->SetHideLayerAndSubtree(true);
- AddCopyRequest(copy_layer_.get());
- break;
- case 2:
- // Hide the copy request layer's parent only.
- grand_parent_layer_->SetHideLayerAndSubtree(false);
- parent_layer_->SetHideLayerAndSubtree(true);
- copy_layer_->SetHideLayerAndSubtree(false);
- AddCopyRequest(copy_layer_.get());
- break;
- case 3:
- // Hide the copy request layer's grand parent only.
- grand_parent_layer_->SetHideLayerAndSubtree(true);
- parent_layer_->SetHideLayerAndSubtree(false);
- copy_layer_->SetHideLayerAndSubtree(false);
- AddCopyRequest(copy_layer_.get());
- break;
- case 4:
- // Hide the copy request layer's parent and grandparent.
- grand_parent_layer_->SetHideLayerAndSubtree(true);
- parent_layer_->SetHideLayerAndSubtree(true);
- copy_layer_->SetHideLayerAndSubtree(false);
- AddCopyRequest(copy_layer_.get());
- break;
- case 5:
- // Hide the copy request layer as well as its parent and grandparent.
- grand_parent_layer_->SetHideLayerAndSubtree(true);
- parent_layer_->SetHideLayerAndSubtree(true);
- copy_layer_->SetHideLayerAndSubtree(true);
- AddCopyRequest(copy_layer_.get());
- break;
- case 6:
- EndTest();
- break;
- }
- }
-
- void AfterTest() override {}
-
- int callback_count_;
- FakeContentLayerClient client_;
- scoped_refptr<FakeContentLayer> root_;
- scoped_refptr<FakeContentLayer> grand_parent_layer_;
- scoped_refptr<FakeContentLayer> parent_layer_;
- scoped_refptr<FakeContentLayer> copy_layer_;
-};
-
-SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F(
- LayerTreeHostCopyRequestTestInHiddenSubtree);
-
-class LayerTreeHostTestHiddenSurfaceNotAllocatedForSubtreeCopyRequest
- : public LayerTreeHostCopyRequestTest {
- protected:
- void SetupTree() override {
- root_ = FakeContentLayer::Create(&client_);
- root_->SetBounds(gfx::Size(20, 20));
-
- grand_parent_layer_ = FakeContentLayer::Create(&client_);
- grand_parent_layer_->SetBounds(gfx::Size(15, 15));
- grand_parent_layer_->SetHideLayerAndSubtree(true);
- root_->AddChild(grand_parent_layer_);
-
- // parent_layer_ owns a render surface.
- parent_layer_ = FakeContentLayer::Create(&client_);
- parent_layer_->SetBounds(gfx::Size(15, 15));
- parent_layer_->SetForceRenderSurface(true);
- grand_parent_layer_->AddChild(parent_layer_);
-
- copy_layer_ = FakeContentLayer::Create(&client_);
- copy_layer_->SetBounds(gfx::Size(10, 10));
- parent_layer_->AddChild(copy_layer_);
-
- layer_tree_host()->SetRootLayer(root_);
- LayerTreeHostCopyRequestTest::SetupTree();
- }
-
- void BeginTest() override {
- did_draw_ = false;
- PostSetNeedsCommitToMainThread();
-
- copy_layer_->RequestCopyOfOutput(
- CopyOutputRequest::CreateBitmapRequest(base::Bind(
- &LayerTreeHostTestHiddenSurfaceNotAllocatedForSubtreeCopyRequest::
- CopyOutputCallback,
- base::Unretained(this))));
- }
-
- void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) {
- EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
- EXPECT_EQ(copy_layer_->bounds().ToString(), result->size().ToString());
- EndTest();
- }
-
- void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override {
- Renderer* renderer = host_impl->renderer();
-
- LayerImpl* root = host_impl->active_tree()->root_layer();
- LayerImpl* grand_parent = root->children()[0];
- LayerImpl* parent = grand_parent->children()[0];
- LayerImpl* copy_layer = parent->children()[0];
-
- // |parent| owns a surface, but it was hidden and not part of the copy
- // request so it should not allocate any resource.
- EXPECT_FALSE(renderer->HasAllocatedResourcesForTesting(
- parent->render_surface()->GetRenderPassId()));
-
- // |copy_layer| should have been rendered to a texture since it was needed
- // for a copy request.
- EXPECT_TRUE(renderer->HasAllocatedResourcesForTesting(
- copy_layer->render_surface()->GetRenderPassId()));
-
- did_draw_ = true;
- }
-
- void AfterTest() override { EXPECT_TRUE(did_draw_); }
-
- FakeContentLayerClient client_;
- bool did_draw_;
- scoped_refptr<FakeContentLayer> root_;
- scoped_refptr<FakeContentLayer> grand_parent_layer_;
- scoped_refptr<FakeContentLayer> parent_layer_;
- scoped_refptr<FakeContentLayer> copy_layer_;
-};
-
-// No output to copy for delegated renderers.
-SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(
- LayerTreeHostTestHiddenSurfaceNotAllocatedForSubtreeCopyRequest);
-
-class LayerTreeHostCopyRequestTestClippedOut
- : public LayerTreeHostCopyRequestTest {
- protected:
- void SetupTree() override {
- root_ = FakeContentLayer::Create(&client_);
- root_->SetBounds(gfx::Size(20, 20));
-
- parent_layer_ = FakeContentLayer::Create(&client_);
- parent_layer_->SetBounds(gfx::Size(15, 15));
- parent_layer_->SetMasksToBounds(true);
- root_->AddChild(parent_layer_);
-
- copy_layer_ = FakeContentLayer::Create(&client_);
- copy_layer_->SetPosition(gfx::Point(15, 15));
- copy_layer_->SetBounds(gfx::Size(10, 10));
- parent_layer_->AddChild(copy_layer_);
-
- layer_tree_host()->SetRootLayer(root_);
- LayerTreeHostCopyRequestTest::SetupTree();
- }
-
- void BeginTest() override {
- PostSetNeedsCommitToMainThread();
-
- copy_layer_->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest(
- base::Bind(&LayerTreeHostCopyRequestTestClippedOut::CopyOutputCallback,
- base::Unretained(this))));
- }
-
- void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) {
- // We should still get a callback with no output if the copy requested layer
- // was completely clipped away.
- EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
- EXPECT_EQ(gfx::Size().ToString(), result->size().ToString());
- EndTest();
- }
-
- void AfterTest() override {}
-
- FakeContentLayerClient client_;
- scoped_refptr<FakeContentLayer> root_;
- scoped_refptr<FakeContentLayer> parent_layer_;
- scoped_refptr<FakeContentLayer> copy_layer_;
-};
-
-SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(
- LayerTreeHostCopyRequestTestClippedOut);
-
-class LayerTreeHostTestAsyncTwoReadbacksWithoutDraw
- : public LayerTreeHostCopyRequestTest {
- protected:
- void SetupTree() override {
- root_ = FakeContentLayer::Create(&client_);
- root_->SetBounds(gfx::Size(20, 20));
-
- copy_layer_ = FakeContentLayer::Create(&client_);
- copy_layer_->SetBounds(gfx::Size(10, 10));
- root_->AddChild(copy_layer_);
-
- layer_tree_host()->SetRootLayer(root_);
- LayerTreeHostCopyRequestTest::SetupTree();
- }
-
- void AddCopyRequest(Layer* layer) {
- layer->RequestCopyOfOutput(
- CopyOutputRequest::CreateBitmapRequest(base::Bind(
- &LayerTreeHostTestAsyncTwoReadbacksWithoutDraw::CopyOutputCallback,
- base::Unretained(this))));
- }
-
- void BeginTest() override {
- saw_copy_request_ = false;
- callback_count_ = 0;
- PostSetNeedsCommitToMainThread();
-
- // Prevent drawing.
- layer_tree_host()->SetViewportSize(gfx::Size(0, 0));
-
- AddCopyRequest(copy_layer_.get());
- }
-
- void DidActivateTreeOnThread(LayerTreeHostImpl* impl) override {
- if (impl->active_tree()->source_frame_number() == 0) {
- LayerImpl* root = impl->active_tree()->root_layer();
- EXPECT_TRUE(root->children()[0]->HasCopyRequest());
- saw_copy_request_ = true;
- }
- }
-
- void DidCommit() override {
- if (layer_tree_host()->source_frame_number() == 1) {
- // Allow drawing.
- layer_tree_host()->SetViewportSize(gfx::Size(root_->bounds()));
-
- AddCopyRequest(copy_layer_.get());
- }
- }
-
- void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) {
- EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
- EXPECT_EQ(copy_layer_->bounds().ToString(), result->size().ToString());
- ++callback_count_;
-
- if (callback_count_ == 2)
- EndTest();
- }
-
- void AfterTest() override { EXPECT_TRUE(saw_copy_request_); }
-
- bool saw_copy_request_;
- int callback_count_;
- FakeContentLayerClient client_;
- scoped_refptr<FakeContentLayer> root_;
- scoped_refptr<FakeContentLayer> copy_layer_;
-};
-
-SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F(
- LayerTreeHostTestAsyncTwoReadbacksWithoutDraw);
-
-class LayerTreeHostCopyRequestTestLostOutputSurface
- : public LayerTreeHostCopyRequestTest {
- protected:
- scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface() override {
- if (!first_context_provider_.get()) {
- first_context_provider_ = TestContextProvider::Create();
- return FakeOutputSurface::Create3d(first_context_provider_);
- }
-
- EXPECT_FALSE(second_context_provider_.get());
- second_context_provider_ = TestContextProvider::Create();
- return FakeOutputSurface::Create3d(second_context_provider_);
- }
-
- void SetupTree() override {
- root_ = FakeContentLayer::Create(&client_);
- root_->SetBounds(gfx::Size(20, 20));
-
- copy_layer_ = FakeContentLayer::Create(&client_);
- copy_layer_->SetBounds(gfx::Size(10, 10));
- root_->AddChild(copy_layer_);
-
- layer_tree_host()->SetRootLayer(root_);
- LayerTreeHostCopyRequestTest::SetupTree();
- }
-
- void BeginTest() override { PostSetNeedsCommitToMainThread(); }
-
- void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) {
- EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
- EXPECT_EQ(gfx::Size(10, 10).ToString(), result->size().ToString());
- EXPECT_TRUE(result->HasTexture());
-
- // Save the result for later.
- EXPECT_FALSE(result_);
- result_ = result.Pass();
-
- // Post a commit to lose the output surface.
- layer_tree_host()->SetNeedsCommit();
- }
-
- void DidCommitAndDrawFrame() override {
- switch (layer_tree_host()->source_frame_number()) {
- case 1:
- // The layers have been pushed to the impl side. The layer textures have
- // been allocated.
-
- // Request a copy of the layer. This will use another texture.
- copy_layer_->RequestCopyOfOutput(CopyOutputRequest::CreateRequest(
- base::Bind(&LayerTreeHostCopyRequestTestLostOutputSurface::
- CopyOutputCallback,
- base::Unretained(this))));
- break;
- case 4:
- // With SingleThreadProxy it takes two commits to finally swap after a
- // context loss.
- case 5:
- // Now destroy the CopyOutputResult, releasing the texture inside back
- // to the compositor.
- EXPECT_TRUE(result_);
- result_ = nullptr;
-
- // Check that it is released.
- ImplThreadTaskRunner()->PostTask(
- FROM_HERE,
- base::Bind(&LayerTreeHostCopyRequestTestLostOutputSurface::
- CheckNumTextures,
- base::Unretained(this),
- num_textures_after_loss_ - 1));
- break;
- }
- }
-
- void SwapBuffersOnThread(LayerTreeHostImpl* impl, bool result) override {
- switch (impl->active_tree()->source_frame_number()) {
- case 0:
- // The layers have been drawn, so their textures have been allocated.
- EXPECT_FALSE(result_);
- num_textures_without_readback_ =
- first_context_provider_->TestContext3d()->NumTextures();
- break;
- case 1:
- // We did a readback, so there will be a readback texture around now.
- EXPECT_LT(num_textures_without_readback_,
- first_context_provider_->TestContext3d()->NumTextures());
- break;
- case 2:
- // The readback texture is collected.
- EXPECT_TRUE(result_);
-
- // Lose the output surface.
- first_context_provider_->TestContext3d()->loseContextCHROMIUM(
- GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB);
- break;
- case 3:
- // With SingleThreadProxy it takes two commits to finally swap after a
- // context loss.
- case 4:
- // The output surface has been recreated.
- EXPECT_TRUE(second_context_provider_.get());
-
- num_textures_after_loss_ =
- first_context_provider_->TestContext3d()->NumTextures();
- break;
- }
- }
-
- void CheckNumTextures(size_t expected_num_textures) {
- EXPECT_EQ(expected_num_textures,
- first_context_provider_->TestContext3d()->NumTextures());
- EndTest();
- }
-
- void AfterTest() override {}
-
- scoped_refptr<TestContextProvider> first_context_provider_;
- scoped_refptr<TestContextProvider> second_context_provider_;
- size_t num_textures_without_readback_;
- size_t num_textures_after_loss_;
- FakeContentLayerClient client_;
- scoped_refptr<FakeContentLayer> root_;
- scoped_refptr<FakeContentLayer> copy_layer_;
- scoped_ptr<CopyOutputResult> result_;
-};
-
-SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F(
- LayerTreeHostCopyRequestTestLostOutputSurface);
-
-class LayerTreeHostCopyRequestTestCountTextures
- : public LayerTreeHostCopyRequestTest {
- protected:
- scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface() override {
- context_provider_ = TestContextProvider::Create();
- return FakeOutputSurface::Create3d(context_provider_);
- }
-
- void SetupTree() override {
- root_ = FakeContentLayer::Create(&client_);
- root_->SetBounds(gfx::Size(20, 20));
-
- copy_layer_ = FakeContentLayer::Create(&client_);
- copy_layer_->SetBounds(gfx::Size(10, 10));
- root_->AddChild(copy_layer_);
-
- layer_tree_host()->SetRootLayer(root_);
- LayerTreeHostCopyRequestTest::SetupTree();
- }
-
- void BeginTest() override {
- num_textures_without_readback_ = 0;
- num_textures_with_readback_ = 0;
- waited_sync_point_after_readback_ = 0;
- PostSetNeedsCommitToMainThread();
- }
-
- virtual void RequestCopy(Layer* layer) = 0;
-
- void DidCommitAndDrawFrame() override {
- switch (layer_tree_host()->source_frame_number()) {
- case 1:
- // The layers have been pushed to the impl side. The layer textures have
- // been allocated.
- RequestCopy(copy_layer_.get());
- break;
- }
- }
-
- void SwapBuffersOnThread(LayerTreeHostImpl* impl, bool result) override {
- switch (impl->active_tree()->source_frame_number()) {
- case 0:
- // The layers have been drawn, so their textures have been allocated.
- num_textures_without_readback_ =
- context_provider_->TestContext3d()->NumTextures();
- break;
- case 1:
- // We did a readback, so there will be a readback texture around now.
- num_textures_with_readback_ =
- context_provider_->TestContext3d()->NumTextures();
- waited_sync_point_after_readback_ =
- context_provider_->TestContext3d()->last_waited_sync_point();
-
- MainThreadTaskRunner()->PostTask(
- FROM_HERE,
- base::Bind(&LayerTreeHostCopyRequestTestCountTextures::DoEndTest,
- base::Unretained(this)));
- break;
- }
- }
-
- virtual void DoEndTest() { EndTest(); }
-
- scoped_refptr<TestContextProvider> context_provider_;
- size_t num_textures_without_readback_;
- size_t num_textures_with_readback_;
- unsigned waited_sync_point_after_readback_;
- FakeContentLayerClient client_;
- scoped_refptr<FakeContentLayer> root_;
- scoped_refptr<FakeContentLayer> copy_layer_;
-};
-
-class LayerTreeHostCopyRequestTestCreatesTexture
- : public LayerTreeHostCopyRequestTestCountTextures {
- protected:
- void RequestCopy(Layer* layer) override {
- // Request a normal texture copy. This should create a new texture.
- copy_layer_->RequestCopyOfOutput(
- CopyOutputRequest::CreateRequest(base::Bind(
- &LayerTreeHostCopyRequestTestCreatesTexture::CopyOutputCallback,
- base::Unretained(this))));
- }
-
- void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) {
- EXPECT_FALSE(result->IsEmpty());
- EXPECT_TRUE(result->HasTexture());
-
- TextureMailbox mailbox;
- scoped_ptr<SingleReleaseCallback> release;
- result->TakeTexture(&mailbox, &release);
- EXPECT_TRUE(release);
-
- release->Run(0, false);
- }
-
- void AfterTest() override {
- // No sync point was needed.
- EXPECT_EQ(0u, waited_sync_point_after_readback_);
- // Except the copy to have made another texture.
- EXPECT_EQ(num_textures_without_readback_ + 1, num_textures_with_readback_);
- }
-};
-
-SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F(
- LayerTreeHostCopyRequestTestCreatesTexture);
-
-class LayerTreeHostCopyRequestTestProvideTexture
- : public LayerTreeHostCopyRequestTestCountTextures {
- protected:
- void BeginTest() override {
- external_context_provider_ = TestContextProvider::Create();
- EXPECT_TRUE(external_context_provider_->BindToCurrentThread());
- LayerTreeHostCopyRequestTestCountTextures::BeginTest();
- }
-
- void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) {
- EXPECT_FALSE(result->IsEmpty());
- EXPECT_TRUE(result->HasTexture());
-
- TextureMailbox mailbox;
- scoped_ptr<SingleReleaseCallback> release;
- result->TakeTexture(&mailbox, &release);
- EXPECT_FALSE(release);
- }
-
- void RequestCopy(Layer* layer) override {
- // Request a copy to a provided texture. This should not create a new
- // texture.
- scoped_ptr<CopyOutputRequest> request =
- CopyOutputRequest::CreateRequest(base::Bind(
- &LayerTreeHostCopyRequestTestProvideTexture::CopyOutputCallback,
- base::Unretained(this)));
-
- gpu::gles2::GLES2Interface* gl = external_context_provider_->ContextGL();
- gpu::Mailbox mailbox;
- gl->GenMailboxCHROMIUM(mailbox.name);
- sync_point_ = gl->InsertSyncPointCHROMIUM();
- request->SetTextureMailbox(
- TextureMailbox(mailbox, GL_TEXTURE_2D, sync_point_));
- EXPECT_TRUE(request->has_texture_mailbox());
-
- copy_layer_->RequestCopyOfOutput(request.Pass());
- }
-
- void AfterTest() override {
- // Expect the compositor to have waited for the sync point in the provided
- // TextureMailbox.
- EXPECT_EQ(sync_point_, waited_sync_point_after_readback_);
- // Except the copy to have *not* made another texture.
- EXPECT_EQ(num_textures_without_readback_, num_textures_with_readback_);
- }
-
- scoped_refptr<TestContextProvider> external_context_provider_;
- unsigned sync_point_;
-};
-
-SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F(
- LayerTreeHostCopyRequestTestProvideTexture);
-
-class LayerTreeHostCopyRequestTestDestroyBeforeCopy
- : public LayerTreeHostCopyRequestTest {
- protected:
- void SetupTree() override {
- root_ = FakeContentLayer::Create(&client_);
- root_->SetBounds(gfx::Size(20, 20));
-
- copy_layer_ = FakeContentLayer::Create(&client_);
- copy_layer_->SetBounds(gfx::Size(10, 10));
- root_->AddChild(copy_layer_);
-
- layer_tree_host()->SetRootLayer(root_);
- LayerTreeHostCopyRequestTest::SetupTree();
- }
-
- void BeginTest() override {
- callback_count_ = 0;
- PostSetNeedsCommitToMainThread();
- }
-
- void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) {
- EXPECT_TRUE(result->IsEmpty());
- ++callback_count_;
- }
-
- void DidActivateTreeOnThread(LayerTreeHostImpl* impl) override {
- MainThreadTaskRunner()->PostTask(
- FROM_HERE,
- base::Bind(&LayerTreeHostCopyRequestTestDestroyBeforeCopy::DidActivate,
- base::Unretained(this)));
- }
-
- void DidActivate() {
- switch (layer_tree_host()->source_frame_number()) {
- case 1: {
- EXPECT_EQ(0, callback_count_);
- // Put a copy request on the layer, but then don't allow any
- // drawing to take place.
- scoped_ptr<CopyOutputRequest> request =
- CopyOutputRequest::CreateRequest(
- base::Bind(&LayerTreeHostCopyRequestTestDestroyBeforeCopy::
- CopyOutputCallback,
- base::Unretained(this)));
- copy_layer_->RequestCopyOfOutput(request.Pass());
-
- layer_tree_host()->SetViewportSize(gfx::Size());
- break;
- }
- case 2:
- EXPECT_EQ(0, callback_count_);
- // Remove the copy layer before we were able to draw.
- copy_layer_->RemoveFromParent();
- break;
- case 3:
- EXPECT_EQ(1, callback_count_);
- // Allow us to draw now.
- layer_tree_host()->SetViewportSize(
- layer_tree_host()->root_layer()->bounds());
- break;
- case 4:
- EXPECT_EQ(1, callback_count_);
- // We should not have crashed.
- EndTest();
- }
- }
-
- void AfterTest() override {}
-
- int callback_count_;
- FakeContentLayerClient client_;
- scoped_refptr<FakeContentLayer> root_;
- scoped_refptr<FakeContentLayer> copy_layer_;
-};
-
-SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(
- LayerTreeHostCopyRequestTestDestroyBeforeCopy);
-
-class LayerTreeHostCopyRequestTestShutdownBeforeCopy
- : public LayerTreeHostCopyRequestTest {
- protected:
- void SetupTree() override {
- root_ = FakeContentLayer::Create(&client_);
- root_->SetBounds(gfx::Size(20, 20));
-
- copy_layer_ = FakeContentLayer::Create(&client_);
- copy_layer_->SetBounds(gfx::Size(10, 10));
- root_->AddChild(copy_layer_);
-
- layer_tree_host()->SetRootLayer(root_);
- LayerTreeHostCopyRequestTest::SetupTree();
- }
-
- void BeginTest() override {
- callback_count_ = 0;
- PostSetNeedsCommitToMainThread();
- }
-
- void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) {
- EXPECT_TRUE(result->IsEmpty());
- ++callback_count_;
- }
-
- void DidActivateTreeOnThread(LayerTreeHostImpl* impl) override {
- MainThreadTaskRunner()->PostTask(
- FROM_HERE,
- base::Bind(&LayerTreeHostCopyRequestTestShutdownBeforeCopy::DidActivate,
- base::Unretained(this)));
- }
-
- void DidActivate() {
- switch (layer_tree_host()->source_frame_number()) {
- case 1: {
- EXPECT_EQ(0, callback_count_);
- // Put a copy request on the layer, but then don't allow any
- // drawing to take place.
- scoped_ptr<CopyOutputRequest> request =
- CopyOutputRequest::CreateRequest(
- base::Bind(&LayerTreeHostCopyRequestTestShutdownBeforeCopy::
- CopyOutputCallback,
- base::Unretained(this)));
- copy_layer_->RequestCopyOfOutput(request.Pass());
-
- layer_tree_host()->SetViewportSize(gfx::Size());
- break;
- }
- case 2:
- DestroyLayerTreeHost();
- // End the test after the copy result has had a chance to get back to
- // the main thread.
- MainThreadTaskRunner()->PostTask(
- FROM_HERE,
- base::Bind(&LayerTreeHostCopyRequestTestShutdownBeforeCopy::EndTest,
- base::Unretained(this)));
- break;
- }
- }
-
- void AfterTest() override { EXPECT_EQ(1, callback_count_); }
-
- int callback_count_;
- FakeContentLayerClient client_;
- scoped_refptr<FakeContentLayer> root_;
- scoped_refptr<FakeContentLayer> copy_layer_;
-};
-
-SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(
- LayerTreeHostCopyRequestTestShutdownBeforeCopy);
-
-class LayerTreeHostCopyRequestTestMultipleDrawsHiddenCopyRequest
- : public LayerTreeHostCopyRequestTest {
- protected:
- void SetupTree() override {
- scoped_refptr<FakeContentLayer> root = FakeContentLayer::Create(&client_);
- root->SetBounds(gfx::Size(20, 20));
-
- child_ = FakeContentLayer::Create(&client_);
- child_->SetBounds(gfx::Size(10, 10));
- root->AddChild(child_);
- child_->SetHideLayerAndSubtree(true);
-
- layer_tree_host()->SetRootLayer(root);
- LayerTreeHostCopyRequestTest::SetupTree();
- }
-
- void BeginTest() override {
- num_draws_ = 0;
- copy_happened_ = false;
- draw_happened_ = false;
- PostSetNeedsCommitToMainThread();
- }
-
- void DidCommitAndDrawFrame() override {
- // Send a copy request after the first commit.
- if (layer_tree_host()->source_frame_number() == 1) {
- child_->RequestCopyOfOutput(
- CopyOutputRequest::CreateBitmapRequest(base::Bind(
- &LayerTreeHostCopyRequestTestMultipleDrawsHiddenCopyRequest::
- CopyOutputCallback,
- base::Unretained(this))));
- }
- }
-
- DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
- LayerTreeHostImpl::FrameData* frame_data,
- DrawResult draw_result) override {
- LayerImpl* root = host_impl->active_tree()->root_layer();
- LayerImpl* child = root->children()[0];
-
- bool saw_root = false;
- bool saw_child = false;
- for (LayerIterator<LayerImpl> it = LayerIterator<LayerImpl>::Begin(
- frame_data->render_surface_layer_list);
- it != LayerIterator<LayerImpl>::End(
- frame_data->render_surface_layer_list);
- ++it) {
- if (it.represents_itself()) {
- if (*it == root)
- saw_root = true;
- else if (*it == child)
- saw_child = true;
- else
- NOTREACHED();
- }
- }
-
- ++num_draws_;
- // The first draw has no copy request. The 2nd draw has a copy request, the
- // 3rd should not again.
- switch (num_draws_) {
- case 1:
- // Only the root layer draws, the child is hidden.
- EXPECT_TRUE(saw_root);
- EXPECT_FALSE(saw_child);
- break;
- case 2:
- // Copy happening here, the child will draw.
- EXPECT_TRUE(saw_root);
- EXPECT_TRUE(saw_child);
- // Make another draw happen after doing the copy request.
- host_impl->SetNeedsRedrawRect(gfx::Rect(1, 1));
- break;
- case 3:
- // If LayerTreeHostImpl does the wrong thing, it will try to draw the
- // layer which had a copy request. But only the root should draw.
- EXPECT_TRUE(saw_root);
- EXPECT_FALSE(saw_child);
-
- // End the test! Don't race with copy request callbacks, so post the end
- // to the main thread.
- draw_happened_ = true;
- MainThreadTaskRunner()->PostTask(
- FROM_HERE,
- base::Bind(
- &LayerTreeHostCopyRequestTestMultipleDrawsHiddenCopyRequest::
- TryEndTest,
- base::Unretained(this)));
- break;
- }
- return draw_result;
- }
-
- void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) {
- EXPECT_FALSE(TestEnded());
- copy_happened_ = true;
- TryEndTest();
- }
-
- void TryEndTest() {
- if (draw_happened_ && copy_happened_)
- EndTest();
- }
-
- void AfterTest() override {}
-
- scoped_refptr<FakeContentLayer> child_;
- FakeContentLayerClient client_;
- int num_draws_;
- bool copy_happened_;
- bool draw_happened_;
-};
-
-SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(
- LayerTreeHostCopyRequestTestMultipleDrawsHiddenCopyRequest);
-
-} // namespace
-} // namespace cc
« no previous file with comments | « cc/trees/layer_tree_host_unittest_context.cc ('k') | cc/trees/layer_tree_host_unittest_damage.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698