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