Index: content/renderer/render_thread_impl.cc |
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc |
index db40b5af28e9f0cdee38e39c246d4d9e1ff14867..674a190e86d0ee4745070414f654109a016d3856 100644 |
--- a/content/renderer/render_thread_impl.cc |
+++ b/content/renderer/render_thread_impl.cc |
@@ -845,6 +845,7 @@ void RenderThreadImpl::Shutdown() { |
main_thread_compositor_task_runner_ = NULL; |
// Context providers must be released prior to destroying the GPU channel. |
+ shared_worker_context_provider_ = nullptr; |
gpu_va_context_provider_ = nullptr; |
shared_main_thread_contexts_ = nullptr; |
@@ -1888,6 +1889,30 @@ base::TaskRunner* RenderThreadImpl::GetWorkerTaskRunner() { |
return raster_worker_pool_.get(); |
} |
+scoped_refptr<ContextProviderCommandBuffer> |
+RenderThreadImpl::SharedWorkerContextProvider() { |
+ DCHECK(IsMainThread()); |
+ // Try to reuse existing shared worker context provider. |
+ bool shared_worker_context_provider_lost = false; |
+ if (shared_worker_context_provider_) { |
+ base::AutoLock lock(*shared_worker_context_provider_->GetLock()); |
+ if (shared_worker_context_provider_->ContextGL() |
+ ->GetGraphicsResetStatusKHR() != GL_NO_ERROR) { |
+ shared_worker_context_provider_lost = true; |
+ } |
+ } |
+ if (!shared_worker_context_provider_ || shared_worker_context_provider_lost) { |
+ shared_worker_context_provider_ = ContextProviderCommandBuffer::Create( |
+ CreateOffscreenContext3d(), RENDER_WORKER_CONTEXT); |
+ if (shared_worker_context_provider_ && |
+ !shared_worker_context_provider_->BindToCurrentThread()) |
+ shared_worker_context_provider_ = nullptr; |
+ if (shared_worker_context_provider_) |
+ shared_worker_context_provider_->SetupLock(); |
+ } |
+ return shared_worker_context_provider_; |
+} |
+ |
void RenderThreadImpl::SampleGamepads(blink::WebGamepads* data) { |
blink_platform_impl_->sampleGamepads(*data); |
} |