Index: cc/resources/resource_provider.cc |
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc |
index e7d309db8a964fa061bd76ef29ba3d21fcd78886..81c27c89b5975100b6c3df52a275bb801d1cc6d2 100644 |
--- a/cc/resources/resource_provider.cc |
+++ b/cc/resources/resource_provider.cc |
@@ -1033,10 +1033,14 @@ void ResourceProvider::UnlockForRead(ResourceId id) { |
// The resource belongs to this ResourceProvider, so it can be destroyed. |
DeleteResourceInternal(it, NORMAL); |
} else { |
- ChildMap::iterator child_it = children_.find(resource->child_id); |
- ResourceIdArray unused; |
- unused.push_back(id); |
- DeleteAndReturnUnusedResourcesToChild(child_it, NORMAL, unused); |
+ if (batch_return_resources_) { |
+ batched_returning_resources_[resource->child_id].push_back(id); |
+ } else { |
+ ChildMap::iterator child_it = children_.find(resource->child_id); |
+ ResourceIdArray unused; |
+ unused.push_back(id); |
+ DeleteAndReturnUnusedResourcesToChild(child_it, NORMAL, unused); |
+ } |
} |
} |
} |
@@ -1355,6 +1359,16 @@ ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() { |
return gpu_memory_buffer_.get(); |
} |
+ResourceProvider::ScopedBatchReturnResources::ScopedBatchReturnResources( |
+ ResourceProvider* resource_provider) |
+ : resource_provider_(resource_provider) { |
+ resource_provider_->SetBatchReturnResources(true); |
+} |
+ |
+ResourceProvider::ScopedBatchReturnResources::~ScopedBatchReturnResources() { |
+ resource_provider_->SetBatchReturnResources(false); |
+} |
+ |
ResourceProvider::SynchronousFence::SynchronousFence( |
gpu::gles2::GLES2Interface* gl) |
: gl_(gl), has_synchronized_(true) {} |
@@ -1663,6 +1677,19 @@ void ResourceProvider::ReceiveReturnsFromParent( |
} |
} |
+void ResourceProvider::SetBatchReturnResources(bool batch) { |
+ DCHECK_NE(batch_return_resources_, batch); |
+ batch_return_resources_ = batch; |
+ if (!batch) { |
+ for (const auto& resources : batched_returning_resources_) { |
+ ChildMap::iterator child_it = children_.find(resources.first); |
+ DCHECK(child_it != children_.end()); |
+ DeleteAndReturnUnusedResourcesToChild(child_it, NORMAL, resources.second); |
+ } |
+ batched_returning_resources_.clear(); |
+ } |
+} |
+ |
#if defined(OS_ANDROID) |
void ResourceProvider::SendPromotionHints( |
const OverlayCandidateList::PromotionHintInfoMap& promotion_hints) { |