Index: cc/trees/layer_tree_host_unittest.cc |
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc |
index fa70d9581d2b9bfca00b1566dbe7307e3d3a8e67..9b301e2cf77bb3d2705639e5a4a2b5ec869009fc 100644 |
--- a/cc/trees/layer_tree_host_unittest.cc |
+++ b/cc/trees/layer_tree_host_unittest.cc |
@@ -2927,660 +2927,6 @@ class LayerTreeHostTestIOSurfaceDrawing : public LayerTreeHostTest { |
SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( |
LayerTreeHostTestIOSurfaceDrawing); |
-class LayerTreeHostTestAsyncReadback : public LayerTreeHostTest { |
- protected: |
- virtual 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); |
- LayerTreeHostTest::SetupTree(); |
- } |
- |
- virtual void BeginTest() OVERRIDE { |
- PostSetNeedsCommitToMainThread(); |
- } |
- |
- virtual void DidCommitAndDrawFrame() OVERRIDE { |
- WaitForCallback(); |
- } |
- |
- void WaitForCallback() { |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind( |
- &LayerTreeHostTestAsyncReadback::NextStep, |
- base::Unretained(this))); |
- } |
- |
- void NextStep() { |
- int frame = layer_tree_host()->source_frame_number(); |
- switch (frame) { |
- case 1: |
- child->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest( |
- base::Bind(&LayerTreeHostTestAsyncReadback::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(&LayerTreeHostTestAsyncReadback::CopyOutputCallback, |
- base::Unretained(this)))); |
- root->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest( |
- base::Bind(&LayerTreeHostTestAsyncReadback::CopyOutputCallback, |
- base::Unretained(this)))); |
- child->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest( |
- base::Bind(&LayerTreeHostTestAsyncReadback::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()); |
- } |
- |
- virtual void AfterTest() OVERRIDE { |
- EXPECT_EQ(4u, callbacks_.size()); |
- } |
- |
- virtual scoped_ptr<OutputSurface> CreateOutputSurface(bool fallback) |
- OVERRIDE { |
- scoped_ptr<FakeOutputSurface> output_surface; |
- if (use_gl_renderer_) { |
- output_surface = FakeOutputSurface::Create3d().Pass(); |
- } else { |
- output_surface = FakeOutputSurface::CreateSoftware( |
- make_scoped_ptr(new SoftwareOutputDevice)).Pass(); |
- } |
- return output_surface.PassAs<OutputSurface>(); |
- } |
- |
- 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. |
-TEST_F(LayerTreeHostTestAsyncReadback, GLRenderer_RunSingleThread) { |
- use_gl_renderer_ = true; |
- RunTest(false, false, false); |
-} |
- |
-TEST_F(LayerTreeHostTestAsyncReadback, |
- GLRenderer_RunMultiThread_MainThreadPainting) { |
- use_gl_renderer_ = true; |
- RunTest(true, false, false); |
-} |
- |
-TEST_F(LayerTreeHostTestAsyncReadback, SoftwareRenderer_RunSingleThread) { |
- use_gl_renderer_ = false; |
- RunTest(false, false, false); |
-} |
- |
-TEST_F(LayerTreeHostTestAsyncReadback, |
- SoftwareRenderer_RunMultiThread_MainThreadPainting) { |
- use_gl_renderer_ = false; |
- RunTest(true, false, false); |
-} |
- |
-class LayerTreeHostTestAsyncReadbackLayerDestroyed : public LayerTreeHostTest { |
- protected: |
- virtual 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_); |
- LayerTreeHostTest::SetupTree(); |
- } |
- |
- virtual void BeginTest() OVERRIDE { |
- callback_count_ = 0; |
- PostSetNeedsCommitToMainThread(); |
- } |
- |
- virtual void DidCommit() OVERRIDE { |
- int frame = layer_tree_host()->source_frame_number(); |
- switch (frame) { |
- case 1: |
- main_destroyed_->RequestCopyOfOutput( |
- CopyOutputRequest::CreateBitmapRequest(base::Bind( |
- &LayerTreeHostTestAsyncReadbackLayerDestroyed:: |
- CopyOutputCallback, |
- base::Unretained(this)))); |
- impl_destroyed_->RequestCopyOfOutput( |
- CopyOutputRequest::CreateBitmapRequest(base::Bind( |
- &LayerTreeHostTestAsyncReadbackLayerDestroyed:: |
- 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_; |
- } |
- |
- virtual 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(LayerTreeHostTestAsyncReadbackLayerDestroyed); |
- |
-class LayerTreeHostTestAsyncReadbackInHiddenSubtree : public LayerTreeHostTest { |
- protected: |
- virtual 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_); |
- LayerTreeHostTest::SetupTree(); |
- } |
- |
- void AddCopyRequest(Layer* layer) { |
- layer->RequestCopyOfOutput( |
- CopyOutputRequest::CreateBitmapRequest(base::Bind( |
- &LayerTreeHostTestAsyncReadbackInHiddenSubtree::CopyOutputCallback, |
- base::Unretained(this)))); |
- } |
- |
- virtual void BeginTest() OVERRIDE { |
- callback_count_ = 0; |
- PostSetNeedsCommitToMainThread(); |
- |
- 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_; |
- |
- 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; |
- } |
- } |
- |
- virtual 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_; |
-}; |
- |
-// No output to copy for delegated renderers. |
-SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F( |
- LayerTreeHostTestAsyncReadbackInHiddenSubtree); |
- |
-class LayerTreeHostTestHiddenSurfaceNotAllocatedForSubtreeCopyRequest |
- : public LayerTreeHostTest { |
- protected: |
- virtual 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_); |
- LayerTreeHostTest::SetupTree(); |
- } |
- |
- virtual 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(); |
- } |
- |
- virtual 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()->RenderPassId())); |
- |
- // |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()->RenderPassId())); |
- |
- did_draw_ = true; |
- } |
- |
- virtual 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 LayerTreeHostTestAsyncReadbackClippedOut : public LayerTreeHostTest { |
- protected: |
- virtual 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_); |
- LayerTreeHostTest::SetupTree(); |
- } |
- |
- virtual void BeginTest() OVERRIDE { |
- PostSetNeedsCommitToMainThread(); |
- |
- copy_layer_->RequestCopyOfOutput( |
- CopyOutputRequest::CreateBitmapRequest(base::Bind( |
- &LayerTreeHostTestAsyncReadbackClippedOut::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(); |
- } |
- |
- virtual void AfterTest() OVERRIDE {} |
- |
- FakeContentLayerClient client_; |
- scoped_refptr<FakeContentLayer> root_; |
- 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( |
- LayerTreeHostTestAsyncReadbackClippedOut); |
- |
-class LayerTreeHostTestAsyncTwoReadbacksWithoutDraw : public LayerTreeHostTest { |
- protected: |
- virtual 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_); |
- LayerTreeHostTest::SetupTree(); |
- } |
- |
- void AddCopyRequest(Layer* layer) { |
- layer->RequestCopyOfOutput( |
- CopyOutputRequest::CreateBitmapRequest(base::Bind( |
- &LayerTreeHostTestAsyncTwoReadbacksWithoutDraw::CopyOutputCallback, |
- base::Unretained(this)))); |
- } |
- |
- virtual 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()); |
- } |
- |
- virtual 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; |
- } |
- } |
- |
- virtual 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(); |
- } |
- |
- virtual 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_; |
-}; |
- |
-// No output to copy for delegated renderers. |
-SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F( |
- LayerTreeHostTestAsyncTwoReadbacksWithoutDraw); |
- |
-class LayerTreeHostTestAsyncReadbackLostOutputSurface |
- : public LayerTreeHostTest { |
- protected: |
- virtual scoped_ptr<OutputSurface> CreateOutputSurface(bool fallback) |
- OVERRIDE { |
- if (!first_context_provider_.get()) { |
- first_context_provider_ = TestContextProvider::Create(); |
- return FakeOutputSurface::Create3d(first_context_provider_) |
- .PassAs<OutputSurface>(); |
- } |
- |
- EXPECT_FALSE(second_context_provider_.get()); |
- second_context_provider_ = TestContextProvider::Create(); |
- return FakeOutputSurface::Create3d(second_context_provider_) |
- .PassAs<OutputSurface>(); |
- } |
- |
- virtual 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_); |
- LayerTreeHostTest::SetupTree(); |
- } |
- |
- virtual 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(); |
- } |
- |
- virtual 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( |
- &LayerTreeHostTestAsyncReadbackLostOutputSurface:: |
- 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_.reset(); |
- |
- // Check that it is released. |
- ImplThreadTaskRunner()->PostTask( |
- FROM_HERE, |
- base::Bind(&LayerTreeHostTestAsyncReadbackLostOutputSurface:: |
- CheckNumTextures, |
- base::Unretained(this), |
- num_textures_after_loss_ - 1)); |
- break; |
- } |
- } |
- |
- virtual 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(); |
- } |
- |
- virtual 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_; |
-}; |
- |
-// No output to copy for delegated renderers. |
-SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F( |
- LayerTreeHostTestAsyncReadbackLostOutputSurface); |
- |
class LayerTreeHostTestNumFramesPending : public LayerTreeHostTest { |
public: |
virtual void BeginTest() OVERRIDE { |