| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "cc/output/compositor_frame.h" | 6 #include "cc/output/compositor_frame.h" |
| 7 #include "cc/output/copy_output_request.h" | 7 #include "cc/output/copy_output_request.h" |
| 8 #include "cc/output/copy_output_result.h" | 8 #include "cc/output/copy_output_result.h" |
| 9 #include "cc/output/delegated_frame_data.h" | 9 #include "cc/output/delegated_frame_data.h" |
| 10 #include "cc/resources/resource_provider.h" | 10 #include "cc/resources/resource_provider.h" |
| 11 #include "cc/surfaces/surface.h" | 11 #include "cc/surfaces/surface.h" |
| 12 #include "cc/surfaces/surface_factory.h" | 12 #include "cc/surfaces/surface_factory.h" |
| 13 #include "cc/surfaces/surface_factory_client.h" | 13 #include "cc/surfaces/surface_factory_client.h" |
| 14 #include "cc/surfaces/surface_manager.h" | 14 #include "cc/surfaces/surface_manager.h" |
| 15 #include "cc/test/scheduler_test_common.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 16 #include "ui/gfx/geometry/size.h" | 17 #include "ui/gfx/geometry/size.h" |
| 17 | 18 |
| 18 namespace cc { | 19 namespace cc { |
| 19 namespace { | 20 namespace { |
| 20 | 21 |
| 21 class TestSurfaceFactoryClient : public SurfaceFactoryClient { | 22 class TestSurfaceFactoryClient : public SurfaceFactoryClient { |
| 22 public: | 23 public: |
| 23 TestSurfaceFactoryClient() {} | 24 TestSurfaceFactoryClient() : begin_frame_source_(nullptr) {} |
| 24 ~TestSurfaceFactoryClient() override {} | 25 ~TestSurfaceFactoryClient() override {} |
| 25 | 26 |
| 26 void ReturnResources(const ReturnedResourceArray& resources) override { | 27 void ReturnResources(const ReturnedResourceArray& resources) override { |
| 27 returned_resources_.insert( | 28 returned_resources_.insert( |
| 28 returned_resources_.end(), resources.begin(), resources.end()); | 29 returned_resources_.end(), resources.begin(), resources.end()); |
| 29 } | 30 } |
| 30 | 31 |
| 32 void SetBeginFrameSource(SurfaceId surface_id, |
| 33 BeginFrameSource* begin_frame_source) override { |
| 34 begin_frame_source_ = begin_frame_source; |
| 35 } |
| 36 |
| 31 const ReturnedResourceArray& returned_resources() const { | 37 const ReturnedResourceArray& returned_resources() const { |
| 32 return returned_resources_; | 38 return returned_resources_; |
| 33 } | 39 } |
| 34 | 40 |
| 35 void clear_returned_resources() { returned_resources_.clear(); } | 41 void clear_returned_resources() { returned_resources_.clear(); } |
| 36 | 42 |
| 43 BeginFrameSource* begin_frame_source() const { return begin_frame_source_; } |
| 44 |
| 37 private: | 45 private: |
| 38 ReturnedResourceArray returned_resources_; | 46 ReturnedResourceArray returned_resources_; |
| 47 BeginFrameSource* begin_frame_source_; |
| 39 | 48 |
| 40 DISALLOW_COPY_AND_ASSIGN(TestSurfaceFactoryClient); | 49 DISALLOW_COPY_AND_ASSIGN(TestSurfaceFactoryClient); |
| 41 }; | 50 }; |
| 42 | 51 |
| 43 class SurfaceFactoryTest : public testing::Test { | 52 class SurfaceFactoryTest : public testing::Test { |
| 44 public: | 53 public: |
| 45 SurfaceFactoryTest() : factory_(&manager_, &client_), surface_id_(3) { | 54 SurfaceFactoryTest() |
| 46 factory_.Create(surface_id_); | 55 : factory_(new SurfaceFactory(&manager_, &client_)), surface_id_(3) { |
| 56 factory_->Create(surface_id_); |
| 47 } | 57 } |
| 48 | 58 |
| 49 ~SurfaceFactoryTest() override { | 59 ~SurfaceFactoryTest() override { |
| 50 if (!surface_id_.is_null()) | 60 if (!surface_id_.is_null()) |
| 51 factory_.Destroy(surface_id_); | 61 factory_->Destroy(surface_id_); |
| 52 } | 62 } |
| 53 | 63 |
| 54 void SubmitCompositorFrameWithResources(ResourceId* resource_ids, | 64 void SubmitCompositorFrameWithResources(ResourceId* resource_ids, |
| 55 size_t num_resource_ids) { | 65 size_t num_resource_ids) { |
| 56 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); | 66 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); |
| 57 for (size_t i = 0u; i < num_resource_ids; ++i) { | 67 for (size_t i = 0u; i < num_resource_ids; ++i) { |
| 58 TransferableResource resource; | 68 TransferableResource resource; |
| 59 resource.id = resource_ids[i]; | 69 resource.id = resource_ids[i]; |
| 60 resource.mailbox_holder.texture_target = GL_TEXTURE_2D; | 70 resource.mailbox_holder.texture_target = GL_TEXTURE_2D; |
| 61 frame_data->resource_list.push_back(resource); | 71 frame_data->resource_list.push_back(resource); |
| 62 } | 72 } |
| 63 scoped_ptr<CompositorFrame> frame(new CompositorFrame); | 73 scoped_ptr<CompositorFrame> frame(new CompositorFrame); |
| 64 frame->delegated_frame_data = frame_data.Pass(); | 74 frame->delegated_frame_data = frame_data.Pass(); |
| 65 factory_.SubmitCompositorFrame(surface_id_, frame.Pass(), | 75 factory_->SubmitCompositorFrame(surface_id_, frame.Pass(), |
| 66 SurfaceFactory::DrawCallback()); | 76 SurfaceFactory::DrawCallback()); |
| 67 } | 77 } |
| 68 | 78 |
| 69 void UnrefResources(ResourceId* ids_to_unref, | 79 void UnrefResources(ResourceId* ids_to_unref, |
| 70 int* counts_to_unref, | 80 int* counts_to_unref, |
| 71 size_t num_ids_to_unref) { | 81 size_t num_ids_to_unref) { |
| 72 ReturnedResourceArray unref_array; | 82 ReturnedResourceArray unref_array; |
| 73 for (size_t i = 0; i < num_ids_to_unref; ++i) { | 83 for (size_t i = 0; i < num_ids_to_unref; ++i) { |
| 74 ReturnedResource resource; | 84 ReturnedResource resource; |
| 75 resource.id = ids_to_unref[i]; | 85 resource.id = ids_to_unref[i]; |
| 76 resource.count = counts_to_unref[i]; | 86 resource.count = counts_to_unref[i]; |
| 77 unref_array.push_back(resource); | 87 unref_array.push_back(resource); |
| 78 } | 88 } |
| 79 factory_.UnrefResources(unref_array); | 89 factory_->UnrefResources(unref_array); |
| 80 } | 90 } |
| 81 | 91 |
| 82 void CheckReturnedResourcesMatchExpected(ResourceId* expected_returned_ids, | 92 void CheckReturnedResourcesMatchExpected(ResourceId* expected_returned_ids, |
| 83 int* expected_returned_counts, | 93 int* expected_returned_counts, |
| 84 size_t expected_resources) { | 94 size_t expected_resources) { |
| 85 const ReturnedResourceArray& actual_resources = | 95 const ReturnedResourceArray& actual_resources = |
| 86 client_.returned_resources(); | 96 client_.returned_resources(); |
| 87 ASSERT_EQ(expected_resources, actual_resources.size()); | 97 ASSERT_EQ(expected_resources, actual_resources.size()); |
| 88 for (size_t i = 0; i < expected_resources; ++i) { | 98 for (size_t i = 0; i < expected_resources; ++i) { |
| 89 ReturnedResource resource = actual_resources[i]; | 99 ReturnedResource resource = actual_resources[i]; |
| 90 EXPECT_EQ(expected_returned_ids[i], resource.id); | 100 EXPECT_EQ(expected_returned_ids[i], resource.id); |
| 91 EXPECT_EQ(expected_returned_counts[i], resource.count); | 101 EXPECT_EQ(expected_returned_counts[i], resource.count); |
| 92 } | 102 } |
| 93 client_.clear_returned_resources(); | 103 client_.clear_returned_resources(); |
| 94 } | 104 } |
| 95 | 105 |
| 96 void RefCurrentFrameResources() { | 106 void RefCurrentFrameResources() { |
| 97 Surface* surface = manager_.GetSurfaceForId(surface_id_); | 107 Surface* surface = manager_.GetSurfaceForId(surface_id_); |
| 98 factory_.RefResources( | 108 factory_->RefResources( |
| 99 surface->GetEligibleFrame()->delegated_frame_data->resource_list); | 109 surface->GetEligibleFrame()->delegated_frame_data->resource_list); |
| 100 } | 110 } |
| 101 | 111 |
| 102 protected: | 112 protected: |
| 103 SurfaceManager manager_; | 113 SurfaceManager manager_; |
| 104 TestSurfaceFactoryClient client_; | 114 TestSurfaceFactoryClient client_; |
| 105 SurfaceFactory factory_; | 115 scoped_ptr<SurfaceFactory> factory_; |
| 106 SurfaceId surface_id_; | 116 SurfaceId surface_id_; |
| 107 }; | 117 }; |
| 108 | 118 |
| 109 // Tests submitting a frame with resources followed by one with no resources | 119 // Tests submitting a frame with resources followed by one with no resources |
| 110 // with no resource provider action in between. | 120 // with no resource provider action in between. |
| 111 TEST_F(SurfaceFactoryTest, ResourceLifetimeSimple) { | 121 TEST_F(SurfaceFactoryTest, ResourceLifetimeSimple) { |
| 112 ResourceId first_frame_ids[] = {1, 2, 3}; | 122 ResourceId first_frame_ids[] = {1, 2, 3}; |
| 113 SubmitCompositorFrameWithResources(first_frame_ids, | 123 SubmitCompositorFrameWithResources(first_frame_ids, |
| 114 arraysize(first_frame_ids)); | 124 arraysize(first_frame_ids)); |
| 115 | 125 |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 367 ResourceId expected_returned_ids[] = {12, 13}; | 377 ResourceId expected_returned_ids[] = {12, 13}; |
| 368 int expected_returned_counts[] = {2, 2}; | 378 int expected_returned_counts[] = {2, 2}; |
| 369 CheckReturnedResourcesMatchExpected(expected_returned_ids, | 379 CheckReturnedResourcesMatchExpected(expected_returned_ids, |
| 370 expected_returned_counts, | 380 expected_returned_counts, |
| 371 arraysize(expected_returned_counts)); | 381 arraysize(expected_returned_counts)); |
| 372 } | 382 } |
| 373 } | 383 } |
| 374 | 384 |
| 375 TEST_F(SurfaceFactoryTest, BlankNoIndexIncrement) { | 385 TEST_F(SurfaceFactoryTest, BlankNoIndexIncrement) { |
| 376 SurfaceId surface_id(6); | 386 SurfaceId surface_id(6); |
| 377 factory_.Create(surface_id); | 387 factory_->Create(surface_id); |
| 378 Surface* surface = manager_.GetSurfaceForId(surface_id); | 388 Surface* surface = manager_.GetSurfaceForId(surface_id); |
| 379 ASSERT_NE(nullptr, surface); | 389 ASSERT_NE(nullptr, surface); |
| 380 EXPECT_EQ(2, surface->frame_index()); | 390 EXPECT_EQ(2, surface->frame_index()); |
| 381 scoped_ptr<CompositorFrame> frame(new CompositorFrame); | 391 scoped_ptr<CompositorFrame> frame(new CompositorFrame); |
| 382 frame->delegated_frame_data.reset(new DelegatedFrameData); | 392 frame->delegated_frame_data.reset(new DelegatedFrameData); |
| 383 | 393 |
| 384 factory_.SubmitCompositorFrame(surface_id, frame.Pass(), | 394 factory_->SubmitCompositorFrame(surface_id, frame.Pass(), |
| 385 SurfaceFactory::DrawCallback()); | 395 SurfaceFactory::DrawCallback()); |
| 386 EXPECT_EQ(2, surface->frame_index()); | 396 EXPECT_EQ(2, surface->frame_index()); |
| 387 factory_.Destroy(surface_id); | 397 factory_->Destroy(surface_id); |
| 388 } | 398 } |
| 389 | 399 |
| 390 void DrawCallback(uint32* execute_count, | 400 void DrawCallback(uint32* execute_count, |
| 391 SurfaceDrawStatus* result, | 401 SurfaceDrawStatus* result, |
| 392 SurfaceDrawStatus drawn) { | 402 SurfaceDrawStatus drawn) { |
| 393 *execute_count += 1; | 403 *execute_count += 1; |
| 394 *result = drawn; | 404 *result = drawn; |
| 395 } | 405 } |
| 396 | 406 |
| 397 // Tests doing a DestroyAll before shutting down the factory; | 407 // Tests doing a DestroyAll before shutting down the factory; |
| 398 TEST_F(SurfaceFactoryTest, DestroyAll) { | 408 TEST_F(SurfaceFactoryTest, DestroyAll) { |
| 399 SurfaceId id(7); | 409 SurfaceId id(7); |
| 400 factory_.Create(id); | 410 factory_->Create(id); |
| 401 | 411 |
| 402 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); | 412 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); |
| 403 TransferableResource resource; | 413 TransferableResource resource; |
| 404 resource.id = 1; | 414 resource.id = 1; |
| 405 resource.mailbox_holder.texture_target = GL_TEXTURE_2D; | 415 resource.mailbox_holder.texture_target = GL_TEXTURE_2D; |
| 406 frame_data->resource_list.push_back(resource); | 416 frame_data->resource_list.push_back(resource); |
| 407 scoped_ptr<CompositorFrame> frame(new CompositorFrame); | 417 scoped_ptr<CompositorFrame> frame(new CompositorFrame); |
| 408 frame->delegated_frame_data = frame_data.Pass(); | 418 frame->delegated_frame_data = frame_data.Pass(); |
| 409 uint32 execute_count = 0; | 419 uint32 execute_count = 0; |
| 410 SurfaceDrawStatus drawn = SurfaceDrawStatus::DRAW_SKIPPED; | 420 SurfaceDrawStatus drawn = SurfaceDrawStatus::DRAW_SKIPPED; |
| 411 | 421 |
| 412 factory_.SubmitCompositorFrame( | 422 factory_->SubmitCompositorFrame( |
| 413 id, frame.Pass(), base::Bind(&DrawCallback, &execute_count, &drawn)); | 423 id, frame.Pass(), base::Bind(&DrawCallback, &execute_count, &drawn)); |
| 414 | 424 |
| 415 surface_id_ = SurfaceId(); | 425 surface_id_ = SurfaceId(); |
| 416 factory_.DestroyAll(); | 426 factory_->DestroyAll(); |
| 417 EXPECT_EQ(1u, execute_count); | 427 EXPECT_EQ(1u, execute_count); |
| 418 EXPECT_EQ(SurfaceDrawStatus::DRAW_SKIPPED, drawn); | 428 EXPECT_EQ(SurfaceDrawStatus::DRAW_SKIPPED, drawn); |
| 419 } | 429 } |
| 420 | 430 |
| 421 TEST_F(SurfaceFactoryTest, DestroySequence) { | 431 TEST_F(SurfaceFactoryTest, DestroySequence) { |
| 422 SurfaceId id2(5); | 432 SurfaceId id2(5); |
| 423 factory_.Create(id2); | 433 factory_->Create(id2); |
| 424 | 434 |
| 425 manager_.RegisterSurfaceIdNamespace(0); | 435 manager_.RegisterSurfaceIdNamespace(0); |
| 426 | 436 |
| 427 // Check that waiting before the sequence is satisfied works. | 437 // Check that waiting before the sequence is satisfied works. |
| 428 manager_.GetSurfaceForId(id2) | 438 manager_.GetSurfaceForId(id2) |
| 429 ->AddDestructionDependency(SurfaceSequence(0, 4)); | 439 ->AddDestructionDependency(SurfaceSequence(0, 4)); |
| 430 factory_.Destroy(id2); | 440 factory_->Destroy(id2); |
| 431 | 441 |
| 432 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); | 442 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); |
| 433 scoped_ptr<CompositorFrame> frame(new CompositorFrame); | 443 scoped_ptr<CompositorFrame> frame(new CompositorFrame); |
| 434 frame->metadata.satisfies_sequences.push_back(6); | 444 frame->metadata.satisfies_sequences.push_back(6); |
| 435 frame->metadata.satisfies_sequences.push_back(4); | 445 frame->metadata.satisfies_sequences.push_back(4); |
| 436 frame->delegated_frame_data = frame_data.Pass(); | 446 frame->delegated_frame_data = frame_data.Pass(); |
| 437 DCHECK(manager_.GetSurfaceForId(id2)); | 447 DCHECK(manager_.GetSurfaceForId(id2)); |
| 438 factory_.SubmitCompositorFrame(surface_id_, frame.Pass(), | 448 factory_->SubmitCompositorFrame(surface_id_, frame.Pass(), |
| 439 SurfaceFactory::DrawCallback()); | 449 SurfaceFactory::DrawCallback()); |
| 440 DCHECK(!manager_.GetSurfaceForId(id2)); | 450 DCHECK(!manager_.GetSurfaceForId(id2)); |
| 441 | 451 |
| 442 // Check that waiting after the sequence is satisfied works. | 452 // Check that waiting after the sequence is satisfied works. |
| 443 factory_.Create(id2); | 453 factory_->Create(id2); |
| 444 DCHECK(manager_.GetSurfaceForId(id2)); | 454 DCHECK(manager_.GetSurfaceForId(id2)); |
| 445 manager_.GetSurfaceForId(id2) | 455 manager_.GetSurfaceForId(id2) |
| 446 ->AddDestructionDependency(SurfaceSequence(0, 6)); | 456 ->AddDestructionDependency(SurfaceSequence(0, 6)); |
| 447 factory_.Destroy(id2); | 457 factory_->Destroy(id2); |
| 448 DCHECK(!manager_.GetSurfaceForId(id2)); | 458 DCHECK(!manager_.GetSurfaceForId(id2)); |
| 449 } | 459 } |
| 450 | 460 |
| 451 // Tests that Surface ID namespace invalidation correctly allows | 461 // Tests that Surface ID namespace invalidation correctly allows |
| 452 // Sequences to be ignored. | 462 // Sequences to be ignored. |
| 453 TEST_F(SurfaceFactoryTest, InvalidIdNamespace) { | 463 TEST_F(SurfaceFactoryTest, InvalidIdNamespace) { |
| 454 uint32_t id_namespace = 9u; | 464 uint32_t id_namespace = 9u; |
| 455 SurfaceId id(5); | 465 SurfaceId id(5); |
| 456 factory_.Create(id); | 466 factory_->Create(id); |
| 457 | 467 |
| 458 manager_.RegisterSurfaceIdNamespace(id_namespace); | 468 manager_.RegisterSurfaceIdNamespace(id_namespace); |
| 459 manager_.GetSurfaceForId(id) | 469 manager_.GetSurfaceForId(id) |
| 460 ->AddDestructionDependency(SurfaceSequence(id_namespace, 4)); | 470 ->AddDestructionDependency(SurfaceSequence(id_namespace, 4)); |
| 461 factory_.Destroy(id); | 471 factory_->Destroy(id); |
| 462 | 472 |
| 463 // Verify the dependency has prevented the surface from getting destroyed. | 473 // Verify the dependency has prevented the surface from getting destroyed. |
| 464 EXPECT_TRUE(manager_.GetSurfaceForId(id)); | 474 EXPECT_TRUE(manager_.GetSurfaceForId(id)); |
| 465 | 475 |
| 466 manager_.InvalidateSurfaceIdNamespace(id_namespace); | 476 manager_.InvalidateSurfaceIdNamespace(id_namespace); |
| 467 | 477 |
| 468 // Verify that the invalidated namespace caused the unsatisfied sequence | 478 // Verify that the invalidated namespace caused the unsatisfied sequence |
| 469 // to be ignored. | 479 // to be ignored. |
| 470 EXPECT_FALSE(manager_.GetSurfaceForId(id)); | 480 EXPECT_FALSE(manager_.GetSurfaceForId(id)); |
| 471 } | 481 } |
| 472 | 482 |
| 473 TEST_F(SurfaceFactoryTest, DestroyCycle) { | 483 TEST_F(SurfaceFactoryTest, DestroyCycle) { |
| 474 SurfaceId id2(5); | 484 SurfaceId id2(5); |
| 475 factory_.Create(id2); | 485 factory_->Create(id2); |
| 476 | 486 |
| 477 manager_.RegisterSurfaceIdNamespace(0); | 487 manager_.RegisterSurfaceIdNamespace(0); |
| 478 | 488 |
| 479 manager_.GetSurfaceForId(id2) | 489 manager_.GetSurfaceForId(id2) |
| 480 ->AddDestructionDependency(SurfaceSequence(0, 4)); | 490 ->AddDestructionDependency(SurfaceSequence(0, 4)); |
| 481 | 491 |
| 482 // Give id2 a frame that references surface_id_. | 492 // Give id2 a frame that references surface_id_. |
| 483 { | 493 { |
| 484 scoped_ptr<RenderPass> render_pass(RenderPass::Create()); | 494 scoped_ptr<RenderPass> render_pass(RenderPass::Create()); |
| 485 render_pass->referenced_surfaces.push_back(surface_id_); | 495 render_pass->referenced_surfaces.push_back(surface_id_); |
| 486 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); | 496 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); |
| 487 frame_data->render_pass_list.push_back(render_pass.Pass()); | 497 frame_data->render_pass_list.push_back(render_pass.Pass()); |
| 488 scoped_ptr<CompositorFrame> frame(new CompositorFrame); | 498 scoped_ptr<CompositorFrame> frame(new CompositorFrame); |
| 489 frame->delegated_frame_data = frame_data.Pass(); | 499 frame->delegated_frame_data = frame_data.Pass(); |
| 490 factory_.SubmitCompositorFrame(id2, frame.Pass(), | 500 factory_->SubmitCompositorFrame(id2, frame.Pass(), |
| 491 SurfaceFactory::DrawCallback()); | 501 SurfaceFactory::DrawCallback()); |
| 492 } | 502 } |
| 493 factory_.Destroy(id2); | 503 factory_->Destroy(id2); |
| 494 | 504 |
| 495 // Give surface_id_ a frame that references id2. | 505 // Give surface_id_ a frame that references id2. |
| 496 { | 506 { |
| 497 scoped_ptr<RenderPass> render_pass(RenderPass::Create()); | 507 scoped_ptr<RenderPass> render_pass(RenderPass::Create()); |
| 498 render_pass->referenced_surfaces.push_back(id2); | 508 render_pass->referenced_surfaces.push_back(id2); |
| 499 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); | 509 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); |
| 500 frame_data->render_pass_list.push_back(render_pass.Pass()); | 510 frame_data->render_pass_list.push_back(render_pass.Pass()); |
| 501 scoped_ptr<CompositorFrame> frame(new CompositorFrame); | 511 scoped_ptr<CompositorFrame> frame(new CompositorFrame); |
| 502 frame->delegated_frame_data = frame_data.Pass(); | 512 frame->delegated_frame_data = frame_data.Pass(); |
| 503 factory_.SubmitCompositorFrame(surface_id_, frame.Pass(), | 513 factory_->SubmitCompositorFrame(surface_id_, frame.Pass(), |
| 504 SurfaceFactory::DrawCallback()); | 514 SurfaceFactory::DrawCallback()); |
| 505 } | 515 } |
| 506 factory_.Destroy(surface_id_); | 516 factory_->Destroy(surface_id_); |
| 507 EXPECT_TRUE(manager_.GetSurfaceForId(id2)); | 517 EXPECT_TRUE(manager_.GetSurfaceForId(id2)); |
| 508 // surface_id_ should be retained by reference from id2. | 518 // surface_id_ should be retained by reference from id2. |
| 509 EXPECT_TRUE(manager_.GetSurfaceForId(surface_id_)); | 519 EXPECT_TRUE(manager_.GetSurfaceForId(surface_id_)); |
| 510 | 520 |
| 511 // Satisfy last destruction dependency for id2. | 521 // Satisfy last destruction dependency for id2. |
| 512 std::vector<uint32_t> to_satisfy; | 522 std::vector<uint32_t> to_satisfy; |
| 513 to_satisfy.push_back(4); | 523 to_satisfy.push_back(4); |
| 514 manager_.DidSatisfySequences(0, &to_satisfy); | 524 manager_.DidSatisfySequences(0, &to_satisfy); |
| 515 | 525 |
| 516 // id2 and surface_id_ are in a reference cycle that has no surface | 526 // id2 and surface_id_ are in a reference cycle that has no surface |
| (...skipping 10 matching lines...) Expand all Loading... |
| 527 } | 537 } |
| 528 | 538 |
| 529 TEST_F(SurfaceFactoryTest, DuplicateCopyRequest) { | 539 TEST_F(SurfaceFactoryTest, DuplicateCopyRequest) { |
| 530 { | 540 { |
| 531 scoped_ptr<RenderPass> render_pass(RenderPass::Create()); | 541 scoped_ptr<RenderPass> render_pass(RenderPass::Create()); |
| 532 render_pass->referenced_surfaces.push_back(surface_id_); | 542 render_pass->referenced_surfaces.push_back(surface_id_); |
| 533 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); | 543 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); |
| 534 frame_data->render_pass_list.push_back(render_pass.Pass()); | 544 frame_data->render_pass_list.push_back(render_pass.Pass()); |
| 535 scoped_ptr<CompositorFrame> frame(new CompositorFrame); | 545 scoped_ptr<CompositorFrame> frame(new CompositorFrame); |
| 536 frame->delegated_frame_data = frame_data.Pass(); | 546 frame->delegated_frame_data = frame_data.Pass(); |
| 537 factory_.SubmitCompositorFrame(surface_id_, frame.Pass(), | 547 factory_->SubmitCompositorFrame(surface_id_, frame.Pass(), |
| 538 SurfaceFactory::DrawCallback()); | 548 SurfaceFactory::DrawCallback()); |
| 539 } | 549 } |
| 540 void* source1 = &source1; | 550 void* source1 = &source1; |
| 541 void* source2 = &source2; | 551 void* source2 = &source2; |
| 542 | 552 |
| 543 bool called1 = false; | 553 bool called1 = false; |
| 544 scoped_ptr<CopyOutputRequest> request; | 554 scoped_ptr<CopyOutputRequest> request; |
| 545 request = CopyOutputRequest::CreateRequest( | 555 request = CopyOutputRequest::CreateRequest( |
| 546 base::Bind(&CopyRequestTestCallback, &called1)); | 556 base::Bind(&CopyRequestTestCallback, &called1)); |
| 547 request->set_source(source1); | 557 request->set_source(source1); |
| 548 | 558 |
| 549 factory_.RequestCopyOfSurface(surface_id_, request.Pass()); | 559 factory_->RequestCopyOfSurface(surface_id_, request.Pass()); |
| 550 EXPECT_FALSE(called1); | 560 EXPECT_FALSE(called1); |
| 551 | 561 |
| 552 bool called2 = false; | 562 bool called2 = false; |
| 553 request = CopyOutputRequest::CreateRequest( | 563 request = CopyOutputRequest::CreateRequest( |
| 554 base::Bind(&CopyRequestTestCallback, &called2)); | 564 base::Bind(&CopyRequestTestCallback, &called2)); |
| 555 request->set_source(source2); | 565 request->set_source(source2); |
| 556 | 566 |
| 557 factory_.RequestCopyOfSurface(surface_id_, request.Pass()); | 567 factory_->RequestCopyOfSurface(surface_id_, request.Pass()); |
| 558 // Callbacks have different sources so neither should be called. | 568 // Callbacks have different sources so neither should be called. |
| 559 EXPECT_FALSE(called1); | 569 EXPECT_FALSE(called1); |
| 560 EXPECT_FALSE(called2); | 570 EXPECT_FALSE(called2); |
| 561 | 571 |
| 562 bool called3 = false; | 572 bool called3 = false; |
| 563 request = CopyOutputRequest::CreateRequest( | 573 request = CopyOutputRequest::CreateRequest( |
| 564 base::Bind(&CopyRequestTestCallback, &called3)); | 574 base::Bind(&CopyRequestTestCallback, &called3)); |
| 565 request->set_source(source1); | 575 request->set_source(source1); |
| 566 | 576 |
| 567 factory_.RequestCopyOfSurface(surface_id_, request.Pass()); | 577 factory_->RequestCopyOfSurface(surface_id_, request.Pass()); |
| 568 // Two callbacks are from source1, so the first should be called. | 578 // Two callbacks are from source1, so the first should be called. |
| 569 EXPECT_TRUE(called1); | 579 EXPECT_TRUE(called1); |
| 570 EXPECT_FALSE(called2); | 580 EXPECT_FALSE(called2); |
| 571 EXPECT_FALSE(called3); | 581 EXPECT_FALSE(called3); |
| 572 | 582 |
| 573 factory_.Destroy(surface_id_); | 583 factory_->Destroy(surface_id_); |
| 574 surface_id_ = SurfaceId(); | 584 surface_id_ = SurfaceId(); |
| 575 EXPECT_TRUE(called1); | 585 EXPECT_TRUE(called1); |
| 576 EXPECT_TRUE(called2); | 586 EXPECT_TRUE(called2); |
| 577 EXPECT_TRUE(called3); | 587 EXPECT_TRUE(called3); |
| 578 } | 588 } |
| 579 | 589 |
| 590 // Verifies BFS is forwarded to the client. |
| 591 TEST_F(SurfaceFactoryTest, SetBeginFrameSource) { |
| 592 FakeBeginFrameSource bfs1; |
| 593 FakeBeginFrameSource bfs2; |
| 594 EXPECT_EQ(nullptr, client_.begin_frame_source()); |
| 595 factory_->SetBeginFrameSource(surface_id_, &bfs1); |
| 596 EXPECT_EQ(&bfs1, client_.begin_frame_source()); |
| 597 factory_->SetBeginFrameSource(surface_id_, &bfs2); |
| 598 EXPECT_EQ(&bfs2, client_.begin_frame_source()); |
| 599 factory_->SetBeginFrameSource(surface_id_, nullptr); |
| 600 EXPECT_EQ(nullptr, client_.begin_frame_source()); |
| 601 } |
| 602 |
| 603 TEST_F(SurfaceFactoryTest, BeginFrameSourceRemovedOnFactoryDestruction) { |
| 604 FakeBeginFrameSource bfs; |
| 605 factory_->SetBeginFrameSource(surface_id_, &bfs); |
| 606 EXPECT_EQ(&bfs, client_.begin_frame_source()); |
| 607 |
| 608 // Prevent the Surface from being destroyed when we destroy the factory. |
| 609 manager_.RegisterSurfaceIdNamespace(0); |
| 610 manager_.GetSurfaceForId(surface_id_) |
| 611 ->AddDestructionDependency(SurfaceSequence(0, 4)); |
| 612 |
| 613 surface_id_ = SurfaceId(); |
| 614 factory_->DestroyAll(); |
| 615 |
| 616 EXPECT_EQ(&bfs, client_.begin_frame_source()); |
| 617 factory_.reset(); |
| 618 EXPECT_EQ(nullptr, client_.begin_frame_source()); |
| 619 } |
| 620 |
| 580 } // namespace | 621 } // namespace |
| 581 } // namespace cc | 622 } // namespace cc |
| OLD | NEW |