| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 3689 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3700 ResourceId id = resource_provider->CreateResource( | 3700 ResourceId id = resource_provider->CreateResource( |
| 3701 size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); | 3701 size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); |
| 3702 resource_provider->AllocateForTesting(id); | 3702 resource_provider->AllocateForTesting(id); |
| 3703 Mock::VerifyAndClearExpectations(context); | 3703 Mock::VerifyAndClearExpectations(context); |
| 3704 | 3704 |
| 3705 DCHECK_EQ(10u, context->PeekTextureId()); | 3705 DCHECK_EQ(10u, context->PeekTextureId()); |
| 3706 resource_provider->DeleteResource(id); | 3706 resource_provider->DeleteResource(id); |
| 3707 } | 3707 } |
| 3708 } | 3708 } |
| 3709 | 3709 |
| 3710 TEST_P(ResourceProviderTest, GpuMemoryBufferReadLockFail) { | |
| 3711 if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) | |
| 3712 return; | |
| 3713 | |
| 3714 gfx::Size size(1, 1); | |
| 3715 ResourceFormat format = RGBA_8888; | |
| 3716 size_t pixel_size = TextureSizeBytes(size, format); | |
| 3717 ASSERT_EQ(4U, pixel_size); | |
| 3718 | |
| 3719 ResourceId id = resource_provider_->CreateResource( | |
| 3720 size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); | |
| 3721 resource_provider_->AllocateForTesting(id); | |
| 3722 { | |
| 3723 ResourceProvider::ScopedReadLockGpuMemoryBuffer lock( | |
| 3724 resource_provider_.get(), id); | |
| 3725 EXPECT_FALSE(lock.gpu_memory_buffer()); | |
| 3726 } | |
| 3727 } | |
| 3728 | |
| 3729 TEST_P(ResourceProviderTest, GpuMemoryBufferReadLockSucceed) { | |
| 3730 if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) | |
| 3731 return; | |
| 3732 | |
| 3733 gfx::Size size(1, 1); | |
| 3734 ResourceFormat format = RGBA_8888; | |
| 3735 size_t pixel_size = TextureSizeBytes(size, format); | |
| 3736 ASSERT_EQ(4U, pixel_size); | |
| 3737 | |
| 3738 ResourceId id = resource_provider_->CreateResource( | |
| 3739 size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); | |
| 3740 gfx::GpuMemoryBuffer* gpu_memory_buffer = nullptr; | |
| 3741 { | |
| 3742 ResourceProvider::ScopedWriteLockGpuMemoryBuffer lock( | |
| 3743 resource_provider_.get(), id); | |
| 3744 gpu_memory_buffer = lock.GetGpuMemoryBuffer(); | |
| 3745 EXPECT_TRUE(lock.GetGpuMemoryBuffer()); | |
| 3746 } | |
| 3747 { | |
| 3748 ResourceProvider::ScopedReadLockGpuMemoryBuffer lock( | |
| 3749 resource_provider_.get(), id); | |
| 3750 EXPECT_EQ(gpu_memory_buffer, lock.gpu_memory_buffer()); | |
| 3751 } | |
| 3752 } | |
| 3753 | |
| 3754 TEST_P(ResourceProviderTest, ChildGpuMemoryBufferReadLock) { | |
| 3755 if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) | |
| 3756 return; | |
| 3757 | |
| 3758 gfx::Size size(1, 1); | |
| 3759 ResourceFormat format = RGBA_8888; | |
| 3760 size_t pixel_size = TextureSizeBytes(size, format); | |
| 3761 ASSERT_EQ(4U, pixel_size); | |
| 3762 | |
| 3763 // Create the child resource provider. | |
| 3764 ReturnedResourceArray returned_to_child; | |
| 3765 int child_id = resource_provider_->CreateChild( | |
| 3766 GetReturnCallback(&returned_to_child), | |
| 3767 child_gpu_memory_buffer_manager_->GetClientId()); | |
| 3768 | |
| 3769 // Create a non-GMB-backed resource. | |
| 3770 ResourceId child_resource = child_resource_provider_->CreateResource( | |
| 3771 size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); | |
| 3772 { | |
| 3773 uint8_t data1[4] = {1, 2, 3, 4}; | |
| 3774 child_resource_provider_->CopyToResource(child_resource, data1, size); | |
| 3775 } | |
| 3776 | |
| 3777 // Create a GMB-backed resource. | |
| 3778 ResourceId child_gmb_resource = child_resource_provider_->CreateResource( | |
| 3779 size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); | |
| 3780 gfx::GpuMemoryBuffer* child_gmb = nullptr; | |
| 3781 { | |
| 3782 ResourceProvider::ScopedWriteLockGpuMemoryBuffer lock( | |
| 3783 child_resource_provider_.get(), child_gmb_resource); | |
| 3784 EXPECT_TRUE(lock.GetGpuMemoryBuffer()); | |
| 3785 child_gmb = lock.GetGpuMemoryBuffer(); | |
| 3786 } | |
| 3787 | |
| 3788 // Transfer to the parent. | |
| 3789 TransferableResourceArray list; | |
| 3790 { | |
| 3791 ResourceProvider::ResourceIdArray resource_ids_to_transfer; | |
| 3792 resource_ids_to_transfer.push_back(child_resource); | |
| 3793 resource_ids_to_transfer.push_back(child_gmb_resource); | |
| 3794 child_resource_provider_->GenerateSyncTokenForResources( | |
| 3795 resource_ids_to_transfer); | |
| 3796 child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, | |
| 3797 &list); | |
| 3798 resource_provider_->ReceiveFromChild(child_id, list); | |
| 3799 resource_provider_->WaitSyncTokenIfNeeded(list[0].id); | |
| 3800 resource_provider_->WaitSyncTokenIfNeeded(list[1].id); | |
| 3801 } | |
| 3802 | |
| 3803 // The non-gmb resource should not have a GpuMemoryBuffer when locked. | |
| 3804 { | |
| 3805 ResourceProvider::ScopedReadLockGpuMemoryBuffer lock( | |
| 3806 resource_provider_.get(), list[0].id); | |
| 3807 EXPECT_FALSE(lock.gpu_memory_buffer()); | |
| 3808 } | |
| 3809 | |
| 3810 // The gmb resource should have a GpuMemoryBuffer when locked | |
| 3811 { | |
| 3812 ResourceProvider::ScopedReadLockGpuMemoryBuffer lock( | |
| 3813 resource_provider_.get(), list[1].id); | |
| 3814 gfx::GpuMemoryBuffer* parent_gmb = lock.gpu_memory_buffer(); | |
| 3815 EXPECT_TRUE(parent_gmb); | |
| 3816 EXPECT_NE(child_gmb, parent_gmb); | |
| 3817 | |
| 3818 // Verify that the IsInUseByMacOSWindowServer signal is shared between | |
| 3819 // parent and child. | |
| 3820 EXPECT_FALSE(parent_gmb->IsInUseByMacOSWindowServer()); | |
| 3821 child_gpu_memory_buffer_manager_ | |
| 3822 ->SetGpuMemoryBufferIsInUseByMacOSWindowServer(child_gmb, true); | |
| 3823 EXPECT_TRUE(parent_gmb->IsInUseByMacOSWindowServer()); | |
| 3824 child_gpu_memory_buffer_manager_ | |
| 3825 ->SetGpuMemoryBufferIsInUseByMacOSWindowServer(child_gmb, false); | |
| 3826 EXPECT_FALSE(parent_gmb->IsInUseByMacOSWindowServer()); | |
| 3827 } | |
| 3828 | |
| 3829 // Transfer back to the child.{ | |
| 3830 { | |
| 3831 ResourceProvider::ResourceIdSet resource_ids_to_receive; | |
| 3832 resource_ids_to_receive.insert(child_resource); | |
| 3833 resource_ids_to_receive.insert(child_gmb_resource); | |
| 3834 resource_provider_->DeclareUsedResourcesFromChild(child_id, | |
| 3835 resource_ids_to_receive); | |
| 3836 } | |
| 3837 resource_provider_->DestroyChild(child_id); | |
| 3838 | |
| 3839 EXPECT_EQ(0u, resource_provider_->num_resources()); | |
| 3840 } | |
| 3841 | |
| 3842 } // namespace | 3710 } // namespace |
| 3843 } // namespace cc | 3711 } // namespace cc |
| OLD | NEW |