Index: content/renderer/render_thread_impl.cc |
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc |
index 0cdb8c3324d834a9ec5fc687d5bf86bebd6cd555..71a87814c594a6c873a089ead91413c75e642de6 100644 |
--- a/content/renderer/render_thread_impl.cc |
+++ b/content/renderer/render_thread_impl.cc |
@@ -846,6 +846,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; |
@@ -1893,6 +1894,31 @@ 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_) { |
+ // Note: If context is lost, delete reference after releasing the lock. |
+ 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); |
} |