| Index: cc/resources/resource_provider.cc
|
| diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc
|
| index a2b6eec30de69f510f3de4cbf0598447baf4774a..d708314088b068f7e2a39c8dc44c2393bbe541e2 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,23 @@ 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;
|
| + DCHECK(mailbox.IsValid());
|
| + if (mailbox.IsTexture()) {
|
| + 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 {
|
| + DCHECK(mailbox.IsSharedMemory());
|
| + uint8_t *pixels = NULL;
|
| + Resource resource(pixels, mailbox.shared_memory_size(), 0, GL_LINEAR);
|
| + resource.external = true;
|
| + resource.allocated = true;
|
| + resource.mailbox = mailbox;
|
| + resources_[id] = resource;
|
| + }
|
| return id;
|
| }
|
|
|
| @@ -332,20 +346,32 @@ 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) {
|
| + if (resource->shared_memory->memory()) {
|
| + DCHECK(resource->shared_memory->memory() == resource->pixels);
|
| + resource->pixels = NULL;
|
| + }
|
| + delete resource->shared_memory;
|
| + resource->shared_memory = 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 +513,40 @@ 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 && resource->mailbox.IsValid()) {
|
| + bool is_texture_mailbox = resource->mailbox.IsTexture();
|
| + if (!resource->gl_id && is_texture_mailbox) {
|
| + 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 && !is_texture_mailbox) {
|
| + DCHECK(resource->mailbox.IsSharedMemory());
|
| + CHECK(!resource->pixels);
|
| + resource->format = GL_RGBA;
|
| + resource->size = resource->mailbox.shared_memory_size();
|
| + base::SharedMemoryHandle handle =
|
| + base::SharedMemory::DuplicateHandle(resource->mailbox.handle());
|
| + resource->shared_memory = new base::SharedMemory(handle, false);
|
| + const size_t size = resource->mailbox.shared_memory_size_in_bytes();
|
| + if (resource->shared_memory->Map(size)) {
|
| + resource->pixels =
|
| + reinterpret_cast<uint8_t*>(resource->shared_memory->memory());
|
| + } else {
|
| + LOG(ERROR) << "Failed to map shared memory mailbox "
|
| + << " of size " << resource->size.ToString();
|
| + resource->pixels = new uint8_t[size];
|
| + std::fill_n(resource->pixels, size, 0xFF);
|
| + }
|
| }
|
| - 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 +888,7 @@ void ResourceProvider::ReceiveFromParent(
|
| DCHECK(resource->exported);
|
| resource->exported = false;
|
| resource->filter = it->filter;
|
| - DCHECK(resource->mailbox.Equals(it->mailbox));
|
| + DCHECK(resource->mailbox.ContainsMailbox(it->mailbox));
|
| if (resource->gl_id) {
|
| if (it->sync_point)
|
| GLC(context3d, context3d->waitSyncPoint(it->sync_point));
|
| @@ -867,7 +915,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 +924,10 @@ 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.
|
| + DCHECK(!source->mailbox.IsSharedMemory());
|
| +
|
| + if (!source->mailbox.IsTexture()) {
|
| GLC(context3d, context3d->genMailboxCHROMIUM(resource->mailbox.name));
|
| source->mailbox.SetName(resource->mailbox);
|
| } else {
|
|
|