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

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

Powered by Google App Engine
This is Rietveld 408576698