Index: content/browser/compositor/gpu_process_transport_factory.cc |
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc |
index f73e8a3015bf44e56d98e4dad6be4c67f223b508..a5ee594f4a2b33f8c0c53ddc6bc5c98812b96cf5 100644 |
--- a/content/browser/compositor/gpu_process_transport_factory.cc |
+++ b/content/browser/compositor/gpu_process_transport_factory.cc |
@@ -274,7 +274,8 @@ void GpuProcessTransportFactory::EstablishedGpuChannel( |
context_provider->ContextCapabilities(); |
if (!data->surface_id) { |
surface = make_scoped_ptr(new OffscreenBrowserCompositorOutputSurface( |
- context_provider, compositor->vsync_manager(), |
+ context_provider, SharedWorkerContextProvider(), |
+ compositor->vsync_manager(), |
scoped_ptr<BrowserCompositorOverlayCandidateValidator>())); |
} else if (capabilities.gpu.surfaceless) { |
GLenum target = GL_TEXTURE_2D; |
@@ -285,13 +286,15 @@ void GpuProcessTransportFactory::EstablishedGpuChannel( |
#endif |
surface = |
make_scoped_ptr(new GpuSurfacelessBrowserCompositorOutputSurface( |
- context_provider, data->surface_id, compositor->vsync_manager(), |
+ context_provider, SharedWorkerContextProvider(), data->surface_id, |
+ compositor->vsync_manager(), |
CreateOverlayCandidateValidator(compositor->widget()), target, |
format, BrowserGpuMemoryBufferManager::current())); |
} else { |
if (!surface) { |
surface = make_scoped_ptr(new GpuBrowserCompositorOutputSurface( |
- context_provider, compositor->vsync_manager(), |
+ context_provider, SharedWorkerContextProvider(), |
+ compositor->vsync_manager(), |
CreateOverlayCandidateValidator(compositor->widget()))); |
} |
} |
@@ -322,7 +325,8 @@ void GpuProcessTransportFactory::EstablishedGpuChannel( |
scoped_ptr<cc::SurfaceDisplayOutputSurface> output_surface( |
new cc::SurfaceDisplayOutputSurface( |
- manager, compositor->surface_id_allocator(), context_provider)); |
+ manager, compositor->surface_id_allocator(), context_provider, |
+ SharedWorkerContextProvider())); |
display_client->set_surface_output_surface(output_surface.get()); |
output_surface->set_display_client(display_client.get()); |
display_client->display()->Resize(compositor->size()); |
@@ -520,6 +524,25 @@ GpuProcessTransportFactory::SharedMainThreadContextProvider() { |
return shared_main_thread_contexts_; |
} |
+scoped_refptr<ContextProviderCommandBuffer> |
+GpuProcessTransportFactory::SharedWorkerContextProvider() { |
+ if (shared_worker_context_provider_.get()) |
+ return shared_worker_context_provider_; |
+ |
+ shared_worker_context_provider_ = ContextProviderCommandBuffer::Create( |
+ GpuProcessTransportFactory::CreateOffscreenCommandBufferContext(), |
+ BROWSER_WORKER_CONTEXT); |
+ |
+ if (shared_worker_context_provider_.get()) { |
+ shared_worker_context_provider_->SetLostContextCallback( |
+ base::Bind(&GpuProcessTransportFactory::OnLostWorkerSharedContext, |
+ callback_factory_.GetWeakPtr())); |
+ if (!shared_worker_context_provider_->BindToCurrentThread()) |
+ shared_worker_context_provider_ = nullptr; |
+ } |
+ return shared_worker_context_provider_; |
+} |
+ |
GpuProcessTransportFactory::PerCompositorData* |
GpuProcessTransportFactory::CreatePerCompositorData( |
ui::Compositor* compositor) { |
@@ -601,4 +624,10 @@ void GpuProcessTransportFactory::OnLostMainThreadSharedContext() { |
lost_shared_main_thread_contexts = NULL; |
} |
+void GpuProcessTransportFactory::OnLostWorkerSharedContext() { |
+ LOG(ERROR) << "Lost UI shared worker context."; |
+ |
+ shared_worker_context_provider_ = nullptr; |
+} |
+ |
} // namespace content |