Chromium Code Reviews| 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 16f600a85ae6e110687acf2b3f764ceb78733d51..9e56e8436fea737b6228f12456d1c9ec77c0c96a 100644 |
| --- a/content/browser/compositor/gpu_process_transport_factory.cc |
| +++ b/content/browser/compositor/gpu_process_transport_factory.cc |
| @@ -11,6 +11,7 @@ |
| #include "base/location.h" |
| #include "base/message_loop/message_loop.h" |
| #include "base/metrics/histogram.h" |
| +#include "base/threading/thread.h" |
| #include "cc/output/compositor_frame.h" |
| #include "cc/output/output_surface.h" |
| #include "content/browser/compositor/browser_compositor_output_surface.h" |
| @@ -62,6 +63,16 @@ GpuProcessTransportFactory::GpuProcessTransportFactory() |
| : callback_factory_(this) { |
| output_surface_proxy_ = new BrowserCompositorOutputSurfaceProxy( |
| &output_surface_map_); |
| +#if defined(OS_CHROMEOS) |
| + bool use_thread = !CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kUIDisableThreadedCompositing); |
| +#else |
| + bool use_thread = false; |
| +#endif |
| + if (use_thread) { |
| + compositor_thread_.reset(new base::Thread("Browser Compositor")); |
| + compositor_thread_->Start(); |
| + } |
| } |
| GpuProcessTransportFactory::~GpuProcessTransportFactory() { |
| @@ -69,6 +80,11 @@ GpuProcessTransportFactory::~GpuProcessTransportFactory() { |
| // Make sure the lost context callback doesn't try to run during destruction. |
| callback_factory_.InvalidateWeakPtrs(); |
| + |
| + if (compositor_thread_.get()) { |
| + compositor_thread_->Stop(); |
|
danakj
2014/05/08 22:37:30
Why do we need to do Stop() and reset()? The destr
piman
2014/05/08 22:48:34
Done. I was just copy&pasting from existing code t
|
| + compositor_thread_.reset(); |
| + } |
| } |
| scoped_ptr<WebGraphicsContext3DCommandBufferImpl> |
| @@ -134,7 +150,7 @@ scoped_ptr<cc::OutputSurface> GpuProcessTransportFactory::CreateOutputSurface( |
| UMA_HISTOGRAM_BOOLEAN("Aura.CreatedGpuBrowserCompositor", !!context_provider); |
| if (!context_provider.get()) { |
| - if (ui::Compositor::WasInitializedWithThread()) { |
| + if (compositor_thread_.get()) { |
| LOG(FATAL) << "Failed to create UI context, but can't use software" |
| " compositing with browser threaded compositing. Aborting."; |
| } |
| @@ -150,7 +166,7 @@ scoped_ptr<cc::OutputSurface> GpuProcessTransportFactory::CreateOutputSurface( |
| } |
| scoped_refptr<base::SingleThreadTaskRunner> compositor_thread_task_runner = |
| - ui::Compositor::GetCompositorMessageLoop(); |
| + GetCompositorMessageLoop(); |
| if (!compositor_thread_task_runner.get()) |
| compositor_thread_task_runner = base::MessageLoopProxy::current(); |
| @@ -178,8 +194,11 @@ scoped_refptr<ui::Reflector> GpuProcessTransportFactory::CreateReflector( |
| PerCompositorData* data = per_compositor_data_[source]; |
| DCHECK(data); |
| - data->reflector = new ReflectorImpl( |
| - source, target, &output_surface_map_, data->surface_id); |
| + data->reflector = new ReflectorImpl(source, |
| + target, |
| + &output_surface_map_, |
| + GetCompositorMessageLoop(), |
| + data->surface_id); |
| return data->reflector; |
| } |
| @@ -222,6 +241,12 @@ cc::SharedBitmapManager* GpuProcessTransportFactory::GetSharedBitmapManager() { |
| return HostSharedBitmapManager::current(); |
| } |
| +base::MessageLoopProxy* GpuProcessTransportFactory::GetCompositorMessageLoop() { |
| + if (!compositor_thread_) |
| + return NULL; |
| + return compositor_thread_->message_loop_proxy(); |
| +} |
| + |
| gfx::GLSurfaceHandle GpuProcessTransportFactory::GetSharedSurfaceHandle() { |
| gfx::GLSurfaceHandle handle = gfx::GLSurfaceHandle( |
| gfx::kNullPluginWindow, gfx::TEXTURE_TRANSPORT); |