Index: ui/gl/gl_surface.cc |
diff --git a/ui/gl/gl_surface.cc b/ui/gl/gl_surface.cc |
index a52a3f7110f3e7eea942f4597e6a38237e51556a..9531fc4f6eea2dca4b07770e86811a14d8b46635 100644 |
--- a/ui/gl/gl_surface.cc |
+++ b/ui/gl/gl_surface.cc |
@@ -14,6 +14,7 @@ |
#include "base/threading/thread_local.h" |
#include "ui/gl/gl_context.h" |
#include "ui/gl/gl_implementation.h" |
+#include "ui/gl/gl_switches.h" |
namespace gfx { |
@@ -24,9 +25,7 @@ base::LazyInstance<base::ThreadLocalPointer<GLSurface> >::Leaky |
// static |
bool GLSurface::InitializeOneOff() { |
- static bool initialized = false; |
- if (initialized) |
- return true; |
+ DCHECK_EQ(kGLImplementationNone, GetGLImplementation()); |
TRACE_EVENT0("gpu", "GLSurface::InitializeOneOff"); |
@@ -34,12 +33,14 @@ bool GLSurface::InitializeOneOff() { |
GetAllowedGLImplementations(&allowed_impls); |
DCHECK(!allowed_impls.empty()); |
+ CommandLine* cmd = CommandLine::ForCurrentProcess(); |
+ |
// The default implementation is always the first one in list. |
GLImplementation impl = allowed_impls[0]; |
bool fallback_to_osmesa = false; |
- if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kUseGL)) { |
+ if (cmd->HasSwitch(switches::kUseGL)) { |
std::string requested_implementation_name = |
- CommandLine::ForCurrentProcess()->GetSwitchValueASCII(switches::kUseGL); |
+ cmd->GetSwitchValueASCII(switches::kUseGL); |
if (requested_implementation_name == "any") { |
fallback_to_osmesa = true; |
} else if (requested_implementation_name == "swiftshader") { |
@@ -55,27 +56,99 @@ bool GLSurface::InitializeOneOff() { |
} |
} |
- initialized = InitializeStaticGLBindings(impl) && InitializeOneOffInternal(); |
+ bool gpu_service_logging = cmd->HasSwitch(switches::kEnableGPUServiceLogging); |
+ bool disable_gl_drawing = cmd->HasSwitch(switches::kDisableGLDrawingForTests); |
+ |
+ return InitializeOneOffImplementation( |
+ impl, fallback_to_osmesa, gpu_service_logging, disable_gl_drawing); |
+} |
+ |
+// static |
+bool GLSurface::InitializeOneOffImplementation(GLImplementation impl, |
+ bool fallback_to_osmesa, |
+ bool gpu_service_logging, |
+ bool disable_gl_drawing) { |
+ bool initialized = |
+ InitializeStaticGLBindings(impl) && InitializeOneOffInternal(); |
if (!initialized && fallback_to_osmesa) { |
ClearGLBindings(); |
initialized = InitializeStaticGLBindings(kGLImplementationOSMesaGL) && |
InitializeOneOffInternal(); |
} |
+ if (!initialized) |
+ ClearGLBindings(); |
if (initialized) { |
DVLOG(1) << "Using " |
<< GetGLImplementationName(GetGLImplementation()) |
<< " GL implementation."; |
- if (CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kEnableGPUServiceLogging)) |
+ if (gpu_service_logging) |
InitializeDebugGLBindings(); |
- if (CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kDisableGLDrawingForTests)) |
+ if (disable_gl_drawing) |
InitializeNullDrawGLBindings(); |
} |
return initialized; |
} |
+// static |
+void GLSurface::InitializeOneOffForTests() { |
+ bool use_osmesa = true; |
+ |
+ // We usually use OSMesa as this works on all bots. The command line can |
+ // override this behaviour to use hardware GL. |
+ if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kUseGpuInTests)) |
+ use_osmesa = false; |
+ |
+#if defined(OS_ANDROID) |
+ // On Android we always use hardware GL. |
+ use_osmesa = false; |
+#endif |
+ |
+ std::vector<GLImplementation> allowed_impls; |
+ GetAllowedGLImplementations(&allowed_impls); |
+ DCHECK(!allowed_impls.empty()); |
+ |
+ GLImplementation impl = allowed_impls[0]; |
+ if (use_osmesa) |
+ impl = kGLImplementationOSMesaGL; |
+ |
+ DCHECK(!CommandLine::ForCurrentProcess()->HasSwitch(switches::kUseGL)) |
+ << "kUseGL has not effect in tests"; |
+ |
+ bool fallback_to_osmesa = false; |
+ bool gpu_service_logging = false; |
+ bool disable_gl_drawing = false; |
+ // TODO(danakj): Unit tests do not produce pixel output by default. |
+ // bool disable_gl_drawing = true; |
+ |
+ CHECK(InitializeOneOffImplementation( |
+ impl, fallback_to_osmesa, gpu_service_logging, disable_gl_drawing)); |
+} |
+ |
+// static |
+void GLSurface::InitializeOneOffWithMockBindingsForTests() { |
+ DCHECK(!CommandLine::ForCurrentProcess()->HasSwitch(switches::kUseGL)) |
+ << "kUseGL has not effect in tests"; |
+ |
+ // This method may be called multiple times in the same process to set up |
+ // mock bindings in different ways. |
+ ClearGLBindings(); |
+ |
+ bool fallback_to_osmesa = false; |
+ bool gpu_service_logging = false; |
+ bool disable_gl_drawing = false; |
+ |
+ CHECK(InitializeOneOffImplementation(kGLImplementationMockGL, |
+ fallback_to_osmesa, |
+ gpu_service_logging, |
+ disable_gl_drawing)); |
+} |
+ |
+// static |
+void GLSurface::InitializeDynamicMockBindingsForTests(GLContext* context) { |
+ CHECK(InitializeDynamicGLBindings(kGLImplementationMockGL, context)); |
+} |
+ |
GLSurface::GLSurface() {} |
bool GLSurface::Initialize() { |