Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3557)

Unified Diff: cc/resources/resource_provider.cc

Issue 132873006: cc: Add zero-copy texture update support to delegating renderer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address review feedback and add unit tests Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/resources/resource_provider.h ('k') | cc/resources/resource_provider_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/resources/resource_provider.cc
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc
index 9b03b675571ed3e7da55f64ab83f16eafc7a6ba2..4579126c541734298bceec2cfe92c353c5da0e43 100644
--- a/cc/resources/resource_provider.cc
+++ b/cc/resources/resource_provider.cc
@@ -1194,6 +1194,11 @@ void ResourceProvider::ReceiveReturnsFromParent(
if (resource->exported_count)
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 (returned.sync_point)
GLC(gl, gl->WaitSyncPointCHROMIUM(returned.sync_point));
@@ -1255,16 +1260,26 @@ void ResourceProvider::TransferResource(GLES2Interface* gl,
resource->mailbox = source->shared_bitmap->id();
resource->is_software = true;
} else if (!source->mailbox.IsValid()) {
- // This is a resource allocated by the compositor, we need to produce it.
- // Don't set a sync point, the caller will do it.
+ LazyCreate(source);
DCHECK(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->ProduceTextureCHROMIUM(resource->target, resource->mailbox.name));
source->mailbox.SetName(resource->mailbox);
} else {
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
// already exported. Make sure to forward the sync point that we were given.
resource->mailbox = source->mailbox.name();
@@ -1497,14 +1512,8 @@ GLenum ResourceProvider::BindForSampling(
resource->filter = filter;
}
- if (resource->image_id && resource->dirty_image) {
- // Release image currently bound to texture.
- 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;
- }
+ if (resource->image_id && resource->dirty_image)
+ BindImageForSampling(resource);
return target;
}
@@ -1628,6 +1637,8 @@ void ResourceProvider::LazyCreate(Resource* resource) {
if (resource->texture_pool == 0)
return;
+ DCHECK(!resource->external);
+ DCHECK(!resource->mailbox.IsValid());
resource->gl_id = texture_id_allocator_->NextId();
GLES2Interface* gl = ContextGL();
@@ -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,
bool enable) {
Resource* resource = GetResource(id);
« no previous file with comments | « cc/resources/resource_provider.h ('k') | cc/resources/resource_provider_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698