Index: cc/resources/resource_provider.cc |
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc |
index 55dafbd47d20e36196a8924b800c97cbbc9191db..156f0dafcbdd532f4851ea9e2e8f3a2211f87f76 100644 |
--- a/cc/resources/resource_provider.cc |
+++ b/cc/resources/resource_provider.cc |
@@ -1124,6 +1124,45 @@ void ResourceProvider::UnlockForWrite(ResourceId id) { |
resource->locked_for_write = false; |
} |
+const ResourceProvider::Resource* ResourceProvider::LockForExport( |
+ ResourceId id) { |
+ Resource* resource = GetResource(id); |
+ if (resource->type == GLTexture) { |
+ DCHECK(resource->origin != Resource::Internal); |
+ DCHECK(resource->mailbox.IsTexture()); |
+ GLES2Interface* gl = ContextGL(); |
+ DCHECK(gl); |
+ if (resource->mailbox.sync_point()) { |
+ GLC(gl, gl->WaitSyncPointCHROMIUM(resource->mailbox.sync_point())); |
+ resource->mailbox.set_sync_point(0); |
+ } |
+ } |
+ |
+ resource->exported_count++; |
+ return resource; |
+} |
+ |
+void ResourceProvider::UnlockForExport(ResourceId id) { |
+ Resource* resource = GetResource(id); |
+ DCHECK_GT(resource->exported_count, 0); |
+ resource->exported_count--; |
+} |
+ |
+ResourceProvider::ScopedExportLock::ScopedExportLock( |
+ ResourceProvider* resource_provider, |
+ ResourceProvider::ResourceId resource_id) |
+ : resource_provider_(resource_provider), resource_id_(resource_id) { |
+ resource_provider_->LockForExport(resource_id); |
+} |
+ |
+ResourceProvider::ScopedExportLock::~ScopedExportLock() { |
+ resource_provider_->UnlockForExport(resource_id_); |
+} |
+ |
+const gpu::Mailbox& ResourceProvider::ScopedExportLock::GetMailbox() const { |
+ return resource_provider_->GetResource(resource_id_)->mailbox.mailbox(); |
+} |
+ |
ResourceProvider::ScopedReadLockGL::ScopedReadLockGL( |
ResourceProvider* resource_provider, |
ResourceProvider::ResourceId resource_id) |