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