| Index: cc/resources/resource_provider.cc
|
| diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc
|
| index 58603548d6f34bde24d24ea5168913100bba72ca..40744177e36a1aa5d2c7229a575e727f3c9d9e50 100644
|
| --- a/cc/resources/resource_provider.cc
|
| +++ b/cc/resources/resource_provider.cc
|
| @@ -180,6 +180,7 @@ ResourceProvider::Resource::Resource()
|
| set_pixels_completion_forced(false),
|
| allocated(false),
|
| enable_read_lock_fences(false),
|
| + sync_point_is_from_client(false),
|
| read_lock_fence(NULL),
|
| size(),
|
| target(0),
|
| @@ -222,6 +223,7 @@ ResourceProvider::Resource::Resource(unsigned texture_id,
|
| set_pixels_completion_forced(false),
|
| allocated(false),
|
| enable_read_lock_fences(false),
|
| + sync_point_is_from_client(false),
|
| read_lock_fence(NULL),
|
| size(size),
|
| target(target),
|
| @@ -261,6 +263,7 @@ ResourceProvider::Resource::Resource(uint8_t* pixels,
|
| set_pixels_completion_forced(false),
|
| allocated(false),
|
| enable_read_lock_fences(false),
|
| + sync_point_is_from_client(false),
|
| read_lock_fence(NULL),
|
| size(size),
|
| target(0),
|
| @@ -481,6 +484,7 @@ ResourceProvider::ResourceId ResourceProvider::CreateResourceFromTextureMailbox(
|
| resource.external = true;
|
| resource.allocated = true;
|
| resource.mailbox = mailbox;
|
| + resource.sync_point_is_from_client = true;
|
| resource.release_callback =
|
| base::Bind(&SingleReleaseCallback::Run,
|
| base::Owned(release_callback.release()));
|
| @@ -538,14 +542,18 @@ void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it,
|
| }
|
| if (resource->mailbox.IsValid() && resource->external) {
|
| unsigned sync_point = resource->mailbox.sync_point();
|
| + if (resource->sync_point_is_from_client)
|
| + sync_point = 0;
|
| if (resource->mailbox.IsTexture()) {
|
| lost_resource |= lost_output_surface_;
|
| WebGraphicsContext3D* context3d = Context3d();
|
| DCHECK(context3d);
|
| if (resource->gl_id)
|
| GLC(context3d, context3d->deleteTexture(resource->gl_id));
|
| - if (!lost_resource && resource->gl_id)
|
| + if (!lost_resource && resource->gl_id) {
|
| + DCHECK(!sync_point);
|
| sync_point = context3d->insertSyncPoint();
|
| + }
|
| } else {
|
| DCHECK(resource->mailbox.IsSharedMemory());
|
| base::SharedMemory* shared_memory = resource->mailbox.shared_memory();
|
| @@ -709,23 +717,21 @@ const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) {
|
| // Uninitialized! Call SetPixels or LockForWrite first.
|
| DCHECK(resource->allocated);
|
|
|
| - LazyCreate(resource);
|
| -
|
| - if (resource->external) {
|
| - if (!resource->gl_id && resource->mailbox.IsTexture()) {
|
| - WebGraphicsContext3D* context3d = Context3d();
|
| - DCHECK(context3d);
|
| - if (resource->mailbox.sync_point()) {
|
| - GLC(context3d,
|
| - context3d->waitSyncPoint(resource->mailbox.sync_point()));
|
| - resource->mailbox.ResetSyncPoint();
|
| - }
|
| - resource->gl_id = texture_id_allocator_->NextId();
|
| - GLC(context3d, context3d->bindTexture(resource->target, resource->gl_id));
|
| - GLC(context3d,
|
| - context3d->consumeTextureCHROMIUM(resource->target,
|
| - resource->mailbox.data()));
|
| + if (!resource->gl_id && resource->mailbox.IsTexture()) {
|
| + WebGraphicsContext3D* context3d = Context3d();
|
| + DCHECK(context3d);
|
| + resource->sync_point_is_from_client = false;
|
| + if (resource->mailbox.sync_point()) {
|
| + GLC(context3d, context3d->waitSyncPoint(resource->mailbox.sync_point()));
|
| + resource->mailbox.ResetSyncPoint();
|
| }
|
| + resource->gl_id = texture_id_allocator_->NextId();
|
| + GLC(context3d, context3d->bindTexture(resource->target, resource->gl_id));
|
| + GLC(context3d,
|
| + context3d->consumeTextureCHROMIUM(resource->target,
|
| + resource->mailbox.data()));
|
| + } else {
|
| + LazyCreate(resource);
|
| }
|
|
|
| resource->lock_for_read_count++;
|
| @@ -753,6 +759,7 @@ const ResourceProvider::Resource* ResourceProvider::LockForWrite(
|
| DCHECK(ReadLockFenceHasPassed(resource));
|
| LazyAllocate(resource);
|
|
|
| + resource->mailbox.ResetSyncPoint();
|
| resource->locked_for_write = true;
|
| return resource;
|
| }
|
| @@ -1071,20 +1078,7 @@ void ResourceProvider::ReceiveFromChild(
|
| resource = Resource(
|
| pixels, bitmap.release(), it->size, GL_LINEAR, GL_CLAMP_TO_EDGE);
|
| } else {
|
| - unsigned texture_id;
|
| - // NOTE: If the parent is a browser and the child a renderer, the parent
|
| - // is not supposed to have its context wait, because that could induce
|
| - // deadlocks and/or security issues. The caller is responsible for
|
| - // waiting asynchronously, and resetting sync_point before calling this.
|
| - // However if the parent is a renderer (e.g. browser tag), it may be ok
|
| - // (and is simpler) to wait.
|
| - if (it->sync_point)
|
| - GLC(context3d, context3d->waitSyncPoint(it->sync_point));
|
| - texture_id = texture_id_allocator_->NextId();
|
| - GLC(context3d, context3d->bindTexture(it->target, texture_id));
|
| - GLC(context3d,
|
| - context3d->consumeTextureCHROMIUM(it->target, it->mailbox.name));
|
| - resource = Resource(texture_id,
|
| + resource = Resource(0,
|
| it->size,
|
| it->target,
|
| it->filter,
|
| @@ -1092,7 +1086,8 @@ void ResourceProvider::ReceiveFromChild(
|
| GL_CLAMP_TO_EDGE,
|
| TextureUsageAny,
|
| it->format);
|
| - resource.mailbox.SetName(it->mailbox);
|
| + resource.mailbox = TextureMailbox(it->mailbox, it->sync_point);
|
| + resource.sync_point_is_from_client = true;
|
| }
|
| resource.child_id = child;
|
| // Don't allocate a texture for a child.
|
| @@ -1191,12 +1186,16 @@ void ResourceProvider::ReceiveReturnsFromParent(
|
| if (resource->exported_count)
|
| continue;
|
|
|
| - if (resource->gl_id) {
|
| - if (returned.sync_point)
|
| + if (returned.sync_point) {
|
| + DCHECK(!resource->shared_bitmap);
|
| + resource->sync_point_is_from_client = false;
|
| + if (resource->gl_id) {
|
| GLC(context3d, context3d->waitSyncPoint(returned.sync_point));
|
| - } else if (!resource->shared_bitmap) {
|
| - resource->mailbox =
|
| - TextureMailbox(resource->mailbox.name(), returned.sync_point);
|
| + resource->mailbox.ResetSyncPoint();
|
| + } else {
|
| + resource->mailbox =
|
| + TextureMailbox(resource->mailbox.name(), returned.sync_point);
|
| + }
|
| }
|
|
|
| if (!resource->marked_for_deletion)
|
| @@ -1266,7 +1265,6 @@ void ResourceProvider::TransferResource(WebGraphicsContext3D* context,
|
| // already exported. Make sure to forward the sync point that we were given.
|
| resource->mailbox = source->mailbox.name();
|
| resource->sync_point = source->mailbox.sync_point();
|
| - source->mailbox.ResetSyncPoint();
|
| }
|
| }
|
|
|
| @@ -1333,9 +1331,11 @@ void ResourceProvider::DeleteAndReturnUnusedResourcesToChild(
|
|
|
| ReturnedResource returned;
|
| returned.id = child_id;
|
| - returned.sync_point = resource.mailbox.sync_point();
|
| - if (!returned.sync_point && !resource.shared_bitmap)
|
| - need_sync_point = true;
|
| + if (!resource.sync_point_is_from_client) {
|
| + returned.sync_point = resource.mailbox.sync_point();
|
| + if (!returned.sync_point && !resource.shared_bitmap)
|
| + need_sync_point = true;
|
| + }
|
| returned.count = resource.imported_count;
|
| returned.lost = is_lost;
|
| to_return.push_back(returned);
|
|
|