Index: cc/resources/resource_provider.cc |
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc |
index 7439b42fa101b9de5a3277dc16c2306601659a6e..b92d59b69bdfcbb3ee331dae75d07381493f0853 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,22 @@ 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 if (mailbox.IsSharedMemory()) { |
piman
2013/05/29 20:00:10
the second if is not needed anymore, but maybe can
slavi
2013/06/03 22:14:16
Done.
|
+ 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 +345,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 +512,37 @@ 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->format = GL_RGBA; |
+ resource->size = resource->mailbox.shared_memory_size(); |
+ resource->shared_memory = new base::SharedMemory( |
+ resource->mailbox.handle(), false); |
piman
2013/05/29 20:00:10
Actually, I just realized because of the RecreateL
slavi
2013/06/03 22:14:16
Done.
|
+ const size_t size = 4 * resource->size.GetArea(); |
+ if (resource->shared_memory->Map(size)) { |
+ resource->pixels = |
+ reinterpret_cast<uint8_t*>(resource->shared_memory->memory()); |
+ } else { |
+ LOG(ERROR) << "Failed to map shared memory handle " |
+ << " 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 +884,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 +911,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 +920,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 { |