Commit 7898d193 authored by piman@chromium.org's avatar piman@chromium.org

ui/compositor: move the browser compositor thread to the ContextFactory

Trying to get rid of more globals in ui/compositor.

BUG=None

Review URL: https://codereview.chromium.org/277713002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@269608 0039d316-1c4b-4281-b951-d872f2087c98
parent c56a0175
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "base/location.h" #include "base/location.h"
#include "base/message_loop/message_loop.h" #include "base/message_loop/message_loop.h"
#include "base/metrics/histogram.h" #include "base/metrics/histogram.h"
#include "base/threading/thread.h"
#include "cc/output/compositor_frame.h" #include "cc/output/compositor_frame.h"
#include "cc/output/output_surface.h" #include "cc/output/output_surface.h"
#include "content/browser/compositor/browser_compositor_output_surface.h" #include "content/browser/compositor/browser_compositor_output_surface.h"
...@@ -62,6 +63,16 @@ GpuProcessTransportFactory::GpuProcessTransportFactory() ...@@ -62,6 +63,16 @@ GpuProcessTransportFactory::GpuProcessTransportFactory()
: callback_factory_(this) { : callback_factory_(this) {
output_surface_proxy_ = new BrowserCompositorOutputSurfaceProxy( output_surface_proxy_ = new BrowserCompositorOutputSurfaceProxy(
&output_surface_map_); &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() { GpuProcessTransportFactory::~GpuProcessTransportFactory() {
...@@ -134,7 +145,7 @@ scoped_ptr<cc::OutputSurface> GpuProcessTransportFactory::CreateOutputSurface( ...@@ -134,7 +145,7 @@ scoped_ptr<cc::OutputSurface> GpuProcessTransportFactory::CreateOutputSurface(
UMA_HISTOGRAM_BOOLEAN("Aura.CreatedGpuBrowserCompositor", !!context_provider); UMA_HISTOGRAM_BOOLEAN("Aura.CreatedGpuBrowserCompositor", !!context_provider);
if (!context_provider.get()) { if (!context_provider.get()) {
if (ui::Compositor::WasInitializedWithThread()) { if (compositor_thread_.get()) {
LOG(FATAL) << "Failed to create UI context, but can't use software" LOG(FATAL) << "Failed to create UI context, but can't use software"
" compositing with browser threaded compositing. Aborting."; " compositing with browser threaded compositing. Aborting.";
} }
...@@ -150,7 +161,7 @@ scoped_ptr<cc::OutputSurface> GpuProcessTransportFactory::CreateOutputSurface( ...@@ -150,7 +161,7 @@ scoped_ptr<cc::OutputSurface> GpuProcessTransportFactory::CreateOutputSurface(
} }
scoped_refptr<base::SingleThreadTaskRunner> compositor_thread_task_runner = scoped_refptr<base::SingleThreadTaskRunner> compositor_thread_task_runner =
ui::Compositor::GetCompositorMessageLoop(); GetCompositorMessageLoop();
if (!compositor_thread_task_runner.get()) if (!compositor_thread_task_runner.get())
compositor_thread_task_runner = base::MessageLoopProxy::current(); compositor_thread_task_runner = base::MessageLoopProxy::current();
...@@ -178,8 +189,11 @@ scoped_refptr<ui::Reflector> GpuProcessTransportFactory::CreateReflector( ...@@ -178,8 +189,11 @@ scoped_refptr<ui::Reflector> GpuProcessTransportFactory::CreateReflector(
PerCompositorData* data = per_compositor_data_[source]; PerCompositorData* data = per_compositor_data_[source];
DCHECK(data); DCHECK(data);
data->reflector = new ReflectorImpl( data->reflector = new ReflectorImpl(source,
source, target, &output_surface_map_, data->surface_id); target,
&output_surface_map_,
GetCompositorMessageLoop(),
data->surface_id);
return data->reflector; return data->reflector;
} }
...@@ -226,6 +240,12 @@ ui::ContextFactory* GpuProcessTransportFactory::GetContextFactory() { ...@@ -226,6 +240,12 @@ ui::ContextFactory* GpuProcessTransportFactory::GetContextFactory() {
return this; return this;
} }
base::MessageLoopProxy* GpuProcessTransportFactory::GetCompositorMessageLoop() {
if (!compositor_thread_)
return NULL;
return compositor_thread_->message_loop_proxy();
}
gfx::GLSurfaceHandle GpuProcessTransportFactory::GetSharedSurfaceHandle() { gfx::GLSurfaceHandle GpuProcessTransportFactory::GetSharedSurfaceHandle() {
gfx::GLSurfaceHandle handle = gfx::GLSurfaceHandle( gfx::GLSurfaceHandle handle = gfx::GLSurfaceHandle(
gfx::kNullPluginWindow, gfx::TEXTURE_TRANSPORT); gfx::kNullPluginWindow, gfx::TEXTURE_TRANSPORT);
......
...@@ -15,6 +15,10 @@ ...@@ -15,6 +15,10 @@
#include "content/browser/compositor/image_transport_factory.h" #include "content/browser/compositor/image_transport_factory.h"
#include "ui/compositor/compositor.h" #include "ui/compositor/compositor.h"
namespace base {
class Thread;
}
namespace content { namespace content {
class BrowserCompositorOutputSurface; class BrowserCompositorOutputSurface;
class BrowserCompositorOutputSurfaceProxy; class BrowserCompositorOutputSurfaceProxy;
...@@ -47,6 +51,7 @@ class GpuProcessTransportFactory ...@@ -47,6 +51,7 @@ class GpuProcessTransportFactory
SharedMainThreadContextProvider() OVERRIDE; SharedMainThreadContextProvider() OVERRIDE;
virtual bool DoesCreateTestContexts() OVERRIDE; virtual bool DoesCreateTestContexts() OVERRIDE;
virtual cc::SharedBitmapManager* GetSharedBitmapManager() OVERRIDE; virtual cc::SharedBitmapManager* GetSharedBitmapManager() OVERRIDE;
virtual base::MessageLoopProxy* GetCompositorMessageLoop() OVERRIDE;
// ImageTransportFactory implementation. // ImageTransportFactory implementation.
virtual ui::ContextFactory* GetContextFactory() OVERRIDE; virtual ui::ContextFactory* GetContextFactory() OVERRIDE;
...@@ -67,6 +72,7 @@ class GpuProcessTransportFactory ...@@ -67,6 +72,7 @@ class GpuProcessTransportFactory
void OnLostMainThreadSharedContext(); void OnLostMainThreadSharedContext();
typedef std::map<ui::Compositor*, PerCompositorData*> PerCompositorDataMap; typedef std::map<ui::Compositor*, PerCompositorData*> PerCompositorDataMap;
scoped_ptr<base::Thread> compositor_thread_;
PerCompositorDataMap per_compositor_data_; PerCompositorDataMap per_compositor_data_;
scoped_refptr<ContextProviderCommandBuffer> shared_main_thread_contexts_; scoped_refptr<ContextProviderCommandBuffer> shared_main_thread_contexts_;
scoped_ptr<GLHelper> gl_helper_; scoped_ptr<GLHelper> gl_helper_;
......
...@@ -17,10 +17,11 @@ ReflectorImpl::ReflectorImpl( ...@@ -17,10 +17,11 @@ ReflectorImpl::ReflectorImpl(
ui::Compositor* mirrored_compositor, ui::Compositor* mirrored_compositor,
ui::Layer* mirroring_layer, ui::Layer* mirroring_layer,
IDMap<BrowserCompositorOutputSurface>* output_surface_map, IDMap<BrowserCompositorOutputSurface>* output_surface_map,
base::MessageLoopProxy* compositor_thread_loop,
int surface_id) int surface_id)
: impl_unsafe_(output_surface_map), : impl_unsafe_(output_surface_map),
main_unsafe_(mirrored_compositor, mirroring_layer), main_unsafe_(mirrored_compositor, mirroring_layer),
impl_message_loop_(ui::Compositor::GetCompositorMessageLoop()), impl_message_loop_(compositor_thread_loop),
main_message_loop_(base::MessageLoopProxy::current()), main_message_loop_(base::MessageLoopProxy::current()),
surface_id_(surface_id) { surface_id_(surface_id) {
GLHelper* helper = ImageTransportFactory::GetInstance()->GetGLHelper(); GLHelper* helper = ImageTransportFactory::GetInstance()->GetGLHelper();
......
...@@ -37,6 +37,7 @@ class ReflectorImpl : public base::SupportsWeakPtr<ReflectorImpl>, ...@@ -37,6 +37,7 @@ class ReflectorImpl : public base::SupportsWeakPtr<ReflectorImpl>,
ui::Compositor* mirrored_compositor, ui::Compositor* mirrored_compositor,
ui::Layer* mirroring_layer, ui::Layer* mirroring_layer,
IDMap<BrowserCompositorOutputSurface>* output_surface_map, IDMap<BrowserCompositorOutputSurface>* output_surface_map,
base::MessageLoopProxy* compositor_thread_loop,
int surface_id); int surface_id);
ui::Compositor* mirrored_compositor() { ui::Compositor* mirrored_compositor() {
......
...@@ -91,7 +91,6 @@ SoftwareBrowserCompositorOutputSurfaceTest:: ...@@ -91,7 +91,6 @@ SoftwareBrowserCompositorOutputSurfaceTest::
void SoftwareBrowserCompositorOutputSurfaceTest::SetUp() { void SoftwareBrowserCompositorOutputSurfaceTest::SetUp() {
bool enable_pixel_output = false; bool enable_pixel_output = false;
ui::InitializeContextFactoryForTests(enable_pixel_output); ui::InitializeContextFactoryForTests(enable_pixel_output);
ui::Compositor::Initialize();
compositor_.reset(new ui::Compositor(gfx::kNullAcceleratedWidget)); compositor_.reset(new ui::Compositor(gfx::kNullAcceleratedWidget));
surface_proxy_ = surface_proxy_ =
...@@ -106,7 +105,6 @@ void SoftwareBrowserCompositorOutputSurfaceTest::TearDown() { ...@@ -106,7 +105,6 @@ void SoftwareBrowserCompositorOutputSurfaceTest::TearDown() {
surface_map_.Clear(); surface_map_.Clear();
ui::TerminateContextFactoryForTests(); ui::TerminateContextFactoryForTests();
ui::Compositor::Terminate();
} }
scoped_ptr<content::BrowserCompositorOutputSurface> scoped_ptr<content::BrowserCompositorOutputSurface>
......
...@@ -100,7 +100,6 @@ SoftwareOutputDeviceOzoneTest::~SoftwareOutputDeviceOzoneTest() { ...@@ -100,7 +100,6 @@ SoftwareOutputDeviceOzoneTest::~SoftwareOutputDeviceOzoneTest() {
void SoftwareOutputDeviceOzoneTest::SetUp() { void SoftwareOutputDeviceOzoneTest::SetUp() {
ui::InitializeContextFactoryForTests(enable_pixel_output_); ui::InitializeContextFactoryForTests(enable_pixel_output_);
ui::Compositor::Initialize();
surface_factory_.reset(new MockSurfaceFactoryOzone()); surface_factory_.reset(new MockSurfaceFactoryOzone());
gfx::SurfaceFactoryOzone::SetInstance(surface_factory_.get()); gfx::SurfaceFactoryOzone::SetInstance(surface_factory_.get());
...@@ -120,7 +119,6 @@ void SoftwareOutputDeviceOzoneTest::TearDown() { ...@@ -120,7 +119,6 @@ void SoftwareOutputDeviceOzoneTest::TearDown() {
compositor_.reset(); compositor_.reset();
surface_factory_.reset(); surface_factory_.reset();
ui::TerminateContextFactoryForTests(); ui::TerminateContextFactoryForTests();
ui::Compositor::Terminate();
} }
class SoftwareOutputDeviceOzonePixelTest class SoftwareOutputDeviceOzonePixelTest
......
...@@ -63,4 +63,8 @@ cc::SharedBitmapManager* ContextFactoryMojo::GetSharedBitmapManager() { ...@@ -63,4 +63,8 @@ cc::SharedBitmapManager* ContextFactoryMojo::GetSharedBitmapManager() {
return NULL; return NULL;
} }
base::MessageLoopProxy* ContextFactoryMojo::GetCompositorMessageLoop() {
return NULL;
}
} // namespace mojo } // namespace mojo
...@@ -36,6 +36,7 @@ class ContextFactoryMojo : public ui::ContextFactory { ...@@ -36,6 +36,7 @@ class ContextFactoryMojo : public ui::ContextFactory {
virtual void RemoveCompositor(ui::Compositor* compositor) OVERRIDE; virtual void RemoveCompositor(ui::Compositor* compositor) OVERRIDE;
virtual bool DoesCreateTestContexts() OVERRIDE; virtual bool DoesCreateTestContexts() OVERRIDE;
virtual cc::SharedBitmapManager* GetSharedBitmapManager() OVERRIDE; virtual cc::SharedBitmapManager* GetSharedBitmapManager() OVERRIDE;
virtual base::MessageLoopProxy* GetCompositorMessageLoop() OVERRIDE;
private: private:
scoped_refptr<webkit::gpu::ContextProviderInProcess> scoped_refptr<webkit::gpu::ContextProviderInProcess>
......
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
#include "ui/aura/env_observer.h" #include "ui/aura/env_observer.h"
#include "ui/aura/input_state_lookup.h" #include "ui/aura/input_state_lookup.h"
#include "ui/compositor/compositor.h"
#include "ui/events/event_target_iterator.h" #include "ui/events/event_target_iterator.h"
#include "ui/events/platform/platform_event_source.h" #include "ui/events/platform/platform_event_source.h"
...@@ -26,8 +25,6 @@ Env::Env() ...@@ -26,8 +25,6 @@ Env::Env()
Env::~Env() { Env::~Env() {
FOR_EACH_OBSERVER(EnvObserver, observers_, OnWillDestroyEnv()); FOR_EACH_OBSERVER(EnvObserver, observers_, OnWillDestroyEnv());
ui::Compositor::Terminate();
} }
//static //static
...@@ -68,8 +65,6 @@ bool Env::IsMouseButtonDown() const { ...@@ -68,8 +65,6 @@ bool Env::IsMouseButtonDown() const {
// Env, private: // Env, private:
void Env::Init(bool create_event_source) { void Env::Init(bool create_event_source) {
ui::Compositor::Initialize();
if (create_event_source && !ui::PlatformEventSource::GetInstance()) if (create_event_source && !ui::PlatformEventSource::GetInstance())
event_source_ = ui::PlatformEventSource::CreateDefault(); event_source_ = ui::PlatformEventSource::CreateDefault();
} }
......
...@@ -10,14 +10,10 @@ ...@@ -10,14 +10,10 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/command_line.h" #include "base/command_line.h"
#include "base/debug/trace_event.h" #include "base/debug/trace_event.h"
#include "base/memory/singleton.h"
#include "base/message_loop/message_loop.h" #include "base/message_loop/message_loop.h"
#include "base/metrics/histogram.h" #include "base/metrics/histogram.h"
#include "base/run_loop.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
#include "base/sys_info.h" #include "base/sys_info.h"
#include "base/threading/thread.h"
#include "base/threading/thread_restrictions.h"
#include "cc/base/latency_info_swap_promise.h" #include "cc/base/latency_info_swap_promise.h"
#include "cc/base/switches.h" #include "cc/base/switches.h"
#include "cc/input/input_handler.h" #include "cc/input/input_handler.h"
...@@ -39,9 +35,6 @@ namespace { ...@@ -39,9 +35,6 @@ namespace {
const double kDefaultRefreshRate = 60.0; const double kDefaultRefreshRate = 60.0;
const double kTestRefreshRate = 200.0; const double kTestRefreshRate = 200.0;
bool g_compositor_initialized = false;
base::Thread* g_compositor_thread = NULL;
ui::ContextFactory* g_context_factory = NULL; ui::ContextFactory* g_context_factory = NULL;
const int kCompositorLockTimeoutMs = 67; const int kCompositorLockTimeoutMs = 67;
...@@ -92,6 +85,7 @@ namespace ui { ...@@ -92,6 +85,7 @@ namespace ui {
Compositor::Compositor(gfx::AcceleratedWidget widget) Compositor::Compositor(gfx::AcceleratedWidget widget)
: root_layer_(NULL), : root_layer_(NULL),
widget_(widget), widget_(widget),
compositor_thread_loop_(g_context_factory->GetCompositorMessageLoop()),
vsync_manager_(new CompositorVSyncManager()), vsync_manager_(new CompositorVSyncManager()),
device_scale_factor_(0.0f), device_scale_factor_(0.0f),
last_started_frame_(0), last_started_frame_(0),
...@@ -104,9 +98,6 @@ Compositor::Compositor(gfx::AcceleratedWidget widget) ...@@ -104,9 +98,6 @@ Compositor::Compositor(gfx::AcceleratedWidget widget)
draw_on_compositing_end_(false), draw_on_compositing_end_(false),
swap_state_(SWAP_NONE), swap_state_(SWAP_NONE),
schedule_draw_factory_(this) { schedule_draw_factory_(this) {
DCHECK(g_compositor_initialized)
<< "Compositor::Initialize must be called before creating a Compositor.";
root_web_layer_ = cc::Layer::Create(); root_web_layer_ = cc::Layer::Create();
root_web_layer_->SetAnchorPoint(gfx::PointF(0.f, 0.f)); root_web_layer_->SetAnchorPoint(gfx::PointF(0.f, 0.f));
...@@ -156,12 +147,12 @@ Compositor::Compositor(gfx::AcceleratedWidget widget) ...@@ -156,12 +147,12 @@ Compositor::Compositor(gfx::AcceleratedWidget widget)
settings.use_zero_copy = IsUIZeroCopyEnabled(); settings.use_zero_copy = IsUIZeroCopyEnabled();
base::TimeTicks before_create = base::TimeTicks::Now(); base::TimeTicks before_create = base::TimeTicks::Now();
if (!!g_compositor_thread) { if (compositor_thread_loop_) {
host_ = cc::LayerTreeHost::CreateThreaded( host_ = cc::LayerTreeHost::CreateThreaded(
this, this,
g_context_factory->GetSharedBitmapManager(), g_context_factory->GetSharedBitmapManager(),
settings, settings,
g_compositor_thread->message_loop_proxy()); compositor_thread_loop_);
} else { } else {
host_ = cc::LayerTreeHost::CreateSingleThreaded( host_ = cc::LayerTreeHost::CreateSingleThreaded(
this, this, g_context_factory->GetSharedBitmapManager(), settings); this, this, g_context_factory->GetSharedBitmapManager(), settings);
...@@ -175,8 +166,6 @@ Compositor::Compositor(gfx::AcceleratedWidget widget) ...@@ -175,8 +166,6 @@ Compositor::Compositor(gfx::AcceleratedWidget widget)
Compositor::~Compositor() { Compositor::~Compositor() {
TRACE_EVENT0("shutdown", "Compositor::destructor"); TRACE_EVENT0("shutdown", "Compositor::destructor");
DCHECK(g_compositor_initialized);
CancelCompositorLock(); CancelCompositorLock();
DCHECK(!compositor_lock_); DCHECK(!compositor_lock_);
...@@ -190,51 +179,8 @@ Compositor::~Compositor() { ...@@ -190,51 +179,8 @@ Compositor::~Compositor() {
ContextFactory::GetInstance()->RemoveCompositor(this); ContextFactory::GetInstance()->RemoveCompositor(this);
} }
// static
void Compositor::Initialize() {
#if defined(OS_CHROMEOS)
bool use_thread = !CommandLine::ForCurrentProcess()->HasSwitch(
switches::kUIDisableThreadedCompositing);
#else
bool use_thread = false;
#endif
if (use_thread) {
g_compositor_thread = new base::Thread("Browser Compositor");
g_compositor_thread->Start();
}
DCHECK(!g_compositor_initialized) << "Compositor initialized twice.";
g_compositor_initialized = true;
}
// static
bool Compositor::WasInitializedWithThread() {
DCHECK(g_compositor_initialized);
return !!g_compositor_thread;
}
// static
scoped_refptr<base::MessageLoopProxy> Compositor::GetCompositorMessageLoop() {
scoped_refptr<base::MessageLoopProxy> proxy;
if (g_compositor_thread)
proxy = g_compositor_thread->message_loop_proxy();
return proxy;
}
// static
void Compositor::Terminate() {
if (g_compositor_thread) {
g_compositor_thread->Stop();
delete g_compositor_thread;
g_compositor_thread = NULL;
}
DCHECK(g_compositor_initialized) << "Compositor::Initialize() didn't happen.";
g_compositor_initialized = false;
}
void Compositor::ScheduleDraw() { void Compositor::ScheduleDraw() {
if (g_compositor_thread) { if (compositor_thread_loop_) {
host_->Composite(gfx::FrameTime::Now()); host_->Composite(gfx::FrameTime::Now());
} else if (!defer_draw_scheduling_) { } else if (!defer_draw_scheduling_) {
defer_draw_scheduling_ = true; defer_draw_scheduling_ = true;
...@@ -263,7 +209,7 @@ void Compositor::SetHostHasTransparentBackground( ...@@ -263,7 +209,7 @@ void Compositor::SetHostHasTransparentBackground(
} }
void Compositor::Draw() { void Compositor::Draw() {
DCHECK(!g_compositor_thread); DCHECK(!compositor_thread_loop_);
defer_draw_scheduling_ = false; defer_draw_scheduling_ = false;
if (waiting_on_compositing_end_) { if (waiting_on_compositing_end_) {
...@@ -382,7 +328,7 @@ void Compositor::DidCommitAndDrawFrame() { ...@@ -382,7 +328,7 @@ void Compositor::DidCommitAndDrawFrame() {
} }
void Compositor::DidCompleteSwapBuffers() { void Compositor::DidCompleteSwapBuffers() {
if (g_compositor_thread) { if (compositor_thread_loop_) {
NotifyEnd(); NotifyEnd();
} else { } else {
DCHECK_EQ(swap_state_, SWAP_POSTED); DCHECK_EQ(swap_state_, SWAP_POSTED);
...@@ -401,13 +347,13 @@ void Compositor::ScheduleAnimation() { ...@@ -401,13 +347,13 @@ void Compositor::ScheduleAnimation() {
} }
void Compositor::DidPostSwapBuffers() { void Compositor::DidPostSwapBuffers() {
DCHECK(!g_compositor_thread); DCHECK(!compositor_thread_loop_);
DCHECK_EQ(swap_state_, SWAP_NONE); DCHECK_EQ(swap_state_, SWAP_NONE);
swap_state_ = SWAP_POSTED; swap_state_ = SWAP_POSTED;
} }
void Compositor::DidAbortSwapBuffers() { void Compositor::DidAbortSwapBuffers() {
if (!g_compositor_thread) { if (!compositor_thread_loop_) {
if (swap_state_ == SWAP_POSTED) { if (swap_state_ == SWAP_POSTED) {
NotifyEnd(); NotifyEnd();
swap_state_ = SWAP_COMPLETED; swap_state_ = SWAP_COMPLETED;
...@@ -431,7 +377,7 @@ void Compositor::SetLayerTreeDebugState( ...@@ -431,7 +377,7 @@ void Compositor::SetLayerTreeDebugState(
scoped_refptr<CompositorLock> Compositor::GetCompositorLock() { scoped_refptr<CompositorLock> Compositor::GetCompositorLock() {
if (!compositor_lock_) { if (!compositor_lock_) {
compositor_lock_ = new CompositorLock(this); compositor_lock_ = new CompositorLock(this);
if (g_compositor_thread) if (compositor_thread_loop_)
host_->SetDeferCommits(true); host_->SetDeferCommits(true);
FOR_EACH_OBSERVER(CompositorObserver, FOR_EACH_OBSERVER(CompositorObserver,
observer_list_, observer_list_,
...@@ -443,7 +389,7 @@ scoped_refptr<CompositorLock> Compositor::GetCompositorLock() { ...@@ -443,7 +389,7 @@ scoped_refptr<CompositorLock> Compositor::GetCompositorLock() {
void Compositor::UnlockCompositor() { void Compositor::UnlockCompositor() {
DCHECK(compositor_lock_); DCHECK(compositor_lock_);
compositor_lock_ = NULL; compositor_lock_ = NULL;
if (g_compositor_thread) if (compositor_thread_loop_)
host_->SetDeferCommits(false); host_->SetDeferCommits(false);
FOR_EACH_OBSERVER(CompositorObserver, FOR_EACH_OBSERVER(CompositorObserver,
observer_list_, observer_list_,
......
...@@ -96,6 +96,10 @@ class COMPOSITOR_EXPORT ContextFactory { ...@@ -96,6 +96,10 @@ class COMPOSITOR_EXPORT ContextFactory {
// Gets the shared bitmap manager for software mode. // Gets the shared bitmap manager for software mode.
virtual cc::SharedBitmapManager* GetSharedBitmapManager() = 0; virtual cc::SharedBitmapManager* GetSharedBitmapManager() = 0;
// Gets the compositor message loop, or NULL if not using threaded
// compositing.
virtual base::MessageLoopProxy* GetCompositorMessageLoop() = 0;
}; };
// This class represents a lock on the compositor, that can be used to prevent // This class represents a lock on the compositor, that can be used to prevent
...@@ -135,11 +139,6 @@ class COMPOSITOR_EXPORT Compositor ...@@ -135,11 +139,6 @@ class COMPOSITOR_EXPORT Compositor
explicit Compositor(gfx::AcceleratedWidget widget); explicit Compositor(gfx::AcceleratedWidget widget);
virtual ~Compositor(); virtual ~Compositor();
static void Initialize();
static bool WasInitializedWithThread();
static scoped_refptr<base::MessageLoopProxy> GetCompositorMessageLoop();
static void Terminate();
// Schedules a redraw of the layer tree associated with this compositor. // Schedules a redraw of the layer tree associated with this compositor.
void ScheduleDraw(); void ScheduleDraw();
...@@ -265,6 +264,7 @@ class COMPOSITOR_EXPORT Compositor ...@@ -265,6 +264,7 @@ class COMPOSITOR_EXPORT Compositor
gfx::AcceleratedWidget widget_; gfx::AcceleratedWidget widget_;
scoped_refptr<cc::Layer> root_web_layer_; scoped_refptr<cc::Layer> root_web_layer_;
scoped_ptr<cc::LayerTreeHost> host_; scoped_ptr<cc::LayerTreeHost> host_;
scoped_refptr<base::MessageLoopProxy> compositor_thread_loop_;
// The manager of vsync parameters for this compositor. // The manager of vsync parameters for this compositor.
scoped_refptr<CompositorVSyncManager> vsync_manager_; scoped_refptr<CompositorVSyncManager> vsync_manager_;
......
...@@ -91,7 +91,6 @@ class LayerWithRealCompositorTest : public testing::Test { ...@@ -91,7 +91,6 @@ class LayerWithRealCompositorTest : public testing::Test {
virtual void SetUp() OVERRIDE { virtual void SetUp() OVERRIDE {
bool enable_pixel_output = true; bool enable_pixel_output = true;
InitializeContextFactoryForTests(enable_pixel_output); InitializeContextFactoryForTests(enable_pixel_output);
Compositor::Initialize();
const gfx::Rect host_bounds(10, 10, 500, 500); const gfx::Rect host_bounds(10, 10, 500, 500);
compositor_host_.reset(TestCompositorHost::Create(host_bounds)); compositor_host_.reset(TestCompositorHost::Create(host_bounds));
...@@ -101,7 +100,6 @@ class LayerWithRealCompositorTest : public testing::Test { ...@@ -101,7 +100,6 @@ class LayerWithRealCompositorTest : public testing::Test {
virtual void TearDown() OVERRIDE { virtual void TearDown() OVERRIDE {
compositor_host_.reset(); compositor_host_.reset();
TerminateContextFactoryForTests(); TerminateContextFactoryForTests();
Compositor::Terminate();
} }
Compositor* GetCompositor() { return compositor_host_->GetCompositor(); } Compositor* GetCompositor() { return compositor_host_->GetCompositor(); }
...@@ -400,7 +398,6 @@ class LayerWithDelegateTest : public testing::Test { ...@@ -400,7 +398,6 @@ class LayerWithDelegateTest : public testing::Test {
virtual void SetUp() OVERRIDE { virtual void SetUp() OVERRIDE {
bool enable_pixel_output = false; bool enable_pixel_output = false;
InitializeContextFactoryForTests(enable_pixel_output); InitializeContextFactoryForTests(enable_pixel_output);
Compositor::Initialize();
const gfx::Rect host_bounds(1000, 1000); const gfx::Rect host_bounds(1000, 1000);
compositor_host_.reset(TestCompositorHost::Create(host_bounds)); compositor_host_.reset(TestCompositorHost::Create(host_bounds));
...@@ -410,7 +407,6 @@ class LayerWithDelegateTest : public testing::Test { ...@@ -410,7 +407,6 @@ class LayerWithDelegateTest : public testing::Test {
virtual void TearDown() OVERRIDE { virtual void TearDown() OVERRIDE {
compositor_host_.reset(); compositor_host_.reset();
TerminateContextFactoryForTests(); TerminateContextFactoryForTests();
Compositor::Terminate();
} }
Compositor* compositor() { return compositor_host_->GetCompositor(); } Compositor* compositor() { return compositor_host_->GetCompositor(); }
......
...@@ -4,8 +4,11 @@ ...@@ -4,8 +4,11 @@
#include "ui/compositor/test/in_process_context_factory.h" #include "ui/compositor/test/in_process_context_factory.h"
#include "base/command_line.h"
#include "base/threading/thread.h"
#include "cc/output/output_surface.h" #include "cc/output/output_surface.h"
#include "cc/test/test_shared_bitmap_manager.h" #include "cc/test/test_shared_bitmap_manager.h"
#include "ui/compositor/compositor_switches.h"
#include "ui/compositor/reflector.h" #include "ui/compositor/reflector.h"
#include "ui/gl/gl_implementation.h" #include "ui/gl/gl_implementation.h"
#include "ui/gl/gl_surface.h" #include "ui/gl/gl_surface.h"
...@@ -18,6 +21,16 @@ namespace ui { ...@@ -18,6 +21,16 @@ namespace ui {
InProcessContextFactory::InProcessContextFactory() InProcessContextFactory::InProcessContextFactory()
: shared_bitmap_manager_(new cc::TestSharedBitmapManager()) { : shared_bitmap_manager_(new cc::TestSharedBitmapManager()) {
DCHECK_NE(gfx::GetGLImplementation(), gfx::kGLImplementationNone); DCHECK_NE(gfx::GetGLImplementation(), gfx::kGLImplementationNone);
#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();
}
} }
InProcessContextFactory::~InProcessContextFactory() {} InProcessContextFactory::~InProcessContextFactory() {}
...@@ -80,4 +93,10 @@ cc::SharedBitmapManager* InProcessContextFactory::GetSharedBitmapManager() { ...@@ -80,4 +93,10 @@ cc::SharedBitmapManager* InProcessContextFactory::GetSharedBitmapManager() {
return shared_bitmap_manager_.get(); return shared_bitmap_manager_.get();
} }
base::MessageLoopProxy* InProcessContextFactory::GetCompositorMessageLoop() {
if (!compositor_thread_)
return NULL;
return compositor_thread_->message_loop_proxy();
}
} // namespace ui } // namespace ui
...@@ -7,6 +7,10 @@ ...@@ -7,6 +7,10 @@
#include "ui/compositor/compositor.h" #include "ui/compositor/compositor.h"
namespace base {
class Thread;
}
namespace webkit { namespace webkit {
namespace gpu { namespace gpu {
class ContextProviderInProcess; class ContextProviderInProcess;
...@@ -35,8 +39,10 @@ class InProcessContextFactory : public ContextFactory { ...@@ -35,8 +39,10 @@ class InProcessContextFactory : public ContextFactory {
virtual void RemoveCompositor(Compositor* compositor) OVERRIDE; virtual void RemoveCompositor(Compositor* compositor) OVERRIDE;
virtual bool DoesCreateTestContexts() OVERRIDE; virtual bool DoesCreateTestContexts() OVERRIDE;
virtual cc::SharedBitmapManager* GetSharedBitmapManager() OVERRIDE; virtual cc::SharedBitmapManager* GetSharedBitmapManager() OVERRIDE;
virtual base::MessageLoopProxy* GetCompositorMessageLoop() OVERRIDE;
private: private:
scoped_ptr<base::Thread> compositor_thread_;
scoped_refptr<webkit::gpu::ContextProviderInProcess> scoped_refptr<webkit::gpu::ContextProviderInProcess>
shared_main_thread_contexts_; shared_main_thread_contexts_;
scoped_ptr<cc::SharedBitmapManager> shared_bitmap_manager_; scoped_ptr<cc::SharedBitmapManager> shared_bitmap_manager_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment