Index: ui/gl/init/gl_initializer.cc |
diff --git a/ui/gl/init/gl_initializer.cc b/ui/gl/init/gl_initializer.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3164891cff6f7ac7df1a730d0efe577589741613 |
--- /dev/null |
+++ b/ui/gl/init/gl_initializer.cc |
@@ -0,0 +1,87 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "ui/gl/init/gl_initializer.h" |
+ |
+#include <string> |
+#include <vector> |
+ |
+#include "base/command_line.h" |
+#include "base/logging.h" |
+#include "base/trace_event/trace_event.h" |
+#include "ui/gl/gl_surface.h" |
+#include "ui/gl/init/gl_factory.h" |
+ |
+namespace gl { |
+namespace init { |
+ |
+bool InitializeGLOneOff() { |
+ TRACE_EVENT0("gpu,startup", "gl::init::InitializeOneOff"); |
+ |
+ DCHECK_EQ(kGLImplementationNone, GetGLImplementation()); |
+ |
+ std::vector<GLImplementation> allowed_impls; |
+ GetAllowedGLImplementations(&allowed_impls); |
+ DCHECK(!allowed_impls.empty()); |
+ |
+ base::CommandLine* cmd = base::CommandLine::ForCurrentProcess(); |
+ |
+ // The default implementation is always the first one in list. |
+ GLImplementation impl = allowed_impls[0]; |
+ bool fallback_to_osmesa = false; |
+ if (cmd->HasSwitch(switches::kOverrideUseGLWithOSMesaForTests)) { |
+ impl = kGLImplementationOSMesaGL; |
+ } else if (cmd->HasSwitch(switches::kUseGL)) { |
+ std::string requested_implementation_name = |
+ cmd->GetSwitchValueASCII(switches::kUseGL); |
+ if (requested_implementation_name == "any") { |
+ fallback_to_osmesa = true; |
+ } else if (requested_implementation_name == |
+ kGLImplementationSwiftShaderName || |
+ requested_implementation_name == kGLImplementationANGLEName) { |
+ impl = kGLImplementationEGLGLES2; |
+ } else { |
+ impl = GetNamedGLImplementation(requested_implementation_name); |
+ if (!ContainsValue(allowed_impls, impl)) { |
+ LOG(ERROR) << "Requested GL implementation is not available."; |
+ return false; |
+ } |
+ } |
+ } |
+ |
+ bool gpu_service_logging = cmd->HasSwitch(switches::kEnableGPUServiceLogging); |
+ bool disable_gl_drawing = cmd->HasSwitch(switches::kDisableGLDrawingForTests); |
+ |
+ return GLInitializer::InitializeOneOffImplementation( |
+ impl, fallback_to_osmesa, gpu_service_logging, disable_gl_drawing); |
+} |
+ |
+// static |
+bool GLInitializer::InitializeOneOffImplementation(GLImplementation impl, |
+ bool fallback_to_osmesa, |
+ bool gpu_service_logging, |
+ bool disable_gl_drawing) { |
+ bool initialized = |
+ InitializeStaticGLBindings(impl) && InitializeOneOffPlatform(); |
+ if (!initialized && fallback_to_osmesa) { |
+ ClearGLBindings(); |
+ initialized = InitializeStaticGLBindings(kGLImplementationOSMesaGL) && |
+ InitializeOneOffPlatform(); |
+ } |
+ if (!initialized) |
+ ClearGLBindings(); |
+ |
+ if (initialized) { |
+ DVLOG(1) << "Using " << GetGLImplementationName(GetGLImplementation()) |
+ << " GL implementation."; |
+ if (gpu_service_logging) |
+ InitializeDebugGLBindings(); |
+ if (disable_gl_drawing) |
+ InitializeNullDrawGLBindings(); |
+ } |
+ return initialized; |
+} |
+ |
+} // namespace init |
+} // namespace gl |