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 |