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 393 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |