| 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
|
|
|