Index: cc/resources/resource_provider.cc |
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc |
index 5428c940150edecf78004c6f99223d5b9b18d474..43f75f3f7417b0349f90183e89a4bbcb29e5c676 100644 |
--- a/cc/resources/resource_provider.cc |
+++ b/cc/resources/resource_provider.cc |
@@ -2151,4 +2151,28 @@ class GrContext* ResourceProvider::GrContext(bool worker_context) const { |
return context_provider ? context_provider->GrContext() : NULL; |
} |
+void ResourceProvider::FreeGrResources() { |
+ if (!output_surface_) |
+ return; |
+ |
+ ContextProvider* context_provider = |
+ output_surface_->worker_context_provider(); |
+ if (!context_provider) |
+ return; |
+ |
+ // The context lock must be held while accessing the context on a |
+ // worker thread. |
+ base::AutoLock context_lock(*context_provider->GetLock()); |
+ |
+ // Allow context to bind to current thread. |
+ context_provider->DetachFromThread(); |
+ |
+ class GrContext* gr_context = context_provider->GrContext(); |
+ DCHECK(gr_context); |
+ gr_context->freeGpuResources(); |
+ |
+ // Allow context to bind to other threads. |
+ context_provider->DetachFromThread(); |
+} |
+ |
} // namespace cc |