Index: cc/resources/resource_provider_unittest.cc |
diff --git a/cc/resources/resource_provider_unittest.cc b/cc/resources/resource_provider_unittest.cc |
index e40c9a7e6fe8fe8fe276e549e5e4170831b27dea..52de843290fcac133ac8848c23940e65cd4e1aa3 100644 |
--- a/cc/resources/resource_provider_unittest.cc |
+++ b/cc/resources/resource_provider_unittest.cc |
@@ -647,6 +647,12 @@ TEST_P(ResourceProviderTest, TransferGLResources) { |
uint8_t data2[4] = { 5, 5, 5, 5 }; |
child_resource_provider_->SetPixels(id2, data2, rect, rect, gfx::Vector2d()); |
+ ResourceProvider::ResourceId id3 = child_resource_provider_->CreateResource( |
+ size, GL_CLAMP_TO_EDGE, ResourceProvider::TextureUsageAny, format); |
+ child_resource_provider_->AcquireImage(id3); |
+ child_resource_provider_->MapImage(id3); |
+ child_resource_provider_->UnmapImage(id3); |
+ |
GLuint external_texture_id = child_context_->createExternalTexture(); |
child_context_->bindTexture(GL_TEXTURE_EXTERNAL_OES, external_texture_id); |
@@ -655,7 +661,7 @@ TEST_P(ResourceProviderTest, TransferGLResources) { |
child_context_->produceTextureCHROMIUM(GL_TEXTURE_EXTERNAL_OES, |
external_mailbox.name); |
const unsigned external_sync_point = child_context_->insertSyncPoint(); |
- ResourceProvider::ResourceId id3 = |
+ ResourceProvider::ResourceId id4 = |
child_resource_provider_->CreateResourceFromTextureMailbox( |
TextureMailbox( |
external_mailbox, GL_TEXTURE_EXTERNAL_OES, external_sync_point), |
@@ -670,36 +676,43 @@ TEST_P(ResourceProviderTest, TransferGLResources) { |
resource_ids_to_transfer.push_back(id1); |
resource_ids_to_transfer.push_back(id2); |
resource_ids_to_transfer.push_back(id3); |
+ resource_ids_to_transfer.push_back(id4); |
TransferableResourceArray list; |
child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
&list); |
- ASSERT_EQ(3u, list.size()); |
+ ASSERT_EQ(4u, list.size()); |
EXPECT_NE(0u, list[0].sync_point); |
EXPECT_NE(0u, list[1].sync_point); |
- EXPECT_EQ(external_sync_point, list[2].sync_point); |
+ EXPECT_NE(0u, list[2].sync_point); |
+ EXPECT_EQ(external_sync_point, list[3].sync_point); |
EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[0].target); |
EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[1].target); |
- EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), list[2].target); |
+ EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[2].target); |
+ EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), list[3].target); |
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); |
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); |
+ EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id4)); |
resource_provider_->ReceiveFromChild(child_id, list); |
resource_provider_->DeclareUsedResourcesFromChild(child_id, |
resource_ids_to_transfer); |
} |
- EXPECT_EQ(3u, resource_provider_->num_resources()); |
+ EXPECT_EQ(4u, resource_provider_->num_resources()); |
ResourceProvider::ResourceIdMap resource_map = |
resource_provider_->GetChildToParentMap(child_id); |
ResourceProvider::ResourceId mapped_id1 = resource_map[id1]; |
ResourceProvider::ResourceId mapped_id2 = resource_map[id2]; |
ResourceProvider::ResourceId mapped_id3 = resource_map[id3]; |
+ ResourceProvider::ResourceId mapped_id4 = resource_map[id4]; |
EXPECT_NE(0u, mapped_id1); |
EXPECT_NE(0u, mapped_id2); |
EXPECT_NE(0u, mapped_id3); |
+ EXPECT_NE(0u, mapped_id4); |
EXPECT_FALSE(resource_provider_->InUseByConsumer(id1)); |
EXPECT_FALSE(resource_provider_->InUseByConsumer(id2)); |
EXPECT_FALSE(resource_provider_->InUseByConsumer(id3)); |
+ EXPECT_FALSE(resource_provider_->InUseByConsumer(id4)); |
uint8_t result[4] = { 0 }; |
GetResourcePixels( |
@@ -715,18 +728,26 @@ TEST_P(ResourceProviderTest, TransferGLResources) { |
// parent works. |
ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
resource_ids_to_transfer.push_back(id1); |
+ resource_ids_to_transfer.push_back(id2); |
+ resource_ids_to_transfer.push_back(id3); |
TransferableResourceArray list; |
child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
&list); |
- EXPECT_EQ(1u, list.size()); |
+ EXPECT_EQ(3u, list.size()); |
EXPECT_EQ(id1, list[0].id); |
+ EXPECT_EQ(id2, list[1].id); |
+ EXPECT_EQ(id3, list[2].id); |
EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[0].target); |
+ EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[1].target); |
+ EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[2].target); |
ReturnedResourceArray returned; |
TransferableResource::ReturnResources(list, &returned); |
child_resource_provider_->ReceiveReturnsFromParent(returned); |
- // id1 was exported twice, we returned it only once, it should still be |
- // in-use. |
+ // ids were exported twice, we returned them only once, they should still |
+ // be in-use. |
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
+ EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); |
+ EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); |
} |
{ |
EXPECT_EQ(0u, returned_to_child.size()); |
@@ -736,19 +757,22 @@ TEST_P(ResourceProviderTest, TransferGLResources) { |
ResourceProvider::ResourceIdArray no_resources; |
resource_provider_->DeclareUsedResourcesFromChild(child_id, no_resources); |
- ASSERT_EQ(3u, returned_to_child.size()); |
+ ASSERT_EQ(4u, returned_to_child.size()); |
EXPECT_NE(0u, returned_to_child[0].sync_point); |
EXPECT_NE(0u, returned_to_child[1].sync_point); |
EXPECT_NE(0u, returned_to_child[2].sync_point); |
+ EXPECT_NE(0u, returned_to_child[3].sync_point); |
EXPECT_FALSE(returned_to_child[0].lost); |
EXPECT_FALSE(returned_to_child[1].lost); |
EXPECT_FALSE(returned_to_child[2].lost); |
+ EXPECT_FALSE(returned_to_child[3].lost); |
child_resource_provider_->ReceiveReturnsFromParent(returned_to_child); |
returned_to_child.clear(); |
} |
EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id1)); |
EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id2)); |
EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id3)); |
+ EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id4)); |
{ |
ResourceProvider::ScopedReadLockGL lock(child_resource_provider_.get(), |
@@ -767,27 +791,38 @@ TEST_P(ResourceProviderTest, TransferGLResources) { |
EXPECT_EQ(0, memcmp(data2, result, pixel_size)); |
} |
{ |
+ ResourceProvider::ScopedReadLockGL lock(child_resource_provider_.get(), |
+ id3); |
+ ASSERT_NE(0U, lock.texture_id()); |
+ child_context_->bindTexture(GL_TEXTURE_2D, lock.texture_id()); |
+ } |
+ { |
// Transfer resources to the parent again. |
ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
resource_ids_to_transfer.push_back(id1); |
resource_ids_to_transfer.push_back(id2); |
resource_ids_to_transfer.push_back(id3); |
+ resource_ids_to_transfer.push_back(id4); |
TransferableResourceArray list; |
child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
&list); |
- ASSERT_EQ(3u, list.size()); |
+ ASSERT_EQ(4u, list.size()); |
EXPECT_EQ(id1, list[0].id); |
EXPECT_EQ(id2, list[1].id); |
EXPECT_EQ(id3, list[2].id); |
+ EXPECT_EQ(id4, list[3].id); |
EXPECT_NE(0u, list[0].sync_point); |
EXPECT_NE(0u, list[1].sync_point); |
EXPECT_NE(0u, list[2].sync_point); |
+ EXPECT_NE(0u, list[3].sync_point); |
EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[0].target); |
EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[1].target); |
- EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), list[2].target); |
+ EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[2].target); |
+ EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), list[3].target); |
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); |
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); |
+ EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id4)); |
resource_provider_->ReceiveFromChild(child_id, list); |
resource_provider_->DeclareUsedResourcesFromChild(child_id, |
resource_ids_to_transfer); |
@@ -795,17 +830,19 @@ TEST_P(ResourceProviderTest, TransferGLResources) { |
EXPECT_EQ(0u, returned_to_child.size()); |
- EXPECT_EQ(3u, resource_provider_->num_resources()); |
+ EXPECT_EQ(4u, resource_provider_->num_resources()); |
resource_provider_->DestroyChild(child_id); |
EXPECT_EQ(0u, resource_provider_->num_resources()); |
- ASSERT_EQ(3u, returned_to_child.size()); |
+ ASSERT_EQ(4u, returned_to_child.size()); |
EXPECT_NE(0u, returned_to_child[0].sync_point); |
EXPECT_NE(0u, returned_to_child[1].sync_point); |
EXPECT_NE(0u, returned_to_child[2].sync_point); |
+ EXPECT_NE(0u, returned_to_child[3].sync_point); |
EXPECT_FALSE(returned_to_child[0].lost); |
EXPECT_FALSE(returned_to_child[1].lost); |
EXPECT_FALSE(returned_to_child[2].lost); |
+ EXPECT_FALSE(returned_to_child[3].lost); |
} |
TEST_P(ResourceProviderTest, TransferSoftwareResources) { |
@@ -828,10 +865,18 @@ TEST_P(ResourceProviderTest, TransferSoftwareResources) { |
uint8_t data2[4] = { 5, 5, 5, 5 }; |
child_resource_provider_->SetPixels(id2, data2, rect, rect, gfx::Vector2d()); |
+ ResourceProvider::ResourceId id3 = child_resource_provider_->CreateResource( |
+ size, GL_CLAMP_TO_EDGE, ResourceProvider::TextureUsageAny, format); |
+ child_resource_provider_->AcquireImage(id3); |
+ void* data = child_resource_provider_->MapImage(id3); |
+ uint8_t data3[4] = { 6, 7, 8, 9 }; |
+ memcpy(data, data3, sizeof(data3)); |
+ child_resource_provider_->UnmapImage(id3); |
+ |
scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory()); |
shared_memory->CreateAndMapAnonymous(1); |
base::SharedMemory* shared_memory_ptr = shared_memory.get(); |
- ResourceProvider::ResourceId id3 = |
+ ResourceProvider::ResourceId id4 = |
child_resource_provider_->CreateResourceFromTextureMailbox( |
TextureMailbox(shared_memory_ptr, gfx::Size(1, 1)), |
SingleReleaseCallback::Create(base::Bind( |
@@ -846,33 +891,39 @@ TEST_P(ResourceProviderTest, TransferSoftwareResources) { |
resource_ids_to_transfer.push_back(id1); |
resource_ids_to_transfer.push_back(id2); |
resource_ids_to_transfer.push_back(id3); |
+ resource_ids_to_transfer.push_back(id4); |
TransferableResourceArray list; |
child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
&list); |
- ASSERT_EQ(3u, list.size()); |
+ ASSERT_EQ(4u, list.size()); |
EXPECT_EQ(0u, list[0].sync_point); |
EXPECT_EQ(0u, list[1].sync_point); |
EXPECT_EQ(0u, list[2].sync_point); |
+ EXPECT_EQ(0u, list[3].sync_point); |
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); |
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); |
+ EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id4)); |
resource_provider_->ReceiveFromChild(child_id, list); |
resource_provider_->DeclareUsedResourcesFromChild(child_id, |
resource_ids_to_transfer); |
} |
- EXPECT_EQ(3u, resource_provider_->num_resources()); |
+ EXPECT_EQ(4u, resource_provider_->num_resources()); |
ResourceProvider::ResourceIdMap resource_map = |
resource_provider_->GetChildToParentMap(child_id); |
ResourceProvider::ResourceId mapped_id1 = resource_map[id1]; |
ResourceProvider::ResourceId mapped_id2 = resource_map[id2]; |
ResourceProvider::ResourceId mapped_id3 = resource_map[id3]; |
+ ResourceProvider::ResourceId mapped_id4 = resource_map[id4]; |
EXPECT_NE(0u, mapped_id1); |
EXPECT_NE(0u, mapped_id2); |
EXPECT_NE(0u, mapped_id3); |
+ EXPECT_NE(0u, mapped_id4); |
EXPECT_FALSE(resource_provider_->InUseByConsumer(id1)); |
EXPECT_FALSE(resource_provider_->InUseByConsumer(id2)); |
EXPECT_FALSE(resource_provider_->InUseByConsumer(id3)); |
+ EXPECT_FALSE(resource_provider_->InUseByConsumer(id4)); |
uint8_t result[4] = { 0 }; |
GetResourcePixels( |
@@ -883,22 +934,32 @@ TEST_P(ResourceProviderTest, TransferSoftwareResources) { |
resource_provider_.get(), context(), mapped_id2, size, format, result); |
EXPECT_EQ(0, memcmp(data2, result, pixel_size)); |
+ GetResourcePixels( |
+ resource_provider_.get(), context(), mapped_id3, size, format, result); |
+ EXPECT_EQ(0, memcmp(data3, result, pixel_size)); |
+ |
{ |
// Check that transfering again the same resource from the child to the |
// parent works. |
ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
resource_ids_to_transfer.push_back(id1); |
+ resource_ids_to_transfer.push_back(id2); |
+ resource_ids_to_transfer.push_back(id3); |
TransferableResourceArray list; |
child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
&list); |
- EXPECT_EQ(1u, list.size()); |
+ EXPECT_EQ(3u, list.size()); |
EXPECT_EQ(id1, list[0].id); |
+ EXPECT_EQ(id2, list[1].id); |
+ EXPECT_EQ(id3, list[2].id); |
ReturnedResourceArray returned; |
TransferableResource::ReturnResources(list, &returned); |
child_resource_provider_->ReceiveReturnsFromParent(returned); |
- // id1 was exported twice, we returned it only once, it should still be |
- // in-use. |
+ // ids were exported twice, we returned them only once, they should still |
+ // be in-use. |
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
+ EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); |
+ EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); |
} |
{ |
EXPECT_EQ(0u, returned_to_child.size()); |
@@ -908,22 +969,26 @@ TEST_P(ResourceProviderTest, TransferSoftwareResources) { |
ResourceProvider::ResourceIdArray no_resources; |
resource_provider_->DeclareUsedResourcesFromChild(child_id, no_resources); |
- ASSERT_EQ(3u, returned_to_child.size()); |
+ ASSERT_EQ(4u, returned_to_child.size()); |
EXPECT_EQ(0u, returned_to_child[0].sync_point); |
EXPECT_EQ(0u, returned_to_child[1].sync_point); |
EXPECT_EQ(0u, returned_to_child[2].sync_point); |
+ EXPECT_EQ(0u, returned_to_child[3].sync_point); |
EXPECT_EQ(id1, returned_to_child[0].id); |
EXPECT_EQ(id2, returned_to_child[1].id); |
EXPECT_EQ(id3, returned_to_child[2].id); |
+ EXPECT_EQ(id4, returned_to_child[3].id); |
EXPECT_FALSE(returned_to_child[0].lost); |
EXPECT_FALSE(returned_to_child[1].lost); |
EXPECT_FALSE(returned_to_child[2].lost); |
+ EXPECT_FALSE(returned_to_child[3].lost); |
child_resource_provider_->ReceiveReturnsFromParent(returned_to_child); |
returned_to_child.clear(); |
} |
EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id1)); |
EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id2)); |
EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id3)); |
+ EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id4)); |
{ |
ResourceProvider::ScopedReadLockSoftware lock( |
@@ -942,21 +1007,32 @@ TEST_P(ResourceProviderTest, TransferSoftwareResources) { |
EXPECT_EQ(0, memcmp(data2, sk_bitmap->getPixels(), pixel_size)); |
} |
{ |
+ ResourceProvider::ScopedReadLockSoftware lock( |
+ child_resource_provider_.get(), id3); |
+ const SkBitmap* sk_bitmap = lock.sk_bitmap(); |
+ EXPECT_EQ(sk_bitmap->width(), size.width()); |
+ EXPECT_EQ(sk_bitmap->height(), size.height()); |
+ EXPECT_EQ(0, memcmp(data3, sk_bitmap->getPixels(), pixel_size)); |
+ } |
+ { |
// Transfer resources to the parent again. |
ResourceProvider::ResourceIdArray resource_ids_to_transfer; |
resource_ids_to_transfer.push_back(id1); |
resource_ids_to_transfer.push_back(id2); |
resource_ids_to_transfer.push_back(id3); |
+ resource_ids_to_transfer.push_back(id4); |
TransferableResourceArray list; |
child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, |
&list); |
- ASSERT_EQ(3u, list.size()); |
+ ASSERT_EQ(4u, list.size()); |
EXPECT_EQ(id1, list[0].id); |
EXPECT_EQ(id2, list[1].id); |
EXPECT_EQ(id3, list[2].id); |
+ EXPECT_EQ(id4, list[3].id); |
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); |
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); |
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); |
+ EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id4)); |
resource_provider_->ReceiveFromChild(child_id, list); |
resource_provider_->DeclareUsedResourcesFromChild(child_id, |
resource_ids_to_transfer); |
@@ -964,20 +1040,23 @@ TEST_P(ResourceProviderTest, TransferSoftwareResources) { |
EXPECT_EQ(0u, returned_to_child.size()); |
- EXPECT_EQ(3u, resource_provider_->num_resources()); |
+ EXPECT_EQ(4u, resource_provider_->num_resources()); |
resource_provider_->DestroyChild(child_id); |
EXPECT_EQ(0u, resource_provider_->num_resources()); |
- ASSERT_EQ(3u, returned_to_child.size()); |
+ ASSERT_EQ(4u, returned_to_child.size()); |
EXPECT_EQ(0u, returned_to_child[0].sync_point); |
EXPECT_EQ(0u, returned_to_child[1].sync_point); |
EXPECT_EQ(0u, returned_to_child[2].sync_point); |
+ EXPECT_EQ(0u, returned_to_child[3].sync_point); |
EXPECT_EQ(id1, returned_to_child[0].id); |
EXPECT_EQ(id2, returned_to_child[1].id); |
EXPECT_EQ(id3, returned_to_child[2].id); |
+ EXPECT_EQ(id4, returned_to_child[3].id); |
EXPECT_FALSE(returned_to_child[0].lost); |
EXPECT_FALSE(returned_to_child[1].lost); |
EXPECT_FALSE(returned_to_child[2].lost); |
+ EXPECT_FALSE(returned_to_child[3].lost); |
} |
TEST_P(ResourceProviderTest, TransferSoftwareToNonUber) { |