| 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 0123efe0ef0648de60f1daf5fe809fded7354f9c..6de5f4d3b3482fc38b5ec369285497758147efa1 100644
|
| --- a/content/browser/compositor/gpu_process_transport_factory.cc
|
| +++ b/content/browser/compositor/gpu_process_transport_factory.cc
|
| @@ -14,11 +14,14 @@
|
| #include "base/threading/thread.h"
|
| #include "cc/output/compositor_frame.h"
|
| #include "cc/output/output_surface.h"
|
| +#include "cc/surfaces/surface_manager.h"
|
| #include "content/browser/compositor/browser_compositor_output_surface.h"
|
| #include "content/browser/compositor/browser_compositor_output_surface_proxy.h"
|
| #include "content/browser/compositor/gpu_browser_compositor_output_surface.h"
|
| +#include "content/browser/compositor/onscreen_display_client.h"
|
| #include "content/browser/compositor/reflector_impl.h"
|
| #include "content/browser/compositor/software_browser_compositor_output_surface.h"
|
| +#include "content/browser/compositor/surface_display_output_surface.h"
|
| #include "content/browser/gpu/browser_gpu_channel_host_factory.h"
|
| #include "content/browser/gpu/gpu_data_manager_impl.h"
|
| #include "content/browser/gpu/gpu_surface_tracker.h"
|
| @@ -29,6 +32,7 @@
|
| #include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
|
| #include "content/common/gpu/gpu_process_launch_causes.h"
|
| #include "content/common/host_shared_bitmap_manager.h"
|
| +#include "content/public/common/content_switches.h"
|
| #include "gpu/GLES2/gl2extchromium.h"
|
| #include "gpu/command_buffer/client/gles2_interface.h"
|
| #include "gpu/command_buffer/common/mailbox.h"
|
| @@ -59,6 +63,7 @@ namespace content {
|
| struct GpuProcessTransportFactory::PerCompositorData {
|
| int surface_id;
|
| scoped_refptr<ReflectorImpl> reflector;
|
| + scoped_ptr<OnscreenDisplayClient> display_client;
|
| };
|
|
|
| GpuProcessTransportFactory::GpuProcessTransportFactory()
|
| @@ -75,6 +80,10 @@ GpuProcessTransportFactory::GpuProcessTransportFactory()
|
| compositor_thread_.reset(new base::Thread("Browser Compositor"));
|
| compositor_thread_->Start();
|
| }
|
| + if (base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kUseSurfaces)) {
|
| + surface_manager_ = make_scoped_ptr(new cc::SurfaceManager);
|
| + }
|
| }
|
|
|
| GpuProcessTransportFactory::~GpuProcessTransportFactory() {
|
| @@ -141,6 +150,7 @@ scoped_ptr<cc::OutputSurface> GpuProcessTransportFactory::CreateOutputSurface(
|
| #endif
|
|
|
| scoped_refptr<ContextProviderCommandBuffer> context_provider;
|
| +
|
| if (!create_software_renderer) {
|
| context_provider = ContextProviderCommandBuffer::Create(
|
| GpuProcessTransportFactory::CreateContextCommon(data->surface_id),
|
| @@ -149,6 +159,34 @@ scoped_ptr<cc::OutputSurface> GpuProcessTransportFactory::CreateOutputSurface(
|
|
|
| UMA_HISTOGRAM_BOOLEAN("Aura.CreatedGpuBrowserCompositor", !!context_provider);
|
|
|
| + if (base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kUseSurfaces)) {
|
| + if (!context_provider.get())
|
| + LOG(FATAL) << "Surfaces do not support software compositing yet";
|
| + // This gets a bit confusing. Here we have a ContextProvider configured to
|
| + // render directly to this widget. We need to make an OnscreenDisplayClient
|
| + // associated with this context, then return a SurfaceDisplayOutputSurface
|
| + // set up to draw to the display's surface.
|
| + cc::SurfaceManager* manager = surface_manager_.get();
|
| + scoped_ptr<OnscreenDisplayClient> display_client(
|
| + new OnscreenDisplayClient(context_provider, manager));
|
| + // TODO(jamesr): Need to set up filtering for the
|
| + // GpuHostMsg_UpdateVSyncParameters message.
|
| +
|
| + scoped_refptr<cc::ContextProvider> offscreen_context_provider =
|
| + ContextProviderCommandBuffer::Create(
|
| + GpuProcessTransportFactory::CreateOffscreenCommandBufferContext(),
|
| + "Offscreen-MainThread");
|
| + scoped_ptr<cc::SoftwareOutputDevice> software_device;
|
| + scoped_ptr<SurfaceDisplayOutputSurface> output_surface(
|
| + new SurfaceDisplayOutputSurface(display_client->display(),
|
| + manager,
|
| + offscreen_context_provider,
|
| + software_device.Pass()));
|
| + data->display_client = display_client.Pass();
|
| + return output_surface.PassAs<cc::OutputSurface>();
|
| + }
|
| +
|
| if (!context_provider.get()) {
|
| if (compositor_thread_.get()) {
|
| LOG(FATAL) << "Failed to create UI context, but can't use software"
|
|
|