| 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 37a90ce2c5a5f96139f806f1e42cb288056daa6f..bbce3618290c8aa3aed82269f18133a22d92fc60 100644
|
| --- a/content/browser/compositor/gpu_process_transport_factory.cc
|
| +++ b/content/browser/compositor/gpu_process_transport_factory.cc
|
| @@ -97,7 +97,11 @@ GpuProcessTransportFactory::~GpuProcessTransportFactory() {
|
|
|
| scoped_ptr<WebGraphicsContext3DCommandBufferImpl>
|
| GpuProcessTransportFactory::CreateOffscreenCommandBufferContext() {
|
| - return CreateContextCommon(0);
|
| + CauseForGpuLaunch cause =
|
| + CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE;
|
| + scoped_refptr<GpuChannelHost> gpu_channel_host(
|
| + BrowserGpuChannelHostFactory::instance()->EstablishGpuChannelSync(cause));
|
| + return CreateContextCommon(gpu_channel_host, 0);
|
| }
|
|
|
| scoped_ptr<cc::SoftwareOutputDevice> CreateSoftwareOutputDevice(
|
| @@ -135,11 +139,13 @@ scoped_ptr<cc::OverlayCandidateValidator> CreateOverlayCandidateValidator(
|
| return scoped_ptr<cc::OverlayCandidateValidator>();
|
| }
|
|
|
| -scoped_ptr<cc::OutputSurface> GpuProcessTransportFactory::CreateOutputSurface(
|
| - ui::Compositor* compositor, bool software_fallback) {
|
| - PerCompositorData* data = per_compositor_data_[compositor];
|
| +void GpuProcessTransportFactory::CreateOutputSurface(
|
| + base::WeakPtr<ui::Compositor> compositor,
|
| + bool software_fallback) {
|
| + DCHECK(!!compositor);
|
| + PerCompositorData* data = per_compositor_data_[compositor.get()];
|
| if (!data)
|
| - data = CreatePerCompositorData(compositor);
|
| + data = CreatePerCompositorData(compositor.get());
|
|
|
| bool create_software_renderer = software_fallback;
|
| #if defined(OS_CHROMEOS)
|
| @@ -151,12 +157,37 @@ scoped_ptr<cc::OutputSurface> GpuProcessTransportFactory::CreateOutputSurface(
|
| create_software_renderer = true;
|
| }
|
| #endif
|
| -
|
| - scoped_refptr<ContextProviderCommandBuffer> context_provider;
|
| + if (!GpuDataManagerImpl::GetInstance()->CanUseGpuBrowserCompositor())
|
| + create_software_renderer = true;
|
|
|
| if (!create_software_renderer) {
|
| + CauseForGpuLaunch cause =
|
| + CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE;
|
| + BrowserGpuChannelHostFactory::instance()->EstablishGpuChannel(
|
| + cause,
|
| + base::Bind(&GpuProcessTransportFactory::EstablishedGpuChannel,
|
| + callback_factory_.GetWeakPtr(),
|
| + compositor,
|
| + create_software_renderer));
|
| + } else {
|
| + EstablishedGpuChannel(compositor, create_software_renderer);
|
| + }
|
| +}
|
| +
|
| +void GpuProcessTransportFactory::EstablishedGpuChannel(
|
| + base::WeakPtr<ui::Compositor> compositor,
|
| + bool create_software_renderer) {
|
| + if (!compositor)
|
| + return;
|
| + PerCompositorData* data = per_compositor_data_[compositor.get()];
|
| + DCHECK(data);
|
| + scoped_refptr<GpuChannelHost> gpu_channel_host =
|
| + BrowserGpuChannelHostFactory::instance()->GetGpuChannel();
|
| + scoped_refptr<ContextProviderCommandBuffer> context_provider;
|
| + if (gpu_channel_host.get() && !create_software_renderer) {
|
| context_provider = ContextProviderCommandBuffer::Create(
|
| - GpuProcessTransportFactory::CreateContextCommon(data->surface_id),
|
| + GpuProcessTransportFactory::CreateContextCommon(gpu_channel_host,
|
| + data->surface_id),
|
| "Compositor");
|
| }
|
|
|
| @@ -186,14 +217,14 @@ scoped_ptr<cc::OutputSurface> GpuProcessTransportFactory::CreateOutputSurface(
|
| display_surface =
|
| make_scoped_ptr(new SoftwareBrowserCompositorOutputSurface(
|
| output_surface_proxy_,
|
| - CreateSoftwareOutputDevice(compositor),
|
| - per_compositor_data_[compositor]->surface_id,
|
| + CreateSoftwareOutputDevice(compositor.get()),
|
| + data->surface_id,
|
| &output_surface_map_,
|
| compositor->vsync_manager()));
|
| } else {
|
| display_surface = make_scoped_ptr(new GpuBrowserCompositorOutputSurface(
|
| context_provider,
|
| - per_compositor_data_[compositor]->surface_id,
|
| + data->surface_id,
|
| &output_surface_map_,
|
| compositor->vsync_manager(),
|
| CreateOverlayCandidateValidator(compositor->widget())));
|
| @@ -207,7 +238,8 @@ scoped_ptr<cc::OutputSurface> GpuProcessTransportFactory::CreateOutputSurface(
|
| display_client->set_surface_output_surface(output_surface.get());
|
| output_surface->set_display_client(display_client.get());
|
| data->display_client = display_client.Pass();
|
| - return output_surface.Pass();
|
| + compositor->SetOutputSurface(output_surface.Pass());
|
| + return;
|
| }
|
|
|
| if (!context_provider.get()) {
|
| @@ -216,12 +248,15 @@ scoped_ptr<cc::OutputSurface> GpuProcessTransportFactory::CreateOutputSurface(
|
| " compositing with browser threaded compositing. Aborting.";
|
| }
|
|
|
| - return make_scoped_ptr(new SoftwareBrowserCompositorOutputSurface(
|
| - output_surface_proxy_,
|
| - CreateSoftwareOutputDevice(compositor),
|
| - per_compositor_data_[compositor]->surface_id,
|
| - &output_surface_map_,
|
| - compositor->vsync_manager()));
|
| + scoped_ptr<SoftwareBrowserCompositorOutputSurface> surface(
|
| + new SoftwareBrowserCompositorOutputSurface(
|
| + output_surface_proxy_,
|
| + CreateSoftwareOutputDevice(compositor.get()),
|
| + data->surface_id,
|
| + &output_surface_map_,
|
| + compositor->vsync_manager()));
|
| + compositor->SetOutputSurface(surface.Pass());
|
| + return;
|
| }
|
|
|
| scoped_ptr<BrowserCompositorOutputSurface> surface;
|
| @@ -229,7 +264,7 @@ scoped_ptr<cc::OutputSurface> GpuProcessTransportFactory::CreateOutputSurface(
|
| if (ui::SurfaceFactoryOzone::GetInstance()->CanShowPrimaryPlaneAsOverlay()) {
|
| surface.reset(new GpuSurfacelessBrowserCompositorOutputSurface(
|
| context_provider,
|
| - per_compositor_data_[compositor]->surface_id,
|
| + data->surface_id,
|
| &output_surface_map_,
|
| compositor->vsync_manager(),
|
| CreateOverlayCandidateValidator(compositor->widget()),
|
| @@ -240,7 +275,7 @@ scoped_ptr<cc::OutputSurface> GpuProcessTransportFactory::CreateOutputSurface(
|
| if (!surface)
|
| surface.reset(new GpuBrowserCompositorOutputSurface(
|
| context_provider,
|
| - per_compositor_data_[compositor]->surface_id,
|
| + data->surface_id,
|
| &output_surface_map_,
|
| compositor->vsync_manager(),
|
| CreateOverlayCandidateValidator(compositor->widget())));
|
| @@ -248,7 +283,7 @@ scoped_ptr<cc::OutputSurface> GpuProcessTransportFactory::CreateOutputSurface(
|
| if (data->reflector.get())
|
| data->reflector->ReattachToOutputSurfaceFromMainThread(surface.get());
|
|
|
| - return surface.Pass();
|
| + compositor->SetOutputSurface(surface.Pass());
|
| }
|
|
|
| scoped_refptr<ui::Reflector> GpuProcessTransportFactory::CreateReflector(
|
| @@ -417,7 +452,9 @@ GpuProcessTransportFactory::CreatePerCompositorData(
|
| }
|
|
|
| scoped_ptr<WebGraphicsContext3DCommandBufferImpl>
|
| -GpuProcessTransportFactory::CreateContextCommon(int surface_id) {
|
| +GpuProcessTransportFactory::CreateContextCommon(
|
| + scoped_refptr<GpuChannelHost> gpu_channel_host,
|
| + int surface_id) {
|
| if (!GpuDataManagerImpl::GetInstance()->CanUseGpuBrowserCompositor())
|
| return scoped_ptr<WebGraphicsContext3DCommandBufferImpl>();
|
| blink::WebGraphicsContext3D::Attributes attrs;
|
| @@ -427,10 +464,6 @@ GpuProcessTransportFactory::CreateContextCommon(int surface_id) {
|
| attrs.antialias = false;
|
| attrs.noAutomaticFlushes = true;
|
| bool lose_context_when_out_of_memory = true;
|
| - CauseForGpuLaunch cause =
|
| - CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE;
|
| - scoped_refptr<GpuChannelHost> gpu_channel_host(
|
| - BrowserGpuChannelHostFactory::instance()->EstablishGpuChannelSync(cause));
|
| if (!gpu_channel_host.get()) {
|
| LOG(ERROR) << "Failed to establish GPU channel.";
|
| return scoped_ptr<WebGraphicsContext3DCommandBufferImpl>();
|
|
|