Chromium Code Reviews| Index: cc/resources/resource_provider.cc |
| diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc |
| index 2e23f3018116be7098527fe16899249e37be1afb..5b2946c33bbbb0a8d32d6e01f4b82641764d4b62 100644 |
| --- a/cc/resources/resource_provider.cc |
| +++ b/cc/resources/resource_provider.cc |
| @@ -83,6 +83,7 @@ ResourceProvider::Resource::Resource() |
| enable_read_lock_fences(false), |
| read_lock_fence(NULL), |
| size(), |
| + shared_memory(NULL), |
| format(0), |
| filter(0), |
| image_id(0), |
| @@ -108,6 +109,7 @@ ResourceProvider::Resource::Resource( |
| enable_read_lock_fences(false), |
| read_lock_fence(NULL), |
| size(size), |
| + shared_memory(NULL), |
| format(format), |
| filter(filter), |
| image_id(0), |
| @@ -131,6 +133,7 @@ ResourceProvider::Resource::Resource( |
| enable_read_lock_fences(false), |
| read_lock_fence(NULL), |
| size(size), |
| + shared_memory(NULL), |
| format(format), |
| filter(filter), |
| image_id(0), |
| @@ -276,12 +279,21 @@ ResourceProvider::ResourceId ResourceProvider::CreateResourceFromTextureMailbox( |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| // Just store the information. Mailbox will be consumed in LockForRead(). |
| ResourceId id = next_id_++; |
| - unsigned texture_id = 0; |
| - Resource resource(texture_id, gfx::Size(), 0, GL_LINEAR); |
| - resource.external = true; |
| - resource.allocated = true; |
| - resource.mailbox = mailbox; |
| - resources_[id] = resource; |
| + if (mailbox.IsTexture()) { |
|
piman
2013/05/28 20:58:57
nit: I think we should DCHECK that the mailbox IsV
slavi
2013/05/29 18:31:48
Done.
|
| + unsigned texture_id = 0; |
| + Resource resource(texture_id, gfx::Size(), 0, GL_LINEAR); |
| + resource.external = true; |
| + resource.allocated = true; |
| + resource.mailbox = mailbox; |
| + resources_[id] = resource; |
| + } else if (mailbox.IsSharedMemory()) { |
| + uint8_t *pixels = NULL; |
| + Resource resource(pixels, mailbox.size(), 0, GL_LINEAR); |
| + resource.external = true; |
| + resource.allocated = true; |
| + resource.mailbox = mailbox; |
| + resources_[id] = resource; |
| + } |
| return id; |
| } |
| @@ -332,20 +344,30 @@ void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it, |
| DCHECK(context3d); |
| GLC(context3d, context3d->deleteBuffer(resource->gl_pixel_buffer_id)); |
| } |
| - if (!resource->mailbox.IsEmpty() && resource->external) { |
| - WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| - DCHECK(context3d); |
| + if (resource->mailbox.IsValid() && resource->external) { |
| unsigned sync_point = resource->mailbox.sync_point(); |
| - if (!lost_resource && resource->gl_id) { |
| - GLC(context3d, context3d->bindTexture( |
| - resource->mailbox.target(), resource->gl_id)); |
| - GLC(context3d, context3d->produceTextureCHROMIUM( |
| - resource->mailbox.target(), resource->mailbox.data())); |
| + if (resource->mailbox.IsTexture()) { |
| + WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| + DCHECK(context3d); |
| + if (!lost_resource && resource->gl_id) { |
| + GLC(context3d, context3d->bindTexture( |
| + resource->mailbox.target(), resource->gl_id)); |
| + GLC(context3d, context3d->produceTextureCHROMIUM( |
| + resource->mailbox.target(), resource->mailbox.data())); |
| + } |
| + if (resource->gl_id) |
| + GLC(context3d, context3d->deleteTexture(resource->gl_id)); |
| + if (!lost_resource && resource->gl_id) |
| + sync_point = context3d->insertSyncPoint(); |
| + } else { |
| + DCHECK(resource->mailbox.IsSharedMemory()); |
| + if (resource->shared_memory) { |
| + DCHECK(resource->shared_memory->memory() == resource->pixels); |
| + delete resource->shared_memory; |
| + resource->shared_memory = NULL; |
| + resource->pixels = NULL; |
| + } |
| } |
| - if (resource->gl_id) |
| - GLC(context3d, context3d->deleteTexture(resource->gl_id)); |
| - if (!lost_resource && resource->gl_id) |
| - sync_point = context3d->insertSyncPoint(); |
| resource->mailbox.RunReleaseCallback(sync_point, lost_resource); |
| } |
| if (resource->pixels) |
| @@ -487,18 +509,32 @@ const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) { |
| // Uninitialized! Call SetPixels or LockForWrite first. |
| DCHECK(resource->allocated); |
| - if (!resource->gl_id && resource->external && !resource->mailbox.IsEmpty()) { |
| - WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| - DCHECK(context3d); |
| - if (resource->mailbox.sync_point()) { |
| - GLC(context3d, context3d->waitSyncPoint(resource->mailbox.sync_point())); |
| - resource->mailbox.ResetSyncPoint(); |
| + if (resource->external) { |
| + if (!resource->gl_id && resource->mailbox.IsTexture()) { |
| + WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| + DCHECK(context3d); |
| + if (resource->mailbox.sync_point()) { |
| + GLC(context3d, |
| + context3d->waitSyncPoint(resource->mailbox.sync_point())); |
| + resource->mailbox.ResetSyncPoint(); |
| + } |
| + resource->gl_id = context3d->createTexture(); |
| + GLC(context3d, context3d->bindTexture( |
| + resource->mailbox.target(), resource->gl_id)); |
| + GLC(context3d, context3d->consumeTextureCHROMIUM( |
| + resource->mailbox.target(), resource->mailbox.data())); |
| + } else if (!resource->shared_memory && resource->mailbox.IsSharedMemory()) { |
| + CHECK(!resource->pixels); |
| + resource->size = resource->mailbox.size(); |
| + resource->shared_memory = new base::SharedMemory( |
| + resource->mailbox.handle(), false); |
| + const size_t size = 4 * resource->size.GetArea(); |
| + bool success = resource->shared_memory->Map(size); |
| + CHECK(success); |
| + resource->format = GL_RGBA; |
| + resource->pixels = |
| + reinterpret_cast<uint8_t*>(resource->shared_memory->memory()); |
| } |
| - resource->gl_id = context3d->createTexture(); |
| - GLC(context3d, context3d->bindTexture( |
| - resource->mailbox.target(), resource->gl_id)); |
| - GLC(context3d, context3d->consumeTextureCHROMIUM( |
| - resource->mailbox.target(), resource->mailbox.data())); |
| } |
| resource->lock_for_read_count++; |
| @@ -840,7 +876,7 @@ void ResourceProvider::ReceiveFromParent( |
| DCHECK(resource->exported); |
| resource->exported = false; |
| resource->filter = it->filter; |
| - DCHECK(resource->mailbox.Equals(it->mailbox)); |
| + DCHECK(resource->mailbox.Contains(it->mailbox)); |
| if (resource->gl_id) { |
| if (it->sync_point) |
| GLC(context3d, context3d->waitSyncPoint(it->sync_point)); |
| @@ -867,7 +903,7 @@ bool ResourceProvider::TransferResource(WebGraphicsContext3D* context, |
| Resource* source = &it->second; |
| DCHECK(!source->locked_for_write); |
| DCHECK(!source->lock_for_read_count); |
| - DCHECK(!source->external || (source->external && !source->mailbox.IsEmpty())); |
| + DCHECK(!source->external || (source->external && source->mailbox.IsValid())); |
| DCHECK(source->allocated); |
| if (source->exported) |
| return false; |
| @@ -876,7 +912,8 @@ bool ResourceProvider::TransferResource(WebGraphicsContext3D* context, |
| resource->filter = source->filter; |
| resource->size = source->size; |
| - if (source->mailbox.IsEmpty()) { |
| + // TODO(skaslev) Implement this path for shared memory resources. |
|
piman
2013/05/28 20:58:57
This needs to be at least a DCHECK or something. R
slavi
2013/05/29 18:31:48
Done.
|
| + if (!source->mailbox.IsTexture()) { |
| GLC(context3d, context3d->genMailboxCHROMIUM(resource->mailbox.name)); |
| source->mailbox.SetName(resource->mailbox); |
| } else { |