Commit ccfc7a81 authored by reveman@chromium.org's avatar reveman@chromium.org

cc: Add zero-copy texture update support to delegating renderer.

This adds necessary BindTexImage/ReleaseTexImage calls to
ResourceProvider::TransferResource.

BUG=334747

Review URL: https://codereview.chromium.org/132873006

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@245460 0039d316-1c4b-4281-b951-d872f2087c98
parent f5d6d24a
...@@ -1194,6 +1194,11 @@ void ResourceProvider::ReceiveReturnsFromParent( ...@@ -1194,6 +1194,11 @@ void ResourceProvider::ReceiveReturnsFromParent(
if (resource->exported_count) if (resource->exported_count)
continue; continue;
// Need to wait for the current read lock fence to pass before we can
// recycle this resource.
if (resource->enable_read_lock_fences)
resource->read_lock_fence = current_read_lock_fence_;
if (resource->gl_id) { if (resource->gl_id) {
if (returned.sync_point) if (returned.sync_point)
GLC(gl, gl->WaitSyncPointCHROMIUM(returned.sync_point)); GLC(gl, gl->WaitSyncPointCHROMIUM(returned.sync_point));
...@@ -1255,16 +1260,26 @@ void ResourceProvider::TransferResource(GLES2Interface* gl, ...@@ -1255,16 +1260,26 @@ void ResourceProvider::TransferResource(GLES2Interface* gl,
resource->mailbox = source->shared_bitmap->id(); resource->mailbox = source->shared_bitmap->id();
resource->is_software = true; resource->is_software = true;
} else if (!source->mailbox.IsValid()) { } else if (!source->mailbox.IsValid()) {
// This is a resource allocated by the compositor, we need to produce it. LazyCreate(source);
// Don't set a sync point, the caller will do it.
DCHECK(source->gl_id); DCHECK(source->gl_id);
GLC(gl, gl->BindTexture(resource->target, source->gl_id)); GLC(gl, gl->BindTexture(resource->target, source->gl_id));
if (source->image_id) {
DCHECK(source->dirty_image);
BindImageForSampling(source);
}
// This is a resource allocated by the compositor, we need to produce it.
// Don't set a sync point, the caller will do it.
GLC(gl, gl->GenMailboxCHROMIUM(resource->mailbox.name)); GLC(gl, gl->GenMailboxCHROMIUM(resource->mailbox.name));
GLC(gl, GLC(gl,
gl->ProduceTextureCHROMIUM(resource->target, resource->mailbox.name)); gl->ProduceTextureCHROMIUM(resource->target, resource->mailbox.name));
source->mailbox.SetName(resource->mailbox); source->mailbox.SetName(resource->mailbox);
} else { } else {
DCHECK(source->mailbox.IsTexture()); DCHECK(source->mailbox.IsTexture());
if (source->image_id && source->dirty_image) {
DCHECK(source->gl_id);
GLC(gl, gl->BindTexture(resource->target, source->gl_id));
BindImageForSampling(source);
}
// This is either an external resource, or a compositor resource that we // This is either an external resource, or a compositor resource that we
// already exported. Make sure to forward the sync point that we were given. // already exported. Make sure to forward the sync point that we were given.
resource->mailbox = source->mailbox.name(); resource->mailbox = source->mailbox.name();
...@@ -1497,14 +1512,8 @@ GLenum ResourceProvider::BindForSampling( ...@@ -1497,14 +1512,8 @@ GLenum ResourceProvider::BindForSampling(
resource->filter = filter; resource->filter = filter;
} }
if (resource->image_id && resource->dirty_image) { if (resource->image_id && resource->dirty_image)
// Release image currently bound to texture. BindImageForSampling(resource);
if (resource->bound_image_id)
gl->ReleaseTexImage2DCHROMIUM(target, resource->bound_image_id);
gl->BindTexImage2DCHROMIUM(target, resource->image_id);
resource->bound_image_id = resource->image_id;
resource->dirty_image = false;
}
return target; return target;
} }
...@@ -1628,6 +1637,8 @@ void ResourceProvider::LazyCreate(Resource* resource) { ...@@ -1628,6 +1637,8 @@ void ResourceProvider::LazyCreate(Resource* resource) {
if (resource->texture_pool == 0) if (resource->texture_pool == 0)
return; return;
DCHECK(!resource->external);
DCHECK(!resource->mailbox.IsValid());
resource->gl_id = texture_id_allocator_->NextId(); resource->gl_id = texture_id_allocator_->NextId();
GLES2Interface* gl = ContextGL(); GLES2Interface* gl = ContextGL();
...@@ -1696,6 +1707,19 @@ void ResourceProvider::LazyAllocate(Resource* resource) { ...@@ -1696,6 +1707,19 @@ void ResourceProvider::LazyAllocate(Resource* resource) {
} }
} }
void ResourceProvider::BindImageForSampling(Resource* resource) {
GLES2Interface* gl = ContextGL();
DCHECK(resource->gl_id);
DCHECK(resource->image_id);
// Release image currently bound to texture.
if (resource->bound_image_id)
gl->ReleaseTexImage2DCHROMIUM(resource->target, resource->bound_image_id);
gl->BindTexImage2DCHROMIUM(resource->target, resource->image_id);
resource->bound_image_id = resource->image_id;
resource->dirty_image = false;
}
void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id, void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id,
bool enable) { bool enable) {
Resource* resource = GetResource(id); Resource* resource = GetResource(id);
......
...@@ -469,6 +469,7 @@ class CC_EXPORT ResourceProvider { ...@@ -469,6 +469,7 @@ class CC_EXPORT ResourceProvider {
void DestroyChildInternal(ChildMap::iterator it, DeleteStyle style); void DestroyChildInternal(ChildMap::iterator it, DeleteStyle style);
void LazyCreate(Resource* resource); void LazyCreate(Resource* resource);
void LazyAllocate(Resource* resource); void LazyAllocate(Resource* resource);
void BindImageForSampling(Resource* resource);
// Binds the given GL resource to a texture target for sampling using the // Binds the given GL resource to a texture target for sampling using the
// specified filter for both minification and magnification. Returns the // specified filter for both minification and magnification. Returns the
......
...@@ -647,6 +647,12 @@ TEST_P(ResourceProviderTest, TransferGLResources) { ...@@ -647,6 +647,12 @@ TEST_P(ResourceProviderTest, TransferGLResources) {
uint8_t data2[4] = { 5, 5, 5, 5 }; uint8_t data2[4] = { 5, 5, 5, 5 };
child_resource_provider_->SetPixels(id2, data2, rect, rect, gfx::Vector2d()); 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(); GLuint external_texture_id = child_context_->createExternalTexture();
child_context_->bindTexture(GL_TEXTURE_EXTERNAL_OES, external_texture_id); child_context_->bindTexture(GL_TEXTURE_EXTERNAL_OES, external_texture_id);
...@@ -655,7 +661,7 @@ TEST_P(ResourceProviderTest, TransferGLResources) { ...@@ -655,7 +661,7 @@ TEST_P(ResourceProviderTest, TransferGLResources) {
child_context_->produceTextureCHROMIUM(GL_TEXTURE_EXTERNAL_OES, child_context_->produceTextureCHROMIUM(GL_TEXTURE_EXTERNAL_OES,
external_mailbox.name); external_mailbox.name);
const unsigned external_sync_point = child_context_->insertSyncPoint(); const unsigned external_sync_point = child_context_->insertSyncPoint();
ResourceProvider::ResourceId id3 = ResourceProvider::ResourceId id4 =
child_resource_provider_->CreateResourceFromTextureMailbox( child_resource_provider_->CreateResourceFromTextureMailbox(
TextureMailbox( TextureMailbox(
external_mailbox, GL_TEXTURE_EXTERNAL_OES, external_sync_point), external_mailbox, GL_TEXTURE_EXTERNAL_OES, external_sync_point),
...@@ -670,36 +676,43 @@ TEST_P(ResourceProviderTest, TransferGLResources) { ...@@ -670,36 +676,43 @@ TEST_P(ResourceProviderTest, TransferGLResources) {
resource_ids_to_transfer.push_back(id1); resource_ids_to_transfer.push_back(id1);
resource_ids_to_transfer.push_back(id2); resource_ids_to_transfer.push_back(id2);
resource_ids_to_transfer.push_back(id3); resource_ids_to_transfer.push_back(id3);
resource_ids_to_transfer.push_back(id4);
TransferableResourceArray list; TransferableResourceArray list;
child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer,
&list); &list);
ASSERT_EQ(3u, list.size()); ASSERT_EQ(4u, list.size());
EXPECT_NE(0u, list[0].sync_point); EXPECT_NE(0u, list[0].sync_point);
EXPECT_NE(0u, list[1].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[0].target);
EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[1].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(id1));
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2));
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3));
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id4));
resource_provider_->ReceiveFromChild(child_id, list); resource_provider_->ReceiveFromChild(child_id, list);
resource_provider_->DeclareUsedResourcesFromChild(child_id, resource_provider_->DeclareUsedResourcesFromChild(child_id,
resource_ids_to_transfer); resource_ids_to_transfer);
} }
EXPECT_EQ(3u, resource_provider_->num_resources()); EXPECT_EQ(4u, resource_provider_->num_resources());
ResourceProvider::ResourceIdMap resource_map = ResourceProvider::ResourceIdMap resource_map =
resource_provider_->GetChildToParentMap(child_id); resource_provider_->GetChildToParentMap(child_id);
ResourceProvider::ResourceId mapped_id1 = resource_map[id1]; ResourceProvider::ResourceId mapped_id1 = resource_map[id1];
ResourceProvider::ResourceId mapped_id2 = resource_map[id2]; ResourceProvider::ResourceId mapped_id2 = resource_map[id2];
ResourceProvider::ResourceId mapped_id3 = resource_map[id3]; ResourceProvider::ResourceId mapped_id3 = resource_map[id3];
ResourceProvider::ResourceId mapped_id4 = resource_map[id4];
EXPECT_NE(0u, mapped_id1); EXPECT_NE(0u, mapped_id1);
EXPECT_NE(0u, mapped_id2); EXPECT_NE(0u, mapped_id2);
EXPECT_NE(0u, mapped_id3); EXPECT_NE(0u, mapped_id3);
EXPECT_NE(0u, mapped_id4);
EXPECT_FALSE(resource_provider_->InUseByConsumer(id1)); EXPECT_FALSE(resource_provider_->InUseByConsumer(id1));
EXPECT_FALSE(resource_provider_->InUseByConsumer(id2)); EXPECT_FALSE(resource_provider_->InUseByConsumer(id2));
EXPECT_FALSE(resource_provider_->InUseByConsumer(id3)); EXPECT_FALSE(resource_provider_->InUseByConsumer(id3));
EXPECT_FALSE(resource_provider_->InUseByConsumer(id4));
uint8_t result[4] = { 0 }; uint8_t result[4] = { 0 };
GetResourcePixels( GetResourcePixels(
...@@ -715,18 +728,26 @@ TEST_P(ResourceProviderTest, TransferGLResources) { ...@@ -715,18 +728,26 @@ TEST_P(ResourceProviderTest, TransferGLResources) {
// parent works. // parent works.
ResourceProvider::ResourceIdArray resource_ids_to_transfer; ResourceProvider::ResourceIdArray resource_ids_to_transfer;
resource_ids_to_transfer.push_back(id1); resource_ids_to_transfer.push_back(id1);
resource_ids_to_transfer.push_back(id2);
resource_ids_to_transfer.push_back(id3);
TransferableResourceArray list; TransferableResourceArray list;
child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer,
&list); &list);
EXPECT_EQ(1u, list.size()); EXPECT_EQ(3u, list.size());
EXPECT_EQ(id1, list[0].id); 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[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; ReturnedResourceArray returned;
TransferableResource::ReturnResources(list, &returned); TransferableResource::ReturnResources(list, &returned);
child_resource_provider_->ReceiveReturnsFromParent(returned); child_resource_provider_->ReceiveReturnsFromParent(returned);
// id1 was exported twice, we returned it only once, it should still be // ids were exported twice, we returned them only once, they should still
// in-use. // be in-use.
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); 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()); EXPECT_EQ(0u, returned_to_child.size());
...@@ -736,19 +757,22 @@ TEST_P(ResourceProviderTest, TransferGLResources) { ...@@ -736,19 +757,22 @@ TEST_P(ResourceProviderTest, TransferGLResources) {
ResourceProvider::ResourceIdArray no_resources; ResourceProvider::ResourceIdArray no_resources;
resource_provider_->DeclareUsedResourcesFromChild(child_id, 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[0].sync_point);
EXPECT_NE(0u, returned_to_child[1].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[2].sync_point);
EXPECT_NE(0u, returned_to_child[3].sync_point);
EXPECT_FALSE(returned_to_child[0].lost); EXPECT_FALSE(returned_to_child[0].lost);
EXPECT_FALSE(returned_to_child[1].lost); EXPECT_FALSE(returned_to_child[1].lost);
EXPECT_FALSE(returned_to_child[2].lost); EXPECT_FALSE(returned_to_child[2].lost);
EXPECT_FALSE(returned_to_child[3].lost);
child_resource_provider_->ReceiveReturnsFromParent(returned_to_child); child_resource_provider_->ReceiveReturnsFromParent(returned_to_child);
returned_to_child.clear(); returned_to_child.clear();
} }
EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id1)); EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id1));
EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id2)); EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id2));
EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id3)); EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id3));
EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id4));
{ {
ResourceProvider::ScopedReadLockGL lock(child_resource_provider_.get(), ResourceProvider::ScopedReadLockGL lock(child_resource_provider_.get(),
...@@ -766,28 +790,39 @@ TEST_P(ResourceProviderTest, TransferGLResources) { ...@@ -766,28 +790,39 @@ TEST_P(ResourceProviderTest, TransferGLResources) {
child_context_->GetPixels(size, format, result); child_context_->GetPixels(size, format, result);
EXPECT_EQ(0, memcmp(data2, result, pixel_size)); 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. // Transfer resources to the parent again.
ResourceProvider::ResourceIdArray resource_ids_to_transfer; ResourceProvider::ResourceIdArray resource_ids_to_transfer;
resource_ids_to_transfer.push_back(id1); resource_ids_to_transfer.push_back(id1);
resource_ids_to_transfer.push_back(id2); resource_ids_to_transfer.push_back(id2);
resource_ids_to_transfer.push_back(id3); resource_ids_to_transfer.push_back(id3);
resource_ids_to_transfer.push_back(id4);
TransferableResourceArray list; TransferableResourceArray list;
child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer,
&list); &list);
ASSERT_EQ(3u, list.size()); ASSERT_EQ(4u, list.size());
EXPECT_EQ(id1, list[0].id); EXPECT_EQ(id1, list[0].id);
EXPECT_EQ(id2, list[1].id); EXPECT_EQ(id2, list[1].id);
EXPECT_EQ(id3, list[2].id); EXPECT_EQ(id3, list[2].id);
EXPECT_EQ(id4, list[3].id);
EXPECT_NE(0u, list[0].sync_point); EXPECT_NE(0u, list[0].sync_point);
EXPECT_NE(0u, list[1].sync_point); EXPECT_NE(0u, list[1].sync_point);
EXPECT_NE(0u, list[2].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[0].target);
EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), list[1].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(id1));
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2));
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3));
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id4));
resource_provider_->ReceiveFromChild(child_id, list); resource_provider_->ReceiveFromChild(child_id, list);
resource_provider_->DeclareUsedResourcesFromChild(child_id, resource_provider_->DeclareUsedResourcesFromChild(child_id,
resource_ids_to_transfer); resource_ids_to_transfer);
...@@ -795,17 +830,19 @@ TEST_P(ResourceProviderTest, TransferGLResources) { ...@@ -795,17 +830,19 @@ TEST_P(ResourceProviderTest, TransferGLResources) {
EXPECT_EQ(0u, returned_to_child.size()); 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); resource_provider_->DestroyChild(child_id);
EXPECT_EQ(0u, resource_provider_->num_resources()); 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[0].sync_point);
EXPECT_NE(0u, returned_to_child[1].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[2].sync_point);
EXPECT_NE(0u, returned_to_child[3].sync_point);
EXPECT_FALSE(returned_to_child[0].lost); EXPECT_FALSE(returned_to_child[0].lost);
EXPECT_FALSE(returned_to_child[1].lost); EXPECT_FALSE(returned_to_child[1].lost);
EXPECT_FALSE(returned_to_child[2].lost); EXPECT_FALSE(returned_to_child[2].lost);
EXPECT_FALSE(returned_to_child[3].lost);
} }
TEST_P(ResourceProviderTest, TransferSoftwareResources) { TEST_P(ResourceProviderTest, TransferSoftwareResources) {
...@@ -828,10 +865,18 @@ TEST_P(ResourceProviderTest, TransferSoftwareResources) { ...@@ -828,10 +865,18 @@ TEST_P(ResourceProviderTest, TransferSoftwareResources) {
uint8_t data2[4] = { 5, 5, 5, 5 }; uint8_t data2[4] = { 5, 5, 5, 5 };
child_resource_provider_->SetPixels(id2, data2, rect, rect, gfx::Vector2d()); 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()); scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory());
shared_memory->CreateAndMapAnonymous(1); shared_memory->CreateAndMapAnonymous(1);
base::SharedMemory* shared_memory_ptr = shared_memory.get(); base::SharedMemory* shared_memory_ptr = shared_memory.get();
ResourceProvider::ResourceId id3 = ResourceProvider::ResourceId id4 =
child_resource_provider_->CreateResourceFromTextureMailbox( child_resource_provider_->CreateResourceFromTextureMailbox(
TextureMailbox(shared_memory_ptr, gfx::Size(1, 1)), TextureMailbox(shared_memory_ptr, gfx::Size(1, 1)),
SingleReleaseCallback::Create(base::Bind( SingleReleaseCallback::Create(base::Bind(
...@@ -846,33 +891,39 @@ TEST_P(ResourceProviderTest, TransferSoftwareResources) { ...@@ -846,33 +891,39 @@ TEST_P(ResourceProviderTest, TransferSoftwareResources) {
resource_ids_to_transfer.push_back(id1); resource_ids_to_transfer.push_back(id1);
resource_ids_to_transfer.push_back(id2); resource_ids_to_transfer.push_back(id2);
resource_ids_to_transfer.push_back(id3); resource_ids_to_transfer.push_back(id3);
resource_ids_to_transfer.push_back(id4);
TransferableResourceArray list; TransferableResourceArray list;
child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer,
&list); &list);
ASSERT_EQ(3u, list.size()); ASSERT_EQ(4u, list.size());
EXPECT_EQ(0u, list[0].sync_point); EXPECT_EQ(0u, list[0].sync_point);
EXPECT_EQ(0u, list[1].sync_point); EXPECT_EQ(0u, list[1].sync_point);
EXPECT_EQ(0u, list[2].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(id1));
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2));
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3));
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id4));
resource_provider_->ReceiveFromChild(child_id, list); resource_provider_->ReceiveFromChild(child_id, list);
resource_provider_->DeclareUsedResourcesFromChild(child_id, resource_provider_->DeclareUsedResourcesFromChild(child_id,
resource_ids_to_transfer); resource_ids_to_transfer);
} }
EXPECT_EQ(3u, resource_provider_->num_resources()); EXPECT_EQ(4u, resource_provider_->num_resources());
ResourceProvider::ResourceIdMap resource_map = ResourceProvider::ResourceIdMap resource_map =
resource_provider_->GetChildToParentMap(child_id); resource_provider_->GetChildToParentMap(child_id);
ResourceProvider::ResourceId mapped_id1 = resource_map[id1]; ResourceProvider::ResourceId mapped_id1 = resource_map[id1];
ResourceProvider::ResourceId mapped_id2 = resource_map[id2]; ResourceProvider::ResourceId mapped_id2 = resource_map[id2];
ResourceProvider::ResourceId mapped_id3 = resource_map[id3]; ResourceProvider::ResourceId mapped_id3 = resource_map[id3];
ResourceProvider::ResourceId mapped_id4 = resource_map[id4];
EXPECT_NE(0u, mapped_id1); EXPECT_NE(0u, mapped_id1);
EXPECT_NE(0u, mapped_id2); EXPECT_NE(0u, mapped_id2);
EXPECT_NE(0u, mapped_id3); EXPECT_NE(0u, mapped_id3);
EXPECT_NE(0u, mapped_id4);
EXPECT_FALSE(resource_provider_->InUseByConsumer(id1)); EXPECT_FALSE(resource_provider_->InUseByConsumer(id1));
EXPECT_FALSE(resource_provider_->InUseByConsumer(id2)); EXPECT_FALSE(resource_provider_->InUseByConsumer(id2));
EXPECT_FALSE(resource_provider_->InUseByConsumer(id3)); EXPECT_FALSE(resource_provider_->InUseByConsumer(id3));
EXPECT_FALSE(resource_provider_->InUseByConsumer(id4));
uint8_t result[4] = { 0 }; uint8_t result[4] = { 0 };
GetResourcePixels( GetResourcePixels(
...@@ -883,22 +934,32 @@ TEST_P(ResourceProviderTest, TransferSoftwareResources) { ...@@ -883,22 +934,32 @@ TEST_P(ResourceProviderTest, TransferSoftwareResources) {
resource_provider_.get(), context(), mapped_id2, size, format, result); resource_provider_.get(), context(), mapped_id2, size, format, result);
EXPECT_EQ(0, memcmp(data2, result, pixel_size)); 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 // Check that transfering again the same resource from the child to the
// parent works. // parent works.
ResourceProvider::ResourceIdArray resource_ids_to_transfer; ResourceProvider::ResourceIdArray resource_ids_to_transfer;
resource_ids_to_transfer.push_back(id1); resource_ids_to_transfer.push_back(id1);
resource_ids_to_transfer.push_back(id2);
resource_ids_to_transfer.push_back(id3);
TransferableResourceArray list; TransferableResourceArray list;
child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer,
&list); &list);
EXPECT_EQ(1u, list.size()); EXPECT_EQ(3u, list.size());
EXPECT_EQ(id1, list[0].id); EXPECT_EQ(id1, list[0].id);
EXPECT_EQ(id2, list[1].id);
EXPECT_EQ(id3, list[2].id);
ReturnedResourceArray returned; ReturnedResourceArray returned;
TransferableResource::ReturnResources(list, &returned); TransferableResource::ReturnResources(list, &returned);
child_resource_provider_->ReceiveReturnsFromParent(returned); child_resource_provider_->ReceiveReturnsFromParent(returned);
// id1 was exported twice, we returned it only once, it should still be // ids were exported twice, we returned them only once, they should still
// in-use. // be in-use.
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); 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()); EXPECT_EQ(0u, returned_to_child.size());
...@@ -908,22 +969,26 @@ TEST_P(ResourceProviderTest, TransferSoftwareResources) { ...@@ -908,22 +969,26 @@ TEST_P(ResourceProviderTest, TransferSoftwareResources) {
ResourceProvider::ResourceIdArray no_resources; ResourceProvider::ResourceIdArray no_resources;
resource_provider_->DeclareUsedResourcesFromChild(child_id, 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[0].sync_point);
EXPECT_EQ(0u, returned_to_child[1].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[2].sync_point);
EXPECT_EQ(0u, returned_to_child[3].sync_point);
EXPECT_EQ(id1, returned_to_child[0].id); EXPECT_EQ(id1, returned_to_child[0].id);
EXPECT_EQ(id2, returned_to_child[1].id); EXPECT_EQ(id2, returned_to_child[1].id);
EXPECT_EQ(id3, returned_to_child[2].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[0].lost);
EXPECT_FALSE(returned_to_child[1].lost); EXPECT_FALSE(returned_to_child[1].lost);
EXPECT_FALSE(returned_to_child[2].lost); EXPECT_FALSE(returned_to_child[2].lost);
EXPECT_FALSE(returned_to_child[3].lost);
child_resource_provider_->ReceiveReturnsFromParent(returned_to_child); child_resource_provider_->ReceiveReturnsFromParent(returned_to_child);
returned_to_child.clear(); returned_to_child.clear();
} }
EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id1)); EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id1));
EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id2)); EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id2));
EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id3)); EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id3));
EXPECT_FALSE(child_resource_provider_->InUseByConsumer(id4));
{ {
ResourceProvider::ScopedReadLockSoftware lock( ResourceProvider::ScopedReadLockSoftware lock(
...@@ -941,22 +1006,33 @@ TEST_P(ResourceProviderTest, TransferSoftwareResources) { ...@@ -941,22 +1006,33 @@ TEST_P(ResourceProviderTest, TransferSoftwareResources) {
EXPECT_EQ(sk_bitmap->height(), size.height()); EXPECT_EQ(sk_bitmap->height(), size.height());
EXPECT_EQ(0, memcmp(data2, sk_bitmap->getPixels(), pixel_size)); 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. // Transfer resources to the parent again.
ResourceProvider::ResourceIdArray resource_ids_to_transfer; ResourceProvider::ResourceIdArray resource_ids_to_transfer;
resource_ids_to_transfer.push_back(id1); resource_ids_to_transfer.push_back(id1);
resource_ids_to_transfer.push_back(id2); resource_ids_to_transfer.push_back(id2);
resource_ids_to_transfer.push_back(id3); resource_ids_to_transfer.push_back(id3);
resource_ids_to_transfer.push_back(id4);
TransferableResourceArray list; TransferableResourceArray list;
child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer,
&list); &list);
ASSERT_EQ(3u, list.size()); ASSERT_EQ(4u, list.size());
EXPECT_EQ(id1, list[0].id); EXPECT_EQ(id1, list[0].id);
EXPECT_EQ(id2, list[1].id); EXPECT_EQ(id2, list[1].id);
EXPECT_EQ(id3, list[2].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(id1));
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2)); EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2));
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3)); EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id3));
EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id4));
resource_provider_->ReceiveFromChild(child_id, list); resource_provider_->ReceiveFromChild(child_id, list);
resource_provider_->DeclareUsedResourcesFromChild(child_id, resource_provider_->DeclareUsedResourcesFromChild(child_id,
resource_ids_to_transfer); resource_ids_to_transfer);
...@@ -964,20 +1040,23 @@ TEST_P(ResourceProviderTest, TransferSoftwareResources) { ...@@ -964,20 +1040,23 @@ TEST_P(ResourceProviderTest, TransferSoftwareResources) {
EXPECT_EQ(0u, returned_to_child.size()); 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); resource_provider_->DestroyChild(child_id);
EXPECT_EQ(0u, resource_provider_->num_resources()); 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[0].sync_point);
EXPECT_EQ(0u, returned_to_child[1].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[2].sync_point);
EXPECT_EQ(0u, returned_to_child[3].sync_point);
EXPECT_EQ(id1, returned_to_child[0].id); EXPECT_EQ(id1, returned_to_child[0].id);
EXPECT_EQ(id2, returned_to_child[1].id); EXPECT_EQ(id2, returned_to_child[1].id);
EXPECT_EQ(id3, returned_to_child[2].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[0].lost);
EXPECT_FALSE(returned_to_child[1].lost); EXPECT_FALSE(returned_to_child[1].lost);
EXPECT_FALSE(returned_to_child[2].lost); EXPECT_FALSE(returned_to_child[2].lost);
EXPECT_FALSE(returned_to_child[3].lost);
} }
TEST_P(ResourceProviderTest, TransferSoftwareToNonUber) { TEST_P(ResourceProviderTest, TransferSoftwareToNonUber) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment