| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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/resources/resource_provider.h" | 5 #include "cc/resources/resource_provider.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/containers/hash_tables.h" | 10 #include "base/containers/hash_tables.h" |
| (...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 417 break; | 417 break; |
| 418 case ResourceProvider::InvalidType: | 418 case ResourceProvider::InvalidType: |
| 419 NOTREACHED(); | 419 NOTREACHED(); |
| 420 break; | 420 break; |
| 421 } | 421 } |
| 422 CHECK(output_surface_->BindToClient(&output_surface_client_)); | 422 CHECK(output_surface_->BindToClient(&output_surface_client_)); |
| 423 resource_provider_ = ResourceProvider::Create( | 423 resource_provider_ = ResourceProvider::Create( |
| 424 output_surface_.get(), 0, false); | 424 output_surface_.get(), 0, false); |
| 425 } | 425 } |
| 426 | 426 |
| 427 static void CollectResources(ReturnedResourceArray* array, |
| 428 const ReturnedResourceArray& returned) { |
| 429 array->insert(array->end(), returned.begin(), returned.end()); |
| 430 } |
| 431 |
| 432 static ReturnCallback GetReturnCallback(ReturnedResourceArray* array) { |
| 433 return base::Bind(&ResourceProviderTest::CollectResources, array); |
| 434 } |
| 435 |
| 427 static void SetResourceFilter(ResourceProvider* resource_provider, | 436 static void SetResourceFilter(ResourceProvider* resource_provider, |
| 428 ResourceProvider::ResourceId id, | 437 ResourceProvider::ResourceId id, |
| 429 WGC3Denum filter) { | 438 WGC3Denum filter) { |
| 430 ResourceProvider::ScopedSamplerGL sampler( | 439 ResourceProvider::ScopedSamplerGL sampler( |
| 431 resource_provider, id, GL_TEXTURE_2D, filter); | 440 resource_provider, id, GL_TEXTURE_2D, filter); |
| 432 } | 441 } |
| 433 | 442 |
| 434 ResourceProviderContext* context() { return context3d_; } | 443 ResourceProviderContext* context() { return context3d_; } |
| 435 | 444 |
| 436 protected: | 445 protected: |
| 437 scoped_ptr<ContextSharedData> shared_data_; | 446 scoped_ptr<ContextSharedData> shared_data_; |
| 438 ResourceProviderContext* context3d_; | 447 ResourceProviderContext* context3d_; |
| 439 FakeOutputSurfaceClient output_surface_client_; | 448 FakeOutputSurfaceClient output_surface_client_; |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 571 size, GL_CLAMP_TO_EDGE, ResourceProvider::TextureUsageAny, format); | 580 size, GL_CLAMP_TO_EDGE, ResourceProvider::TextureUsageAny, format); |
| 572 uint8_t data1[4] = { 1, 2, 3, 4 }; | 581 uint8_t data1[4] = { 1, 2, 3, 4 }; |
| 573 gfx::Rect rect(size); | 582 gfx::Rect rect(size); |
| 574 child_resource_provider->SetPixels(id1, data1, rect, rect, gfx::Vector2d()); | 583 child_resource_provider->SetPixels(id1, data1, rect, rect, gfx::Vector2d()); |
| 575 | 584 |
| 576 ResourceProvider::ResourceId id2 = child_resource_provider->CreateResource( | 585 ResourceProvider::ResourceId id2 = child_resource_provider->CreateResource( |
| 577 size, GL_CLAMP_TO_EDGE, ResourceProvider::TextureUsageAny, format); | 586 size, GL_CLAMP_TO_EDGE, ResourceProvider::TextureUsageAny, format); |
| 578 uint8_t data2[4] = { 5, 5, 5, 5 }; | 587 uint8_t data2[4] = { 5, 5, 5, 5 }; |
| 579 child_resource_provider->SetPixels(id2, data2, rect, rect, gfx::Vector2d()); | 588 child_resource_provider->SetPixels(id2, data2, rect, rect, gfx::Vector2d()); |
| 580 | 589 |
| 581 int child_id = resource_provider_->CreateChild(); | 590 ReturnedResourceArray returned_to_child; |
| 591 int child_id = |
| 592 resource_provider_->CreateChild(GetReturnCallback(&returned_to_child)); |
| 582 { | 593 { |
| 583 // Transfer some resources to the parent. | 594 // Transfer some resources to the parent. |
| 584 ResourceProvider::ResourceIdArray resource_ids_to_transfer; | 595 ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
| 585 resource_ids_to_transfer.push_back(id1); | 596 resource_ids_to_transfer.push_back(id1); |
| 586 resource_ids_to_transfer.push_back(id2); | 597 resource_ids_to_transfer.push_back(id2); |
| 587 TransferableResourceArray list; | 598 TransferableResourceArray list; |
| 588 child_resource_provider->PrepareSendToParent(resource_ids_to_transfer, | 599 child_resource_provider->PrepareSendToParent(resource_ids_to_transfer, |
| 589 &list); | 600 &list); |
| 590 ASSERT_EQ(2u, list.size()); | 601 ASSERT_EQ(2u, list.size()); |
| 591 EXPECT_NE(0u, list[0].sync_point); | 602 EXPECT_NE(0u, list[0].sync_point); |
| 592 EXPECT_NE(0u, list[1].sync_point); | 603 EXPECT_NE(0u, list[1].sync_point); |
| 593 EXPECT_TRUE(child_resource_provider->InUseByConsumer(id1)); | 604 EXPECT_TRUE(child_resource_provider->InUseByConsumer(id1)); |
| 594 EXPECT_TRUE(child_resource_provider->InUseByConsumer(id2)); | 605 EXPECT_TRUE(child_resource_provider->InUseByConsumer(id2)); |
| 595 resource_provider_->ReceiveFromChild(child_id, list); | 606 resource_provider_->ReceiveFromChild(child_id, list); |
| 607 resource_provider_->DeclareUsedResourcesFromChild(child_id, |
| 608 resource_ids_to_transfer); |
| 596 } | 609 } |
| 597 | 610 |
| 598 EXPECT_EQ(2u, resource_provider_->num_resources()); | 611 EXPECT_EQ(2u, resource_provider_->num_resources()); |
| 599 ResourceProvider::ResourceIdMap resource_map = | 612 ResourceProvider::ResourceIdMap resource_map = |
| 600 resource_provider_->GetChildToParentMap(child_id); | 613 resource_provider_->GetChildToParentMap(child_id); |
| 601 ResourceProvider::ResourceId mapped_id1 = resource_map[id1]; | 614 ResourceProvider::ResourceId mapped_id1 = resource_map[id1]; |
| 602 ResourceProvider::ResourceId mapped_id2 = resource_map[id2]; | 615 ResourceProvider::ResourceId mapped_id2 = resource_map[id2]; |
| 603 EXPECT_NE(0u, mapped_id1); | 616 EXPECT_NE(0u, mapped_id1); |
| 604 EXPECT_NE(0u, mapped_id2); | 617 EXPECT_NE(0u, mapped_id2); |
| 605 EXPECT_FALSE(resource_provider_->InUseByConsumer(id1)); | 618 EXPECT_FALSE(resource_provider_->InUseByConsumer(id1)); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 624 EXPECT_EQ(1u, list.size()); | 637 EXPECT_EQ(1u, list.size()); |
| 625 EXPECT_EQ(id1, list[0].id); | 638 EXPECT_EQ(id1, list[0].id); |
| 626 ReturnedResourceArray returned; | 639 ReturnedResourceArray returned; |
| 627 TransferableResource::ReturnResources(list, &returned); | 640 TransferableResource::ReturnResources(list, &returned); |
| 628 child_resource_provider->ReceiveReturnsFromParent(returned); | 641 child_resource_provider->ReceiveReturnsFromParent(returned); |
| 629 // id1 was exported twice, we returned it only once, it should still be | 642 // id1 was exported twice, we returned it only once, it should still be |
| 630 // in-use. | 643 // in-use. |
| 631 EXPECT_TRUE(child_resource_provider->InUseByConsumer(id1)); | 644 EXPECT_TRUE(child_resource_provider->InUseByConsumer(id1)); |
| 632 } | 645 } |
| 633 { | 646 { |
| 634 // Transfer resources back from the parent to the child. | 647 EXPECT_EQ(0u, returned_to_child.size()); |
| 635 ResourceProvider::ResourceIdArray resource_ids_to_transfer; | 648 |
| 636 resource_ids_to_transfer.push_back(mapped_id1); | 649 // Transfer resources back from the parent to the child. Set no resources as |
| 637 resource_ids_to_transfer.push_back(mapped_id2); | 650 // being in use. |
| 638 ReturnedResourceArray list; | 651 ResourceProvider::ResourceIdArray no_resources; |
| 639 resource_provider_->PrepareSendReturnsToChild( | 652 resource_provider_->DeclareUsedResourcesFromChild(child_id, no_resources); |
| 640 child_id, resource_ids_to_transfer, &list); | 653 |
| 641 ASSERT_EQ(2u, list.size()); | 654 ASSERT_EQ(2u, returned_to_child.size()); |
| 642 EXPECT_NE(0u, list[0].sync_point); | 655 EXPECT_NE(0u, returned_to_child[0].sync_point); |
| 643 EXPECT_NE(0u, list[1].sync_point); | 656 EXPECT_NE(0u, returned_to_child[1].sync_point); |
| 644 child_resource_provider->ReceiveReturnsFromParent(list); | 657 child_resource_provider->ReceiveReturnsFromParent(returned_to_child); |
| 658 returned_to_child.clear(); |
| 645 } | 659 } |
| 646 EXPECT_FALSE(child_resource_provider->InUseByConsumer(id1)); | 660 EXPECT_FALSE(child_resource_provider->InUseByConsumer(id1)); |
| 647 EXPECT_FALSE(child_resource_provider->InUseByConsumer(id2)); | 661 EXPECT_FALSE(child_resource_provider->InUseByConsumer(id2)); |
| 648 | 662 |
| 649 { | 663 { |
| 650 ResourceProvider::ScopedReadLockGL lock(child_resource_provider.get(), id1); | 664 ResourceProvider::ScopedReadLockGL lock(child_resource_provider.get(), id1); |
| 651 ASSERT_NE(0U, lock.texture_id()); | 665 ASSERT_NE(0U, lock.texture_id()); |
| 652 child_context->bindTexture(GL_TEXTURE_2D, lock.texture_id()); | 666 child_context->bindTexture(GL_TEXTURE_2D, lock.texture_id()); |
| 653 child_context->GetPixels(size, format, result); | 667 child_context->GetPixels(size, format, result); |
| 654 EXPECT_EQ(0, memcmp(data1, result, pixel_size)); | 668 EXPECT_EQ(0, memcmp(data1, result, pixel_size)); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 667 resource_ids_to_transfer.push_back(id2); | 681 resource_ids_to_transfer.push_back(id2); |
| 668 TransferableResourceArray list; | 682 TransferableResourceArray list; |
| 669 child_resource_provider->PrepareSendToParent(resource_ids_to_transfer, | 683 child_resource_provider->PrepareSendToParent(resource_ids_to_transfer, |
| 670 &list); | 684 &list); |
| 671 ASSERT_EQ(2u, list.size()); | 685 ASSERT_EQ(2u, list.size()); |
| 672 EXPECT_NE(0u, list[0].sync_point); | 686 EXPECT_NE(0u, list[0].sync_point); |
| 673 EXPECT_NE(0u, list[1].sync_point); | 687 EXPECT_NE(0u, list[1].sync_point); |
| 674 EXPECT_TRUE(child_resource_provider->InUseByConsumer(id1)); | 688 EXPECT_TRUE(child_resource_provider->InUseByConsumer(id1)); |
| 675 EXPECT_TRUE(child_resource_provider->InUseByConsumer(id2)); | 689 EXPECT_TRUE(child_resource_provider->InUseByConsumer(id2)); |
| 676 resource_provider_->ReceiveFromChild(child_id, list); | 690 resource_provider_->ReceiveFromChild(child_id, list); |
| 677 } | 691 resource_provider_->DeclareUsedResourcesFromChild(child_id, |
| 692 resource_ids_to_transfer); |
| 693 } |
| 694 |
| 695 EXPECT_EQ(0u, returned_to_child.size()); |
| 678 | 696 |
| 679 EXPECT_EQ(2u, resource_provider_->num_resources()); | 697 EXPECT_EQ(2u, resource_provider_->num_resources()); |
| 680 resource_provider_->DestroyChild(child_id); | 698 resource_provider_->DestroyChild(child_id); |
| 681 EXPECT_EQ(0u, resource_provider_->num_resources()); | 699 EXPECT_EQ(0u, resource_provider_->num_resources()); |
| 700 |
| 701 ASSERT_EQ(2u, returned_to_child.size()); |
| 702 // TODO(danakj): Verify the resources are not marked as lost. |
| 703 EXPECT_NE(0u, returned_to_child[0].sync_point); |
| 704 EXPECT_NE(0u, returned_to_child[1].sync_point); |
| 682 } | 705 } |
| 683 | 706 |
| 707 TEST_P(ResourceProviderTest, DeleteExportedResources) { |
| 708 // Resource transfer is only supported with GL textures for now. |
| 709 if (GetParam() != ResourceProvider::GLTexture) |
| 710 return; |
| 711 |
| 712 scoped_ptr<ResourceProviderContext> child_context_owned( |
| 713 ResourceProviderContext::Create(shared_data_.get())); |
| 714 |
| 715 FakeOutputSurfaceClient child_output_surface_client; |
| 716 scoped_ptr<OutputSurface> child_output_surface(FakeOutputSurface::Create3d( |
| 717 child_context_owned.PassAs<TestWebGraphicsContext3D>())); |
| 718 CHECK(child_output_surface->BindToClient(&child_output_surface_client)); |
| 719 |
| 720 scoped_ptr<ResourceProvider> child_resource_provider( |
| 721 ResourceProvider::Create(child_output_surface.get(), 0, false)); |
| 722 |
| 723 gfx::Size size(1, 1); |
| 724 ResourceFormat format = RGBA_8888; |
| 725 size_t pixel_size = TextureSize(size, format); |
| 726 ASSERT_EQ(4U, pixel_size); |
| 727 |
| 728 ResourceProvider::ResourceId id1 = child_resource_provider->CreateResource( |
| 729 size, GL_CLAMP_TO_EDGE, ResourceProvider::TextureUsageAny, format); |
| 730 uint8_t data1[4] = {1, 2, 3, 4}; |
| 731 gfx::Rect rect(size); |
| 732 child_resource_provider->SetPixels(id1, data1, rect, rect, gfx::Vector2d()); |
| 733 |
| 734 ResourceProvider::ResourceId id2 = child_resource_provider->CreateResource( |
| 735 size, GL_CLAMP_TO_EDGE, ResourceProvider::TextureUsageAny, format); |
| 736 uint8_t data2[4] = {5, 5, 5, 5}; |
| 737 child_resource_provider->SetPixels(id2, data2, rect, rect, gfx::Vector2d()); |
| 738 |
| 739 ReturnedResourceArray returned_to_child; |
| 740 int child_id = |
| 741 resource_provider_->CreateChild(GetReturnCallback(&returned_to_child)); |
| 742 { |
| 743 // Transfer some resources to the parent. |
| 744 ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
| 745 resource_ids_to_transfer.push_back(id1); |
| 746 resource_ids_to_transfer.push_back(id2); |
| 747 TransferableResourceArray list; |
| 748 child_resource_provider->PrepareSendToParent(resource_ids_to_transfer, |
| 749 &list); |
| 750 ASSERT_EQ(2u, list.size()); |
| 751 EXPECT_NE(0u, list[0].sync_point); |
| 752 EXPECT_NE(0u, list[1].sync_point); |
| 753 EXPECT_TRUE(child_resource_provider->InUseByConsumer(id1)); |
| 754 EXPECT_TRUE(child_resource_provider->InUseByConsumer(id2)); |
| 755 resource_provider_->ReceiveFromChild(child_id, list); |
| 756 resource_provider_->DeclareUsedResourcesFromChild(child_id, |
| 757 resource_ids_to_transfer); |
| 758 } |
| 759 |
| 760 EXPECT_EQ(2u, resource_provider_->num_resources()); |
| 761 ResourceProvider::ResourceIdMap resource_map = |
| 762 resource_provider_->GetChildToParentMap(child_id); |
| 763 ResourceProvider::ResourceId mapped_id1 = resource_map[id1]; |
| 764 ResourceProvider::ResourceId mapped_id2 = resource_map[id2]; |
| 765 EXPECT_NE(0u, mapped_id1); |
| 766 EXPECT_NE(0u, mapped_id2); |
| 767 EXPECT_FALSE(resource_provider_->InUseByConsumer(id1)); |
| 768 EXPECT_FALSE(resource_provider_->InUseByConsumer(id2)); |
| 769 |
| 770 { |
| 771 // The parent transfers the resources to the grandparent. |
| 772 ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
| 773 resource_ids_to_transfer.push_back(mapped_id1); |
| 774 resource_ids_to_transfer.push_back(mapped_id2); |
| 775 TransferableResourceArray list; |
| 776 resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); |
| 777 |
| 778 ASSERT_EQ(2u, list.size()); |
| 779 EXPECT_NE(0u, list[0].sync_point); |
| 780 EXPECT_NE(0u, list[1].sync_point); |
| 781 EXPECT_TRUE(resource_provider_->InUseByConsumer(id1)); |
| 782 EXPECT_TRUE(resource_provider_->InUseByConsumer(id2)); |
| 783 |
| 784 // Release the resource in the parent. Set no resources as being in use. The |
| 785 // resources are exported so that can't be transferred back yet. |
| 786 ResourceProvider::ResourceIdArray no_resources; |
| 787 resource_provider_->DeclareUsedResourcesFromChild(child_id, no_resources); |
| 788 |
| 789 EXPECT_EQ(0u, returned_to_child.size()); |
| 790 EXPECT_EQ(2u, resource_provider_->num_resources()); |
| 791 |
| 792 // Return the resources from the grandparent to the parent. They should be |
| 793 // returned to the child then. |
| 794 EXPECT_EQ(2u, list.size()); |
| 795 EXPECT_EQ(mapped_id1, list[0].id); |
| 796 EXPECT_EQ(mapped_id2, list[1].id); |
| 797 ReturnedResourceArray returned; |
| 798 TransferableResource::ReturnResources(list, &returned); |
| 799 resource_provider_->ReceiveReturnsFromParent(returned); |
| 800 |
| 801 EXPECT_EQ(0u, resource_provider_->num_resources()); |
| 802 ASSERT_EQ(2u, returned_to_child.size()); |
| 803 // TODO(danakj): Verify the resources are not marked as lost. |
| 804 EXPECT_NE(0u, returned_to_child[0].sync_point); |
| 805 EXPECT_NE(0u, returned_to_child[1].sync_point); |
| 806 } |
| 807 } |
| 808 |
| 809 TEST_P(ResourceProviderTest, DestroyChildWithExportedResources) { |
| 810 // Resource transfer is only supported with GL textures for now. |
| 811 if (GetParam() != ResourceProvider::GLTexture) |
| 812 return; |
| 813 |
| 814 scoped_ptr<ResourceProviderContext> child_context_owned( |
| 815 ResourceProviderContext::Create(shared_data_.get())); |
| 816 |
| 817 FakeOutputSurfaceClient child_output_surface_client; |
| 818 scoped_ptr<OutputSurface> child_output_surface(FakeOutputSurface::Create3d( |
| 819 child_context_owned.PassAs<TestWebGraphicsContext3D>())); |
| 820 CHECK(child_output_surface->BindToClient(&child_output_surface_client)); |
| 821 |
| 822 scoped_ptr<ResourceProvider> child_resource_provider( |
| 823 ResourceProvider::Create(child_output_surface.get(), 0, false)); |
| 824 |
| 825 gfx::Size size(1, 1); |
| 826 ResourceFormat format = RGBA_8888; |
| 827 size_t pixel_size = TextureSize(size, format); |
| 828 ASSERT_EQ(4U, pixel_size); |
| 829 |
| 830 ResourceProvider::ResourceId id1 = child_resource_provider->CreateResource( |
| 831 size, GL_CLAMP_TO_EDGE, ResourceProvider::TextureUsageAny, format); |
| 832 uint8_t data1[4] = {1, 2, 3, 4}; |
| 833 gfx::Rect rect(size); |
| 834 child_resource_provider->SetPixels(id1, data1, rect, rect, gfx::Vector2d()); |
| 835 |
| 836 ResourceProvider::ResourceId id2 = child_resource_provider->CreateResource( |
| 837 size, GL_CLAMP_TO_EDGE, ResourceProvider::TextureUsageAny, format); |
| 838 uint8_t data2[4] = {5, 5, 5, 5}; |
| 839 child_resource_provider->SetPixels(id2, data2, rect, rect, gfx::Vector2d()); |
| 840 |
| 841 ReturnedResourceArray returned_to_child; |
| 842 int child_id = |
| 843 resource_provider_->CreateChild(GetReturnCallback(&returned_to_child)); |
| 844 { |
| 845 // Transfer some resources to the parent. |
| 846 ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
| 847 resource_ids_to_transfer.push_back(id1); |
| 848 resource_ids_to_transfer.push_back(id2); |
| 849 TransferableResourceArray list; |
| 850 child_resource_provider->PrepareSendToParent(resource_ids_to_transfer, |
| 851 &list); |
| 852 ASSERT_EQ(2u, list.size()); |
| 853 EXPECT_NE(0u, list[0].sync_point); |
| 854 EXPECT_NE(0u, list[1].sync_point); |
| 855 EXPECT_TRUE(child_resource_provider->InUseByConsumer(id1)); |
| 856 EXPECT_TRUE(child_resource_provider->InUseByConsumer(id2)); |
| 857 resource_provider_->ReceiveFromChild(child_id, list); |
| 858 resource_provider_->DeclareUsedResourcesFromChild(child_id, |
| 859 resource_ids_to_transfer); |
| 860 } |
| 861 |
| 862 EXPECT_EQ(2u, resource_provider_->num_resources()); |
| 863 ResourceProvider::ResourceIdMap resource_map = |
| 864 resource_provider_->GetChildToParentMap(child_id); |
| 865 ResourceProvider::ResourceId mapped_id1 = resource_map[id1]; |
| 866 ResourceProvider::ResourceId mapped_id2 = resource_map[id2]; |
| 867 EXPECT_NE(0u, mapped_id1); |
| 868 EXPECT_NE(0u, mapped_id2); |
| 869 EXPECT_FALSE(resource_provider_->InUseByConsumer(id1)); |
| 870 EXPECT_FALSE(resource_provider_->InUseByConsumer(id2)); |
| 871 |
| 872 { |
| 873 // The parent transfers the resources to the grandparent. |
| 874 ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
| 875 resource_ids_to_transfer.push_back(mapped_id1); |
| 876 resource_ids_to_transfer.push_back(mapped_id2); |
| 877 TransferableResourceArray list; |
| 878 resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); |
| 879 |
| 880 ASSERT_EQ(2u, list.size()); |
| 881 EXPECT_NE(0u, list[0].sync_point); |
| 882 EXPECT_NE(0u, list[1].sync_point); |
| 883 EXPECT_TRUE(resource_provider_->InUseByConsumer(id1)); |
| 884 EXPECT_TRUE(resource_provider_->InUseByConsumer(id2)); |
| 885 |
| 886 // Release the resource in the parent. Set no resources as being in use. The |
| 887 // resources are exported so that can't be transferred back yet. |
| 888 ResourceProvider::ResourceIdArray no_resources; |
| 889 resource_provider_->DeclareUsedResourcesFromChild(child_id, no_resources); |
| 890 |
| 891 // Destroy the child, the resources should be returned immediately from the |
| 892 // parent and marked as lost. |
| 893 EXPECT_EQ(0u, returned_to_child.size()); |
| 894 EXPECT_EQ(2u, resource_provider_->num_resources()); |
| 895 |
| 896 resource_provider_->DestroyChild(child_id); |
| 897 |
| 898 EXPECT_EQ(0u, resource_provider_->num_resources()); |
| 899 ASSERT_EQ(2u, returned_to_child.size()); |
| 900 // TODO(danakj): Verify the resources are marked as lost. |
| 901 EXPECT_NE(0u, returned_to_child[0].sync_point); |
| 902 EXPECT_NE(0u, returned_to_child[1].sync_point); |
| 903 returned_to_child.clear(); |
| 904 |
| 905 // Return the resources from the grandparent to the parent. They should be |
| 906 // dropped on the floor since they were already returned to the child. |
| 907 EXPECT_EQ(2u, list.size()); |
| 908 EXPECT_EQ(mapped_id1, list[0].id); |
| 909 EXPECT_EQ(mapped_id2, list[1].id); |
| 910 ReturnedResourceArray returned; |
| 911 TransferableResource::ReturnResources(list, &returned); |
| 912 resource_provider_->ReceiveReturnsFromParent(returned); |
| 913 |
| 914 EXPECT_EQ(0u, returned_to_child.size()); |
| 915 } |
| 916 } |
| 917 |
| 684 TEST_P(ResourceProviderTest, DeleteTransferredResources) { | 918 TEST_P(ResourceProviderTest, DeleteTransferredResources) { |
| 685 // Resource transfer is only supported with GL textures for now. | 919 // Resource transfer is only supported with GL textures for now. |
| 686 if (GetParam() != ResourceProvider::GLTexture) | 920 if (GetParam() != ResourceProvider::GLTexture) |
| 687 return; | 921 return; |
| 688 | 922 |
| 689 scoped_ptr<ResourceProviderContext> child_context_owned( | 923 scoped_ptr<ResourceProviderContext> child_context_owned( |
| 690 ResourceProviderContext::Create(shared_data_.get())); | 924 ResourceProviderContext::Create(shared_data_.get())); |
| 691 | 925 |
| 692 FakeOutputSurfaceClient child_output_surface_client; | 926 FakeOutputSurfaceClient child_output_surface_client; |
| 693 scoped_ptr<OutputSurface> child_output_surface( | 927 scoped_ptr<OutputSurface> child_output_surface( |
| 694 FakeOutputSurface::Create3d( | 928 FakeOutputSurface::Create3d( |
| 695 child_context_owned.PassAs<TestWebGraphicsContext3D>())); | 929 child_context_owned.PassAs<TestWebGraphicsContext3D>())); |
| 696 CHECK(child_output_surface->BindToClient(&child_output_surface_client)); | 930 CHECK(child_output_surface->BindToClient(&child_output_surface_client)); |
| 697 | 931 |
| 698 scoped_ptr<ResourceProvider> child_resource_provider( | 932 scoped_ptr<ResourceProvider> child_resource_provider( |
| 699 ResourceProvider::Create(child_output_surface.get(), 0, false)); | 933 ResourceProvider::Create(child_output_surface.get(), 0, false)); |
| 700 | 934 |
| 701 gfx::Size size(1, 1); | 935 gfx::Size size(1, 1); |
| 702 ResourceFormat format = RGBA_8888; | 936 ResourceFormat format = RGBA_8888; |
| 703 size_t pixel_size = TextureSize(size, format); | 937 size_t pixel_size = TextureSize(size, format); |
| 704 ASSERT_EQ(4U, pixel_size); | 938 ASSERT_EQ(4U, pixel_size); |
| 705 | 939 |
| 706 ResourceProvider::ResourceId id = child_resource_provider->CreateResource( | 940 ResourceProvider::ResourceId id = child_resource_provider->CreateResource( |
| 707 size, GL_CLAMP_TO_EDGE, ResourceProvider::TextureUsageAny, format); | 941 size, GL_CLAMP_TO_EDGE, ResourceProvider::TextureUsageAny, format); |
| 708 uint8_t data[4] = { 1, 2, 3, 4 }; | 942 uint8_t data[4] = { 1, 2, 3, 4 }; |
| 709 gfx::Rect rect(size); | 943 gfx::Rect rect(size); |
| 710 child_resource_provider->SetPixels(id, data, rect, rect, gfx::Vector2d()); | 944 child_resource_provider->SetPixels(id, data, rect, rect, gfx::Vector2d()); |
| 711 | 945 |
| 712 int child_id = resource_provider_->CreateChild(); | 946 ReturnedResourceArray returned_to_child; |
| 947 int child_id = |
| 948 resource_provider_->CreateChild(GetReturnCallback(&returned_to_child)); |
| 713 { | 949 { |
| 714 // Transfer some resource to the parent. | 950 // Transfer some resource to the parent. |
| 715 ResourceProvider::ResourceIdArray resource_ids_to_transfer; | 951 ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
| 716 resource_ids_to_transfer.push_back(id); | 952 resource_ids_to_transfer.push_back(id); |
| 717 TransferableResourceArray list; | 953 TransferableResourceArray list; |
| 718 child_resource_provider->PrepareSendToParent(resource_ids_to_transfer, | 954 child_resource_provider->PrepareSendToParent(resource_ids_to_transfer, |
| 719 &list); | 955 &list); |
| 720 ASSERT_EQ(1u, list.size()); | 956 ASSERT_EQ(1u, list.size()); |
| 721 EXPECT_NE(0u, list[0].sync_point); | 957 EXPECT_NE(0u, list[0].sync_point); |
| 722 EXPECT_TRUE(child_resource_provider->InUseByConsumer(id)); | 958 EXPECT_TRUE(child_resource_provider->InUseByConsumer(id)); |
| 723 resource_provider_->ReceiveFromChild(child_id, list); | 959 resource_provider_->ReceiveFromChild(child_id, list); |
| 960 resource_provider_->DeclareUsedResourcesFromChild(child_id, |
| 961 resource_ids_to_transfer); |
| 724 } | 962 } |
| 725 | 963 |
| 726 // Delete textures in the child, while they are transfered. | 964 // Delete textures in the child, while they are transfered. |
| 727 child_resource_provider->DeleteResource(id); | 965 child_resource_provider->DeleteResource(id); |
| 728 EXPECT_EQ(1u, child_resource_provider->num_resources()); | 966 EXPECT_EQ(1u, child_resource_provider->num_resources()); |
| 729 { | 967 { |
| 730 // Transfer resources back from the parent to the child. | 968 EXPECT_EQ(0u, returned_to_child.size()); |
| 731 ResourceProvider::ResourceIdMap resource_map = | 969 |
| 732 resource_provider_->GetChildToParentMap(child_id); | 970 // Transfer resources back from the parent to the child. Set no resources as |
| 733 ResourceProvider::ResourceId mapped_id = resource_map[id]; | 971 // being in use. |
| 734 EXPECT_NE(0u, mapped_id); | 972 ResourceProvider::ResourceIdArray no_resources; |
| 735 ResourceProvider::ResourceIdArray resource_ids_to_transfer; | 973 resource_provider_->DeclareUsedResourcesFromChild(child_id, no_resources); |
| 736 resource_ids_to_transfer.push_back(mapped_id); | 974 |
| 737 ReturnedResourceArray list; | 975 ASSERT_EQ(1u, returned_to_child.size()); |
| 738 resource_provider_->PrepareSendReturnsToChild( | 976 EXPECT_NE(0u, returned_to_child[0].sync_point); |
| 739 child_id, resource_ids_to_transfer, &list); | 977 child_resource_provider->ReceiveReturnsFromParent(returned_to_child); |
| 740 ASSERT_EQ(1u, list.size()); | |
| 741 EXPECT_NE(0u, list[0].sync_point); | |
| 742 child_resource_provider->ReceiveReturnsFromParent(list); | |
| 743 } | 978 } |
| 744 EXPECT_EQ(0u, child_resource_provider->num_resources()); | 979 EXPECT_EQ(0u, child_resource_provider->num_resources()); |
| 745 } | 980 } |
| 746 | 981 |
| 747 class ResourceProviderTestTextureFilters : public ResourceProviderTest { | 982 class ResourceProviderTestTextureFilters : public ResourceProviderTest { |
| 748 public: | 983 public: |
| 749 static void RunTest(GLenum child_filter, GLenum parent_filter) { | 984 static void RunTest(GLenum child_filter, GLenum parent_filter) { |
| 750 scoped_ptr<TextureStateTrackingContext> child_context_owned( | 985 scoped_ptr<TextureStateTrackingContext> child_context_owned( |
| 751 new TextureStateTrackingContext); | 986 new TextureStateTrackingContext); |
| 752 TextureStateTrackingContext* child_context = child_context_owned.get(); | 987 TextureStateTrackingContext* child_context = child_context_owned.get(); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 814 EXPECT_CALL( | 1049 EXPECT_CALL( |
| 815 *child_context, | 1050 *child_context, |
| 816 texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, child_filter)); | 1051 texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, child_filter)); |
| 817 EXPECT_CALL( | 1052 EXPECT_CALL( |
| 818 *child_context, | 1053 *child_context, |
| 819 texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, child_filter)); | 1054 texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, child_filter)); |
| 820 } | 1055 } |
| 821 SetResourceFilter(child_resource_provider.get(), id, child_filter); | 1056 SetResourceFilter(child_resource_provider.get(), id, child_filter); |
| 822 Mock::VerifyAndClearExpectations(child_context); | 1057 Mock::VerifyAndClearExpectations(child_context); |
| 823 | 1058 |
| 824 int child_id = parent_resource_provider->CreateChild(); | 1059 ReturnedResourceArray returned_to_child; |
| 1060 int child_id = parent_resource_provider->CreateChild( |
| 1061 GetReturnCallback(&returned_to_child)); |
| 825 { | 1062 { |
| 826 // Transfer some resource to the parent. | 1063 // Transfer some resource to the parent. |
| 827 ResourceProvider::ResourceIdArray resource_ids_to_transfer; | 1064 ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
| 828 resource_ids_to_transfer.push_back(id); | 1065 resource_ids_to_transfer.push_back(id); |
| 829 TransferableResourceArray list; | 1066 TransferableResourceArray list; |
| 830 | 1067 |
| 831 EXPECT_CALL(*child_context, bindTexture(GL_TEXTURE_2D, texture_id)); | 1068 EXPECT_CALL(*child_context, bindTexture(GL_TEXTURE_2D, texture_id)); |
| 832 EXPECT_CALL(*child_context, | 1069 EXPECT_CALL(*child_context, |
| 833 produceTextureCHROMIUM(GL_TEXTURE_2D, _)); | 1070 produceTextureCHROMIUM(GL_TEXTURE_2D, _)); |
| 834 EXPECT_CALL(*child_context, insertSyncPoint()); | 1071 EXPECT_CALL(*child_context, insertSyncPoint()); |
| 835 child_resource_provider->PrepareSendToParent(resource_ids_to_transfer, | 1072 child_resource_provider->PrepareSendToParent(resource_ids_to_transfer, |
| 836 &list); | 1073 &list); |
| 837 Mock::VerifyAndClearExpectations(child_context); | 1074 Mock::VerifyAndClearExpectations(child_context); |
| 838 | 1075 |
| 839 ASSERT_EQ(1u, list.size()); | 1076 ASSERT_EQ(1u, list.size()); |
| 840 EXPECT_EQ(static_cast<unsigned>(child_filter), list[0].filter); | 1077 EXPECT_EQ(static_cast<unsigned>(child_filter), list[0].filter); |
| 841 | 1078 |
| 842 EXPECT_CALL(*parent_context, bindTexture(GL_TEXTURE_2D, texture_id)); | 1079 EXPECT_CALL(*parent_context, bindTexture(GL_TEXTURE_2D, texture_id)); |
| 843 EXPECT_CALL(*parent_context, | 1080 EXPECT_CALL(*parent_context, |
| 844 consumeTextureCHROMIUM(GL_TEXTURE_2D, _)); | 1081 consumeTextureCHROMIUM(GL_TEXTURE_2D, _)); |
| 845 parent_resource_provider->ReceiveFromChild(child_id, list); | 1082 parent_resource_provider->ReceiveFromChild(child_id, list); |
| 846 Mock::VerifyAndClearExpectations(parent_context); | 1083 Mock::VerifyAndClearExpectations(parent_context); |
| 1084 |
| 1085 parent_resource_provider->DeclareUsedResourcesFromChild( |
| 1086 child_id, resource_ids_to_transfer); |
| 1087 Mock::VerifyAndClearExpectations(parent_context); |
| 847 } | 1088 } |
| 848 ResourceProvider::ResourceIdMap resource_map = | 1089 ResourceProvider::ResourceIdMap resource_map = |
| 849 parent_resource_provider->GetChildToParentMap(child_id); | 1090 parent_resource_provider->GetChildToParentMap(child_id); |
| 850 ResourceProvider::ResourceId mapped_id = resource_map[id]; | 1091 ResourceProvider::ResourceId mapped_id = resource_map[id]; |
| 851 EXPECT_NE(0u, mapped_id); | 1092 EXPECT_NE(0u, mapped_id); |
| 852 | 1093 |
| 853 // The texture is set to |parent_filter| in the parent. | 1094 // The texture is set to |parent_filter| in the parent. |
| 854 EXPECT_CALL(*parent_context, bindTexture(GL_TEXTURE_2D, texture_id)); | 1095 EXPECT_CALL(*parent_context, bindTexture(GL_TEXTURE_2D, texture_id)); |
| 855 EXPECT_CALL( | 1096 EXPECT_CALL( |
| 856 *parent_context, | 1097 *parent_context, |
| 857 texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, parent_filter)); | 1098 texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, parent_filter)); |
| 858 EXPECT_CALL( | 1099 EXPECT_CALL( |
| 859 *parent_context, | 1100 *parent_context, |
| 860 texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, parent_filter)); | 1101 texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, parent_filter)); |
| 861 SetResourceFilter(parent_resource_provider.get(), mapped_id, parent_filter); | 1102 SetResourceFilter(parent_resource_provider.get(), mapped_id, parent_filter); |
| 862 Mock::VerifyAndClearExpectations(parent_context); | 1103 Mock::VerifyAndClearExpectations(parent_context); |
| 863 | 1104 |
| 864 // The texture should be reset to |child_filter| in the parent when it is | 1105 // The texture should be reset to |child_filter| in the parent when it is |
| 865 // returned, since that is how it was received. | 1106 // returned, since that is how it was received. |
| 866 EXPECT_CALL(*parent_context, bindTexture(GL_TEXTURE_2D, texture_id)); | 1107 EXPECT_CALL(*parent_context, bindTexture(GL_TEXTURE_2D, texture_id)); |
| 867 EXPECT_CALL( | 1108 EXPECT_CALL( |
| 868 *parent_context, | 1109 *parent_context, |
| 869 texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, child_filter)); | 1110 texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, child_filter)); |
| 870 EXPECT_CALL( | 1111 EXPECT_CALL( |
| 871 *parent_context, | 1112 *parent_context, |
| 872 texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, child_filter)); | 1113 texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, child_filter)); |
| 873 | 1114 |
| 874 { | 1115 { |
| 875 // Transfer resources back from the parent to the child. | 1116 EXPECT_EQ(0u, returned_to_child.size()); |
| 876 ResourceProvider::ResourceIdArray resource_ids_to_transfer; | |
| 877 resource_ids_to_transfer.push_back(mapped_id); | |
| 878 ReturnedResourceArray list; | |
| 879 | 1117 |
| 1118 // Transfer resources back from the parent to the child. Set no resources |
| 1119 // as being in use. |
| 1120 ResourceProvider::ResourceIdArray no_resources; |
| 880 EXPECT_CALL(*parent_context, insertSyncPoint()); | 1121 EXPECT_CALL(*parent_context, insertSyncPoint()); |
| 1122 parent_resource_provider->DeclareUsedResourcesFromChild(child_id, |
| 1123 no_resources); |
| 1124 Mock::VerifyAndClearExpectations(parent_context); |
| 881 | 1125 |
| 882 parent_resource_provider->PrepareSendReturnsToChild( | 1126 ASSERT_EQ(1u, returned_to_child.size()); |
| 883 child_id, resource_ids_to_transfer, &list); | 1127 child_resource_provider->ReceiveReturnsFromParent(returned_to_child); |
| 884 ASSERT_EQ(1u, list.size()); | |
| 885 child_resource_provider->ReceiveReturnsFromParent(list); | |
| 886 } | 1128 } |
| 887 Mock::VerifyAndClearExpectations(parent_context); | |
| 888 | 1129 |
| 889 // The child remembers the texture filter is set to |child_filter|. | 1130 // The child remembers the texture filter is set to |child_filter|. |
| 890 EXPECT_CALL(*child_context, bindTexture(GL_TEXTURE_2D, texture_id)); | 1131 EXPECT_CALL(*child_context, bindTexture(GL_TEXTURE_2D, texture_id)); |
| 891 SetResourceFilter(child_resource_provider.get(), id, child_filter); | 1132 SetResourceFilter(child_resource_provider.get(), id, child_filter); |
| 892 Mock::VerifyAndClearExpectations(child_context); | 1133 Mock::VerifyAndClearExpectations(child_context); |
| 893 } | 1134 } |
| 894 }; | 1135 }; |
| 895 | 1136 |
| 896 TEST_P(ResourceProviderTest, TextureFilters_ChildNearestParentLinear) { | 1137 TEST_P(ResourceProviderTest, TextureFilters_ChildNearestParentLinear) { |
| 897 if (GetParam() != ResourceProvider::GLTexture) | 1138 if (GetParam() != ResourceProvider::GLTexture) |
| (...skipping 1063 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1961 output_surface.get()); | 2202 output_surface.get()); |
| 1962 } | 2203 } |
| 1963 | 2204 |
| 1964 INSTANTIATE_TEST_CASE_P( | 2205 INSTANTIATE_TEST_CASE_P( |
| 1965 ResourceProviderTests, | 2206 ResourceProviderTests, |
| 1966 ResourceProviderTest, | 2207 ResourceProviderTest, |
| 1967 ::testing::Values(ResourceProvider::GLTexture, ResourceProvider::Bitmap)); | 2208 ::testing::Values(ResourceProvider::GLTexture, ResourceProvider::Bitmap)); |
| 1968 | 2209 |
| 1969 } // namespace | 2210 } // namespace |
| 1970 } // namespace cc | 2211 } // namespace cc |
| OLD | NEW |