OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/resources/resource_provider.h" | 5 #include "cc/resources/resource_provider.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |