| 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 #include <map> | 8 #include <map> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 629 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 size, GL_CLAMP_TO_EDGE, ResourceProvider::TextureUsageAny, format); | 640 size, GL_CLAMP_TO_EDGE, ResourceProvider::TextureUsageAny, format); |
| 641 uint8_t data1[4] = { 1, 2, 3, 4 }; | 641 uint8_t data1[4] = { 1, 2, 3, 4 }; |
| 642 gfx::Rect rect(size); | 642 gfx::Rect rect(size); |
| 643 child_resource_provider_->SetPixels(id1, data1, rect, rect, gfx::Vector2d()); | 643 child_resource_provider_->SetPixels(id1, data1, rect, rect, gfx::Vector2d()); |
| 644 | 644 |
| 645 ResourceProvider::ResourceId id2 = child_resource_provider_->CreateResource( | 645 ResourceProvider::ResourceId id2 = child_resource_provider_->CreateResource( |
| 646 size, GL_CLAMP_TO_EDGE, ResourceProvider::TextureUsageAny, format); | 646 size, GL_CLAMP_TO_EDGE, ResourceProvider::TextureUsageAny, format); |
| 647 uint8_t data2[4] = { 5, 5, 5, 5 }; | 647 uint8_t data2[4] = { 5, 5, 5, 5 }; |
| 648 child_resource_provider_->SetPixels(id2, data2, rect, rect, gfx::Vector2d()); | 648 child_resource_provider_->SetPixels(id2, data2, rect, rect, gfx::Vector2d()); |
| 649 | 649 |
| 650 ResourceProvider::ResourceId id3 = child_resource_provider_->CreateResource( |
| 651 size, GL_CLAMP_TO_EDGE, ResourceProvider::TextureUsageAny, format); |
| 652 child_resource_provider_->AcquireImage(id3); |
| 653 child_resource_provider_->MapImage(id3); |
| 654 child_resource_provider_->UnmapImage(id3); |
| 655 |
| 650 GLuint external_texture_id = child_context_->createExternalTexture(); | 656 GLuint external_texture_id = child_context_->createExternalTexture(); |
| 651 child_context_->bindTexture(GL_TEXTURE_EXTERNAL_OES, external_texture_id); | 657 child_context_->bindTexture(GL_TEXTURE_EXTERNAL_OES, external_texture_id); |
| 652 | 658 |
| 653 gpu::Mailbox external_mailbox; | 659 gpu::Mailbox external_mailbox; |
| 654 child_context_->genMailboxCHROMIUM(external_mailbox.name); | 660 child_context_->genMailboxCHROMIUM(external_mailbox.name); |
| 655 child_context_->produceTextureCHROMIUM(GL_TEXTURE_EXTERNAL_OES, | 661 child_context_->produceTextureCHROMIUM(GL_TEXTURE_EXTERNAL_OES, |
| 656 external_mailbox.name); | 662 external_mailbox.name); |
| 657 const unsigned external_sync_point = child_context_->insertSyncPoint(); | 663 const unsigned external_sync_point = child_context_->insertSyncPoint(); |
| 658 ResourceProvider::ResourceId id3 = | 664 ResourceProvider::ResourceId id4 = |
| 659 child_resource_provider_->CreateResourceFromTextureMailbox( | 665 child_resource_provider_->CreateResourceFromTextureMailbox( |
| 660 TextureMailbox( | 666 TextureMailbox( |
| 661 external_mailbox, GL_TEXTURE_EXTERNAL_OES, external_sync_point), | 667 external_mailbox, GL_TEXTURE_EXTERNAL_OES, external_sync_point), |
| 662 SingleReleaseCallback::Create(base::Bind(&EmptyReleaseCallback))); | 668 SingleReleaseCallback::Create(base::Bind(&EmptyReleaseCallback))); |
| 663 | 669 |
| 664 ReturnedResourceArray returned_to_child; | 670 ReturnedResourceArray returned_to_child; |
| 665 int child_id = | 671 int child_id = |
| 666 resource_provider_->CreateChild(GetReturnCallback(&returned_to_child)); | 672 resource_provider_->CreateChild(GetReturnCallback(&returned_to_child)); |
| 667 { | 673 { |
| 668 // Transfer some resources to the parent. | 674 // Transfer some resources to the parent. |
| 669 ResourceProvider::ResourceIdArray resource_ids_to_transfer; | 675 ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
| 670 resource_ids_to_transfer.push_back(id1); | 676 resource_ids_to_transfer.push_back(id1); |
| 671 resource_ids_to_transfer.push_back(id2); | 677 resource_ids_to_transfer.push_back(id2); |
| 672 resource_ids_to_transfer.push_back(id3); | 678 resource_ids_to_transfer.push_back(id3); |
| 679 resource_ids_to_transfer.push_back(id4); |
| 673 TransferableResourceArray list; | 680 TransferableResourceArray list; |
| 674 child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, | 681 child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
| 675 &list); | 682 &list); |
| 676 ASSERT_EQ(3u, list.size()); | 683 ASSERT_EQ(4u, list.size()); |
| 677 EXPECT_NE(0u, list[0].sync_point); | 684 EXPECT_NE(0u, list[0].sync_point); |
| 678 EXPECT_NE(0u, list[1].sync_point); | 685 EXPECT_NE(0u, list[1].sync_point); |
| 679 EXPECT_EQ(external_sync_point, list[2].sync_point); | 686 EXPECT_NE(0u, list[2].sync_point); |
| 687 EXPECT_EQ(external_sync_point, list[3].sync_point); |
| 680 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[0].target); | 688 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[0].target); |
| 681 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[1].target); | 689 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[1].target); |
| 682 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), list[2].target); | 690 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[2].target); |
| 691 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), list[3].target); |
| 683 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); | 692 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
| 684 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); | 693 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); |
| 685 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); | 694 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); |
| 695 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id4)); |
| 686 resource_provider_->ReceiveFromChild(child_id, list); | 696 resource_provider_->ReceiveFromChild(child_id, list); |
| 687 resource_provider_->DeclareUsedResourcesFromChild(child_id, | 697 resource_provider_->DeclareUsedResourcesFromChild(child_id, |
| 688 resource_ids_to_transfer); | 698 resource_ids_to_transfer); |
| 689 } | 699 } |
| 690 | 700 |
| 691 EXPECT_EQ(3u, resource_provider_->num_resources()); | 701 EXPECT_EQ(4u, resource_provider_->num_resources()); |
| 692 ResourceProvider::ResourceIdMap resource_map = | 702 ResourceProvider::ResourceIdMap resource_map = |
| 693 resource_provider_->GetChildToParentMap(child_id); | 703 resource_provider_->GetChildToParentMap(child_id); |
| 694 ResourceProvider::ResourceId mapped_id1 = resource_map[id1]; | 704 ResourceProvider::ResourceId mapped_id1 = resource_map[id1]; |
| 695 ResourceProvider::ResourceId mapped_id2 = resource_map[id2]; | 705 ResourceProvider::ResourceId mapped_id2 = resource_map[id2]; |
| 696 ResourceProvider::ResourceId mapped_id3 = resource_map[id3]; | 706 ResourceProvider::ResourceId mapped_id3 = resource_map[id3]; |
| 707 ResourceProvider::ResourceId mapped_id4 = resource_map[id4]; |
| 697 EXPECT_NE(0u, mapped_id1); | 708 EXPECT_NE(0u, mapped_id1); |
| 698 EXPECT_NE(0u, mapped_id2); | 709 EXPECT_NE(0u, mapped_id2); |
| 699 EXPECT_NE(0u, mapped_id3); | 710 EXPECT_NE(0u, mapped_id3); |
| 711 EXPECT_NE(0u, mapped_id4); |
| 700 EXPECT_FALSE(resource_provider_->InUseByConsumer(id1)); | 712 EXPECT_FALSE(resource_provider_->InUseByConsumer(id1)); |
| 701 EXPECT_FALSE(resource_provider_->InUseByConsumer(id2)); | 713 EXPECT_FALSE(resource_provider_->InUseByConsumer(id2)); |
| 702 EXPECT_FALSE(resource_provider_->InUseByConsumer(id3)); | 714 EXPECT_FALSE(resource_provider_->InUseByConsumer(id3)); |
| 715 EXPECT_FALSE(resource_provider_->InUseByConsumer(id4)); |
| 703 | 716 |
| 704 uint8_t result[4] = { 0 }; | 717 uint8_t result[4] = { 0 }; |
| 705 GetResourcePixels( | 718 GetResourcePixels( |
| 706 resource_provider_.get(), context(), mapped_id1, size, format, result); | 719 resource_provider_.get(), context(), mapped_id1, size, format, result); |
| 707 EXPECT_EQ(0, memcmp(data1, result, pixel_size)); | 720 EXPECT_EQ(0, memcmp(data1, result, pixel_size)); |
| 708 | 721 |
| 709 GetResourcePixels( | 722 GetResourcePixels( |
| 710 resource_provider_.get(), context(), mapped_id2, size, format, result); | 723 resource_provider_.get(), context(), mapped_id2, size, format, result); |
| 711 EXPECT_EQ(0, memcmp(data2, result, pixel_size)); | 724 EXPECT_EQ(0, memcmp(data2, result, pixel_size)); |
| 712 | 725 |
| 713 { | 726 { |
| 714 // Check that transfering again the same resource from the child to the | 727 // Check that transfering again the same resource from the child to the |
| 715 // parent works. | 728 // parent works. |
| 716 ResourceProvider::ResourceIdArray resource_ids_to_transfer; | 729 ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
| 717 resource_ids_to_transfer.push_back(id1); | 730 resource_ids_to_transfer.push_back(id1); |
| 731 resource_ids_to_transfer.push_back(id2); |
| 732 resource_ids_to_transfer.push_back(id3); |
| 718 TransferableResourceArray list; | 733 TransferableResourceArray list; |
| 719 child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, | 734 child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
| 720 &list); | 735 &list); |
| 721 EXPECT_EQ(1u, list.size()); | 736 EXPECT_EQ(3u, list.size()); |
| 722 EXPECT_EQ(id1, list[0].id); | 737 EXPECT_EQ(id1, list[0].id); |
| 738 EXPECT_EQ(id2, list[1].id); |
| 739 EXPECT_EQ(id3, list[2].id); |
| 723 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[0].target); | 740 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[0].target); |
| 741 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[1].target); |
| 742 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[2].target); |
| 724 ReturnedResourceArray returned; | 743 ReturnedResourceArray returned; |
| 725 TransferableResource::ReturnResources(list, &returned); | 744 TransferableResource::ReturnResources(list, &returned); |
| 726 child_resource_provider_->ReceiveReturnsFromParent(returned); | 745 child_resource_provider_->ReceiveReturnsFromParent(returned); |
| 727 // id1 was exported twice, we returned it only once, it should still be | 746 // ids were exported twice, we returned them only once, they should still |
| 728 // in-use. | 747 // be in-use. |
| 729 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); | 748 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
| 749 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); |
| 750 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); |
| 730 } | 751 } |
| 731 { | 752 { |
| 732 EXPECT_EQ(0u, returned_to_child.size()); | 753 EXPECT_EQ(0u, returned_to_child.size()); |
| 733 | 754 |
| 734 // Transfer resources back from the parent to the child. Set no resources as | 755 // Transfer resources back from the parent to the child. Set no resources as |
| 735 // being in use. | 756 // being in use. |
| 736 ResourceProvider::ResourceIdArray no_resources; | 757 ResourceProvider::ResourceIdArray no_resources; |
| 737 resource_provider_->DeclareUsedResourcesFromChild(child_id, no_resources); | 758 resource_provider_->DeclareUsedResourcesFromChild(child_id, no_resources); |
| 738 | 759 |
| 739 ASSERT_EQ(3u, returned_to_child.size()); | 760 ASSERT_EQ(4u, returned_to_child.size()); |
| 740 EXPECT_NE(0u, returned_to_child[0].sync_point); | 761 EXPECT_NE(0u, returned_to_child[0].sync_point); |
| 741 EXPECT_NE(0u, returned_to_child[1].sync_point); | 762 EXPECT_NE(0u, returned_to_child[1].sync_point); |
| 742 EXPECT_NE(0u, returned_to_child[2].sync_point); | 763 EXPECT_NE(0u, returned_to_child[2].sync_point); |
| 764 EXPECT_NE(0u, returned_to_child[3].sync_point); |
| 743 EXPECT_FALSE(returned_to_child[0].lost); | 765 EXPECT_FALSE(returned_to_child[0].lost); |
| 744 EXPECT_FALSE(returned_to_child[1].lost); | 766 EXPECT_FALSE(returned_to_child[1].lost); |
| 745 EXPECT_FALSE(returned_to_child[2].lost); | 767 EXPECT_FALSE(returned_to_child[2].lost); |
| 768 EXPECT_FALSE(returned_to_child[3].lost); |
| 746 child_resource_provider_->ReceiveReturnsFromParent(returned_to_child); | 769 child_resource_provider_->ReceiveReturnsFromParent(returned_to_child); |
| 747 returned_to_child.clear(); | 770 returned_to_child.clear(); |
| 748 } | 771 } |
| 749 EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id1)); | 772 EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id1)); |
| 750 EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id2)); | 773 EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id2)); |
| 751 EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id3)); | 774 EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id3)); |
| 775 EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id4)); |
| 752 | 776 |
| 753 { | 777 { |
| 754 ResourceProvider::ScopedReadLockGL lock(child_resource_provider_.get(), | 778 ResourceProvider::ScopedReadLockGL lock(child_resource_provider_.get(), |
| 755 id1); | 779 id1); |
| 756 ASSERT_NE(0U, lock.texture_id()); | 780 ASSERT_NE(0U, lock.texture_id()); |
| 757 child_context_->bindTexture(GL_TEXTURE_2D, lock.texture_id()); | 781 child_context_->bindTexture(GL_TEXTURE_2D, lock.texture_id()); |
| 758 child_context_->GetPixels(size, format, result); | 782 child_context_->GetPixels(size, format, result); |
| 759 EXPECT_EQ(0, memcmp(data1, result, pixel_size)); | 783 EXPECT_EQ(0, memcmp(data1, result, pixel_size)); |
| 760 } | 784 } |
| 761 { | 785 { |
| 762 ResourceProvider::ScopedReadLockGL lock(child_resource_provider_.get(), | 786 ResourceProvider::ScopedReadLockGL lock(child_resource_provider_.get(), |
| 763 id2); | 787 id2); |
| 764 ASSERT_NE(0U, lock.texture_id()); | 788 ASSERT_NE(0U, lock.texture_id()); |
| 765 child_context_->bindTexture(GL_TEXTURE_2D, lock.texture_id()); | 789 child_context_->bindTexture(GL_TEXTURE_2D, lock.texture_id()); |
| 766 child_context_->GetPixels(size, format, result); | 790 child_context_->GetPixels(size, format, result); |
| 767 EXPECT_EQ(0, memcmp(data2, result, pixel_size)); | 791 EXPECT_EQ(0, memcmp(data2, result, pixel_size)); |
| 768 } | 792 } |
| 769 { | 793 { |
| 794 ResourceProvider::ScopedReadLockGL lock(child_resource_provider_.get(), |
| 795 id3); |
| 796 ASSERT_NE(0U, lock.texture_id()); |
| 797 child_context_->bindTexture(GL_TEXTURE_2D, lock.texture_id()); |
| 798 } |
| 799 { |
| 770 // Transfer resources to the parent again. | 800 // Transfer resources to the parent again. |
| 771 ResourceProvider::ResourceIdArray resource_ids_to_transfer; | 801 ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
| 772 resource_ids_to_transfer.push_back(id1); | 802 resource_ids_to_transfer.push_back(id1); |
| 773 resource_ids_to_transfer.push_back(id2); | 803 resource_ids_to_transfer.push_back(id2); |
| 774 resource_ids_to_transfer.push_back(id3); | 804 resource_ids_to_transfer.push_back(id3); |
| 805 resource_ids_to_transfer.push_back(id4); |
| 775 TransferableResourceArray list; | 806 TransferableResourceArray list; |
| 776 child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, | 807 child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
| 777 &list); | 808 &list); |
| 778 ASSERT_EQ(3u, list.size()); | 809 ASSERT_EQ(4u, list.size()); |
| 779 EXPECT_EQ(id1, list[0].id); | 810 EXPECT_EQ(id1, list[0].id); |
| 780 EXPECT_EQ(id2, list[1].id); | 811 EXPECT_EQ(id2, list[1].id); |
| 781 EXPECT_EQ(id3, list[2].id); | 812 EXPECT_EQ(id3, list[2].id); |
| 813 EXPECT_EQ(id4, list[3].id); |
| 782 EXPECT_NE(0u, list[0].sync_point); | 814 EXPECT_NE(0u, list[0].sync_point); |
| 783 EXPECT_NE(0u, list[1].sync_point); | 815 EXPECT_NE(0u, list[1].sync_point); |
| 784 EXPECT_NE(0u, list[2].sync_point); | 816 EXPECT_NE(0u, list[2].sync_point); |
| 817 EXPECT_NE(0u, list[3].sync_point); |
| 785 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[0].target); | 818 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[0].target); |
| 786 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[1].target); | 819 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[1].target); |
| 787 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), list[2].target); | 820 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[2].target); |
| 821 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), list[3].target); |
| 788 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); | 822 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
| 789 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); | 823 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); |
| 790 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); | 824 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); |
| 825 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id4)); |
| 791 resource_provider_->ReceiveFromChild(child_id, list); | 826 resource_provider_->ReceiveFromChild(child_id, list); |
| 792 resource_provider_->DeclareUsedResourcesFromChild(child_id, | 827 resource_provider_->DeclareUsedResourcesFromChild(child_id, |
| 793 resource_ids_to_transfer); | 828 resource_ids_to_transfer); |
| 794 } | 829 } |
| 795 | 830 |
| 796 EXPECT_EQ(0u, returned_to_child.size()); | 831 EXPECT_EQ(0u, returned_to_child.size()); |
| 797 | 832 |
| 798 EXPECT_EQ(3u, resource_provider_->num_resources()); | 833 EXPECT_EQ(4u, resource_provider_->num_resources()); |
| 799 resource_provider_->DestroyChild(child_id); | 834 resource_provider_->DestroyChild(child_id); |
| 800 EXPECT_EQ(0u, resource_provider_->num_resources()); | 835 EXPECT_EQ(0u, resource_provider_->num_resources()); |
| 801 | 836 |
| 802 ASSERT_EQ(3u, returned_to_child.size()); | 837 ASSERT_EQ(4u, returned_to_child.size()); |
| 803 EXPECT_NE(0u, returned_to_child[0].sync_point); | 838 EXPECT_NE(0u, returned_to_child[0].sync_point); |
| 804 EXPECT_NE(0u, returned_to_child[1].sync_point); | 839 EXPECT_NE(0u, returned_to_child[1].sync_point); |
| 805 EXPECT_NE(0u, returned_to_child[2].sync_point); | 840 EXPECT_NE(0u, returned_to_child[2].sync_point); |
| 841 EXPECT_NE(0u, returned_to_child[3].sync_point); |
| 806 EXPECT_FALSE(returned_to_child[0].lost); | 842 EXPECT_FALSE(returned_to_child[0].lost); |
| 807 EXPECT_FALSE(returned_to_child[1].lost); | 843 EXPECT_FALSE(returned_to_child[1].lost); |
| 808 EXPECT_FALSE(returned_to_child[2].lost); | 844 EXPECT_FALSE(returned_to_child[2].lost); |
| 845 EXPECT_FALSE(returned_to_child[3].lost); |
| 809 } | 846 } |
| 810 | 847 |
| 811 TEST_P(ResourceProviderTest, TransferSoftwareResources) { | 848 TEST_P(ResourceProviderTest, TransferSoftwareResources) { |
| 812 if (GetParam() != ResourceProvider::Bitmap) | 849 if (GetParam() != ResourceProvider::Bitmap) |
| 813 return; | 850 return; |
| 814 | 851 |
| 815 gfx::Size size(1, 1); | 852 gfx::Size size(1, 1); |
| 816 ResourceFormat format = RGBA_8888; | 853 ResourceFormat format = RGBA_8888; |
| 817 size_t pixel_size = TextureSizeBytes(size, format); | 854 size_t pixel_size = TextureSizeBytes(size, format); |
| 818 ASSERT_EQ(4U, pixel_size); | 855 ASSERT_EQ(4U, pixel_size); |
| 819 | 856 |
| 820 ResourceProvider::ResourceId id1 = child_resource_provider_->CreateResource( | 857 ResourceProvider::ResourceId id1 = child_resource_provider_->CreateResource( |
| 821 size, GL_CLAMP_TO_EDGE, ResourceProvider::TextureUsageAny, format); | 858 size, GL_CLAMP_TO_EDGE, ResourceProvider::TextureUsageAny, format); |
| 822 uint8_t data1[4] = { 1, 2, 3, 4 }; | 859 uint8_t data1[4] = { 1, 2, 3, 4 }; |
| 823 gfx::Rect rect(size); | 860 gfx::Rect rect(size); |
| 824 child_resource_provider_->SetPixels(id1, data1, rect, rect, gfx::Vector2d()); | 861 child_resource_provider_->SetPixels(id1, data1, rect, rect, gfx::Vector2d()); |
| 825 | 862 |
| 826 ResourceProvider::ResourceId id2 = child_resource_provider_->CreateResource( | 863 ResourceProvider::ResourceId id2 = child_resource_provider_->CreateResource( |
| 827 size, GL_CLAMP_TO_EDGE, ResourceProvider::TextureUsageAny, format); | 864 size, GL_CLAMP_TO_EDGE, ResourceProvider::TextureUsageAny, format); |
| 828 uint8_t data2[4] = { 5, 5, 5, 5 }; | 865 uint8_t data2[4] = { 5, 5, 5, 5 }; |
| 829 child_resource_provider_->SetPixels(id2, data2, rect, rect, gfx::Vector2d()); | 866 child_resource_provider_->SetPixels(id2, data2, rect, rect, gfx::Vector2d()); |
| 830 | 867 |
| 868 ResourceProvider::ResourceId id3 = child_resource_provider_->CreateResource( |
| 869 size, GL_CLAMP_TO_EDGE, ResourceProvider::TextureUsageAny, format); |
| 870 child_resource_provider_->AcquireImage(id3); |
| 871 void* data = child_resource_provider_->MapImage(id3); |
| 872 uint8_t data3[4] = { 6, 7, 8, 9 }; |
| 873 memcpy(data, data3, sizeof(data3)); |
| 874 child_resource_provider_->UnmapImage(id3); |
| 875 |
| 831 scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory()); | 876 scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory()); |
| 832 shared_memory->CreateAndMapAnonymous(1); | 877 shared_memory->CreateAndMapAnonymous(1); |
| 833 base::SharedMemory* shared_memory_ptr = shared_memory.get(); | 878 base::SharedMemory* shared_memory_ptr = shared_memory.get(); |
| 834 ResourceProvider::ResourceId id3 = | 879 ResourceProvider::ResourceId id4 = |
| 835 child_resource_provider_->CreateResourceFromTextureMailbox( | 880 child_resource_provider_->CreateResourceFromTextureMailbox( |
| 836 TextureMailbox(shared_memory_ptr, gfx::Size(1, 1)), | 881 TextureMailbox(shared_memory_ptr, gfx::Size(1, 1)), |
| 837 SingleReleaseCallback::Create(base::Bind( | 882 SingleReleaseCallback::Create(base::Bind( |
| 838 &SharedMemoryReleaseCallback, base::Passed(&shared_memory)))); | 883 &SharedMemoryReleaseCallback, base::Passed(&shared_memory)))); |
| 839 | 884 |
| 840 ReturnedResourceArray returned_to_child; | 885 ReturnedResourceArray returned_to_child; |
| 841 int child_id = | 886 int child_id = |
| 842 resource_provider_->CreateChild(GetReturnCallback(&returned_to_child)); | 887 resource_provider_->CreateChild(GetReturnCallback(&returned_to_child)); |
| 843 { | 888 { |
| 844 // Transfer some resources to the parent. | 889 // Transfer some resources to the parent. |
| 845 ResourceProvider::ResourceIdArray resource_ids_to_transfer; | 890 ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
| 846 resource_ids_to_transfer.push_back(id1); | 891 resource_ids_to_transfer.push_back(id1); |
| 847 resource_ids_to_transfer.push_back(id2); | 892 resource_ids_to_transfer.push_back(id2); |
| 848 resource_ids_to_transfer.push_back(id3); | 893 resource_ids_to_transfer.push_back(id3); |
| 894 resource_ids_to_transfer.push_back(id4); |
| 849 TransferableResourceArray list; | 895 TransferableResourceArray list; |
| 850 child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, | 896 child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
| 851 &list); | 897 &list); |
| 852 ASSERT_EQ(3u, list.size()); | 898 ASSERT_EQ(4u, list.size()); |
| 853 EXPECT_EQ(0u, list[0].sync_point); | 899 EXPECT_EQ(0u, list[0].sync_point); |
| 854 EXPECT_EQ(0u, list[1].sync_point); | 900 EXPECT_EQ(0u, list[1].sync_point); |
| 855 EXPECT_EQ(0u, list[2].sync_point); | 901 EXPECT_EQ(0u, list[2].sync_point); |
| 902 EXPECT_EQ(0u, list[3].sync_point); |
| 856 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); | 903 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
| 857 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); | 904 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); |
| 858 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); | 905 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); |
| 906 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id4)); |
| 859 resource_provider_->ReceiveFromChild(child_id, list); | 907 resource_provider_->ReceiveFromChild(child_id, list); |
| 860 resource_provider_->DeclareUsedResourcesFromChild(child_id, | 908 resource_provider_->DeclareUsedResourcesFromChild(child_id, |
| 861 resource_ids_to_transfer); | 909 resource_ids_to_transfer); |
| 862 } | 910 } |
| 863 | 911 |
| 864 EXPECT_EQ(3u, resource_provider_->num_resources()); | 912 EXPECT_EQ(4u, resource_provider_->num_resources()); |
| 865 ResourceProvider::ResourceIdMap resource_map = | 913 ResourceProvider::ResourceIdMap resource_map = |
| 866 resource_provider_->GetChildToParentMap(child_id); | 914 resource_provider_->GetChildToParentMap(child_id); |
| 867 ResourceProvider::ResourceId mapped_id1 = resource_map[id1]; | 915 ResourceProvider::ResourceId mapped_id1 = resource_map[id1]; |
| 868 ResourceProvider::ResourceId mapped_id2 = resource_map[id2]; | 916 ResourceProvider::ResourceId mapped_id2 = resource_map[id2]; |
| 869 ResourceProvider::ResourceId mapped_id3 = resource_map[id3]; | 917 ResourceProvider::ResourceId mapped_id3 = resource_map[id3]; |
| 918 ResourceProvider::ResourceId mapped_id4 = resource_map[id4]; |
| 870 EXPECT_NE(0u, mapped_id1); | 919 EXPECT_NE(0u, mapped_id1); |
| 871 EXPECT_NE(0u, mapped_id2); | 920 EXPECT_NE(0u, mapped_id2); |
| 872 EXPECT_NE(0u, mapped_id3); | 921 EXPECT_NE(0u, mapped_id3); |
| 922 EXPECT_NE(0u, mapped_id4); |
| 873 EXPECT_FALSE(resource_provider_->InUseByConsumer(id1)); | 923 EXPECT_FALSE(resource_provider_->InUseByConsumer(id1)); |
| 874 EXPECT_FALSE(resource_provider_->InUseByConsumer(id2)); | 924 EXPECT_FALSE(resource_provider_->InUseByConsumer(id2)); |
| 875 EXPECT_FALSE(resource_provider_->InUseByConsumer(id3)); | 925 EXPECT_FALSE(resource_provider_->InUseByConsumer(id3)); |
| 926 EXPECT_FALSE(resource_provider_->InUseByConsumer(id4)); |
| 876 | 927 |
| 877 uint8_t result[4] = { 0 }; | 928 uint8_t result[4] = { 0 }; |
| 878 GetResourcePixels( | 929 GetResourcePixels( |
| 879 resource_provider_.get(), context(), mapped_id1, size, format, result); | 930 resource_provider_.get(), context(), mapped_id1, size, format, result); |
| 880 EXPECT_EQ(0, memcmp(data1, result, pixel_size)); | 931 EXPECT_EQ(0, memcmp(data1, result, pixel_size)); |
| 881 | 932 |
| 882 GetResourcePixels( | 933 GetResourcePixels( |
| 883 resource_provider_.get(), context(), mapped_id2, size, format, result); | 934 resource_provider_.get(), context(), mapped_id2, size, format, result); |
| 884 EXPECT_EQ(0, memcmp(data2, result, pixel_size)); | 935 EXPECT_EQ(0, memcmp(data2, result, pixel_size)); |
| 885 | 936 |
| 937 GetResourcePixels( |
| 938 resource_provider_.get(), context(), mapped_id3, size, format, result); |
| 939 EXPECT_EQ(0, memcmp(data3, result, pixel_size)); |
| 940 |
| 886 { | 941 { |
| 887 // Check that transfering again the same resource from the child to the | 942 // Check that transfering again the same resource from the child to the |
| 888 // parent works. | 943 // parent works. |
| 889 ResourceProvider::ResourceIdArray resource_ids_to_transfer; | 944 ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
| 890 resource_ids_to_transfer.push_back(id1); | 945 resource_ids_to_transfer.push_back(id1); |
| 946 resource_ids_to_transfer.push_back(id2); |
| 947 resource_ids_to_transfer.push_back(id3); |
| 891 TransferableResourceArray list; | 948 TransferableResourceArray list; |
| 892 child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, | 949 child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
| 893 &list); | 950 &list); |
| 894 EXPECT_EQ(1u, list.size()); | 951 EXPECT_EQ(3u, list.size()); |
| 895 EXPECT_EQ(id1, list[0].id); | 952 EXPECT_EQ(id1, list[0].id); |
| 953 EXPECT_EQ(id2, list[1].id); |
| 954 EXPECT_EQ(id3, list[2].id); |
| 896 ReturnedResourceArray returned; | 955 ReturnedResourceArray returned; |
| 897 TransferableResource::ReturnResources(list, &returned); | 956 TransferableResource::ReturnResources(list, &returned); |
| 898 child_resource_provider_->ReceiveReturnsFromParent(returned); | 957 child_resource_provider_->ReceiveReturnsFromParent(returned); |
| 899 // id1 was exported twice, we returned it only once, it should still be | 958 // ids were exported twice, we returned them only once, they should still |
| 900 // in-use. | 959 // be in-use. |
| 901 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); | 960 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
| 961 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); |
| 962 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); |
| 902 } | 963 } |
| 903 { | 964 { |
| 904 EXPECT_EQ(0u, returned_to_child.size()); | 965 EXPECT_EQ(0u, returned_to_child.size()); |
| 905 | 966 |
| 906 // Transfer resources back from the parent to the child. Set no resources as | 967 // Transfer resources back from the parent to the child. Set no resources as |
| 907 // being in use. | 968 // being in use. |
| 908 ResourceProvider::ResourceIdArray no_resources; | 969 ResourceProvider::ResourceIdArray no_resources; |
| 909 resource_provider_->DeclareUsedResourcesFromChild(child_id, no_resources); | 970 resource_provider_->DeclareUsedResourcesFromChild(child_id, no_resources); |
| 910 | 971 |
| 911 ASSERT_EQ(3u, returned_to_child.size()); | 972 ASSERT_EQ(4u, returned_to_child.size()); |
| 912 EXPECT_EQ(0u, returned_to_child[0].sync_point); | 973 EXPECT_EQ(0u, returned_to_child[0].sync_point); |
| 913 EXPECT_EQ(0u, returned_to_child[1].sync_point); | 974 EXPECT_EQ(0u, returned_to_child[1].sync_point); |
| 914 EXPECT_EQ(0u, returned_to_child[2].sync_point); | 975 EXPECT_EQ(0u, returned_to_child[2].sync_point); |
| 976 EXPECT_EQ(0u, returned_to_child[3].sync_point); |
| 915 EXPECT_EQ(id1, returned_to_child[0].id); | 977 EXPECT_EQ(id1, returned_to_child[0].id); |
| 916 EXPECT_EQ(id2, returned_to_child[1].id); | 978 EXPECT_EQ(id2, returned_to_child[1].id); |
| 917 EXPECT_EQ(id3, returned_to_child[2].id); | 979 EXPECT_EQ(id3, returned_to_child[2].id); |
| 980 EXPECT_EQ(id4, returned_to_child[3].id); |
| 918 EXPECT_FALSE(returned_to_child[0].lost); | 981 EXPECT_FALSE(returned_to_child[0].lost); |
| 919 EXPECT_FALSE(returned_to_child[1].lost); | 982 EXPECT_FALSE(returned_to_child[1].lost); |
| 920 EXPECT_FALSE(returned_to_child[2].lost); | 983 EXPECT_FALSE(returned_to_child[2].lost); |
| 984 EXPECT_FALSE(returned_to_child[3].lost); |
| 921 child_resource_provider_->ReceiveReturnsFromParent(returned_to_child); | 985 child_resource_provider_->ReceiveReturnsFromParent(returned_to_child); |
| 922 returned_to_child.clear(); | 986 returned_to_child.clear(); |
| 923 } | 987 } |
| 924 EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id1)); | 988 EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id1)); |
| 925 EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id2)); | 989 EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id2)); |
| 926 EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id3)); | 990 EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id3)); |
| 991 EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id4)); |
| 927 | 992 |
| 928 { | 993 { |
| 929 ResourceProvider::ScopedReadLockSoftware lock( | 994 ResourceProvider::ScopedReadLockSoftware lock( |
| 930 child_resource_provider_.get(), id1); | 995 child_resource_provider_.get(), id1); |
| 931 const SkBitmap* sk_bitmap = lock.sk_bitmap(); | 996 const SkBitmap* sk_bitmap = lock.sk_bitmap(); |
| 932 EXPECT_EQ(sk_bitmap->width(), size.width()); | 997 EXPECT_EQ(sk_bitmap->width(), size.width()); |
| 933 EXPECT_EQ(sk_bitmap->height(), size.height()); | 998 EXPECT_EQ(sk_bitmap->height(), size.height()); |
| 934 EXPECT_EQ(0, memcmp(data1, sk_bitmap->getPixels(), pixel_size)); | 999 EXPECT_EQ(0, memcmp(data1, sk_bitmap->getPixels(), pixel_size)); |
| 935 } | 1000 } |
| 936 { | 1001 { |
| 937 ResourceProvider::ScopedReadLockSoftware lock( | 1002 ResourceProvider::ScopedReadLockSoftware lock( |
| 938 child_resource_provider_.get(), id2); | 1003 child_resource_provider_.get(), id2); |
| 939 const SkBitmap* sk_bitmap = lock.sk_bitmap(); | 1004 const SkBitmap* sk_bitmap = lock.sk_bitmap(); |
| 940 EXPECT_EQ(sk_bitmap->width(), size.width()); | 1005 EXPECT_EQ(sk_bitmap->width(), size.width()); |
| 941 EXPECT_EQ(sk_bitmap->height(), size.height()); | 1006 EXPECT_EQ(sk_bitmap->height(), size.height()); |
| 942 EXPECT_EQ(0, memcmp(data2, sk_bitmap->getPixels(), pixel_size)); | 1007 EXPECT_EQ(0, memcmp(data2, sk_bitmap->getPixels(), pixel_size)); |
| 943 } | 1008 } |
| 944 { | 1009 { |
| 1010 ResourceProvider::ScopedReadLockSoftware lock( |
| 1011 child_resource_provider_.get(), id3); |
| 1012 const SkBitmap* sk_bitmap = lock.sk_bitmap(); |
| 1013 EXPECT_EQ(sk_bitmap->width(), size.width()); |
| 1014 EXPECT_EQ(sk_bitmap->height(), size.height()); |
| 1015 EXPECT_EQ(0, memcmp(data3, sk_bitmap->getPixels(), pixel_size)); |
| 1016 } |
| 1017 { |
| 945 // Transfer resources to the parent again. | 1018 // Transfer resources to the parent again. |
| 946 ResourceProvider::ResourceIdArray resource_ids_to_transfer; | 1019 ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
| 947 resource_ids_to_transfer.push_back(id1); | 1020 resource_ids_to_transfer.push_back(id1); |
| 948 resource_ids_to_transfer.push_back(id2); | 1021 resource_ids_to_transfer.push_back(id2); |
| 949 resource_ids_to_transfer.push_back(id3); | 1022 resource_ids_to_transfer.push_back(id3); |
| 1023 resource_ids_to_transfer.push_back(id4); |
| 950 TransferableResourceArray list; | 1024 TransferableResourceArray list; |
| 951 child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, | 1025 child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
| 952 &list); | 1026 &list); |
| 953 ASSERT_EQ(3u, list.size()); | 1027 ASSERT_EQ(4u, list.size()); |
| 954 EXPECT_EQ(id1, list[0].id); | 1028 EXPECT_EQ(id1, list[0].id); |
| 955 EXPECT_EQ(id2, list[1].id); | 1029 EXPECT_EQ(id2, list[1].id); |
| 956 EXPECT_EQ(id3, list[2].id); | 1030 EXPECT_EQ(id3, list[2].id); |
| 1031 EXPECT_EQ(id4, list[3].id); |
| 957 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); | 1032 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
| 958 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); | 1033 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); |
| 959 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); | 1034 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); |
| 1035 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id4)); |
| 960 resource_provider_->ReceiveFromChild(child_id, list); | 1036 resource_provider_->ReceiveFromChild(child_id, list); |
| 961 resource_provider_->DeclareUsedResourcesFromChild(child_id, | 1037 resource_provider_->DeclareUsedResourcesFromChild(child_id, |
| 962 resource_ids_to_transfer); | 1038 resource_ids_to_transfer); |
| 963 } | 1039 } |
| 964 | 1040 |
| 965 EXPECT_EQ(0u, returned_to_child.size()); | 1041 EXPECT_EQ(0u, returned_to_child.size()); |
| 966 | 1042 |
| 967 EXPECT_EQ(3u, resource_provider_->num_resources()); | 1043 EXPECT_EQ(4u, resource_provider_->num_resources()); |
| 968 resource_provider_->DestroyChild(child_id); | 1044 resource_provider_->DestroyChild(child_id); |
| 969 EXPECT_EQ(0u, resource_provider_->num_resources()); | 1045 EXPECT_EQ(0u, resource_provider_->num_resources()); |
| 970 | 1046 |
| 971 ASSERT_EQ(3u, returned_to_child.size()); | 1047 ASSERT_EQ(4u, returned_to_child.size()); |
| 972 EXPECT_EQ(0u, returned_to_child[0].sync_point); | 1048 EXPECT_EQ(0u, returned_to_child[0].sync_point); |
| 973 EXPECT_EQ(0u, returned_to_child[1].sync_point); | 1049 EXPECT_EQ(0u, returned_to_child[1].sync_point); |
| 974 EXPECT_EQ(0u, returned_to_child[2].sync_point); | 1050 EXPECT_EQ(0u, returned_to_child[2].sync_point); |
| 1051 EXPECT_EQ(0u, returned_to_child[3].sync_point); |
| 975 EXPECT_EQ(id1, returned_to_child[0].id); | 1052 EXPECT_EQ(id1, returned_to_child[0].id); |
| 976 EXPECT_EQ(id2, returned_to_child[1].id); | 1053 EXPECT_EQ(id2, returned_to_child[1].id); |
| 977 EXPECT_EQ(id3, returned_to_child[2].id); | 1054 EXPECT_EQ(id3, returned_to_child[2].id); |
| 1055 EXPECT_EQ(id4, returned_to_child[3].id); |
| 978 EXPECT_FALSE(returned_to_child[0].lost); | 1056 EXPECT_FALSE(returned_to_child[0].lost); |
| 979 EXPECT_FALSE(returned_to_child[1].lost); | 1057 EXPECT_FALSE(returned_to_child[1].lost); |
| 980 EXPECT_FALSE(returned_to_child[2].lost); | 1058 EXPECT_FALSE(returned_to_child[2].lost); |
| 1059 EXPECT_FALSE(returned_to_child[3].lost); |
| 981 } | 1060 } |
| 982 | 1061 |
| 983 TEST_P(ResourceProviderTest, TransferSoftwareToNonUber) { | 1062 TEST_P(ResourceProviderTest, TransferSoftwareToNonUber) { |
| 984 // TODO(jbauman): Remove test when shared bitmap manager available | 1063 // TODO(jbauman): Remove test when shared bitmap manager available |
| 985 // everywhere. | 1064 // everywhere. |
| 986 if (GetParam() != ResourceProvider::Bitmap) | 1065 if (GetParam() != ResourceProvider::Bitmap) |
| 987 return; | 1066 return; |
| 988 | 1067 |
| 989 scoped_ptr<FakeOutputSurface> parent_output_surface = | 1068 scoped_ptr<FakeOutputSurface> parent_output_surface = |
| 990 FakeOutputSurface::CreateSoftware( | 1069 FakeOutputSurface::CreateSoftware( |
| (...skipping 2075 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3066 resource_provider->AllocateForTesting(id); | 3145 resource_provider->AllocateForTesting(id); |
| 3067 Mock::VerifyAndClearExpectations(context); | 3146 Mock::VerifyAndClearExpectations(context); |
| 3068 | 3147 |
| 3069 DCHECK_EQ(10u, context->PeekTextureId()); | 3148 DCHECK_EQ(10u, context->PeekTextureId()); |
| 3070 resource_provider->DeleteResource(id); | 3149 resource_provider->DeleteResource(id); |
| 3071 } | 3150 } |
| 3072 } | 3151 } |
| 3073 | 3152 |
| 3074 } // namespace | 3153 } // namespace |
| 3075 } // namespace cc | 3154 } // namespace cc |
| OLD | NEW |