| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/output/copy_output_request.h" | 5 #include "cc/output/copy_output_request.h" |
| 6 #include "cc/output/copy_output_result.h" | 6 #include "cc/output/copy_output_result.h" |
| 7 #include "cc/test/fake_content_layer.h" | 7 #include "cc/test/fake_content_layer.h" |
| 8 #include "cc/test/fake_content_layer_client.h" | 8 #include "cc/test/fake_content_layer_client.h" |
| 9 #include "cc/test/fake_output_surface.h" | 9 #include "cc/test/fake_output_surface.h" |
| 10 #include "cc/test/layer_tree_test.h" | 10 #include "cc/test/layer_tree_test.h" |
| 11 #include "cc/trees/layer_tree_impl.h" | 11 #include "cc/trees/layer_tree_impl.h" |
| 12 #include "gpu/GLES2/gl2extchromium.h" | 12 #include "gpu/GLES2/gl2extchromium.h" |
| 13 | 13 |
| 14 namespace cc { | 14 namespace cc { |
| 15 namespace { | 15 namespace { |
| 16 | 16 |
| 17 // These tests only use direct rendering, as there is no output to copy for | 17 // These tests only use direct rendering, as there is no output to copy for |
| 18 // delegated renderers. | 18 // delegated renderers. |
| 19 class LayerTreeHostCopyRequestTest : public LayerTreeTest {}; | 19 class LayerTreeHostCopyRequestTest : public LayerTreeTest {}; |
| 20 | 20 |
| 21 class LayerTreeHostCopyRequestTestMultipleRequests | 21 class LayerTreeHostCopyRequestTestMultipleRequests |
| 22 : public LayerTreeHostCopyRequestTest { | 22 : public LayerTreeHostCopyRequestTest { |
| 23 protected: | 23 protected: |
| 24 virtual void SetupTree() override { | 24 void SetupTree() override { |
| 25 root = FakeContentLayer::Create(&client_); | 25 root = FakeContentLayer::Create(&client_); |
| 26 root->SetBounds(gfx::Size(20, 20)); | 26 root->SetBounds(gfx::Size(20, 20)); |
| 27 | 27 |
| 28 child = FakeContentLayer::Create(&client_); | 28 child = FakeContentLayer::Create(&client_); |
| 29 child->SetBounds(gfx::Size(10, 10)); | 29 child->SetBounds(gfx::Size(10, 10)); |
| 30 root->AddChild(child); | 30 root->AddChild(child); |
| 31 | 31 |
| 32 layer_tree_host()->SetRootLayer(root); | 32 layer_tree_host()->SetRootLayer(root); |
| 33 LayerTreeHostCopyRequestTest::SetupTree(); | 33 LayerTreeHostCopyRequestTest::SetupTree(); |
| 34 } | 34 } |
| 35 | 35 |
| 36 virtual void BeginTest() override { PostSetNeedsCommitToMainThread(); } | 36 void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
| 37 | 37 |
| 38 virtual void DidCommitAndDrawFrame() override { WaitForCallback(); } | 38 void DidCommitAndDrawFrame() override { WaitForCallback(); } |
| 39 | 39 |
| 40 void WaitForCallback() { | 40 void WaitForCallback() { |
| 41 base::MessageLoop::current()->PostTask( | 41 base::MessageLoop::current()->PostTask( |
| 42 FROM_HERE, | 42 FROM_HERE, |
| 43 base::Bind(&LayerTreeHostCopyRequestTestMultipleRequests::NextStep, | 43 base::Bind(&LayerTreeHostCopyRequestTestMultipleRequests::NextStep, |
| 44 base::Unretained(this))); | 44 base::Unretained(this))); |
| 45 } | 45 } |
| 46 | 46 |
| 47 void NextStep() { | 47 void NextStep() { |
| 48 int frame = layer_tree_host()->source_frame_number(); | 48 int frame = layer_tree_host()->source_frame_number(); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 | 94 |
| 95 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { | 95 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { |
| 96 EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); | 96 EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); |
| 97 EXPECT_TRUE(result->HasBitmap()); | 97 EXPECT_TRUE(result->HasBitmap()); |
| 98 scoped_ptr<SkBitmap> bitmap = result->TakeBitmap().Pass(); | 98 scoped_ptr<SkBitmap> bitmap = result->TakeBitmap().Pass(); |
| 99 EXPECT_EQ(result->size().ToString(), | 99 EXPECT_EQ(result->size().ToString(), |
| 100 gfx::Size(bitmap->width(), bitmap->height()).ToString()); | 100 gfx::Size(bitmap->width(), bitmap->height()).ToString()); |
| 101 callbacks_.push_back(result->size()); | 101 callbacks_.push_back(result->size()); |
| 102 } | 102 } |
| 103 | 103 |
| 104 virtual void AfterTest() override { EXPECT_EQ(4u, callbacks_.size()); } | 104 void AfterTest() override { EXPECT_EQ(4u, callbacks_.size()); } |
| 105 | 105 |
| 106 virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) | 106 scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface( |
| 107 override { | 107 bool fallback) override { |
| 108 if (use_gl_renderer_) | 108 if (use_gl_renderer_) |
| 109 return FakeOutputSurface::Create3d(); | 109 return FakeOutputSurface::Create3d(); |
| 110 return FakeOutputSurface::CreateSoftware( | 110 return FakeOutputSurface::CreateSoftware( |
| 111 make_scoped_ptr(new SoftwareOutputDevice)); | 111 make_scoped_ptr(new SoftwareOutputDevice)); |
| 112 } | 112 } |
| 113 | 113 |
| 114 bool use_gl_renderer_; | 114 bool use_gl_renderer_; |
| 115 std::vector<gfx::Size> callbacks_; | 115 std::vector<gfx::Size> callbacks_; |
| 116 FakeContentLayerClient client_; | 116 FakeContentLayerClient client_; |
| 117 scoped_refptr<FakeContentLayer> root; | 117 scoped_refptr<FakeContentLayer> root; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 139 | 139 |
| 140 TEST_F(LayerTreeHostCopyRequestTestMultipleRequests, | 140 TEST_F(LayerTreeHostCopyRequestTestMultipleRequests, |
| 141 SoftwareRenderer_RunMultiThread_MainThreadPainting) { | 141 SoftwareRenderer_RunMultiThread_MainThreadPainting) { |
| 142 use_gl_renderer_ = false; | 142 use_gl_renderer_ = false; |
| 143 RunTest(true, false, false); | 143 RunTest(true, false, false); |
| 144 } | 144 } |
| 145 | 145 |
| 146 class LayerTreeHostCopyRequestTestLayerDestroyed | 146 class LayerTreeHostCopyRequestTestLayerDestroyed |
| 147 : public LayerTreeHostCopyRequestTest { | 147 : public LayerTreeHostCopyRequestTest { |
| 148 protected: | 148 protected: |
| 149 virtual void SetupTree() override { | 149 void SetupTree() override { |
| 150 root_ = FakeContentLayer::Create(&client_); | 150 root_ = FakeContentLayer::Create(&client_); |
| 151 root_->SetBounds(gfx::Size(20, 20)); | 151 root_->SetBounds(gfx::Size(20, 20)); |
| 152 | 152 |
| 153 main_destroyed_ = FakeContentLayer::Create(&client_); | 153 main_destroyed_ = FakeContentLayer::Create(&client_); |
| 154 main_destroyed_->SetBounds(gfx::Size(15, 15)); | 154 main_destroyed_->SetBounds(gfx::Size(15, 15)); |
| 155 root_->AddChild(main_destroyed_); | 155 root_->AddChild(main_destroyed_); |
| 156 | 156 |
| 157 impl_destroyed_ = FakeContentLayer::Create(&client_); | 157 impl_destroyed_ = FakeContentLayer::Create(&client_); |
| 158 impl_destroyed_->SetBounds(gfx::Size(10, 10)); | 158 impl_destroyed_->SetBounds(gfx::Size(10, 10)); |
| 159 root_->AddChild(impl_destroyed_); | 159 root_->AddChild(impl_destroyed_); |
| 160 | 160 |
| 161 layer_tree_host()->SetRootLayer(root_); | 161 layer_tree_host()->SetRootLayer(root_); |
| 162 LayerTreeHostCopyRequestTest::SetupTree(); | 162 LayerTreeHostCopyRequestTest::SetupTree(); |
| 163 } | 163 } |
| 164 | 164 |
| 165 virtual void BeginTest() override { | 165 void BeginTest() override { |
| 166 callback_count_ = 0; | 166 callback_count_ = 0; |
| 167 PostSetNeedsCommitToMainThread(); | 167 PostSetNeedsCommitToMainThread(); |
| 168 } | 168 } |
| 169 | 169 |
| 170 virtual void DidCommit() override { | 170 void DidCommit() override { |
| 171 int frame = layer_tree_host()->source_frame_number(); | 171 int frame = layer_tree_host()->source_frame_number(); |
| 172 switch (frame) { | 172 switch (frame) { |
| 173 case 1: | 173 case 1: |
| 174 main_destroyed_->RequestCopyOfOutput( | 174 main_destroyed_->RequestCopyOfOutput( |
| 175 CopyOutputRequest::CreateBitmapRequest(base::Bind( | 175 CopyOutputRequest::CreateBitmapRequest(base::Bind( |
| 176 &LayerTreeHostCopyRequestTestLayerDestroyed::CopyOutputCallback, | 176 &LayerTreeHostCopyRequestTestLayerDestroyed::CopyOutputCallback, |
| 177 base::Unretained(this)))); | 177 base::Unretained(this)))); |
| 178 impl_destroyed_->RequestCopyOfOutput( | 178 impl_destroyed_->RequestCopyOfOutput( |
| 179 CopyOutputRequest::CreateBitmapRequest(base::Bind( | 179 CopyOutputRequest::CreateBitmapRequest(base::Bind( |
| 180 &LayerTreeHostCopyRequestTestLayerDestroyed::CopyOutputCallback, | 180 &LayerTreeHostCopyRequestTestLayerDestroyed::CopyOutputCallback, |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 break; | 217 break; |
| 218 } | 218 } |
| 219 } | 219 } |
| 220 | 220 |
| 221 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { | 221 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { |
| 222 EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); | 222 EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); |
| 223 EXPECT_TRUE(result->IsEmpty()); | 223 EXPECT_TRUE(result->IsEmpty()); |
| 224 ++callback_count_; | 224 ++callback_count_; |
| 225 } | 225 } |
| 226 | 226 |
| 227 virtual void AfterTest() override {} | 227 void AfterTest() override {} |
| 228 | 228 |
| 229 int callback_count_; | 229 int callback_count_; |
| 230 FakeContentLayerClient client_; | 230 FakeContentLayerClient client_; |
| 231 scoped_refptr<FakeContentLayer> root_; | 231 scoped_refptr<FakeContentLayer> root_; |
| 232 scoped_refptr<FakeContentLayer> main_destroyed_; | 232 scoped_refptr<FakeContentLayer> main_destroyed_; |
| 233 scoped_refptr<FakeContentLayer> impl_destroyed_; | 233 scoped_refptr<FakeContentLayer> impl_destroyed_; |
| 234 }; | 234 }; |
| 235 | 235 |
| 236 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostCopyRequestTestLayerDestroyed); | 236 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostCopyRequestTestLayerDestroyed); |
| 237 | 237 |
| 238 class LayerTreeHostCopyRequestTestInHiddenSubtree | 238 class LayerTreeHostCopyRequestTestInHiddenSubtree |
| 239 : public LayerTreeHostCopyRequestTest { | 239 : public LayerTreeHostCopyRequestTest { |
| 240 protected: | 240 protected: |
| 241 virtual void SetupTree() override { | 241 void SetupTree() override { |
| 242 root_ = FakeContentLayer::Create(&client_); | 242 root_ = FakeContentLayer::Create(&client_); |
| 243 root_->SetBounds(gfx::Size(20, 20)); | 243 root_->SetBounds(gfx::Size(20, 20)); |
| 244 | 244 |
| 245 grand_parent_layer_ = FakeContentLayer::Create(&client_); | 245 grand_parent_layer_ = FakeContentLayer::Create(&client_); |
| 246 grand_parent_layer_->SetBounds(gfx::Size(15, 15)); | 246 grand_parent_layer_->SetBounds(gfx::Size(15, 15)); |
| 247 root_->AddChild(grand_parent_layer_); | 247 root_->AddChild(grand_parent_layer_); |
| 248 | 248 |
| 249 // parent_layer_ owns a render surface. | 249 // parent_layer_ owns a render surface. |
| 250 parent_layer_ = FakeContentLayer::Create(&client_); | 250 parent_layer_ = FakeContentLayer::Create(&client_); |
| 251 parent_layer_->SetBounds(gfx::Size(15, 15)); | 251 parent_layer_->SetBounds(gfx::Size(15, 15)); |
| 252 parent_layer_->SetForceRenderSurface(true); | 252 parent_layer_->SetForceRenderSurface(true); |
| 253 grand_parent_layer_->AddChild(parent_layer_); | 253 grand_parent_layer_->AddChild(parent_layer_); |
| 254 | 254 |
| 255 copy_layer_ = FakeContentLayer::Create(&client_); | 255 copy_layer_ = FakeContentLayer::Create(&client_); |
| 256 copy_layer_->SetBounds(gfx::Size(10, 10)); | 256 copy_layer_->SetBounds(gfx::Size(10, 10)); |
| 257 parent_layer_->AddChild(copy_layer_); | 257 parent_layer_->AddChild(copy_layer_); |
| 258 | 258 |
| 259 layer_tree_host()->SetRootLayer(root_); | 259 layer_tree_host()->SetRootLayer(root_); |
| 260 LayerTreeHostCopyRequestTest::SetupTree(); | 260 LayerTreeHostCopyRequestTest::SetupTree(); |
| 261 } | 261 } |
| 262 | 262 |
| 263 void AddCopyRequest(Layer* layer) { | 263 void AddCopyRequest(Layer* layer) { |
| 264 layer->RequestCopyOfOutput( | 264 layer->RequestCopyOfOutput( |
| 265 CopyOutputRequest::CreateBitmapRequest(base::Bind( | 265 CopyOutputRequest::CreateBitmapRequest(base::Bind( |
| 266 &LayerTreeHostCopyRequestTestInHiddenSubtree::CopyOutputCallback, | 266 &LayerTreeHostCopyRequestTestInHiddenSubtree::CopyOutputCallback, |
| 267 base::Unretained(this)))); | 267 base::Unretained(this)))); |
| 268 } | 268 } |
| 269 | 269 |
| 270 virtual void BeginTest() override { | 270 void BeginTest() override { |
| 271 callback_count_ = 0; | 271 callback_count_ = 0; |
| 272 PostSetNeedsCommitToMainThread(); | 272 PostSetNeedsCommitToMainThread(); |
| 273 | 273 |
| 274 AddCopyRequest(copy_layer_.get()); | 274 AddCopyRequest(copy_layer_.get()); |
| 275 } | 275 } |
| 276 | 276 |
| 277 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { | 277 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { |
| 278 ++callback_count_; | 278 ++callback_count_; |
| 279 EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); | 279 EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); |
| 280 EXPECT_EQ(copy_layer_->bounds().ToString(), result->size().ToString()) | 280 EXPECT_EQ(copy_layer_->bounds().ToString(), result->size().ToString()) |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 parent_layer_->SetHideLayerAndSubtree(true); | 314 parent_layer_->SetHideLayerAndSubtree(true); |
| 315 copy_layer_->SetHideLayerAndSubtree(true); | 315 copy_layer_->SetHideLayerAndSubtree(true); |
| 316 AddCopyRequest(copy_layer_.get()); | 316 AddCopyRequest(copy_layer_.get()); |
| 317 break; | 317 break; |
| 318 case 6: | 318 case 6: |
| 319 EndTest(); | 319 EndTest(); |
| 320 break; | 320 break; |
| 321 } | 321 } |
| 322 } | 322 } |
| 323 | 323 |
| 324 virtual void AfterTest() override {} | 324 void AfterTest() override {} |
| 325 | 325 |
| 326 int callback_count_; | 326 int callback_count_; |
| 327 FakeContentLayerClient client_; | 327 FakeContentLayerClient client_; |
| 328 scoped_refptr<FakeContentLayer> root_; | 328 scoped_refptr<FakeContentLayer> root_; |
| 329 scoped_refptr<FakeContentLayer> grand_parent_layer_; | 329 scoped_refptr<FakeContentLayer> grand_parent_layer_; |
| 330 scoped_refptr<FakeContentLayer> parent_layer_; | 330 scoped_refptr<FakeContentLayer> parent_layer_; |
| 331 scoped_refptr<FakeContentLayer> copy_layer_; | 331 scoped_refptr<FakeContentLayer> copy_layer_; |
| 332 }; | 332 }; |
| 333 | 333 |
| 334 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F( | 334 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F( |
| 335 LayerTreeHostCopyRequestTestInHiddenSubtree); | 335 LayerTreeHostCopyRequestTestInHiddenSubtree); |
| 336 | 336 |
| 337 class LayerTreeHostTestHiddenSurfaceNotAllocatedForSubtreeCopyRequest | 337 class LayerTreeHostTestHiddenSurfaceNotAllocatedForSubtreeCopyRequest |
| 338 : public LayerTreeHostCopyRequestTest { | 338 : public LayerTreeHostCopyRequestTest { |
| 339 protected: | 339 protected: |
| 340 virtual void SetupTree() override { | 340 void SetupTree() override { |
| 341 root_ = FakeContentLayer::Create(&client_); | 341 root_ = FakeContentLayer::Create(&client_); |
| 342 root_->SetBounds(gfx::Size(20, 20)); | 342 root_->SetBounds(gfx::Size(20, 20)); |
| 343 | 343 |
| 344 grand_parent_layer_ = FakeContentLayer::Create(&client_); | 344 grand_parent_layer_ = FakeContentLayer::Create(&client_); |
| 345 grand_parent_layer_->SetBounds(gfx::Size(15, 15)); | 345 grand_parent_layer_->SetBounds(gfx::Size(15, 15)); |
| 346 grand_parent_layer_->SetHideLayerAndSubtree(true); | 346 grand_parent_layer_->SetHideLayerAndSubtree(true); |
| 347 root_->AddChild(grand_parent_layer_); | 347 root_->AddChild(grand_parent_layer_); |
| 348 | 348 |
| 349 // parent_layer_ owns a render surface. | 349 // parent_layer_ owns a render surface. |
| 350 parent_layer_ = FakeContentLayer::Create(&client_); | 350 parent_layer_ = FakeContentLayer::Create(&client_); |
| 351 parent_layer_->SetBounds(gfx::Size(15, 15)); | 351 parent_layer_->SetBounds(gfx::Size(15, 15)); |
| 352 parent_layer_->SetForceRenderSurface(true); | 352 parent_layer_->SetForceRenderSurface(true); |
| 353 grand_parent_layer_->AddChild(parent_layer_); | 353 grand_parent_layer_->AddChild(parent_layer_); |
| 354 | 354 |
| 355 copy_layer_ = FakeContentLayer::Create(&client_); | 355 copy_layer_ = FakeContentLayer::Create(&client_); |
| 356 copy_layer_->SetBounds(gfx::Size(10, 10)); | 356 copy_layer_->SetBounds(gfx::Size(10, 10)); |
| 357 parent_layer_->AddChild(copy_layer_); | 357 parent_layer_->AddChild(copy_layer_); |
| 358 | 358 |
| 359 layer_tree_host()->SetRootLayer(root_); | 359 layer_tree_host()->SetRootLayer(root_); |
| 360 LayerTreeHostCopyRequestTest::SetupTree(); | 360 LayerTreeHostCopyRequestTest::SetupTree(); |
| 361 } | 361 } |
| 362 | 362 |
| 363 virtual void BeginTest() override { | 363 void BeginTest() override { |
| 364 did_draw_ = false; | 364 did_draw_ = false; |
| 365 PostSetNeedsCommitToMainThread(); | 365 PostSetNeedsCommitToMainThread(); |
| 366 | 366 |
| 367 copy_layer_->RequestCopyOfOutput( | 367 copy_layer_->RequestCopyOfOutput( |
| 368 CopyOutputRequest::CreateBitmapRequest(base::Bind( | 368 CopyOutputRequest::CreateBitmapRequest(base::Bind( |
| 369 &LayerTreeHostTestHiddenSurfaceNotAllocatedForSubtreeCopyRequest:: | 369 &LayerTreeHostTestHiddenSurfaceNotAllocatedForSubtreeCopyRequest:: |
| 370 CopyOutputCallback, | 370 CopyOutputCallback, |
| 371 base::Unretained(this)))); | 371 base::Unretained(this)))); |
| 372 } | 372 } |
| 373 | 373 |
| 374 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { | 374 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { |
| 375 EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); | 375 EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); |
| 376 EXPECT_EQ(copy_layer_->bounds().ToString(), result->size().ToString()); | 376 EXPECT_EQ(copy_layer_->bounds().ToString(), result->size().ToString()); |
| 377 EndTest(); | 377 EndTest(); |
| 378 } | 378 } |
| 379 | 379 |
| 380 virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override { | 380 void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override { |
| 381 Renderer* renderer = host_impl->renderer(); | 381 Renderer* renderer = host_impl->renderer(); |
| 382 | 382 |
| 383 LayerImpl* root = host_impl->active_tree()->root_layer(); | 383 LayerImpl* root = host_impl->active_tree()->root_layer(); |
| 384 LayerImpl* grand_parent = root->children()[0]; | 384 LayerImpl* grand_parent = root->children()[0]; |
| 385 LayerImpl* parent = grand_parent->children()[0]; | 385 LayerImpl* parent = grand_parent->children()[0]; |
| 386 LayerImpl* copy_layer = parent->children()[0]; | 386 LayerImpl* copy_layer = parent->children()[0]; |
| 387 | 387 |
| 388 // |parent| owns a surface, but it was hidden and not part of the copy | 388 // |parent| owns a surface, but it was hidden and not part of the copy |
| 389 // request so it should not allocate any resource. | 389 // request so it should not allocate any resource. |
| 390 EXPECT_FALSE(renderer->HasAllocatedResourcesForTesting( | 390 EXPECT_FALSE(renderer->HasAllocatedResourcesForTesting( |
| 391 parent->render_surface()->GetRenderPassId())); | 391 parent->render_surface()->GetRenderPassId())); |
| 392 | 392 |
| 393 // |copy_layer| should have been rendered to a texture since it was needed | 393 // |copy_layer| should have been rendered to a texture since it was needed |
| 394 // for a copy request. | 394 // for a copy request. |
| 395 EXPECT_TRUE(renderer->HasAllocatedResourcesForTesting( | 395 EXPECT_TRUE(renderer->HasAllocatedResourcesForTesting( |
| 396 copy_layer->render_surface()->GetRenderPassId())); | 396 copy_layer->render_surface()->GetRenderPassId())); |
| 397 | 397 |
| 398 did_draw_ = true; | 398 did_draw_ = true; |
| 399 } | 399 } |
| 400 | 400 |
| 401 virtual void AfterTest() override { EXPECT_TRUE(did_draw_); } | 401 void AfterTest() override { EXPECT_TRUE(did_draw_); } |
| 402 | 402 |
| 403 FakeContentLayerClient client_; | 403 FakeContentLayerClient client_; |
| 404 bool did_draw_; | 404 bool did_draw_; |
| 405 scoped_refptr<FakeContentLayer> root_; | 405 scoped_refptr<FakeContentLayer> root_; |
| 406 scoped_refptr<FakeContentLayer> grand_parent_layer_; | 406 scoped_refptr<FakeContentLayer> grand_parent_layer_; |
| 407 scoped_refptr<FakeContentLayer> parent_layer_; | 407 scoped_refptr<FakeContentLayer> parent_layer_; |
| 408 scoped_refptr<FakeContentLayer> copy_layer_; | 408 scoped_refptr<FakeContentLayer> copy_layer_; |
| 409 }; | 409 }; |
| 410 | 410 |
| 411 // No output to copy for delegated renderers. | 411 // No output to copy for delegated renderers. |
| 412 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( | 412 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( |
| 413 LayerTreeHostTestHiddenSurfaceNotAllocatedForSubtreeCopyRequest); | 413 LayerTreeHostTestHiddenSurfaceNotAllocatedForSubtreeCopyRequest); |
| 414 | 414 |
| 415 class LayerTreeHostCopyRequestTestClippedOut | 415 class LayerTreeHostCopyRequestTestClippedOut |
| 416 : public LayerTreeHostCopyRequestTest { | 416 : public LayerTreeHostCopyRequestTest { |
| 417 protected: | 417 protected: |
| 418 virtual void SetupTree() override { | 418 void SetupTree() override { |
| 419 root_ = FakeContentLayer::Create(&client_); | 419 root_ = FakeContentLayer::Create(&client_); |
| 420 root_->SetBounds(gfx::Size(20, 20)); | 420 root_->SetBounds(gfx::Size(20, 20)); |
| 421 | 421 |
| 422 parent_layer_ = FakeContentLayer::Create(&client_); | 422 parent_layer_ = FakeContentLayer::Create(&client_); |
| 423 parent_layer_->SetBounds(gfx::Size(15, 15)); | 423 parent_layer_->SetBounds(gfx::Size(15, 15)); |
| 424 parent_layer_->SetMasksToBounds(true); | 424 parent_layer_->SetMasksToBounds(true); |
| 425 root_->AddChild(parent_layer_); | 425 root_->AddChild(parent_layer_); |
| 426 | 426 |
| 427 copy_layer_ = FakeContentLayer::Create(&client_); | 427 copy_layer_ = FakeContentLayer::Create(&client_); |
| 428 copy_layer_->SetPosition(gfx::Point(15, 15)); | 428 copy_layer_->SetPosition(gfx::Point(15, 15)); |
| 429 copy_layer_->SetBounds(gfx::Size(10, 10)); | 429 copy_layer_->SetBounds(gfx::Size(10, 10)); |
| 430 parent_layer_->AddChild(copy_layer_); | 430 parent_layer_->AddChild(copy_layer_); |
| 431 | 431 |
| 432 layer_tree_host()->SetRootLayer(root_); | 432 layer_tree_host()->SetRootLayer(root_); |
| 433 LayerTreeHostCopyRequestTest::SetupTree(); | 433 LayerTreeHostCopyRequestTest::SetupTree(); |
| 434 } | 434 } |
| 435 | 435 |
| 436 virtual void BeginTest() override { | 436 void BeginTest() override { |
| 437 PostSetNeedsCommitToMainThread(); | 437 PostSetNeedsCommitToMainThread(); |
| 438 | 438 |
| 439 copy_layer_->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest( | 439 copy_layer_->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest( |
| 440 base::Bind(&LayerTreeHostCopyRequestTestClippedOut::CopyOutputCallback, | 440 base::Bind(&LayerTreeHostCopyRequestTestClippedOut::CopyOutputCallback, |
| 441 base::Unretained(this)))); | 441 base::Unretained(this)))); |
| 442 } | 442 } |
| 443 | 443 |
| 444 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { | 444 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { |
| 445 // We should still get a callback with no output if the copy requested layer | 445 // We should still get a callback with no output if the copy requested layer |
| 446 // was completely clipped away. | 446 // was completely clipped away. |
| 447 EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); | 447 EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); |
| 448 EXPECT_EQ(gfx::Size().ToString(), result->size().ToString()); | 448 EXPECT_EQ(gfx::Size().ToString(), result->size().ToString()); |
| 449 EndTest(); | 449 EndTest(); |
| 450 } | 450 } |
| 451 | 451 |
| 452 virtual void AfterTest() override {} | 452 void AfterTest() override {} |
| 453 | 453 |
| 454 FakeContentLayerClient client_; | 454 FakeContentLayerClient client_; |
| 455 scoped_refptr<FakeContentLayer> root_; | 455 scoped_refptr<FakeContentLayer> root_; |
| 456 scoped_refptr<FakeContentLayer> parent_layer_; | 456 scoped_refptr<FakeContentLayer> parent_layer_; |
| 457 scoped_refptr<FakeContentLayer> copy_layer_; | 457 scoped_refptr<FakeContentLayer> copy_layer_; |
| 458 }; | 458 }; |
| 459 | 459 |
| 460 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( | 460 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( |
| 461 LayerTreeHostCopyRequestTestClippedOut); | 461 LayerTreeHostCopyRequestTestClippedOut); |
| 462 | 462 |
| 463 class LayerTreeHostTestAsyncTwoReadbacksWithoutDraw | 463 class LayerTreeHostTestAsyncTwoReadbacksWithoutDraw |
| 464 : public LayerTreeHostCopyRequestTest { | 464 : public LayerTreeHostCopyRequestTest { |
| 465 protected: | 465 protected: |
| 466 virtual void SetupTree() override { | 466 void SetupTree() override { |
| 467 root_ = FakeContentLayer::Create(&client_); | 467 root_ = FakeContentLayer::Create(&client_); |
| 468 root_->SetBounds(gfx::Size(20, 20)); | 468 root_->SetBounds(gfx::Size(20, 20)); |
| 469 | 469 |
| 470 copy_layer_ = FakeContentLayer::Create(&client_); | 470 copy_layer_ = FakeContentLayer::Create(&client_); |
| 471 copy_layer_->SetBounds(gfx::Size(10, 10)); | 471 copy_layer_->SetBounds(gfx::Size(10, 10)); |
| 472 root_->AddChild(copy_layer_); | 472 root_->AddChild(copy_layer_); |
| 473 | 473 |
| 474 layer_tree_host()->SetRootLayer(root_); | 474 layer_tree_host()->SetRootLayer(root_); |
| 475 LayerTreeHostCopyRequestTest::SetupTree(); | 475 LayerTreeHostCopyRequestTest::SetupTree(); |
| 476 } | 476 } |
| 477 | 477 |
| 478 void AddCopyRequest(Layer* layer) { | 478 void AddCopyRequest(Layer* layer) { |
| 479 layer->RequestCopyOfOutput( | 479 layer->RequestCopyOfOutput( |
| 480 CopyOutputRequest::CreateBitmapRequest(base::Bind( | 480 CopyOutputRequest::CreateBitmapRequest(base::Bind( |
| 481 &LayerTreeHostTestAsyncTwoReadbacksWithoutDraw::CopyOutputCallback, | 481 &LayerTreeHostTestAsyncTwoReadbacksWithoutDraw::CopyOutputCallback, |
| 482 base::Unretained(this)))); | 482 base::Unretained(this)))); |
| 483 } | 483 } |
| 484 | 484 |
| 485 virtual void BeginTest() override { | 485 void BeginTest() override { |
| 486 saw_copy_request_ = false; | 486 saw_copy_request_ = false; |
| 487 callback_count_ = 0; | 487 callback_count_ = 0; |
| 488 PostSetNeedsCommitToMainThread(); | 488 PostSetNeedsCommitToMainThread(); |
| 489 | 489 |
| 490 // Prevent drawing. | 490 // Prevent drawing. |
| 491 layer_tree_host()->SetViewportSize(gfx::Size(0, 0)); | 491 layer_tree_host()->SetViewportSize(gfx::Size(0, 0)); |
| 492 | 492 |
| 493 AddCopyRequest(copy_layer_.get()); | 493 AddCopyRequest(copy_layer_.get()); |
| 494 } | 494 } |
| 495 | 495 |
| 496 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) override { | 496 void DidActivateTreeOnThread(LayerTreeHostImpl* impl) override { |
| 497 if (impl->active_tree()->source_frame_number() == 0) { | 497 if (impl->active_tree()->source_frame_number() == 0) { |
| 498 LayerImpl* root = impl->active_tree()->root_layer(); | 498 LayerImpl* root = impl->active_tree()->root_layer(); |
| 499 EXPECT_TRUE(root->children()[0]->HasCopyRequest()); | 499 EXPECT_TRUE(root->children()[0]->HasCopyRequest()); |
| 500 saw_copy_request_ = true; | 500 saw_copy_request_ = true; |
| 501 } | 501 } |
| 502 } | 502 } |
| 503 | 503 |
| 504 virtual void DidCommit() override { | 504 void DidCommit() override { |
| 505 if (layer_tree_host()->source_frame_number() == 1) { | 505 if (layer_tree_host()->source_frame_number() == 1) { |
| 506 // Allow drawing. | 506 // Allow drawing. |
| 507 layer_tree_host()->SetViewportSize(gfx::Size(root_->bounds())); | 507 layer_tree_host()->SetViewportSize(gfx::Size(root_->bounds())); |
| 508 | 508 |
| 509 AddCopyRequest(copy_layer_.get()); | 509 AddCopyRequest(copy_layer_.get()); |
| 510 } | 510 } |
| 511 } | 511 } |
| 512 | 512 |
| 513 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { | 513 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { |
| 514 EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); | 514 EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); |
| 515 EXPECT_EQ(copy_layer_->bounds().ToString(), result->size().ToString()); | 515 EXPECT_EQ(copy_layer_->bounds().ToString(), result->size().ToString()); |
| 516 ++callback_count_; | 516 ++callback_count_; |
| 517 | 517 |
| 518 if (callback_count_ == 2) | 518 if (callback_count_ == 2) |
| 519 EndTest(); | 519 EndTest(); |
| 520 } | 520 } |
| 521 | 521 |
| 522 virtual void AfterTest() override { EXPECT_TRUE(saw_copy_request_); } | 522 void AfterTest() override { EXPECT_TRUE(saw_copy_request_); } |
| 523 | 523 |
| 524 bool saw_copy_request_; | 524 bool saw_copy_request_; |
| 525 int callback_count_; | 525 int callback_count_; |
| 526 FakeContentLayerClient client_; | 526 FakeContentLayerClient client_; |
| 527 scoped_refptr<FakeContentLayer> root_; | 527 scoped_refptr<FakeContentLayer> root_; |
| 528 scoped_refptr<FakeContentLayer> copy_layer_; | 528 scoped_refptr<FakeContentLayer> copy_layer_; |
| 529 }; | 529 }; |
| 530 | 530 |
| 531 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F( | 531 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F( |
| 532 LayerTreeHostTestAsyncTwoReadbacksWithoutDraw); | 532 LayerTreeHostTestAsyncTwoReadbacksWithoutDraw); |
| 533 | 533 |
| 534 class LayerTreeHostCopyRequestTestLostOutputSurface | 534 class LayerTreeHostCopyRequestTestLostOutputSurface |
| 535 : public LayerTreeHostCopyRequestTest { | 535 : public LayerTreeHostCopyRequestTest { |
| 536 protected: | 536 protected: |
| 537 virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) | 537 scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface( |
| 538 override { | 538 bool fallback) override { |
| 539 if (!first_context_provider_.get()) { | 539 if (!first_context_provider_.get()) { |
| 540 first_context_provider_ = TestContextProvider::Create(); | 540 first_context_provider_ = TestContextProvider::Create(); |
| 541 return FakeOutputSurface::Create3d(first_context_provider_); | 541 return FakeOutputSurface::Create3d(first_context_provider_); |
| 542 } | 542 } |
| 543 | 543 |
| 544 EXPECT_FALSE(second_context_provider_.get()); | 544 EXPECT_FALSE(second_context_provider_.get()); |
| 545 second_context_provider_ = TestContextProvider::Create(); | 545 second_context_provider_ = TestContextProvider::Create(); |
| 546 return FakeOutputSurface::Create3d(second_context_provider_); | 546 return FakeOutputSurface::Create3d(second_context_provider_); |
| 547 } | 547 } |
| 548 | 548 |
| 549 virtual void SetupTree() override { | 549 void SetupTree() override { |
| 550 root_ = FakeContentLayer::Create(&client_); | 550 root_ = FakeContentLayer::Create(&client_); |
| 551 root_->SetBounds(gfx::Size(20, 20)); | 551 root_->SetBounds(gfx::Size(20, 20)); |
| 552 | 552 |
| 553 copy_layer_ = FakeContentLayer::Create(&client_); | 553 copy_layer_ = FakeContentLayer::Create(&client_); |
| 554 copy_layer_->SetBounds(gfx::Size(10, 10)); | 554 copy_layer_->SetBounds(gfx::Size(10, 10)); |
| 555 root_->AddChild(copy_layer_); | 555 root_->AddChild(copy_layer_); |
| 556 | 556 |
| 557 layer_tree_host()->SetRootLayer(root_); | 557 layer_tree_host()->SetRootLayer(root_); |
| 558 LayerTreeHostCopyRequestTest::SetupTree(); | 558 LayerTreeHostCopyRequestTest::SetupTree(); |
| 559 } | 559 } |
| 560 | 560 |
| 561 virtual void BeginTest() override { PostSetNeedsCommitToMainThread(); } | 561 void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
| 562 | 562 |
| 563 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { | 563 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { |
| 564 EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); | 564 EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); |
| 565 EXPECT_EQ(gfx::Size(10, 10).ToString(), result->size().ToString()); | 565 EXPECT_EQ(gfx::Size(10, 10).ToString(), result->size().ToString()); |
| 566 EXPECT_TRUE(result->HasTexture()); | 566 EXPECT_TRUE(result->HasTexture()); |
| 567 | 567 |
| 568 // Save the result for later. | 568 // Save the result for later. |
| 569 EXPECT_FALSE(result_); | 569 EXPECT_FALSE(result_); |
| 570 result_ = result.Pass(); | 570 result_ = result.Pass(); |
| 571 | 571 |
| 572 // Post a commit to lose the output surface. | 572 // Post a commit to lose the output surface. |
| 573 layer_tree_host()->SetNeedsCommit(); | 573 layer_tree_host()->SetNeedsCommit(); |
| 574 } | 574 } |
| 575 | 575 |
| 576 virtual void DidCommitAndDrawFrame() override { | 576 void DidCommitAndDrawFrame() override { |
| 577 switch (layer_tree_host()->source_frame_number()) { | 577 switch (layer_tree_host()->source_frame_number()) { |
| 578 case 1: | 578 case 1: |
| 579 // The layers have been pushed to the impl side. The layer textures have | 579 // The layers have been pushed to the impl side. The layer textures have |
| 580 // been allocated. | 580 // been allocated. |
| 581 | 581 |
| 582 // Request a copy of the layer. This will use another texture. | 582 // Request a copy of the layer. This will use another texture. |
| 583 copy_layer_->RequestCopyOfOutput(CopyOutputRequest::CreateRequest( | 583 copy_layer_->RequestCopyOfOutput(CopyOutputRequest::CreateRequest( |
| 584 base::Bind(&LayerTreeHostCopyRequestTestLostOutputSurface:: | 584 base::Bind(&LayerTreeHostCopyRequestTestLostOutputSurface:: |
| 585 CopyOutputCallback, | 585 CopyOutputCallback, |
| 586 base::Unretained(this)))); | 586 base::Unretained(this)))); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 598 ImplThreadTaskRunner()->PostTask( | 598 ImplThreadTaskRunner()->PostTask( |
| 599 FROM_HERE, | 599 FROM_HERE, |
| 600 base::Bind(&LayerTreeHostCopyRequestTestLostOutputSurface:: | 600 base::Bind(&LayerTreeHostCopyRequestTestLostOutputSurface:: |
| 601 CheckNumTextures, | 601 CheckNumTextures, |
| 602 base::Unretained(this), | 602 base::Unretained(this), |
| 603 num_textures_after_loss_ - 1)); | 603 num_textures_after_loss_ - 1)); |
| 604 break; | 604 break; |
| 605 } | 605 } |
| 606 } | 606 } |
| 607 | 607 |
| 608 virtual void SwapBuffersOnThread(LayerTreeHostImpl* impl, | 608 void SwapBuffersOnThread(LayerTreeHostImpl* impl, bool result) override { |
| 609 bool result) override { | |
| 610 switch (impl->active_tree()->source_frame_number()) { | 609 switch (impl->active_tree()->source_frame_number()) { |
| 611 case 0: | 610 case 0: |
| 612 // The layers have been drawn, so their textures have been allocated. | 611 // The layers have been drawn, so their textures have been allocated. |
| 613 EXPECT_FALSE(result_); | 612 EXPECT_FALSE(result_); |
| 614 num_textures_without_readback_ = | 613 num_textures_without_readback_ = |
| 615 first_context_provider_->TestContext3d()->NumTextures(); | 614 first_context_provider_->TestContext3d()->NumTextures(); |
| 616 break; | 615 break; |
| 617 case 1: | 616 case 1: |
| 618 // We did a readback, so there will be a readback texture around now. | 617 // We did a readback, so there will be a readback texture around now. |
| 619 EXPECT_LT(num_textures_without_readback_, | 618 EXPECT_LT(num_textures_without_readback_, |
| (...skipping 19 matching lines...) Expand all Loading... |
| 639 break; | 638 break; |
| 640 } | 639 } |
| 641 } | 640 } |
| 642 | 641 |
| 643 void CheckNumTextures(size_t expected_num_textures) { | 642 void CheckNumTextures(size_t expected_num_textures) { |
| 644 EXPECT_EQ(expected_num_textures, | 643 EXPECT_EQ(expected_num_textures, |
| 645 first_context_provider_->TestContext3d()->NumTextures()); | 644 first_context_provider_->TestContext3d()->NumTextures()); |
| 646 EndTest(); | 645 EndTest(); |
| 647 } | 646 } |
| 648 | 647 |
| 649 virtual void AfterTest() override {} | 648 void AfterTest() override {} |
| 650 | 649 |
| 651 scoped_refptr<TestContextProvider> first_context_provider_; | 650 scoped_refptr<TestContextProvider> first_context_provider_; |
| 652 scoped_refptr<TestContextProvider> second_context_provider_; | 651 scoped_refptr<TestContextProvider> second_context_provider_; |
| 653 size_t num_textures_without_readback_; | 652 size_t num_textures_without_readback_; |
| 654 size_t num_textures_after_loss_; | 653 size_t num_textures_after_loss_; |
| 655 FakeContentLayerClient client_; | 654 FakeContentLayerClient client_; |
| 656 scoped_refptr<FakeContentLayer> root_; | 655 scoped_refptr<FakeContentLayer> root_; |
| 657 scoped_refptr<FakeContentLayer> copy_layer_; | 656 scoped_refptr<FakeContentLayer> copy_layer_; |
| 658 scoped_ptr<CopyOutputResult> result_; | 657 scoped_ptr<CopyOutputResult> result_; |
| 659 }; | 658 }; |
| 660 | 659 |
| 661 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F( | 660 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F( |
| 662 LayerTreeHostCopyRequestTestLostOutputSurface); | 661 LayerTreeHostCopyRequestTestLostOutputSurface); |
| 663 | 662 |
| 664 class LayerTreeHostCopyRequestTestCountTextures | 663 class LayerTreeHostCopyRequestTestCountTextures |
| 665 : public LayerTreeHostCopyRequestTest { | 664 : public LayerTreeHostCopyRequestTest { |
| 666 protected: | 665 protected: |
| 667 virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) | 666 scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface( |
| 668 override { | 667 bool fallback) override { |
| 669 context_provider_ = TestContextProvider::Create(); | 668 context_provider_ = TestContextProvider::Create(); |
| 670 return FakeOutputSurface::Create3d(context_provider_); | 669 return FakeOutputSurface::Create3d(context_provider_); |
| 671 } | 670 } |
| 672 | 671 |
| 673 virtual void SetupTree() override { | 672 void SetupTree() override { |
| 674 root_ = FakeContentLayer::Create(&client_); | 673 root_ = FakeContentLayer::Create(&client_); |
| 675 root_->SetBounds(gfx::Size(20, 20)); | 674 root_->SetBounds(gfx::Size(20, 20)); |
| 676 | 675 |
| 677 copy_layer_ = FakeContentLayer::Create(&client_); | 676 copy_layer_ = FakeContentLayer::Create(&client_); |
| 678 copy_layer_->SetBounds(gfx::Size(10, 10)); | 677 copy_layer_->SetBounds(gfx::Size(10, 10)); |
| 679 root_->AddChild(copy_layer_); | 678 root_->AddChild(copy_layer_); |
| 680 | 679 |
| 681 layer_tree_host()->SetRootLayer(root_); | 680 layer_tree_host()->SetRootLayer(root_); |
| 682 LayerTreeHostCopyRequestTest::SetupTree(); | 681 LayerTreeHostCopyRequestTest::SetupTree(); |
| 683 } | 682 } |
| 684 | 683 |
| 685 virtual void BeginTest() override { | 684 void BeginTest() override { |
| 686 num_textures_without_readback_ = 0; | 685 num_textures_without_readback_ = 0; |
| 687 num_textures_with_readback_ = 0; | 686 num_textures_with_readback_ = 0; |
| 688 waited_sync_point_after_readback_ = 0; | 687 waited_sync_point_after_readback_ = 0; |
| 689 PostSetNeedsCommitToMainThread(); | 688 PostSetNeedsCommitToMainThread(); |
| 690 } | 689 } |
| 691 | 690 |
| 692 virtual void RequestCopy(Layer* layer) = 0; | 691 virtual void RequestCopy(Layer* layer) = 0; |
| 693 | 692 |
| 694 virtual void DidCommitAndDrawFrame() override { | 693 void DidCommitAndDrawFrame() override { |
| 695 switch (layer_tree_host()->source_frame_number()) { | 694 switch (layer_tree_host()->source_frame_number()) { |
| 696 case 1: | 695 case 1: |
| 697 // The layers have been pushed to the impl side. The layer textures have | 696 // The layers have been pushed to the impl side. The layer textures have |
| 698 // been allocated. | 697 // been allocated. |
| 699 RequestCopy(copy_layer_.get()); | 698 RequestCopy(copy_layer_.get()); |
| 700 break; | 699 break; |
| 701 } | 700 } |
| 702 } | 701 } |
| 703 | 702 |
| 704 virtual void SwapBuffersOnThread(LayerTreeHostImpl* impl, | 703 void SwapBuffersOnThread(LayerTreeHostImpl* impl, bool result) override { |
| 705 bool result) override { | |
| 706 switch (impl->active_tree()->source_frame_number()) { | 704 switch (impl->active_tree()->source_frame_number()) { |
| 707 case 0: | 705 case 0: |
| 708 // The layers have been drawn, so their textures have been allocated. | 706 // The layers have been drawn, so their textures have been allocated. |
| 709 num_textures_without_readback_ = | 707 num_textures_without_readback_ = |
| 710 context_provider_->TestContext3d()->NumTextures(); | 708 context_provider_->TestContext3d()->NumTextures(); |
| 711 break; | 709 break; |
| 712 case 1: | 710 case 1: |
| 713 // We did a readback, so there will be a readback texture around now. | 711 // We did a readback, so there will be a readback texture around now. |
| 714 num_textures_with_readback_ = | 712 num_textures_with_readback_ = |
| 715 context_provider_->TestContext3d()->NumTextures(); | 713 context_provider_->TestContext3d()->NumTextures(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 731 size_t num_textures_with_readback_; | 729 size_t num_textures_with_readback_; |
| 732 unsigned waited_sync_point_after_readback_; | 730 unsigned waited_sync_point_after_readback_; |
| 733 FakeContentLayerClient client_; | 731 FakeContentLayerClient client_; |
| 734 scoped_refptr<FakeContentLayer> root_; | 732 scoped_refptr<FakeContentLayer> root_; |
| 735 scoped_refptr<FakeContentLayer> copy_layer_; | 733 scoped_refptr<FakeContentLayer> copy_layer_; |
| 736 }; | 734 }; |
| 737 | 735 |
| 738 class LayerTreeHostCopyRequestTestCreatesTexture | 736 class LayerTreeHostCopyRequestTestCreatesTexture |
| 739 : public LayerTreeHostCopyRequestTestCountTextures { | 737 : public LayerTreeHostCopyRequestTestCountTextures { |
| 740 protected: | 738 protected: |
| 741 virtual void RequestCopy(Layer* layer) override { | 739 void RequestCopy(Layer* layer) override { |
| 742 // Request a normal texture copy. This should create a new texture. | 740 // Request a normal texture copy. This should create a new texture. |
| 743 copy_layer_->RequestCopyOfOutput( | 741 copy_layer_->RequestCopyOfOutput( |
| 744 CopyOutputRequest::CreateRequest(base::Bind( | 742 CopyOutputRequest::CreateRequest(base::Bind( |
| 745 &LayerTreeHostCopyRequestTestCreatesTexture::CopyOutputCallback, | 743 &LayerTreeHostCopyRequestTestCreatesTexture::CopyOutputCallback, |
| 746 base::Unretained(this)))); | 744 base::Unretained(this)))); |
| 747 } | 745 } |
| 748 | 746 |
| 749 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { | 747 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { |
| 750 EXPECT_FALSE(result->IsEmpty()); | 748 EXPECT_FALSE(result->IsEmpty()); |
| 751 EXPECT_TRUE(result->HasTexture()); | 749 EXPECT_TRUE(result->HasTexture()); |
| 752 | 750 |
| 753 TextureMailbox mailbox; | 751 TextureMailbox mailbox; |
| 754 scoped_ptr<SingleReleaseCallback> release; | 752 scoped_ptr<SingleReleaseCallback> release; |
| 755 result->TakeTexture(&mailbox, &release); | 753 result->TakeTexture(&mailbox, &release); |
| 756 EXPECT_TRUE(release); | 754 EXPECT_TRUE(release); |
| 757 | 755 |
| 758 release->Run(0, false); | 756 release->Run(0, false); |
| 759 } | 757 } |
| 760 | 758 |
| 761 virtual void AfterTest() override { | 759 void AfterTest() override { |
| 762 // No sync point was needed. | 760 // No sync point was needed. |
| 763 EXPECT_EQ(0u, waited_sync_point_after_readback_); | 761 EXPECT_EQ(0u, waited_sync_point_after_readback_); |
| 764 // Except the copy to have made another texture. | 762 // Except the copy to have made another texture. |
| 765 EXPECT_EQ(num_textures_without_readback_ + 1, num_textures_with_readback_); | 763 EXPECT_EQ(num_textures_without_readback_ + 1, num_textures_with_readback_); |
| 766 } | 764 } |
| 767 }; | 765 }; |
| 768 | 766 |
| 769 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F( | 767 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F( |
| 770 LayerTreeHostCopyRequestTestCreatesTexture); | 768 LayerTreeHostCopyRequestTestCreatesTexture); |
| 771 | 769 |
| 772 class LayerTreeHostCopyRequestTestProvideTexture | 770 class LayerTreeHostCopyRequestTestProvideTexture |
| 773 : public LayerTreeHostCopyRequestTestCountTextures { | 771 : public LayerTreeHostCopyRequestTestCountTextures { |
| 774 protected: | 772 protected: |
| 775 virtual void BeginTest() override { | 773 void BeginTest() override { |
| 776 external_context_provider_ = TestContextProvider::Create(); | 774 external_context_provider_ = TestContextProvider::Create(); |
| 777 EXPECT_TRUE(external_context_provider_->BindToCurrentThread()); | 775 EXPECT_TRUE(external_context_provider_->BindToCurrentThread()); |
| 778 LayerTreeHostCopyRequestTestCountTextures::BeginTest(); | 776 LayerTreeHostCopyRequestTestCountTextures::BeginTest(); |
| 779 } | 777 } |
| 780 | 778 |
| 781 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { | 779 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { |
| 782 EXPECT_FALSE(result->IsEmpty()); | 780 EXPECT_FALSE(result->IsEmpty()); |
| 783 EXPECT_TRUE(result->HasTexture()); | 781 EXPECT_TRUE(result->HasTexture()); |
| 784 | 782 |
| 785 TextureMailbox mailbox; | 783 TextureMailbox mailbox; |
| 786 scoped_ptr<SingleReleaseCallback> release; | 784 scoped_ptr<SingleReleaseCallback> release; |
| 787 result->TakeTexture(&mailbox, &release); | 785 result->TakeTexture(&mailbox, &release); |
| 788 EXPECT_FALSE(release); | 786 EXPECT_FALSE(release); |
| 789 } | 787 } |
| 790 | 788 |
| 791 virtual void RequestCopy(Layer* layer) override { | 789 void RequestCopy(Layer* layer) override { |
| 792 // Request a copy to a provided texture. This should not create a new | 790 // Request a copy to a provided texture. This should not create a new |
| 793 // texture. | 791 // texture. |
| 794 scoped_ptr<CopyOutputRequest> request = | 792 scoped_ptr<CopyOutputRequest> request = |
| 795 CopyOutputRequest::CreateRequest(base::Bind( | 793 CopyOutputRequest::CreateRequest(base::Bind( |
| 796 &LayerTreeHostCopyRequestTestProvideTexture::CopyOutputCallback, | 794 &LayerTreeHostCopyRequestTestProvideTexture::CopyOutputCallback, |
| 797 base::Unretained(this))); | 795 base::Unretained(this))); |
| 798 | 796 |
| 799 gpu::gles2::GLES2Interface* gl = external_context_provider_->ContextGL(); | 797 gpu::gles2::GLES2Interface* gl = external_context_provider_->ContextGL(); |
| 800 gpu::Mailbox mailbox; | 798 gpu::Mailbox mailbox; |
| 801 gl->GenMailboxCHROMIUM(mailbox.name); | 799 gl->GenMailboxCHROMIUM(mailbox.name); |
| 802 sync_point_ = gl->InsertSyncPointCHROMIUM(); | 800 sync_point_ = gl->InsertSyncPointCHROMIUM(); |
| 803 request->SetTextureMailbox( | 801 request->SetTextureMailbox( |
| 804 TextureMailbox(mailbox, GL_TEXTURE_2D, sync_point_)); | 802 TextureMailbox(mailbox, GL_TEXTURE_2D, sync_point_)); |
| 805 EXPECT_TRUE(request->has_texture_mailbox()); | 803 EXPECT_TRUE(request->has_texture_mailbox()); |
| 806 | 804 |
| 807 copy_layer_->RequestCopyOfOutput(request.Pass()); | 805 copy_layer_->RequestCopyOfOutput(request.Pass()); |
| 808 } | 806 } |
| 809 | 807 |
| 810 virtual void AfterTest() override { | 808 void AfterTest() override { |
| 811 // Expect the compositor to have waited for the sync point in the provided | 809 // Expect the compositor to have waited for the sync point in the provided |
| 812 // TextureMailbox. | 810 // TextureMailbox. |
| 813 EXPECT_EQ(sync_point_, waited_sync_point_after_readback_); | 811 EXPECT_EQ(sync_point_, waited_sync_point_after_readback_); |
| 814 // Except the copy to have *not* made another texture. | 812 // Except the copy to have *not* made another texture. |
| 815 EXPECT_EQ(num_textures_without_readback_, num_textures_with_readback_); | 813 EXPECT_EQ(num_textures_without_readback_, num_textures_with_readback_); |
| 816 } | 814 } |
| 817 | 815 |
| 818 scoped_refptr<TestContextProvider> external_context_provider_; | 816 scoped_refptr<TestContextProvider> external_context_provider_; |
| 819 unsigned sync_point_; | 817 unsigned sync_point_; |
| 820 }; | 818 }; |
| 821 | 819 |
| 822 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F( | 820 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_NOIMPL_TEST_F( |
| 823 LayerTreeHostCopyRequestTestProvideTexture); | 821 LayerTreeHostCopyRequestTestProvideTexture); |
| 824 | 822 |
| 825 class LayerTreeHostCopyRequestTestDestroyBeforeCopy | 823 class LayerTreeHostCopyRequestTestDestroyBeforeCopy |
| 826 : public LayerTreeHostCopyRequestTest { | 824 : public LayerTreeHostCopyRequestTest { |
| 827 protected: | 825 protected: |
| 828 virtual void SetupTree() override { | 826 void SetupTree() override { |
| 829 root_ = FakeContentLayer::Create(&client_); | 827 root_ = FakeContentLayer::Create(&client_); |
| 830 root_->SetBounds(gfx::Size(20, 20)); | 828 root_->SetBounds(gfx::Size(20, 20)); |
| 831 | 829 |
| 832 copy_layer_ = FakeContentLayer::Create(&client_); | 830 copy_layer_ = FakeContentLayer::Create(&client_); |
| 833 copy_layer_->SetBounds(gfx::Size(10, 10)); | 831 copy_layer_->SetBounds(gfx::Size(10, 10)); |
| 834 root_->AddChild(copy_layer_); | 832 root_->AddChild(copy_layer_); |
| 835 | 833 |
| 836 layer_tree_host()->SetRootLayer(root_); | 834 layer_tree_host()->SetRootLayer(root_); |
| 837 LayerTreeHostCopyRequestTest::SetupTree(); | 835 LayerTreeHostCopyRequestTest::SetupTree(); |
| 838 } | 836 } |
| 839 | 837 |
| 840 virtual void BeginTest() override { | 838 void BeginTest() override { |
| 841 callback_count_ = 0; | 839 callback_count_ = 0; |
| 842 PostSetNeedsCommitToMainThread(); | 840 PostSetNeedsCommitToMainThread(); |
| 843 } | 841 } |
| 844 | 842 |
| 845 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { | 843 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { |
| 846 EXPECT_TRUE(result->IsEmpty()); | 844 EXPECT_TRUE(result->IsEmpty()); |
| 847 ++callback_count_; | 845 ++callback_count_; |
| 848 } | 846 } |
| 849 | 847 |
| 850 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) override { | 848 void DidActivateTreeOnThread(LayerTreeHostImpl* impl) override { |
| 851 MainThreadTaskRunner()->PostTask( | 849 MainThreadTaskRunner()->PostTask( |
| 852 FROM_HERE, | 850 FROM_HERE, |
| 853 base::Bind(&LayerTreeHostCopyRequestTestDestroyBeforeCopy::DidActivate, | 851 base::Bind(&LayerTreeHostCopyRequestTestDestroyBeforeCopy::DidActivate, |
| 854 base::Unretained(this))); | 852 base::Unretained(this))); |
| 855 } | 853 } |
| 856 | 854 |
| 857 void DidActivate() { | 855 void DidActivate() { |
| 858 switch (layer_tree_host()->source_frame_number()) { | 856 switch (layer_tree_host()->source_frame_number()) { |
| 859 case 1: { | 857 case 1: { |
| 860 EXPECT_EQ(0, callback_count_); | 858 EXPECT_EQ(0, callback_count_); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 881 layer_tree_host()->SetViewportSize( | 879 layer_tree_host()->SetViewportSize( |
| 882 layer_tree_host()->root_layer()->bounds()); | 880 layer_tree_host()->root_layer()->bounds()); |
| 883 break; | 881 break; |
| 884 case 4: | 882 case 4: |
| 885 EXPECT_EQ(1, callback_count_); | 883 EXPECT_EQ(1, callback_count_); |
| 886 // We should not have crashed. | 884 // We should not have crashed. |
| 887 EndTest(); | 885 EndTest(); |
| 888 } | 886 } |
| 889 } | 887 } |
| 890 | 888 |
| 891 virtual void AfterTest() override {} | 889 void AfterTest() override {} |
| 892 | 890 |
| 893 int callback_count_; | 891 int callback_count_; |
| 894 FakeContentLayerClient client_; | 892 FakeContentLayerClient client_; |
| 895 scoped_refptr<FakeContentLayer> root_; | 893 scoped_refptr<FakeContentLayer> root_; |
| 896 scoped_refptr<FakeContentLayer> copy_layer_; | 894 scoped_refptr<FakeContentLayer> copy_layer_; |
| 897 }; | 895 }; |
| 898 | 896 |
| 899 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( | 897 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( |
| 900 LayerTreeHostCopyRequestTestDestroyBeforeCopy); | 898 LayerTreeHostCopyRequestTestDestroyBeforeCopy); |
| 901 | 899 |
| 902 class LayerTreeHostCopyRequestTestShutdownBeforeCopy | 900 class LayerTreeHostCopyRequestTestShutdownBeforeCopy |
| 903 : public LayerTreeHostCopyRequestTest { | 901 : public LayerTreeHostCopyRequestTest { |
| 904 protected: | 902 protected: |
| 905 virtual void SetupTree() override { | 903 void SetupTree() override { |
| 906 root_ = FakeContentLayer::Create(&client_); | 904 root_ = FakeContentLayer::Create(&client_); |
| 907 root_->SetBounds(gfx::Size(20, 20)); | 905 root_->SetBounds(gfx::Size(20, 20)); |
| 908 | 906 |
| 909 copy_layer_ = FakeContentLayer::Create(&client_); | 907 copy_layer_ = FakeContentLayer::Create(&client_); |
| 910 copy_layer_->SetBounds(gfx::Size(10, 10)); | 908 copy_layer_->SetBounds(gfx::Size(10, 10)); |
| 911 root_->AddChild(copy_layer_); | 909 root_->AddChild(copy_layer_); |
| 912 | 910 |
| 913 layer_tree_host()->SetRootLayer(root_); | 911 layer_tree_host()->SetRootLayer(root_); |
| 914 LayerTreeHostCopyRequestTest::SetupTree(); | 912 LayerTreeHostCopyRequestTest::SetupTree(); |
| 915 } | 913 } |
| 916 | 914 |
| 917 virtual void BeginTest() override { | 915 void BeginTest() override { |
| 918 callback_count_ = 0; | 916 callback_count_ = 0; |
| 919 PostSetNeedsCommitToMainThread(); | 917 PostSetNeedsCommitToMainThread(); |
| 920 } | 918 } |
| 921 | 919 |
| 922 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { | 920 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { |
| 923 EXPECT_TRUE(result->IsEmpty()); | 921 EXPECT_TRUE(result->IsEmpty()); |
| 924 ++callback_count_; | 922 ++callback_count_; |
| 925 } | 923 } |
| 926 | 924 |
| 927 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) override { | 925 void DidActivateTreeOnThread(LayerTreeHostImpl* impl) override { |
| 928 MainThreadTaskRunner()->PostTask( | 926 MainThreadTaskRunner()->PostTask( |
| 929 FROM_HERE, | 927 FROM_HERE, |
| 930 base::Bind(&LayerTreeHostCopyRequestTestShutdownBeforeCopy::DidActivate, | 928 base::Bind(&LayerTreeHostCopyRequestTestShutdownBeforeCopy::DidActivate, |
| 931 base::Unretained(this))); | 929 base::Unretained(this))); |
| 932 } | 930 } |
| 933 | 931 |
| 934 void DidActivate() { | 932 void DidActivate() { |
| 935 switch (layer_tree_host()->source_frame_number()) { | 933 switch (layer_tree_host()->source_frame_number()) { |
| 936 case 1: { | 934 case 1: { |
| 937 EXPECT_EQ(0, callback_count_); | 935 EXPECT_EQ(0, callback_count_); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 952 // End the test after the copy result has had a chance to get back to | 950 // End the test after the copy result has had a chance to get back to |
| 953 // the main thread. | 951 // the main thread. |
| 954 MainThreadTaskRunner()->PostTask( | 952 MainThreadTaskRunner()->PostTask( |
| 955 FROM_HERE, | 953 FROM_HERE, |
| 956 base::Bind(&LayerTreeHostCopyRequestTestShutdownBeforeCopy::EndTest, | 954 base::Bind(&LayerTreeHostCopyRequestTestShutdownBeforeCopy::EndTest, |
| 957 base::Unretained(this))); | 955 base::Unretained(this))); |
| 958 break; | 956 break; |
| 959 } | 957 } |
| 960 } | 958 } |
| 961 | 959 |
| 962 virtual void AfterTest() override { EXPECT_EQ(1, callback_count_); } | 960 void AfterTest() override { EXPECT_EQ(1, callback_count_); } |
| 963 | 961 |
| 964 int callback_count_; | 962 int callback_count_; |
| 965 FakeContentLayerClient client_; | 963 FakeContentLayerClient client_; |
| 966 scoped_refptr<FakeContentLayer> root_; | 964 scoped_refptr<FakeContentLayer> root_; |
| 967 scoped_refptr<FakeContentLayer> copy_layer_; | 965 scoped_refptr<FakeContentLayer> copy_layer_; |
| 968 }; | 966 }; |
| 969 | 967 |
| 970 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( | 968 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( |
| 971 LayerTreeHostCopyRequestTestShutdownBeforeCopy); | 969 LayerTreeHostCopyRequestTestShutdownBeforeCopy); |
| 972 | 970 |
| 973 } // namespace | 971 } // namespace |
| 974 } // namespace cc | 972 } // namespace cc |
| OLD | NEW |