summaryrefslogtreecommitdiffstats
path: root/ui/compositor/compositor.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ui/compositor/compositor.cc')
-rw-r--r--ui/compositor/compositor.cc118
1 files changed, 65 insertions, 53 deletions
diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc
index c976ecf..5739bbf 100644
--- a/ui/compositor/compositor.cc
+++ b/ui/compositor/compositor.cc
@@ -50,10 +50,9 @@ enum SwapType {
READPIXELS_SWAP,
};
+bool g_compositor_initialized = false;
base::Thread* g_compositor_thread = NULL;
-bool g_test_compositor_enabled = false;
-
ui::ContextFactory* g_implicit_factory = NULL;
ui::ContextFactory* g_context_factory = NULL;
@@ -77,39 +76,13 @@ class PendingSwap {
DISALLOW_COPY_AND_ASSIGN(PendingSwap);
};
-void SetupImplicitFactory() {
- // We leak the implicit factory so that we don't race with the tear down of
- // the gl_bindings.
- DCHECK(!g_context_factory);
- DCHECK(!g_implicit_factory);
- if (g_test_compositor_enabled) {
- g_implicit_factory = new ui::TestContextFactory;
- } else {
- DVLOG(1) << "Using DefaultContextFactory";
- scoped_ptr<ui::DefaultContextFactory> instance(
- new ui::DefaultContextFactory());
- if (instance->Initialize())
- g_implicit_factory = instance.release();
- }
- g_context_factory = g_implicit_factory;
-}
-
-void ResetImplicitFactory() {
- if (!g_implicit_factory || g_context_factory != g_implicit_factory)
- return;
- delete g_implicit_factory;
- g_implicit_factory = NULL;
- g_context_factory = NULL;
-}
-
} // namespace
namespace ui {
// static
ContextFactory* ContextFactory::GetInstance() {
- if (!g_context_factory)
- SetupImplicitFactory();
+ DCHECK(g_context_factory);
return g_context_factory;
}
@@ -180,6 +153,8 @@ DefaultContextFactory::OffscreenContextProviderForCompositorThread() {
void DefaultContextFactory::RemoveCompositor(Compositor* compositor) {
}
+bool DefaultContextFactory::DoesCreateTestContexts() { return false; }
+
scoped_ptr<WebKit::WebGraphicsContext3D>
DefaultContextFactory::CreateContextCommon(Compositor* compositor,
bool offscreen) {
@@ -248,6 +223,8 @@ TestContextFactory::OffscreenContextProviderForCompositorThread() {
void TestContextFactory::RemoveCompositor(Compositor* compositor) {
}
+bool TestContextFactory::DoesCreateTestContexts() { return true; }
+
Texture::Texture(bool flipped, const gfx::Size& size, float device_scale_factor)
: size_(size),
flipped_(flipped),
@@ -410,6 +387,9 @@ Compositor::Compositor(CompositorDelegate* delegate,
next_draw_is_resize_(false),
disable_schedule_composite_(false),
compositor_lock_(NULL) {
+ DCHECK(g_compositor_initialized)
+ << "Compositor::Initialize must be called before creating a Compositor.";
+
root_web_layer_ = cc::Layer::Create();
root_web_layer_->SetAnchorPoint(gfx::PointF(0.f, 0.f));
@@ -417,7 +397,9 @@ Compositor::Compositor(CompositorDelegate* delegate,
cc::LayerTreeSettings settings;
settings.refresh_rate =
- g_test_compositor_enabled ? kTestRefreshRate : kDefaultRefreshRate;
+ ContextFactory::GetInstance()->DoesCreateTestContexts()
+ ? kTestRefreshRate
+ : kDefaultRefreshRate;
settings.partial_swap_enabled =
!command_line->HasSwitch(cc::switches::kUIDisablePartialSwap);
settings.per_tile_painting_enabled =
@@ -452,6 +434,8 @@ Compositor::Compositor(CompositorDelegate* delegate,
}
Compositor::~Compositor() {
+ DCHECK(g_compositor_initialized);
+
CancelCompositorLock();
DCHECK(!compositor_lock_);
@@ -468,6 +452,41 @@ Compositor::~Compositor() {
}
// static
+void Compositor::InitializeContextFactoryForTests(bool allow_test_contexts) {
+ DCHECK(!g_context_factory) << "ContextFactory already initialized.";
+ DCHECK(!g_implicit_factory) <<
+ "ContextFactory for tests already initialized.";
+
+ bool use_test_contexts = true;
+
+ // Always use test contexts unless the disable command line flag is used.
+ CommandLine* command_line = CommandLine::ForCurrentProcess();
+ if (command_line->HasSwitch(switches::kDisableTestCompositor))
+ use_test_contexts = false;
+
+#if defined(OS_CHROMEOS)
+ // If the test is running on the chromeos envrionment (such as
+ // device or vm bots), always use real contexts.
+ if (base::chromeos::IsRunningOnChromeOS())
+ use_test_contexts = false;
+#endif
+
+ if (!allow_test_contexts)
+ use_test_contexts = false;
+
+ if (use_test_contexts) {
+ g_implicit_factory = new ui::TestContextFactory;
+ } else {
+ DVLOG(1) << "Using DefaultContextFactory";
+ scoped_ptr<ui::DefaultContextFactory> instance(
+ new ui::DefaultContextFactory());
+ if (instance->Initialize())
+ g_implicit_factory = instance.release();
+ }
+ g_context_factory = g_implicit_factory;
+}
+
+// static
void Compositor::Initialize() {
#if defined(OS_CHROMEOS)
bool use_thread = !CommandLine::ForCurrentProcess()->HasSwitch(
@@ -483,6 +502,9 @@ void Compositor::Initialize() {
g_compositor_thread = new base::Thread("Browser Compositor");
g_compositor_thread->Start();
}
+
+ DCHECK(!g_compositor_initialized) << "Compositor initialized twice.";
+ g_compositor_initialized = true;
}
// static
@@ -500,11 +522,24 @@ scoped_refptr<base::MessageLoopProxy> Compositor::GetCompositorMessageLoop() {
// static
void Compositor::Terminate() {
+ if (g_context_factory) {
+ if (g_implicit_factory) {
+ delete g_implicit_factory;
+ g_implicit_factory = NULL;
+ }
+ g_context_factory = NULL;
+ }
+
if (g_compositor_thread) {
+ DCHECK(!g_context_factory)
+ << "The ContextFactory should not outlive the 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() {
@@ -751,27 +786,4 @@ void Compositor::NotifyEnd() {
OnCompositingEnded(this));
}
-COMPOSITOR_EXPORT void SetupTestCompositor() {
- if (!CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kDisableTestCompositor)) {
- g_test_compositor_enabled = true;
- }
-#if defined(OS_CHROMEOS)
- // If the test is running on the chromeos envrionment (such as
- // device or vm bots), use the real compositor.
- if (base::chromeos::IsRunningOnChromeOS())
- g_test_compositor_enabled = false;
-#endif
- ResetImplicitFactory();
-}
-
-COMPOSITOR_EXPORT void DisableTestCompositor() {
- ResetImplicitFactory();
- g_test_compositor_enabled = false;
-}
-
-COMPOSITOR_EXPORT bool IsTestCompositorEnabled() {
- return g_test_compositor_enabled;
-}
-
} // namespace ui