Index: cc/raster/gpu_tile_task_worker_pool.cc |
diff --git a/cc/raster/gpu_tile_task_worker_pool.cc b/cc/raster/gpu_tile_task_worker_pool.cc |
index 23804550122319aaf08eff05b70121cc15fdccee..3567308fcdc70d01c810bd6963fddb714c5e2fef 100644 |
--- a/cc/raster/gpu_tile_task_worker_pool.cc |
+++ b/cc/raster/gpu_tile_task_worker_pool.cc |
@@ -46,9 +46,13 @@ |
ContextProvider* context_provider = rasterizer_->resource_provider() |
->output_surface() |
->worker_context_provider(); |
- DCHECK(context_provider); |
- |
- ContextProvider::ScopedContextLock scoped_context(context_provider); |
+ |
+ // The context lock must be held while accessing the context on a |
+ // worker thread. |
+ base::AutoLock context_lock(*context_provider->GetLock()); |
+ |
+ // Allow this worker thread to bind to context_provider. |
+ context_provider->DetachFromThread(); |
gfx::Rect playback_rect = raster_full_rect; |
if (resource_has_previous_content_) { |
@@ -63,7 +67,10 @@ |
playback_rect, scale); |
// Barrier to sync worker context output to cc context. |
- scoped_context.ContextGL()->OrderingBarrierCHROMIUM(); |
+ context_provider->ContextGL()->OrderingBarrierCHROMIUM(); |
+ |
+ // Allow compositor thread to bind to context_provider. |
+ context_provider->DetachFromThread(); |
} |
private: |