Index: cc/resources/resource_provider_unittest.cc |
diff --git a/cc/resources/resource_provider_unittest.cc b/cc/resources/resource_provider_unittest.cc |
index bc26e1cafc43ddc4a4102058a03b7025c2edcf70..72c425f0a88185781e65b0993c27a602a6f9b6e5 100644 |
--- a/cc/resources/resource_provider_unittest.cc |
+++ b/cc/resources/resource_provider_unittest.cc |
@@ -81,6 +81,18 @@ static scoped_ptr<base::SharedMemory> CreateAndFillSharedMemory( |
return shared_memory.Pass(); |
} |
+void ForceUseChildTextures(ResourceProvider* resource_provider, |
+ int child_id, |
+ const TransferableResourceArray& resources) { |
+ ResourceProvider::ResourceIdMap resource_map = |
+ resource_provider->GetChildToParentMap(child_id); |
+ for (size_t i = 0; i < resources.size(); ++i) { |
+ ResourceProvider::ResourceId mapped_id = resource_map[resources[i].id]; |
+ ResourceProvider::ScopedReadLockGL lock(resource_provider, mapped_id); |
+ EXPECT_NE(0U, lock.texture_id()); |
+ } |
+} |
+ |
class TextureStateTrackingContext : public TestWebGraphicsContext3D { |
public: |
MOCK_METHOD2(bindTexture, void(WGC3Denum target, WebGLId texture)); |
@@ -723,27 +735,33 @@ TEST_P(ResourceProviderTest, TransferGLResources) { |
resource_ids_to_transfer); |
} |
- EXPECT_EQ(3u, 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]; |
- EXPECT_NE(0u, mapped_id1); |
- EXPECT_NE(0u, mapped_id2); |
- EXPECT_NE(0u, mapped_id3); |
- EXPECT_FALSE(resource_provider_->InUseByConsumer(id1)); |
- EXPECT_FALSE(resource_provider_->InUseByConsumer(id2)); |
- EXPECT_FALSE(resource_provider_->InUseByConsumer(id3)); |
- |
uint8_t result[4] = { 0 }; |
- GetResourcePixels( |
- resource_provider_.get(), context(), mapped_id1, size, format, result); |
- EXPECT_EQ(0, memcmp(data1, result, pixel_size)); |
+ { |
+ EXPECT_EQ(3u, 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]; |
+ EXPECT_NE(0u, mapped_id1); |
+ EXPECT_NE(0u, mapped_id2); |
+ EXPECT_NE(0u, mapped_id3); |
+ EXPECT_FALSE(resource_provider_->InUseByConsumer(id1)); |
+ EXPECT_FALSE(resource_provider_->InUseByConsumer(id2)); |
+ EXPECT_FALSE(resource_provider_->InUseByConsumer(id3)); |
- GetResourcePixels( |
- resource_provider_.get(), context(), mapped_id2, size, format, result); |
- EXPECT_EQ(0, memcmp(data2, result, pixel_size)); |
+ GetResourcePixels( |
+ resource_provider_.get(), context(), mapped_id1, size, format, result); |
+ EXPECT_EQ(0, memcmp(data1, result, pixel_size)); |
+ |
+ GetResourcePixels( |
+ resource_provider_.get(), context(), mapped_id2, size, format, result); |
+ EXPECT_EQ(0, memcmp(data2, result, pixel_size)); |
+ |
+ ResourceProvider::ScopedReadLockGL lock(resource_provider_.get(), |
+ mapped_id3); |
+ EXPECT_NE(0U, lock.texture_id()); |
+ } |
{ |
// Check that transfering again the same resource from the child to the |
@@ -826,6 +844,8 @@ TEST_P(ResourceProviderTest, TransferGLResources) { |
resource_provider_->ReceiveFromChild(child_id, list); |
resource_provider_->DeclareUsedResourcesFromChild(child_id, |
resource_ids_to_transfer); |
+ // Lock resources in child to make sure they get "used". |
+ ForceUseChildTextures(resource_provider_.get(), child_id, list); |
} |
EXPECT_EQ(0u, returned_to_child.size()); |
@@ -1261,6 +1281,11 @@ TEST_P(ResourceProviderTest, DeleteExportedResources) { |
EXPECT_EQ(mapped_id2, list[1].id); |
ReturnedResourceArray returned; |
TransferableResource::ReturnResources(list, &returned); |
+ EXPECT_EQ(2u, returned.size()); |
+ if (GetParam() == ResourceProvider::GLTexture) { |
+ returned[0].sync_point = 3; |
+ returned[1].sync_point = 4; |
+ } |
resource_provider_->ReceiveReturnsFromParent(returned); |
EXPECT_EQ(0u, resource_provider_->num_resources()); |
@@ -1364,13 +1389,15 @@ TEST_P(ResourceProviderTest, DestroyChildWithExportedResources) { |
list.pop_back(); |
ReturnedResourceArray returned; |
TransferableResource::ReturnResources(return_list, &returned); |
+ EXPECT_EQ(1u, returned.size()); |
+ if (GetParam() == ResourceProvider::GLTexture) |
+ returned[0].sync_point = 3; |
resource_provider_->ReceiveReturnsFromParent(returned); |
EXPECT_EQ(1u, resource_provider_->num_resources()); |
ASSERT_EQ(1u, returned_to_child.size()); |
- if (GetParam() == ResourceProvider::GLTexture) { |
+ if (GetParam() == ResourceProvider::GLTexture) |
EXPECT_NE(0u, returned_to_child[0].sync_point); |
- } |
EXPECT_FALSE(returned_to_child[0].lost); |
returned_to_child.clear(); |
@@ -1378,9 +1405,6 @@ TEST_P(ResourceProviderTest, DestroyChildWithExportedResources) { |
// lost at this point, and returned. |
resource_provider_.reset(); |
ASSERT_EQ(1u, returned_to_child.size()); |
- if (GetParam() == ResourceProvider::GLTexture) { |
- EXPECT_NE(0u, returned_to_child[0].sync_point); |
- } |
EXPECT_TRUE(returned_to_child[0].lost); |
} |
} |
@@ -1414,6 +1438,8 @@ TEST_P(ResourceProviderTest, DeleteTransferredResources) { |
resource_provider_->ReceiveFromChild(child_id, list); |
resource_provider_->DeclareUsedResourcesFromChild(child_id, |
resource_ids_to_transfer); |
+ if (GetParam() == ResourceProvider::GLTexture) |
+ ForceUseChildTextures(resource_provider_.get(), child_id, list); |
} |
// Delete textures in the child, while they are transfered. |
@@ -1541,10 +1567,12 @@ class ResourceProviderTestTextureFilters : public ResourceProviderTest { |
ASSERT_EQ(1u, list.size()); |
EXPECT_EQ(static_cast<unsigned>(child_filter), list[0].filter); |
+ parent_resource_provider->ReceiveFromChild(child_id, list); |
+ |
EXPECT_CALL(*parent_context, |
bindTexture(GL_TEXTURE_2D, parent_texture_id)); |
EXPECT_CALL(*parent_context, consumeTextureCHROMIUM(GL_TEXTURE_2D, _)); |
- parent_resource_provider->ReceiveFromChild(child_id, list); |
+ ForceUseChildTextures(parent_resource_provider.get(), child_id, list); |
Mock::VerifyAndClearExpectations(parent_context); |
parent_resource_provider->DeclareUsedResourcesFromChild( |
@@ -1660,19 +1688,22 @@ TEST_P(ResourceProviderTest, TransferMailboxResources) { |
EXPECT_EQ(0, memcmp(data, test_data, sizeof(data))); |
context()->produceTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); |
context()->deleteTexture(other_texture); |
- list[0].sync_point = context()->insertSyncPoint(); |
- EXPECT_LT(0u, list[0].sync_point); |
+ unsigned return_sync_point = context()->insertSyncPoint(); |
+ EXPECT_LT(0u, return_sync_point); |
// Receive the resource, then delete it, expect the sync points to be |
// consistent. |
ReturnedResourceArray returned; |
TransferableResource::ReturnResources(list, &returned); |
+ EXPECT_EQ(1u, returned.size()); |
+ returned[0].sync_point = return_sync_point; |
+ |
resource_provider_->ReceiveReturnsFromParent(returned); |
EXPECT_EQ(1u, context()->NumTextures()); |
EXPECT_EQ(0u, release_sync_point); |
resource_provider_->DeleteResource(resource); |
- EXPECT_LE(list[0].sync_point, release_sync_point); |
+ EXPECT_LE(returned[0].sync_point, release_sync_point); |
EXPECT_FALSE(lost_resource); |
} |
@@ -1708,8 +1739,8 @@ TEST_P(ResourceProviderTest, TransferMailboxResources) { |
EXPECT_EQ(0, memcmp(data, test_data, sizeof(data))); |
context()->produceTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); |
context()->deleteTexture(other_texture); |
- list[0].sync_point = context()->insertSyncPoint(); |
- EXPECT_LT(0u, list[0].sync_point); |
+ unsigned return_sync_point = context()->insertSyncPoint(); |
+ EXPECT_LT(0u, return_sync_point); |
// Delete the resource, which shouldn't do anything. |
resource_provider_->DeleteResource(resource); |
@@ -1720,6 +1751,9 @@ TEST_P(ResourceProviderTest, TransferMailboxResources) { |
// sync points to be consistent. |
ReturnedResourceArray returned; |
TransferableResource::ReturnResources(list, &returned); |
+ EXPECT_EQ(1u, returned.size()); |
+ returned[0].sync_point = return_sync_point; |
+ |
resource_provider_->ReceiveReturnsFromParent(returned); |
EXPECT_LE(list[0].sync_point, release_sync_point); |
EXPECT_FALSE(lost_resource); |
@@ -1983,12 +2017,17 @@ TEST_P(ResourceProviderTest, Shutdown) { |
bool lost_resource = false; |
bool release_called = false; |
unsigned sync_point = 0; |
- CreateChildMailbox( |
+ ResourceProvider::ResourceId resource = CreateChildMailbox( |
&release_sync_point, &lost_resource, &release_called, &sync_point); |
EXPECT_EQ(0u, release_sync_point); |
EXPECT_FALSE(lost_resource); |
+ if (GetParam() == ResourceProvider::GLTexture) { |
+ ResourceProvider::ScopedReadLockGL lock(child_resource_provider_.get(), |
+ resource); |
+ } |
+ |
child_resource_provider_.reset(); |
if (GetParam() == ResourceProvider::GLTexture) { |
@@ -2040,17 +2079,21 @@ TEST_P(ResourceProviderTest, LostContext) { |
bool lost_resource = false; |
scoped_ptr<SingleReleaseCallback> callback = SingleReleaseCallback::Create( |
base::Bind(ReleaseTextureMailbox, &release_sync_point, &lost_resource)); |
- resource_provider_->CreateResourceFromTextureMailbox( |
- TextureMailbox(mailbox, sync_point), |
- callback.Pass()); |
+ ResourceProvider::ResourceId resource = |
+ resource_provider_->CreateResourceFromTextureMailbox( |
+ TextureMailbox(mailbox, sync_point), callback.Pass()); |
EXPECT_EQ(0u, release_sync_point); |
EXPECT_FALSE(lost_resource); |
+ if (GetParam() == ResourceProvider::GLTexture) { |
+ ResourceProvider::ScopedReadLockGL lock(resource_provider_.get(), resource); |
+ } |
+ |
resource_provider_->DidLoseOutputSurface(); |
resource_provider_.reset(); |
- EXPECT_LE(sync_point, release_sync_point); |
+ EXPECT_EQ(0u, release_sync_point); |
EXPECT_TRUE(lost_resource); |
} |