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

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

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

Powered by Google App Engine
This is Rietveld 408576698