Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(293)

Side by Side Diff: cc/resources/resource_provider_unittest.cc

Issue 132873006: cc: Add zero-copy texture update support to delegating renderer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address review feedback and add unit tests Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/resources/resource_provider.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « cc/resources/resource_provider.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698