[go: nahoru, domu]

Split //ui/gl into //ui/gl + //ui/gi/init.

Refactor //ui/gl to fix Ozone dep problem. This CL is step 1 described
in the associated bug.

BUG=611142
CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel

Review-Url: https://codereview.chromium.org/1920163005
Cr-Commit-Position: refs/heads/master@{#393838}
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn
index 45e2732..6670def 100644
--- a/android_webview/BUILD.gn
+++ b/android_webview/BUILD.gn
@@ -589,6 +589,7 @@
     "//third_party/WebKit/public:blink",
     "//ui/events:gesture_detection",
     "//ui/gl",
+    "//ui/gl/init",
     "//ui/shell_dialogs",
     "//v8",
   ]
diff --git a/android_webview/android_webview.gyp b/android_webview/android_webview.gyp
index 4a4f85e..1c79e44 100644
--- a/android_webview/android_webview.gyp
+++ b/android_webview/android_webview.gyp
@@ -260,6 +260,7 @@
         '../third_party/WebKit/public/blink.gyp:blink',
         '../ui/events/events.gyp:gesture_detection',
         '../ui/gl/gl.gyp:gl',
+        '../ui/gl/init/gl_init.gyp:gl_init',
         '../ui/shell_dialogs/shell_dialogs.gyp:shell_dialogs',
         '../url/ipc/url_ipc.gyp:url_ipc',
         '../v8/src/v8.gyp:v8',
diff --git a/android_webview/android_webview_tests.gypi b/android_webview/android_webview_tests.gypi
index 35877b5..5e3b962 100644
--- a/android_webview/android_webview_tests.gypi
+++ b/android_webview/android_webview_tests.gypi
@@ -136,6 +136,7 @@
         '../testing/gtest.gyp:gtest',
         '../ui/base/ui_base.gyp:ui_base_jni_headers',
         '../ui/gl/gl.gyp:gl',
+        '../ui/gl/init/gl_init.gyp:gl_init',
         '../ui/gl/gl.gyp:gl_test_support',
         'android_webview_common',
         'android_webview_unittests_jni',
diff --git a/android_webview/browser/aw_gl_surface.h b/android_webview/browser/aw_gl_surface.h
index d0c5220..056851b 100644
--- a/android_webview/browser/aw_gl_surface.h
+++ b/android_webview/browser/aw_gl_surface.h
@@ -13,7 +13,7 @@
 // This surface is used to represent the underlying surface provided by the App
 // inside a hardware draw. Note that offscreen contexts will not be using this
 // GLSurface.
-class GL_EXPORT AwGLSurface : public gfx::GLSurface {
+class AwGLSurface : public gfx::GLSurface {
  public:
   AwGLSurface();
 
diff --git a/android_webview/browser/scoped_app_gl_state_restore.cc b/android_webview/browser/scoped_app_gl_state_restore.cc
index caa23879..0c6867f 100644
--- a/android_webview/browser/scoped_app_gl_state_restore.cc
+++ b/android_webview/browser/scoped_app_gl_state_restore.cc
@@ -11,6 +11,7 @@
 #include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_context.h"
 #include "ui/gl/gl_surface_stub.h"
+#include "ui/gl/init/gl_factory.h"
 
 namespace android_webview {
 
@@ -22,9 +23,9 @@
  public:
   AppContextSurface()
       : surface(new gfx::GLSurfaceStub),
-        context(gfx::GLContext::CreateGLContext(NULL,
-                                                surface.get(),
-                                                gfx::PreferDiscreteGpu)) {}
+        context(gl::init::CreateGLContext(nullptr,
+                                          surface.get(),
+                                          gfx::PreferDiscreteGpu)) {}
   void MakeCurrent() { context->MakeCurrent(surface.get()); }
 
  private:
diff --git a/android_webview/browser/test/fake_window.cc b/android_webview/browser/test/fake_window.cc
index 3319db1..4b63f74 100644
--- a/android_webview/browser/test/fake_window.cc
+++ b/android_webview/browser/test/fake_window.cc
@@ -12,6 +12,7 @@
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "ui/gl/gl_bindings.h"
+#include "ui/gl/init/gl_factory.h"
 
 namespace android_webview {
 
@@ -192,11 +193,11 @@
 
 void FakeWindow::InitializeOnRT(base::WaitableEvent* sync) {
   CheckCurrentlyOnRT();
-  surface_ = gfx::GLSurface::CreateOffscreenGLSurface(surface_size_);
+  surface_ = gl::init::CreateOffscreenGLSurface(surface_size_);
   DCHECK(surface_);
   DCHECK(surface_->GetHandle());
-  context_ = gfx::GLContext::CreateGLContext(nullptr, surface_.get(),
-                                             gfx::PreferDiscreteGpu);
+  context_ = gl::init::CreateGLContext(nullptr, surface_.get(),
+                                       gfx::PreferDiscreteGpu);
   DCHECK(context_);
   sync->Signal();
 }
diff --git a/blimp/client/BUILD.gn b/blimp/client/BUILD.gn
index d773b26..e37f204 100644
--- a/blimp/client/BUILD.gn
+++ b/blimp/client/BUILD.gn
@@ -64,6 +64,7 @@
     "//third_party/libwebp",
     "//ui/gfx/geometry",
     "//ui/gl",
+    "//ui/gl/init",
     "//url:url",
   ]
 }
diff --git a/blimp/client/app/blimp_startup.cc b/blimp/client/app/blimp_startup.cc
index 71dad32..0b45e9e 100644
--- a/blimp/client/app/blimp_startup.cc
+++ b/blimp/client/app/blimp_startup.cc
@@ -15,7 +15,7 @@
 #include "blimp/client/app/blimp_discardable_memory_allocator.h"
 #include "blimp/client/feature/compositor/decoding_image_generator.h"
 #include "third_party/skia/include/core/SkGraphics.h"
-#include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 class SkImageGenerator;
 
@@ -73,7 +73,7 @@
   // Set the DiscardableMemoryAllocator.
   base::DiscardableMemoryAllocator::SetInstance(
       g_discardable_memory_allocator.Pointer());
-  if (!gfx::GLSurface::InitializeOneOff())
+  if (!gl::init::InitializeGLOneOff())
     return false;
   SkGraphics::Init();
   SkGraphics::SetImageGeneratorFromEncodedFactory(CreateImageGenerator);
diff --git a/components/mus/gles2/BUILD.gn b/components/mus/gles2/BUILD.gn
index 7f2bb63..bfa0d5a 100644
--- a/components/mus/gles2/BUILD.gn
+++ b/components/mus/gles2/BUILD.gn
@@ -50,6 +50,7 @@
     "//ui/gfx",
     "//ui/gfx/geometry",
     "//ui/gl",
+    "//ui/gl/init",
     "//ui/mojo/geometry:interfaces",
   ]
 
diff --git a/components/mus/gles2/command_buffer_driver.cc b/components/mus/gles2/command_buffer_driver.cc
index 5b44ca99..49dea068 100644
--- a/components/mus/gles2/command_buffer_driver.cc
+++ b/components/mus/gles2/command_buffer_driver.cc
@@ -33,6 +33,7 @@
 #include "ui/gl/gl_context.h"
 #include "ui/gl/gl_image_shared_memory.h"
 #include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 #if defined(USE_OZONE)
 #include "ui/gl/gl_image_ozone_native_pixmap.h"
@@ -86,16 +87,16 @@
 
   const bool offscreen = widget_ == gfx::kNullAcceleratedWidget;
   if (offscreen) {
-    surface_ = gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(0, 0));
+    surface_ = gl::init::CreateOffscreenGLSurface(gfx::Size(0, 0));
   } else {
 #if defined(USE_OZONE)
     scoped_refptr<gfx::GLSurface> underlying_surface =
-        gfx::GLSurface::CreateSurfacelessViewGLSurface(widget_);
+        gl::init::CreateSurfacelessViewGLSurface(widget_);
     if (!underlying_surface)
-      underlying_surface = gfx::GLSurface::CreateViewGLSurface(widget_);
+      underlying_surface = gl::init::CreateViewGLSurface(widget_);
 #else
     scoped_refptr<gfx::GLSurface> underlying_surface =
-        gfx::GLSurface::CreateViewGLSurface(widget_);
+        gl::init::CreateViewGLSurface(widget_);
 #endif
     scoped_refptr<GLSurfaceAdapterMus> surface_adapter =
         new GLSurfaceAdapterMus(underlying_surface);
@@ -117,7 +118,7 @@
     return false;
 
   // TODO(piman): virtual contexts, gpu preference.
-  context_ = gfx::GLContext::CreateGLContext(
+  context_ = gl::init::CreateGLContext(
       gpu_state_->share_group(), surface_.get(), gfx::PreferIntegratedGpu);
   if (!context_.get())
     return false;
diff --git a/components/mus/gles2/gpu_state.cc b/components/mus/gles2/gpu_state.cc
index 3733ff8..1ff542d 100644
--- a/components/mus/gles2/gpu_state.cc
+++ b/components/mus/gles2/gpu_state.cc
@@ -10,7 +10,7 @@
 #include "base/threading/thread_restrictions.h"
 #include "gpu/config/gpu_info_collector.h"
 #include "ui/gl/gl_implementation.h"
-#include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 #if defined(USE_OZONE)
 #include "ui/ozone/public/ozone_platform.h"
@@ -48,7 +48,7 @@
 #if defined(USE_OZONE)
   ui::OzonePlatform::InitializeForGPU();
 #endif
-  hardware_rendering_available_ = gfx::GLSurface::InitializeOneOff();
+  hardware_rendering_available_ = gl::init::InitializeGLOneOff();
   command_buffer_task_runner_ = new CommandBufferTaskRunner;
   driver_manager_.reset(new CommandBufferDriverManager);
   sync_point_manager_.reset(new gpu::SyncPointManager(true));
diff --git a/content/common/sandbox_mac.mm b/content/common/sandbox_mac.mm
index 73fee33..ab87ff4a 100644
--- a/content/common/sandbox_mac.mm
+++ b/content/common/sandbox_mac.mm
@@ -39,7 +39,7 @@
 #include "sandbox/mac/seatbelt.h"
 #include "third_party/icu/source/common/unicode/uchar.h"
 #include "ui/base/layout.h"
-#include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 extern "C" {
 void CGSSetDenyWindowServerConnections(bool);
@@ -329,7 +329,7 @@
   if (sandbox_type == SANDBOX_TYPE_GPU) {
     // Preload either the desktop GL or the osmesa so, depending on the
     // --use-gl flag.
-    gfx::GLSurface::InitializeOneOff();
+    gl::init::InitializeGLOneOff();
 
     // Preload VideoToolbox.
     media::InitializeVideoToolbox();
diff --git a/content/content_common.gypi b/content/content_common.gypi
index e480bdf..f5927ad0 100644
--- a/content/content_common.gypi
+++ b/content/content_common.gypi
@@ -45,6 +45,7 @@
     '../ui/gfx/ipc/gfx_ipc.gyp:gfx_ipc',
     '../ui/gfx/ipc/skia/gfx_ipc_skia.gyp:gfx_ipc_skia',
     '../ui/gl/gl.gyp:gl',
+    '../ui/gl/init/gl_init.gyp:gl_init',
     '../ui/shell_dialogs/shell_dialogs.gyp:shell_dialogs',
     '../url/url.gyp:url_lib',
     '../url/ipc/url_ipc.gyp:url_ipc',
diff --git a/content/content_gpu.gypi b/content/content_gpu.gypi
index a75555f..041ae41 100644
--- a/content/content_gpu.gypi
+++ b/content/content_gpu.gypi
@@ -12,6 +12,7 @@
     '../media/media.gyp:media_gpu',
     '../skia/skia.gyp:skia',
     '../ui/gl/gl.gyp:gl',
+    '../ui/gl/init/gl_init.gyp:gl_init',
     'content_common_mojo_bindings.gyp:content_common_mojo_bindings',
   ],
   'sources': [
diff --git a/content/gpu/BUILD.gn b/content/gpu/BUILD.gn
index 63d8adf1..1b3aa77 100644
--- a/content/gpu/BUILD.gn
+++ b/content/gpu/BUILD.gn
@@ -63,6 +63,7 @@
     "//ui/events/ipc",
     "//ui/gfx/ipc",
     "//ui/gl",
+    "//ui/gl/init",
   ]
 
   if (mojo_media_host == "gpu") {
diff --git a/content/gpu/gpu_child_thread.cc b/content/gpu/gpu_child_thread.cc
index fe38be7..fec9818 100644
--- a/content/gpu/gpu_child_thread.cc
+++ b/content/gpu/gpu_child_thread.cc
@@ -38,6 +38,7 @@
 #include "ui/gl/gl_implementation.h"
 #include "ui/gl/gl_switches.h"
 #include "ui/gl/gpu_switching_manager.h"
+#include "ui/gl/init/gl_factory.h"
 #include "url/gurl.h"
 
 #if defined(USE_OZONE)
@@ -199,8 +200,8 @@
          base::CommandLine::ForCurrentProcess()->HasSwitch(
              switches::kInProcessGPU));
 
-  if (!gfx::GLSurface::InitializeOneOff())
-    VLOG(1) << "gfx::GLSurface::InitializeOneOff failed";
+  if (!gl::init::InitializeGLOneOff())
+    VLOG(1) << "gl::init::InitializeGLOneOff failed";
 
   g_thread_safe_sender.Get() = thread_safe_sender();
   g_lazy_tls.Pointer()->Set(this);
diff --git a/content/gpu/gpu_main.cc b/content/gpu/gpu_main.cc
index 7cfe918..8dec744 100644
--- a/content/gpu/gpu_main.cc
+++ b/content/gpu/gpu_main.cc
@@ -42,6 +42,7 @@
 #include "ui/gl/gl_surface.h"
 #include "ui/gl/gl_switches.h"
 #include "ui/gl/gpu_switching_manager.h"
+#include "ui/gl/init/gl_factory.h"
 
 #if defined(OS_WIN)
 #include <dwmapi.h>
@@ -54,8 +55,8 @@
 #endif
 
 #if defined(OS_WIN)
-#include "base/win/windows_version.h"
 #include "base/win/scoped_com_initializer.h"
+#include "base/win/windows_version.h"
 #include "media/gpu/dxva_video_decode_accelerator_win.h"
 #include "sandbox/win/src/sandbox.h"
 #endif
@@ -275,13 +276,13 @@
     bool gl_already_initialized = false;
 #if defined(OS_MACOSX)
     if (!command_line.HasSwitch(switches::kNoSandbox)) {
-      // On Mac, if the sandbox is enabled, then GLSurface::InitializeOneOff()
+      // On Mac, if the sandbox is enabled, then gl::init::InitializeGLOneOff()
       // is called from the sandbox warmup code before getting here.
       gl_already_initialized = true;
     }
 #endif
     if (command_line.HasSwitch(switches::kInProcessGPU)) {
-      // With in-process GPU, GLSurface::InitializeOneOff() is called from
+      // With in-process GPU, gl::init::InitializeGLOneOff() is called from
       // GpuChildThread before getting here.
       gl_already_initialized = true;
     }
@@ -290,7 +291,7 @@
     bool gl_initialized =
         gl_already_initialized
             ? gfx::GetGLImplementation() != gfx::kGLImplementationNone
-            : gfx::GLSurface::InitializeOneOff();
+            : gl::init::InitializeGLOneOff();
     if (gl_initialized) {
       // We need to collect GL strings (VENDOR, RENDERER) for blacklisting
       // purposes. However, on Mac we don't actually use them. As documented in
@@ -334,7 +335,7 @@
       UMA_HISTOGRAM_TIMES("GPU.CollectContextGraphicsInfo",
                           collect_context_time);
     } else {  // gl_initialized
-      VLOG(1) << "gfx::GLSurface::InitializeOneOff failed";
+      VLOG(1) << "gl::init::InitializeGLOneOff failed";
       dead_on_arrival = true;
     }
 
@@ -524,18 +525,18 @@
 
 void CreateDummyGlContext() {
   scoped_refptr<gfx::GLSurface> surface(
-      gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size()));
+      gl::init::CreateOffscreenGLSurface(gfx::Size()));
   if (!surface.get()) {
-    DVLOG(1) << "gfx::GLSurface::CreateOffscreenGLSurface failed";
+    DVLOG(1) << "gl::init::CreateOffscreenGLSurface failed";
     return;
   }
 
   // On Linux, this is needed to make sure /dev/nvidiactl has
   // been opened and its descriptor cached.
-  scoped_refptr<gfx::GLContext> context(gfx::GLContext::CreateGLContext(
-      NULL, surface.get(), gfx::PreferDiscreteGpu));
+  scoped_refptr<gfx::GLContext> context(
+      gl::init::CreateGLContext(NULL, surface.get(), gfx::PreferDiscreteGpu));
   if (!context.get()) {
-    DVLOG(1) << "gfx::GLContext::CreateGLContext failed";
+    DVLOG(1) << "gl::init::CreateGLContext failed";
     return;
   }
 
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn
index 1759ef2..9e96a4a 100644
--- a/gpu/BUILD.gn
+++ b/gpu/BUILD.gn
@@ -391,6 +391,7 @@
     "//testing/perf",
     "//ui/gfx/geometry",
     "//ui/gl",
+    "//ui/gl/init",
   ]
 
   # This target should not require the Chrome executable to run.
diff --git a/gpu/command_buffer/service/BUILD.gn b/gpu/command_buffer/service/BUILD.gn
index 7dd6ea4..6a90413 100644
--- a/gpu/command_buffer/service/BUILD.gn
+++ b/gpu/command_buffer/service/BUILD.gn
@@ -155,6 +155,7 @@
     "//ui/gfx",
     "//ui/gfx/geometry",
     "//ui/gl",
+    "//ui/gl/init",
   ]
 
   if (is_mac) {
diff --git a/gpu/command_buffer/service/in_process_command_buffer.cc b/gpu/command_buffer/service/in_process_command_buffer.cc
index 5d4bb0c..22d2468 100644
--- a/gpu/command_buffer/service/in_process_command_buffer.cc
+++ b/gpu/command_buffer/service/in_process_command_buffer.cc
@@ -44,6 +44,7 @@
 #include "ui/gl/gl_image.h"
 #include "ui/gl/gl_image_shared_memory.h"
 #include "ui/gl/gl_share_group.h"
+#include "ui/gl/init/gl_factory.h"
 
 #if defined(OS_WIN)
 #include <windows.h>
@@ -342,9 +343,9 @@
 
   if (!surface_.get()) {
     if (params.is_offscreen)
-      surface_ = gfx::GLSurface::CreateOffscreenGLSurface(params.size);
+      surface_ = gl::init::CreateOffscreenGLSurface(params.size);
     else
-      surface_ = gfx::GLSurface::CreateViewGLSurface(params.window);
+      surface_ = gl::init::CreateViewGLSurface(params.window);
   }
 
   if (!surface_.get()) {
@@ -364,7 +365,7 @@
           .use_virtualized_gl_contexts) {
     context_ = gl_share_group_->GetSharedContext();
     if (!context_.get()) {
-      context_ = gfx::GLContext::CreateGLContext(
+      context_ = gl::init::CreateGLContext(
           gl_share_group_.get(), surface_.get(), params.gpu_preference);
       gl_share_group_->SetSharedContext(context_.get());
     }
@@ -377,8 +378,8 @@
       context_ = NULL;
     }
   } else {
-    context_ = gfx::GLContext::CreateGLContext(
-        gl_share_group_.get(), surface_.get(), params.gpu_preference);
+    context_ = gl::init::CreateGLContext(gl_share_group_.get(), surface_.get(),
+                                         params.gpu_preference);
   }
 
   if (!context_.get()) {
diff --git a/gpu/command_buffer/tests/gl_manager.cc b/gpu/command_buffer/tests/gl_manager.cc
index a52e209..5ff6c8b 100644
--- a/gpu/command_buffer/tests/gl_manager.cc
+++ b/gpu/command_buffer/tests/gl_manager.cc
@@ -43,6 +43,7 @@
 #include "ui/gl/gl_image_ref_counted_memory.h"
 #include "ui/gl/gl_share_group.h"
 #include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 #if defined(OS_MACOSX)
 #include "ui/gfx/mac/io_surface.h"
@@ -312,7 +313,7 @@
 
   decoder_->set_engine(executor_.get());
 
-  surface_ = gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size());
+  surface_ = gl::init::CreateOffscreenGLSurface(gfx::Size());
   ASSERT_TRUE(surface_.get() != NULL) << "could not create offscreen surface";
 
   if (base_context_) {
@@ -327,9 +328,8 @@
       ASSERT_TRUE(context_->Initialize(
           surface_.get(), gfx::PreferIntegratedGpu));
     } else {
-      context_ = gfx::GLContext::CreateGLContext(share_group_.get(),
-                                                 surface_.get(),
-                                                 gpu_preference);
+      context_ = gl::init::CreateGLContext(share_group_.get(), surface_.get(),
+                                           gpu_preference);
     }
   }
   ASSERT_TRUE(context_.get() != NULL) << "could not create GL context";
@@ -392,12 +392,11 @@
           new gfx::GLShareGroup);
       gfx::Size size(4, 4);
       base_surface_ = new scoped_refptr<gfx::GLSurface>(
-          gfx::GLSurface::CreateOffscreenGLSurface(size));
+          gl::init::CreateOffscreenGLSurface(size));
       gfx::GpuPreference gpu_preference(gfx::PreferDiscreteGpu);
-      base_context_ = new scoped_refptr<gfx::GLContext>(
-          gfx::GLContext::CreateGLContext(base_share_group_->get(),
-                                          base_surface_->get(),
-                                          gpu_preference));
+      base_context_ =
+          new scoped_refptr<gfx::GLContext>(gl::init::CreateGLContext(
+              base_share_group_->get(), base_surface_->get(), gpu_preference));
     #endif
   }
   ++use_count_;
diff --git a/gpu/command_buffer/tests/gl_tests_main.cc b/gpu/command_buffer/tests/gl_tests_main.cc
index e2b93fd..0c79c11 100644
--- a/gpu/command_buffer/tests/gl_tests_main.cc
+++ b/gpu/command_buffer/tests/gl_tests_main.cc
@@ -15,7 +15,7 @@
 #include "gpu/config/gpu_info_collector.h"
 #include "gpu/config/gpu_util.h"
 #include "testing/gmock/include/gmock/gmock.h"
-#include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 #if defined(OS_ANDROID)
 #include "base/android/jni_android.h"
@@ -34,7 +34,7 @@
   gpu::CollectBasicGraphicsInfo(&gpu_info);
   gpu::ApplyGpuDriverBugWorkarounds(gpu_info,
                                     base::CommandLine::ForCurrentProcess());
-  gfx::GLSurface::InitializeOneOff();
+  gl::init::InitializeGLOneOff();
   ::gles2::Initialize();
   return testSuite->Run();
 }
diff --git a/gpu/command_buffer/tests/gl_unittests_android.cc b/gpu/command_buffer/tests/gl_unittests_android.cc
index 9bdd503..2767f16 100644
--- a/gpu/command_buffer/tests/gl_unittests_android.cc
+++ b/gpu/command_buffer/tests/gl_unittests_android.cc
@@ -17,6 +17,7 @@
 #include "ui/gfx/native_widget_types.h"
 #include "ui/gl/android/surface_texture.h"
 #include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 namespace gpu {
 
@@ -40,7 +41,7 @@
   EXPECT_TRUE(window != NULL);
 
   scoped_refptr<gfx::GLSurface> gl_surface =
-      gfx::GLSurface::CreateViewGLSurface(window);
+      gl::init::CreateViewGLSurface(window);
   EXPECT_TRUE(gl_surface.get() != NULL);
 
   gl_.SetSurface(gl_surface.get());
diff --git a/gpu/command_buffer_service.gypi b/gpu/command_buffer_service.gypi
index 895cf31b..6a86e49 100644
--- a/gpu/command_buffer_service.gypi
+++ b/gpu/command_buffer_service.gypi
@@ -22,6 +22,7 @@
     '../ui/gfx/gfx.gyp:gfx',
     '../ui/gfx/gfx.gyp:gfx_geometry',
     '../ui/gl/gl.gyp:gl',
+    '../ui/gl/init/gl_init.gyp:gl_init',
     '<(angle_path)/src/angle.gyp:commit_id',
     '<(angle_path)/src/angle.gyp:translator',
   ],
diff --git a/gpu/config/BUILD.gn b/gpu/config/BUILD.gn
index d75e143..aa6fa7ea 100644
--- a/gpu/config/BUILD.gn
+++ b/gpu/config/BUILD.gn
@@ -77,6 +77,7 @@
     "//base",
     "//third_party/re2",
     "//ui/gl",
+    "//ui/gl/init",
   ]
 
   # Prefer mesa GL headers to system headers, which cause problems on Win.
diff --git a/gpu/config/gpu_info_collector.cc b/gpu/config/gpu_info_collector.cc
index 5ecbaba..e07379c 100644
--- a/gpu/config/gpu_info_collector.cc
+++ b/gpu/config/gpu_info_collector.cc
@@ -24,12 +24,13 @@
 #include "ui/gl/gl_implementation.h"
 #include "ui/gl/gl_surface.h"
 #include "ui/gl/gl_version_info.h"
+#include "ui/gl/init/gl_factory.h"
 
 namespace {
 
 scoped_refptr<gfx::GLSurface> InitializeGLSurface() {
   scoped_refptr<gfx::GLSurface> surface(
-      gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size()));
+      gl::init::CreateOffscreenGLSurface(gfx::Size()));
   if (!surface.get()) {
     LOG(ERROR) << "gfx::GLContext::CreateOffscreenGLSurface failed";
     return NULL;
@@ -39,13 +40,10 @@
 }
 
 scoped_refptr<gfx::GLContext> InitializeGLContext(gfx::GLSurface* surface) {
-
   scoped_refptr<gfx::GLContext> context(
-      gfx::GLContext::CreateGLContext(NULL,
-                                      surface,
-                                      gfx::PreferIntegratedGpu));
+      gl::init::CreateGLContext(nullptr, surface, gfx::PreferIntegratedGpu));
   if (!context.get()) {
-    LOG(ERROR) << "gfx::GLContext::CreateGLContext failed";
+    LOG(ERROR) << "gl::init::CreateGLContext failed";
     return NULL;
   }
 
diff --git a/gpu/gles2_conform_support/egl/context.cc b/gpu/gles2_conform_support/egl/context.cc
index 8bdd48d..9228efa 100644
--- a/gpu/gles2_conform_support/egl/context.cc
+++ b/gpu/gles2_conform_support/egl/context.cc
@@ -19,6 +19,7 @@
 #include "gpu/gles2_conform_support/egl/display.h"
 #include "gpu/gles2_conform_support/egl/surface.h"
 #include "gpu/gles2_conform_support/egl/thread_state.h"
+#include "ui/gl/init/gl_factory.h"
 
 // The slight complexification in this file comes from following properties:
 // 1) Command buffer connection (context) can not be established without a
@@ -271,8 +272,8 @@
 
   decoder->set_engine(command_executor.get());
 
-  scoped_refptr<gfx::GLContext> gl_context(gfx::GLContext::CreateGLContext(
-      nullptr, gl_surface, gfx::PreferDiscreteGpu));
+  scoped_refptr<gfx::GLContext> gl_context(
+      gl::init::CreateGLContext(nullptr, gl_surface, gfx::PreferDiscreteGpu));
   if (!gl_context)
     return false;
 
diff --git a/gpu/gles2_conform_support/egl/display.cc b/gpu/gles2_conform_support/egl/display.cc
index b4e01587..f80820f6 100644
--- a/gpu/gles2_conform_support/egl/display.cc
+++ b/gpu/gles2_conform_support/egl/display.cc
@@ -8,6 +8,7 @@
 #include "gpu/gles2_conform_support/egl/context.h"
 #include "gpu/gles2_conform_support/egl/surface.h"
 #include "gpu/gles2_conform_support/egl/thread_state.h"
+#include "ui/gl/init/gl_factory.h"
 
 namespace egl {
 
@@ -178,8 +179,7 @@
                                            EGLint height) {
   lock_.AssertAcquired();
   scoped_refptr<gfx::GLSurface> gl_surface;
-  gl_surface =
-      gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(width, height));
+  gl_surface = gl::init::CreateOffscreenGLSurface(gfx::Size(width, height));
   if (!gl_surface)
     return ts->ReturnError(EGL_BAD_ALLOC, nullptr);
   surfaces_.emplace_back(new Surface(gl_surface.get(), config));
@@ -214,7 +214,7 @@
     return result;
   }
   scoped_refptr<gfx::GLSurface> gl_surface;
-  gl_surface = gfx::GLSurface::CreateViewGLSurface(win);
+  gl_surface = gl::init::CreateViewGLSurface(win);
   if (!gl_surface)
     return ts->ReturnError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
   surfaces_.emplace_back(new Surface(gl_surface.get(), config));
diff --git a/gpu/gles2_conform_support/egl/thread_state.cc b/gpu/gles2_conform_support/egl/thread_state.cc
index 41593cb..13c5f89 100644
--- a/gpu/gles2_conform_support/egl/thread_state.cc
+++ b/gpu/gles2_conform_support/egl/thread_state.cc
@@ -22,6 +22,7 @@
 #include "gpu/gles2_conform_support/egl/test_support.h"
 #include "ui/gl/gl_context.h"
 #include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 // Thread local key for ThreadState instance. Accessed when holding g_egl_lock
 // only, since the initialization can not be Guaranteed otherwise.  Not in
@@ -83,7 +84,7 @@
         gpu::ApplyGpuDriverBugWorkarounds(gpu_info, command_line);
       }
 
-      gfx::GLSurface::InitializeOneOff();
+      gl::init::InitializeGLOneOff();
     }
 
     g_egl_default_display = new egl::Display();
diff --git a/gpu/gles2_conform_support/gles2_conform_support.gyp b/gpu/gles2_conform_support/gles2_conform_support.gyp
index 0316ddb..5f97bba 100644
--- a/gpu/gles2_conform_support/gles2_conform_support.gyp
+++ b/gpu/gles2_conform_support/gles2_conform_support.gyp
@@ -35,6 +35,7 @@
         '../../ui/base/ui_base.gyp:ui_base',
         '../../ui/gfx/gfx.gyp:gfx_geometry',
         '../../ui/gl/gl.gyp:gl',
+        '../../ui/gl/init/gl_init.gyp:gl_init',
       ],
       'sources': [
         'egl/config.cc',
diff --git a/gpu/gpu.gyp b/gpu/gpu.gyp
index 027faedf..6aa0a27 100644
--- a/gpu/gpu.gyp
+++ b/gpu/gpu.gyp
@@ -21,6 +21,7 @@
         '../third_party/khronos/khronos.gyp:khronos_headers',
         '../ui/gfx/gfx.gyp:gfx_geometry',
         '../ui/gl/gl.gyp:gl',
+        '../ui/gl/init/gl_init.gyp:gl_init',
         'command_buffer/command_buffer.gyp:gles2_utils',
         'gles2_cmd_helper',
       ],
@@ -50,6 +51,7 @@
         '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
         '../ui/gfx/gfx.gyp:gfx_geometry',
         '../ui/gl/gl.gyp:gl',
+        '../ui/gl/init/gl_init.gyp:gl_init',
       ],
       'defines': [
         'GL_IN_PROCESS_CONTEXT_IMPLEMENTATION',
@@ -166,6 +168,7 @@
         '../ui/gfx/gfx.gyp:gfx_geometry',
         '../ui/gfx/gfx.gyp:gfx_test_support',
         '../ui/gl/gl.gyp:gl',
+        '../ui/gl/init/gl_init.gyp:gl_init',
         '../ui/gl/gl.gyp:gl_test_support',
         'command_buffer/command_buffer.gyp:gles2_utils',
         'command_buffer_client',
@@ -319,6 +322,7 @@
         '../third_party/mesa/mesa.gyp:mesa_headers',
         '../ui/gfx/gfx.gyp:gfx_test_support',
         '../ui/gl/gl.gyp:gl',
+        '../ui/gl/init/gl_init.gyp:gl_init',
         '../ui/gl/gl.gyp:gl_unittest_utils',
         '../ui/gl/gl.gyp:gl_test_support',
         '../url/url.gyp:url_lib',
@@ -371,6 +375,7 @@
         '../testing/perf/perf_test.gyp:perf_test',
         '../ui/gfx/gfx.gyp:gfx_geometry',
         '../ui/gl/gl.gyp:gl',
+        '../ui/gl/init/gl_init.gyp:gl_init',
         'command_buffer_service',
       ],
       'sources': [
@@ -403,6 +408,7 @@
         '../ui/gfx/gfx.gyp:gfx_test_support',
         '../ui/gfx/gfx.gyp:gfx_geometry',
         '../ui/gl/gl.gyp:gl',
+        '../ui/gl/init/gl_init.gyp:gl_init',
         'command_buffer/command_buffer.gyp:gles2_utils',
         'command_buffer_client',
         'command_buffer_common',
@@ -521,6 +527,7 @@
         '../gpu/gpu.gyp:command_buffer_service',
         '../ui/gfx/gfx.gyp:gfx_geometry',
         '../ui/gl/gl.gyp:gl',
+        '../ui/gl/init/gl_init.gyp:gl_init',
         'command_buffer/command_buffer.gyp:gles2_utils',
         'gles2_c_lib',
         'gles2_implementation',
diff --git a/gpu/gpu_config.gypi b/gpu/gpu_config.gypi
index df9b3599..5907ce1 100644
--- a/gpu/gpu_config.gypi
+++ b/gpu/gpu_config.gypi
@@ -7,6 +7,7 @@
     '../third_party/re2/re2.gyp:re2',
     '../base/base.gyp:base',
     '../ui/gl/gl.gyp:gl',
+    '../ui/gl/init/gl_init.gyp:gl_init',
   ],
   'include_dirs': [
     '..',
diff --git a/gpu/gpu_ipc_client.gypi b/gpu/gpu_ipc_client.gypi
index f0ad3f2..dfa6a99 100644
--- a/gpu/gpu_ipc_client.gypi
+++ b/gpu/gpu_ipc_client.gypi
@@ -14,6 +14,7 @@
     '../ui/gfx/ipc/geometry/gfx_ipc_geometry.gyp:gfx_ipc_geometry',
     '../ui/gfx/ipc/gfx_ipc.gyp:gfx_ipc',
     '../ui/gl/gl.gyp:gl',
+    '../ui/gl/init/gl_init.gyp:gl_init',
     '../url/url.gyp:url_lib',
     '../url/ipc/url_ipc.gyp:url_ipc',
   ],
diff --git a/gpu/gpu_ipc_common.gypi b/gpu/gpu_ipc_common.gypi
index 6a4a41d..3bf9ec5 100644
--- a/gpu/gpu_ipc_common.gypi
+++ b/gpu/gpu_ipc_common.gypi
@@ -14,6 +14,7 @@
     '../ui/gfx/ipc/geometry/gfx_ipc_geometry.gyp:gfx_ipc_geometry',
     '../ui/gfx/ipc/gfx_ipc.gyp:gfx_ipc',
     '../ui/gl/gl.gyp:gl',
+    '../ui/gl/init/gl_init.gyp:gl_init',
     '../url/url.gyp:url_lib',
     '../url/ipc/url_ipc.gyp:url_ipc',
   ],
diff --git a/gpu/gpu_ipc_service.gypi b/gpu/gpu_ipc_service.gypi
index 443abbe..f2a86e2 100644
--- a/gpu/gpu_ipc_service.gypi
+++ b/gpu/gpu_ipc_service.gypi
@@ -11,6 +11,7 @@
     '../ui/gfx/gfx.gyp:gfx',
     '../ui/gfx/gfx.gyp:gfx_geometry',
     '../ui/gl/gl.gyp:gl',
+    '../ui/gl/init/gl_init.gyp:gl_init',
     '../url/url.gyp:url_lib',
   ],
   'include_dirs': [
diff --git a/gpu/ipc/service/BUILD.gn b/gpu/ipc/service/BUILD.gn
index cc514a8..052a892 100644
--- a/gpu/ipc/service/BUILD.gn
+++ b/gpu/ipc/service/BUILD.gn
@@ -50,6 +50,7 @@
     "//ui/gfx",
     "//ui/gfx/geometry",
     "//ui/gl",
+    "//ui/gl/init",
     "//url",
   ]
   deps = [
diff --git a/gpu/ipc/service/gpu_channel_manager.cc b/gpu/ipc/service/gpu_channel_manager.cc
index f31f40a..04487ed 100644
--- a/gpu/ipc/service/gpu_channel_manager.cc
+++ b/gpu/ipc/service/gpu_channel_manager.cc
@@ -27,6 +27,7 @@
 #include "gpu/ipc/service/gpu_memory_manager.h"
 #include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_share_group.h"
+#include "ui/gl/init/gl_factory.h"
 
 namespace gpu {
 
@@ -234,7 +235,7 @@
 gfx::GLSurface* GpuChannelManager::GetDefaultOffscreenSurface() {
   if (!default_offscreen_surface_.get()) {
     default_offscreen_surface_ =
-        gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size());
+        gl::init::CreateOffscreenGLSurface(gfx::Size());
   }
   return default_offscreen_surface_.get();
 }
diff --git a/gpu/ipc/service/gpu_command_buffer_stub.cc b/gpu/ipc/service/gpu_command_buffer_stub.cc
index 6032dab..ae78f6c 100644
--- a/gpu/ipc/service/gpu_command_buffer_stub.cc
+++ b/gpu/ipc/service/gpu_command_buffer_stub.cc
@@ -38,9 +38,11 @@
 #include "gpu/ipc/service/gpu_watchdog.h"
 #include "gpu/ipc/service/image_transport_surface.h"
 #include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_context.h"
 #include "ui/gl/gl_image.h"
 #include "ui/gl/gl_implementation.h"
 #include "ui/gl/gl_switches.h"
+#include "ui/gl/init/gl_factory.h"
 
 #if defined(OS_WIN)
 #include "base/win/win_util.h"
@@ -563,8 +565,8 @@
   if (use_virtualized_gl_context_ && share_group) {
     context = share_group->GetSharedContext();
     if (!context.get()) {
-      context = gfx::GLContext::CreateGLContext(
-          share_group,
+      context = gl::init::CreateGLContext(
+          channel_->share_group(),
           channel_->gpu_channel_manager()->GetDefaultOffscreenSurface(),
           gpu_preference_);
       if (!context.get()) {
@@ -595,8 +597,8 @@
     }
   }
   if (!context.get()) {
-    context = gfx::GLContext::CreateGLContext(
-        share_group, surface_.get(), gpu_preference_);
+    context =
+        gl::init::CreateGLContext(share_group, surface_.get(), gpu_preference_);
   }
   if (!context.get()) {
     DLOG(ERROR) << "Failed to create context.";
diff --git a/gpu/ipc/service/image_transport_surface_linux.cc b/gpu/ipc/service/image_transport_surface_linux.cc
index 9f60d45..24e21ae 100644
--- a/gpu/ipc/service/image_transport_surface_linux.cc
+++ b/gpu/ipc/service/image_transport_surface_linux.cc
@@ -5,6 +5,7 @@
 #include "gpu/ipc/service/image_transport_surface.h"
 
 #include "gpu/ipc/service/pass_through_image_transport_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 namespace gpu {
 
@@ -17,10 +18,10 @@
   DCHECK_NE(surface_handle, kNullSurfaceHandle);
   scoped_refptr<gfx::GLSurface> surface;
 #if defined(USE_OZONE)
-  surface = gfx::GLSurface::CreateSurfacelessViewGLSurface(surface_handle);
+  surface = gl::init::CreateSurfacelessViewGLSurface(surface_handle);
 #endif
   if (!surface)
-    surface = gfx::GLSurface::CreateViewGLSurface(surface_handle);
+    surface = gl::init::CreateViewGLSurface(surface_handle);
   if (!surface)
     return surface;
   return scoped_refptr<gfx::GLSurface>(new PassThroughImageTransportSurface(
diff --git a/gpu/ipc/service/image_transport_surface_win.cc b/gpu/ipc/service/image_transport_surface_win.cc
index 7cc4454..3bc4fae 100644
--- a/gpu/ipc/service/image_transport_surface_win.cc
+++ b/gpu/ipc/service/image_transport_surface_win.cc
@@ -12,6 +12,7 @@
 #include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_implementation.h"
 #include "ui/gl/gl_surface_egl.h"
+#include "ui/gl/init/gl_factory.h"
 #include "ui/gl/vsync_provider_win.h"
 
 namespace gpu {
@@ -37,7 +38,7 @@
     if (!egl_surface->Initialize(std::move(vsync_provider)))
       return nullptr;
   } else {
-    surface = gfx::GLSurface::CreateViewGLSurface(surface_handle);
+    surface = gl::init::CreateViewGLSurface(surface_handle);
     if (!surface)
       return nullptr;
   }
diff --git a/gpu/perftests/texture_upload_perftest.cc b/gpu/perftests/texture_upload_perftest.cc
index 3cbcd07..86eeb021d 100644
--- a/gpu/perftests/texture_upload_perftest.cc
+++ b/gpu/perftests/texture_upload_perftest.cc
@@ -25,6 +25,7 @@
 #include "ui/gl/gl_surface.h"
 #include "ui/gl/gl_version_info.h"
 #include "ui/gl/gpu_timing.h"
+#include "ui/gl/init/gl_factory.h"
 #include "ui/gl/scoped_make_current.h"
 
 #if defined(USE_OZONE)
@@ -183,13 +184,13 @@
     // thread.
     base::MessageLoopForUI main_loop;
 #endif
-    static bool gl_initialized = gfx::GLSurface::InitializeOneOff();
+    static bool gl_initialized = gl::init::InitializeGLOneOff();
     DCHECK(gl_initialized);
     // Initialize an offscreen surface and a gl context.
-    surface_ = gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size());
-    gl_context_ = gfx::GLContext::CreateGLContext(NULL,  // share_group
-                                                  surface_.get(),
-                                                  gfx::PreferIntegratedGpu);
+    surface_ = gl::init::CreateOffscreenGLSurface(gfx::Size());
+    gl_context_ =
+        gl::init::CreateGLContext(nullptr,  // share_group
+                                  surface_.get(), gfx::PreferIntegratedGpu);
     ui::ScopedMakeCurrent smc(gl_context_.get(), surface_.get());
     glGenTextures(1, &color_texture_);
     glBindTexture(GL_TEXTURE_2D, color_texture_);
diff --git a/gpu/tools/compositor_model_bench/BUILD.gn b/gpu/tools/compositor_model_bench/BUILD.gn
index b074ee77..fbef186 100644
--- a/gpu/tools/compositor_model_bench/BUILD.gn
+++ b/gpu/tools/compositor_model_bench/BUILD.gn
@@ -24,6 +24,7 @@
       "//base",
       "//build/config/sanitizers:deps",
       "//ui/gl",
+      "//ui/gl/init",
     ]
   }
 }
diff --git a/gpu/tools/compositor_model_bench/compositor_model_bench.cc b/gpu/tools/compositor_model_bench/compositor_model_bench.cc
index 4d77353..dca35a7 100644
--- a/gpu/tools/compositor_model_bench/compositor_model_bench.cc
+++ b/gpu/tools/compositor_model_bench/compositor_model_bench.cc
@@ -35,7 +35,7 @@
 #include "gpu/tools/compositor_model_bench/render_model_utils.h"
 #include "gpu/tools/compositor_model_bench/render_models.h"
 #include "gpu/tools/compositor_model_bench/render_tree.h"
-#include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 using base::TimeTicks;
 using base::DirectoryExists;
@@ -186,8 +186,8 @@
 
   // Initialize the OpenGL context.
   bool InitGLContext() {
-    if (!gfx::GLSurface::InitializeOneOff()) {
-      LOG(FATAL) << "gfx::GLSurface::InitializeOneOff failed";
+    if (!gl::init::InitializeGLOneOff()) {
+      LOG(FATAL) << "gl::init::InitializeGLOneOff failed";
       return false;
     }
 
diff --git a/gpu/tools/tools.gyp b/gpu/tools/tools.gyp
index 342a769..c2109c13 100644
--- a/gpu/tools/tools.gyp
+++ b/gpu/tools/tools.gyp
@@ -19,6 +19,7 @@
             '../../base/base.gyp:base',
             '../../build/linux/system.gyp:x11',
             '../../ui/gl/gl.gyp:gl',
+            '../../ui/gl/init/gl_init.gyp:gl_init',
           ],
           'libraries': [
             '-lGL',
diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn
index 5ca89e2..3f5bb533 100644
--- a/media/gpu/BUILD.gn
+++ b/media/gpu/BUILD.gn
@@ -368,6 +368,7 @@
       "//ui/gfx/geometry",
       "//ui/gl",
       "//ui/gl:test_support",
+      "//ui/gl/init",
     ]
 
     configs += [ "//third_party/khronos:khronos_headers" ]
diff --git a/media/gpu/rendering_helper.cc b/media/gpu/rendering_helper.cc
index b72dc10..30b1a1e 100644
--- a/media/gpu/rendering_helper.cc
+++ b/media/gpu/rendering_helper.cc
@@ -25,6 +25,7 @@
 #include "ui/gl/gl_context.h"
 #include "ui/gl/gl_implementation.h"
 #include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 #if defined(OS_WIN)
 #include <windows.h>
@@ -194,7 +195,7 @@
   cmd_line->AppendSwitchASCII(switches::kUseGL, gfx::kGLImplementationEGLName);
 #endif
 
-  if (!gfx::GLSurface::InitializeOneOff())
+  if (!gl::init::InitializeGLOneOff())
     LOG(FATAL) << "Could not initialize GL";
   done->Signal();
 }
@@ -329,14 +330,14 @@
   render_as_thumbnails_ = params.render_as_thumbnails;
   message_loop_ = base::MessageLoop::current();
 
-  gl_surface_ = gfx::GLSurface::CreateViewGLSurface(window_);
+  gl_surface_ = gl::init::CreateViewGLSurface(window_);
 #if defined(USE_OZONE)
   gl_surface_->Resize(platform_window_delegate_->GetSize(), 1.f, true);
 #endif  // defined(USE_OZONE)
   screen_size_ = gl_surface_->GetSize();
 
-  gl_context_ = gfx::GLContext::CreateGLContext(NULL, gl_surface_.get(),
-                                                gfx::PreferIntegratedGpu);
+  gl_context_ = gl::init::CreateGLContext(nullptr, gl_surface_.get(),
+                                          gfx::PreferIntegratedGpu);
   CHECK(gl_context_->MakeCurrent(gl_surface_.get()));
 
   CHECK_GT(params.window_sizes.size(), 0U);
diff --git a/media/media_gpu.gypi b/media/media_gpu.gypi
index 364a3dd..e21af31 100644
--- a/media/media_gpu.gypi
+++ b/media/media_gpu.gypi
@@ -13,6 +13,7 @@
     '../ui/display/display.gyp:display_types',
     '../ui/gfx/gfx.gyp:gfx_geometry',
     '../ui/gl/gl.gyp:gl',
+    '../ui/gl/init/gl_init.gyp:gl_init',
     '../ui/platform_window/platform_window.gyp:platform_window',
   ],
   'sources': [
@@ -322,6 +323,7 @@
       'dependencies': [
         '../media/media.gyp:media',
         '../ui/gl/gl.gyp:gl',
+        '../ui/gl/init/gl_init.gyp:gl_init',
       ],
       'link_settings': {
         'libraries': [
diff --git a/ui/aura/BUILD.gn b/ui/aura/BUILD.gn
index 32e747d..99b3b1f 100644
--- a/ui/aura/BUILD.gn
+++ b/ui/aura/BUILD.gn
@@ -243,7 +243,7 @@
     "//ui/events",
     "//ui/gfx",
     "//ui/gfx/geometry",
-    "//ui/gl",
+    "//ui/gl/init",
   ]
 
   if (use_x11) {
diff --git a/ui/aura/aura.gyp b/ui/aura/aura.gyp
index 2372dca..5b15beed 100644
--- a/ui/aura/aura.gyp
+++ b/ui/aura/aura.gyp
@@ -261,6 +261,7 @@
         '../gfx/gfx.gyp:gfx',
         '../gfx/gfx.gyp:gfx_geometry',
         '../gl/gl.gyp:gl',
+        '../gl/init/gl_init.gyp:gl_init',
         'aura_test_support',
         'aura',
       ],
diff --git a/ui/aura/demo/DEPS b/ui/aura/demo/DEPS
index 04a064d..305f5f6 100644
--- a/ui/aura/demo/DEPS
+++ b/ui/aura/demo/DEPS
@@ -1,4 +1,4 @@
 include_rules = [
   "+ui/display",          # Windows DPI Initialization.
-  "+ui/gl/gl_surface.h",  # To initialize GL bindings.
+  "+ui/gl/init/gl_factory.h",  # To initialize GL bindings.
 ]
diff --git a/ui/aura/demo/demo_main.cc b/ui/aura/demo/demo_main.cc
index 0c6867b..8f52346 100644
--- a/ui/aura/demo/demo_main.cc
+++ b/ui/aura/demo/demo_main.cc
@@ -29,7 +29,7 @@
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/skia_util.h"
-#include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 #if defined(USE_X11)
 #include "ui/gfx/x/x11_connection.h"  // nogncheck
@@ -130,7 +130,7 @@
   gfx::InitializeThreadedX11();
 #endif
 
-  gfx::GLSurface::InitializeOneOff();
+  gl::init::InitializeGLOneOff();
 
 #if defined(OS_WIN)
   display::win::SetDefaultDeviceScaleFactor(1.0f);
diff --git a/ui/gl/BUILD.gn b/ui/gl/BUILD.gn
index 876f5c2..304f046 100644
--- a/ui/gl/BUILD.gn
+++ b/ui/gl/BUILD.gn
@@ -322,6 +322,7 @@
 
   public_deps = [
     ":gl",
+    "//ui/gl/init",
   ]
   deps = [
     "//testing/gtest",
@@ -374,6 +375,7 @@
     "//testing/gtest",
     "//ui/gfx",
     "//ui/gfx/geometry",
+    "//ui/gl/init",
   ]
 
   data_deps = [
diff --git a/ui/gl/generate_bindings.py b/ui/gl/generate_bindings.py
index 1b28d2a..8771d1e 100755
--- a/ui/gl/generate_bindings.py
+++ b/ui/gl/generate_bindings.py
@@ -1905,8 +1905,8 @@
   file.write(LICENSE_AND_HEADER +
 """
 
-#ifndef UI_GFX_GL_GL_BINDINGS_AUTOGEN_%(name)s_H_
-#define UI_GFX_GL_GL_BINDINGS_AUTOGEN_%(name)s_H_
+#ifndef UI_GL_GL_BINDINGS_AUTOGEN_%(name)s_H_
+#define UI_GL_GL_BINDINGS_AUTOGEN_%(name)s_H_
 
 namespace gfx {
 
@@ -1962,7 +1962,7 @@
         (func['known_as'], set_name.lower(), func['known_as']))
 
   file.write('\n')
-  file.write('#endif  //  UI_GFX_GL_GL_BINDINGS_AUTOGEN_%s_H_\n' %
+  file.write('#endif  //  UI_GL_GL_BINDINGS_AUTOGEN_%s_H_\n' %
       set_name.upper())
 
 
diff --git a/ui/gl/gl.gyp b/ui/gl/gl.gyp
index 2b84ea2..7fa43f5 100644
--- a/ui/gl/gl.gyp
+++ b/ui/gl/gl.gyp
@@ -311,6 +311,7 @@
         '../../testing/gmock.gyp:gmock',
         '../../third_party/khronos/khronos.gyp:khronos_headers',
         'gl',
+        'init/gl_init.gyp:gl_init',
       ],
       'include_dirs': [
         '../..',
@@ -332,6 +333,7 @@
         '<(DEPTH)/testing/gtest.gyp:gtest',
         '../../third_party/khronos/khronos.gyp:khronos_headers',
         'gl',
+        'init/gl_init.gyp:gl_init',
       ],
       'include_dirs': [
         '../..',
diff --git a/ui/gl/gl_bindings_autogen_egl.h b/ui/gl/gl_bindings_autogen_egl.h
index 54d1269..b321192 100644
--- a/ui/gl/gl_bindings_autogen_egl.h
+++ b/ui/gl/gl_bindings_autogen_egl.h
@@ -8,8 +8,8 @@
 //    clang-format -i -style=chromium filename
 // DO NOT EDIT!
 
-#ifndef UI_GFX_GL_GL_BINDINGS_AUTOGEN_EGL_H_
-#define UI_GFX_GL_GL_BINDINGS_AUTOGEN_EGL_H_
+#ifndef UI_GL_GL_BINDINGS_AUTOGEN_EGL_H_
+#define UI_GL_GL_BINDINGS_AUTOGEN_EGL_H_
 
 namespace gfx {
 
@@ -522,4 +522,4 @@
 #define eglWaitNative ::gfx::g_current_egl_context->eglWaitNativeFn
 #define eglWaitSyncKHR ::gfx::g_current_egl_context->eglWaitSyncKHRFn
 
-#endif  //  UI_GFX_GL_GL_BINDINGS_AUTOGEN_EGL_H_
+#endif  //  UI_GL_GL_BINDINGS_AUTOGEN_EGL_H_
diff --git a/ui/gl/gl_bindings_autogen_gl.h b/ui/gl/gl_bindings_autogen_gl.h
index 7019e7d..73ff63b 100644
--- a/ui/gl/gl_bindings_autogen_gl.h
+++ b/ui/gl/gl_bindings_autogen_gl.h
@@ -8,8 +8,8 @@
 //    clang-format -i -style=chromium filename
 // DO NOT EDIT!
 
-#ifndef UI_GFX_GL_GL_BINDINGS_AUTOGEN_GL_H_
-#define UI_GFX_GL_GL_BINDINGS_AUTOGEN_GL_H_
+#ifndef UI_GL_GL_BINDINGS_AUTOGEN_GL_H_
+#define UI_GL_GL_BINDINGS_AUTOGEN_GL_H_
 
 namespace gfx {
 
@@ -2745,4 +2745,4 @@
 #define glViewport ::gfx::g_current_gl_context->glViewportFn
 #define glWaitSync ::gfx::g_current_gl_context->glWaitSyncFn
 
-#endif  //  UI_GFX_GL_GL_BINDINGS_AUTOGEN_GL_H_
+#endif  //  UI_GL_GL_BINDINGS_AUTOGEN_GL_H_
diff --git a/ui/gl/gl_bindings_autogen_glx.h b/ui/gl/gl_bindings_autogen_glx.h
index fe2ae41..f9675b2 100644
--- a/ui/gl/gl_bindings_autogen_glx.h
+++ b/ui/gl/gl_bindings_autogen_glx.h
@@ -8,8 +8,8 @@
 //    clang-format -i -style=chromium filename
 // DO NOT EDIT!
 
-#ifndef UI_GFX_GL_GL_BINDINGS_AUTOGEN_GLX_H_
-#define UI_GFX_GL_GL_BINDINGS_AUTOGEN_GLX_H_
+#ifndef UI_GL_GL_BINDINGS_AUTOGEN_GLX_H_
+#define UI_GL_GL_BINDINGS_AUTOGEN_GLX_H_
 
 namespace gfx {
 
@@ -421,4 +421,4 @@
 #define glXWaitVideoSyncSGI ::gfx::g_current_glx_context->glXWaitVideoSyncSGIFn
 #define glXWaitX ::gfx::g_current_glx_context->glXWaitXFn
 
-#endif  //  UI_GFX_GL_GL_BINDINGS_AUTOGEN_GLX_H_
+#endif  //  UI_GL_GL_BINDINGS_AUTOGEN_GLX_H_
diff --git a/ui/gl/gl_bindings_autogen_osmesa.h b/ui/gl/gl_bindings_autogen_osmesa.h
index 8a6bb66..9b88f6b 100644
--- a/ui/gl/gl_bindings_autogen_osmesa.h
+++ b/ui/gl/gl_bindings_autogen_osmesa.h
@@ -8,8 +8,8 @@
 //    clang-format -i -style=chromium filename
 // DO NOT EDIT!
 
-#ifndef UI_GFX_GL_GL_BINDINGS_AUTOGEN_OSMESA_H_
-#define UI_GFX_GL_GL_BINDINGS_AUTOGEN_OSMESA_H_
+#ifndef UI_GL_GL_BINDINGS_AUTOGEN_OSMESA_H_
+#define UI_GL_GL_BINDINGS_AUTOGEN_OSMESA_H_
 
 namespace gfx {
 
@@ -120,4 +120,4 @@
 #define OSMesaMakeCurrent ::gfx::g_current_osmesa_context->OSMesaMakeCurrentFn
 #define OSMesaPixelStore ::gfx::g_current_osmesa_context->OSMesaPixelStoreFn
 
-#endif  //  UI_GFX_GL_GL_BINDINGS_AUTOGEN_OSMESA_H_
+#endif  //  UI_GL_GL_BINDINGS_AUTOGEN_OSMESA_H_
diff --git a/ui/gl/gl_bindings_autogen_wgl.h b/ui/gl/gl_bindings_autogen_wgl.h
index b7a2040..02d2fe9 100644
--- a/ui/gl/gl_bindings_autogen_wgl.h
+++ b/ui/gl/gl_bindings_autogen_wgl.h
@@ -8,8 +8,8 @@
 //    clang-format -i -style=chromium filename
 // DO NOT EDIT!
 
-#ifndef UI_GFX_GL_GL_BINDINGS_AUTOGEN_WGL_H_
-#define UI_GFX_GL_GL_BINDINGS_AUTOGEN_WGL_H_
+#ifndef UI_GL_GL_BINDINGS_AUTOGEN_WGL_H_
+#define UI_GL_GL_BINDINGS_AUTOGEN_WGL_H_
 
 namespace gfx {
 
@@ -144,4 +144,4 @@
 #define wglSwapIntervalEXT ::gfx::g_current_wgl_context->wglSwapIntervalEXTFn
 #define wglSwapLayerBuffers ::gfx::g_current_wgl_context->wglSwapLayerBuffersFn
 
-#endif  //  UI_GFX_GL_GL_BINDINGS_AUTOGEN_WGL_H_
+#endif  //  UI_GL_GL_BINDINGS_AUTOGEN_WGL_H_
diff --git a/ui/gl/gl_context.h b/ui/gl/gl_context.h
index 6d1420ded4..368b0ec9 100644
--- a/ui/gl/gl_context.h
+++ b/ui/gl/gl_context.h
@@ -13,6 +13,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/synchronization/cancellation_flag.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_share_group.h"
 #include "ui/gl/gl_state_restorer.h"
 #include "ui/gl/gpu_preference.h"
@@ -102,6 +103,7 @@
   // Create a GL context that is compatible with the given surface.
   // |share_group|, if non-NULL, is a group of contexts which the
   // internally created OpenGL context shares textures and other resources.
+  // DEPRECATED(kylechar): Use gl::init::CreateGLContext from gl_factory.h.
   static scoped_refptr<GLContext> CreateGLContext(
       GLShareGroup* share_group,
       GLSurface* compatible_surface,
diff --git a/ui/gl/gl_context_osmesa.h b/ui/gl/gl_context_osmesa.h
index d5612d6..25fa560 100644
--- a/ui/gl/gl_context_osmesa.h
+++ b/ui/gl/gl_context_osmesa.h
@@ -8,6 +8,7 @@
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "ui/gl/gl_context.h"
+#include "ui/gl/gl_export.h"
 
 typedef struct osmesa_context* OSMesaContext;
 
@@ -17,7 +18,7 @@
 class GLSurface;
 
 // Encapsulates an OSMesa OpenGL context that uses software rendering.
-class GLContextOSMesa : public GLContextReal {
+class GL_EXPORT GLContextOSMesa : public GLContextReal {
  public:
   explicit GLContextOSMesa(GLShareGroup* share_group);
 
diff --git a/ui/gl/gl_context_stub.h b/ui/gl/gl_context_stub.h
index 58854c8..ecee830 100644
--- a/ui/gl/gl_context_stub.h
+++ b/ui/gl/gl_context_stub.h
@@ -7,6 +7,7 @@
 
 #include "base/macros.h"
 #include "ui/gl/gl_context.h"
+#include "ui/gl/gl_export.h"
 
 namespace gfx {
 
diff --git a/ui/gl/gl_context_stub_with_extensions.h b/ui/gl/gl_context_stub_with_extensions.h
index 1bc1b3f..175dde9 100644
--- a/ui/gl/gl_context_stub_with_extensions.h
+++ b/ui/gl/gl_context_stub_with_extensions.h
@@ -7,6 +7,7 @@
 
 #include "base/macros.h"
 #include "ui/gl/gl_context_stub.h"
+#include "ui/gl/gl_export.h"
 
 namespace gfx {
 
diff --git a/ui/gl/gl_egl_api_implementation.h b/ui/gl/gl_egl_api_implementation.h
index d09255f0..7047625 100644
--- a/ui/gl/gl_egl_api_implementation.h
+++ b/ui/gl/gl_egl_api_implementation.h
@@ -9,7 +9,7 @@
 #include <vector>
 
 #include "base/compiler_specific.h"
-#include "gl_bindings.h"
+#include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_export.h"
 
 namespace base {
diff --git a/ui/gl/gl_fence_apple.h b/ui/gl/gl_fence_apple.h
index 5458e0d1..c307a20b 100644
--- a/ui/gl/gl_fence_apple.h
+++ b/ui/gl/gl_fence_apple.h
@@ -7,6 +7,7 @@
 
 #include "base/macros.h"
 #include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_fence.h"
 
 namespace gfx {
diff --git a/ui/gl/gl_fence_arb.h b/ui/gl/gl_fence_arb.h
index 3975efe..e01b0cd 100644
--- a/ui/gl/gl_fence_arb.h
+++ b/ui/gl/gl_fence_arb.h
@@ -7,6 +7,7 @@
 
 #include "base/macros.h"
 #include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_fence.h"
 
 namespace gfx {
diff --git a/ui/gl/gl_fence_egl.h b/ui/gl/gl_fence_egl.h
index 5b6006c..5f68c8c1 100644
--- a/ui/gl/gl_fence_egl.h
+++ b/ui/gl/gl_fence_egl.h
@@ -7,6 +7,7 @@
 
 #include "base/macros.h"
 #include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_fence.h"
 
 namespace gfx {
diff --git a/ui/gl/gl_fence_nv.h b/ui/gl/gl_fence_nv.h
index 488251b..bf07616 100644
--- a/ui/gl/gl_fence_nv.h
+++ b/ui/gl/gl_fence_nv.h
@@ -7,6 +7,7 @@
 
 #include "base/macros.h"
 #include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_fence.h"
 
 namespace gfx {
diff --git a/ui/gl/gl_image_egl.h b/ui/gl/gl_image_egl.h
index b613182..33f4de8 100644
--- a/ui/gl/gl_image_egl.h
+++ b/ui/gl/gl_image_egl.h
@@ -8,6 +8,7 @@
 #include "base/macros.h"
 #include "base/threading/thread_checker.h"
 #include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_image.h"
 
 namespace gl {
diff --git a/ui/gl/gl_image_io_surface.h b/ui/gl/gl_image_io_surface.h
index f62d4a2..5774e12 100644
--- a/ui/gl/gl_image_io_surface.h
+++ b/ui/gl/gl_image_io_surface.h
@@ -14,6 +14,7 @@
 #include "base/threading/thread_checker.h"
 #include "ui/gfx/buffer_types.h"
 #include "ui/gfx/generic_shared_memory_id.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_image.h"
 
 #if defined(__OBJC__)
diff --git a/ui/gl/gl_image_memory.h b/ui/gl/gl_image_memory.h
index 4f6db9a2..6fd87b3 100644
--- a/ui/gl/gl_image_memory.h
+++ b/ui/gl/gl_image_memory.h
@@ -12,6 +12,7 @@
 #include "base/macros.h"
 #include "base/numerics/safe_math.h"
 #include "ui/gfx/buffer_types.h"
+#include "ui/gl/gl_export.h"
 
 namespace gl {
 
diff --git a/ui/gl/gl_image_ozone_native_pixmap.h b/ui/gl/gl_image_ozone_native_pixmap.h
index 469c044..8a35750 100644
--- a/ui/gl/gl_image_ozone_native_pixmap.h
+++ b/ui/gl/gl_image_ozone_native_pixmap.h
@@ -8,6 +8,7 @@
 #include <stdint.h>
 
 #include "ui/gfx/buffer_types.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_image_egl.h"
 #include "ui/ozone/public/native_pixmap.h"
 
diff --git a/ui/gl/gl_image_ref_counted_memory.h b/ui/gl/gl_image_ref_counted_memory.h
index 0d73dcd..4c46372 100644
--- a/ui/gl/gl_image_ref_counted_memory.h
+++ b/ui/gl/gl_image_ref_counted_memory.h
@@ -9,6 +9,7 @@
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_image_memory.h"
 
 namespace base {
diff --git a/ui/gl/gl_image_shared_memory.h b/ui/gl/gl_image_shared_memory.h
index b1f5f994..40cdfb3 100644
--- a/ui/gl/gl_image_shared_memory.h
+++ b/ui/gl/gl_image_shared_memory.h
@@ -13,6 +13,7 @@
 #include "base/macros.h"
 #include "base/memory/shared_memory_handle.h"
 #include "ui/gfx/generic_shared_memory_id.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_image_memory.h"
 
 namespace base {
diff --git a/ui/gl/gl_image_stub.h b/ui/gl/gl_image_stub.h
index 8edadb6..406dfa2 100644
--- a/ui/gl/gl_image_stub.h
+++ b/ui/gl/gl_image_stub.h
@@ -7,6 +7,7 @@
 
 #include <stdint.h>
 
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_image.h"
 
 namespace gl {
diff --git a/ui/gl/gl_image_surface_texture.h b/ui/gl/gl_image_surface_texture.h
index c58ec8c7..52f575a 100644
--- a/ui/gl/gl_image_surface_texture.h
+++ b/ui/gl/gl_image_surface_texture.h
@@ -11,6 +11,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/threading/thread_checker.h"
 #include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_image.h"
 
 namespace gfx {
diff --git a/ui/gl/gl_surface.h b/ui/gl/gl_surface.h
index e72ec11..6a2a7324 100644
--- a/ui/gl/gl_surface.h
+++ b/ui/gl/gl_surface.h
@@ -129,6 +129,7 @@
   virtual void CommitOverlayPlanesAsync(const SwapCompletionCallback& callback);
 
   // Initialize GL bindings.
+  // DEPRECATED(kylechar): Use gl::init::InitializeGLOneOff from gl_factory.h.
   static bool InitializeOneOff();
 
   // Called after a context is made current with this surface. Returns false
@@ -197,6 +198,7 @@
   virtual bool BuffersFlipped() const;
 
   // Create a GL surface that renders directly to a view.
+  // DEPRECATED(kylechar): Use gl::init::CreateViewGLSurface from gl_factory.h.
   static scoped_refptr<GLSurface> CreateViewGLSurface(
       gfx::AcceleratedWidget window);
 
@@ -205,11 +207,15 @@
   // semantics - there is no default framebuffer and the primary surface must
   // be presented as an overlay. If surfaceless mode is not supported or
   // enabled it will return a null pointer.
+  // DEPRECATED(kylechar): Use gl::init::CreateSurfacelessViewGLSurface from
+  // gl_factory.h.
   static scoped_refptr<GLSurface> CreateSurfacelessViewGLSurface(
       gfx::AcceleratedWidget window);
 #endif  // defined(USE_OZONE)
 
   // Create a GL surface used for offscreen rendering.
+  // DEPRECATED(kylechar): Use gl::init::CreateOffscreenGLSurface from
+  // gl_factory.h.
   static scoped_refptr<GLSurface> CreateOffscreenGLSurface(
       const gfx::Size& size);
 
diff --git a/ui/gl/gl_surface_egl.h b/ui/gl/gl_surface_egl.h
index 373c655..4be8b2a 100644
--- a/ui/gl/gl_surface_egl.h
+++ b/ui/gl/gl_surface_egl.h
@@ -20,6 +20,7 @@
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/vsync_provider.h"
 #include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_surface.h"
 #include "ui/gl/gl_surface_overlay.h"
 
diff --git a/ui/gl/gl_surface_egl_x11.h b/ui/gl/gl_surface_egl_x11.h
index 67c151eb..b7f0f3a 100644
--- a/ui/gl/gl_surface_egl_x11.h
+++ b/ui/gl/gl_surface_egl_x11.h
@@ -11,6 +11,7 @@
 
 #include "base/macros.h"
 #include "ui/events/platform/platform_event_dispatcher.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_surface_egl.h"
 
 namespace gfx {
diff --git a/ui/gl/gl_surface_mac.cc b/ui/gl/gl_surface_mac.cc
index 2da2b72..52179c3 100644
--- a/ui/gl/gl_surface_mac.cc
+++ b/ui/gl/gl_surface_mac.cc
@@ -13,6 +13,7 @@
 #include "base/trace_event/trace_event.h"
 #include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_context.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_implementation.h"
 #include "ui/gl/gl_surface_osmesa.h"
 #include "ui/gl/gl_surface_stub.h"
diff --git a/ui/gl/gl_surface_osmesa.h b/ui/gl/gl_surface_osmesa.h
index e4f6ba9..dee15eb 100644
--- a/ui/gl/gl_surface_osmesa.h
+++ b/ui/gl/gl_surface_osmesa.h
@@ -11,6 +11,7 @@
 
 #include "base/macros.h"
 #include "ui/gfx/geometry/size.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_surface.h"
 
 namespace gfx {
diff --git a/ui/gl/gl_surface_stub.h b/ui/gl/gl_surface_stub.h
index 9115b7c1..13cfaf5 100644
--- a/ui/gl/gl_surface_stub.h
+++ b/ui/gl/gl_surface_stub.h
@@ -5,6 +5,7 @@
 #ifndef UI_GL_GL_SURFACE_STUB_H_
 #define UI_GL_GL_SURFACE_STUB_H_
 
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_surface.h"
 
 namespace gfx {
diff --git a/ui/gl/gl_surface_wgl.h b/ui/gl/gl_surface_wgl.h
index 7466bcb..dc323c1 100644
--- a/ui/gl/gl_surface_wgl.h
+++ b/ui/gl/gl_surface_wgl.h
@@ -7,6 +7,7 @@
 
 #include "base/macros.h"
 #include "ui/gfx/native_widget_types.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_surface.h"
 
 namespace gfx {
diff --git a/ui/gl/gl_tests.gyp b/ui/gl/gl_tests.gyp
index dfce746..a3cd88b0 100644
--- a/ui/gl/gl_tests.gyp
+++ b/ui/gl/gl_tests.gyp
@@ -29,6 +29,7 @@
         '<(DEPTH)/ui/gfx/gfx.gyp:gfx',
         '<(DEPTH)/ui/gfx/gfx.gyp:gfx_geometry',
         '<(DEPTH)/ui/gl/gl.gyp:gl',
+        '<(DEPTH)/ui/gl/init/gl_init.gyp:gl_init',
         '<(DEPTH)/ui/gl/gl.gyp:gl_test_support',
         '<(DEPTH)/ui/gl/gl.gyp:gl_unittest_utils',
       ],
diff --git a/ui/gl/init/BUILD.gn b/ui/gl/init/BUILD.gn
new file mode 100644
index 0000000..844ee29
--- /dev/null
+++ b/ui/gl/init/BUILD.gn
@@ -0,0 +1,23 @@
+# 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.
+
+component("init") {
+  output_name = "gl_init"
+
+  sources = [
+    "gl_factory.cc",
+    "gl_factory.h",
+    "gl_init_export.h",
+  ]
+  defines = [ "GL_INIT_IMPLEMENTATION" ]
+
+  deps = [
+    "//base",
+    "//ui/gfx",
+  ]
+
+  public_deps = [
+    "//ui/gl",
+  ]
+}
diff --git a/ui/gl/init/gl_factory.cc b/ui/gl/init/gl_factory.cc
new file mode 100644
index 0000000..09cb4ff
--- /dev/null
+++ b/ui/gl/init/gl_factory.cc
@@ -0,0 +1,49 @@
+// 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_factory.h"
+
+#include "ui/gl/gl_context.h"
+#include "ui/gl/gl_share_group.h"
+#include "ui/gl/gl_surface.h"
+
+namespace gl {
+namespace init {
+
+// TODO(kylechar): This file should be replaced with a platform specific
+// version for X11, Ozone, Windows, Mac and Android. The implementation of each
+// factory function should be moved into that file and the original static
+// methods should be removed from GLSurface and GLContext. This file can then
+// be deleted.
+
+bool InitializeGLOneOff() {
+  return gfx::GLSurface::InitializeOneOff();
+}
+
+scoped_refptr<gfx::GLContext> CreateGLContext(
+    gfx::GLShareGroup* share_group,
+    gfx::GLSurface* compatible_surface,
+    gfx::GpuPreference gpu_preference) {
+  return gfx::GLContext::CreateGLContext(share_group, compatible_surface,
+                                         gpu_preference);
+}
+
+scoped_refptr<gfx::GLSurface> CreateViewGLSurface(
+    gfx::AcceleratedWidget window) {
+  return gfx::GLSurface::CreateViewGLSurface(window);
+}
+
+#if defined(USE_OZONE)
+scoped_refptr<gfx::GLSurface> CreateSurfacelessViewGLSurface(
+    gfx::AcceleratedWidget window) {
+  return gfx::GLSurface::CreateSurfacelessViewGLSurface(window);
+}
+#endif  // defined(USE_OZONE)
+
+scoped_refptr<gfx::GLSurface> CreateOffscreenGLSurface(const gfx::Size& size) {
+  return gfx::GLSurface::CreateOffscreenGLSurface(size);
+}
+
+}  // namespace init
+}  // namespace gl
diff --git a/ui/gl/init/gl_factory.h b/ui/gl/init/gl_factory.h
new file mode 100644
index 0000000..bdf6e29
--- /dev/null
+++ b/ui/gl/init/gl_factory.h
@@ -0,0 +1,54 @@
+// 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.
+
+#ifndef UI_GL_INIT_GL_FACTORY_H_
+#define UI_GL_INIT_GL_FACTORY_H_
+
+#include "base/memory/ref_counted.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/gfx/native_widget_types.h"
+#include "ui/gl/gpu_preference.h"
+#include "ui/gl/init/gl_init_export.h"
+
+namespace gfx {
+class GLContext;
+class GLShareGroup;
+class GLSurface;
+};
+
+namespace gl {
+namespace init {
+
+// Initialize GL bindings.
+GL_INIT_EXPORT bool InitializeGLOneOff();
+
+// Create a GL context that is compatible with the given surface. |share_group|,
+// if non-NULL, is a group of contexts which the internally created OpenGL
+// context shares textures and other resources.
+GL_INIT_EXPORT scoped_refptr<gfx::GLContext> CreateGLContext(
+    gfx::GLShareGroup* share_group,
+    gfx::GLSurface* compatible_surface,
+    gfx::GpuPreference gpu_preference);
+
+// Create a GL surface that renders directly to a view.
+GL_INIT_EXPORT scoped_refptr<gfx::GLSurface> CreateViewGLSurface(
+    gfx::AcceleratedWidget window);
+
+#if defined(USE_OZONE)
+// Create a GL surface that renders directly into a window with surfaceless
+// semantics - there is no default framebuffer and the primary surface must
+// be presented as an overlay. If surfaceless mode is not supported or
+// enabled it will return a null pointer.
+GL_INIT_EXPORT scoped_refptr<gfx::GLSurface> CreateSurfacelessViewGLSurface(
+    gfx::AcceleratedWidget window);
+#endif  // defined(USE_OZONE)
+
+// Create a GL surface used for offscreen rendering.
+GL_INIT_EXPORT scoped_refptr<gfx::GLSurface> CreateOffscreenGLSurface(
+    const gfx::Size& size);
+
+}  // namespace init
+}  // namespace gl
+
+#endif  // UI_GL_INIT_GL_FACTORY_H_
diff --git a/ui/gl/init/gl_init.gyp b/ui/gl/init/gl_init.gyp
new file mode 100644
index 0000000..ba65c01
--- /dev/null
+++ b/ui/gl/init/gl_init.gyp
@@ -0,0 +1,30 @@
+# 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.
+
+{
+  'variables': {
+    'chromium_code': 1,
+  },
+
+  'targets': [
+    {
+      'target_name': 'gl_init',
+      'type': '<(component)',
+      'dependencies': [
+        '../../../base/base.gyp:base',
+        '../../gfx/gfx.gyp:gfx',
+        '../../gfx/gfx.gyp:gfx_geometry',
+        '../gl.gyp:gl',
+      ],
+      'defines': [
+        'GL_INIT_IMPLEMENTATION',
+      ],
+      'sources': [
+        'gl_factory.cc',
+        'gl_factory.h',
+        'gl_init_export.h',
+      ],
+    },
+  ],
+}
diff --git a/ui/gl/init/gl_init_export.h b/ui/gl/init/gl_init_export.h
new file mode 100644
index 0000000..4523953
--- /dev/null
+++ b/ui/gl/init/gl_init_export.h
@@ -0,0 +1,29 @@
+// 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.
+
+#ifndef UI_GL_INIT_GL_INIT_EXPORT_H_
+#define UI_GL_INIT_GL_INIT_EXPORT_H_
+
+#if defined(COMPONENT_BUILD)
+#if defined(WIN32)
+
+#if defined(GL_INIT_IMPLEMENTATION)
+#define GL_INIT_EXPORT __declspec(dllexport)
+#else
+#define GL_INIT_EXPORT __declspec(dllimport)
+#endif  // defined(GL_INIT_IMPLEMENTATION)
+
+#else  // defined(WIN32)
+#if defined(GL_INIT_IMPLEMENTATION)
+#define GL_INIT_EXPORT __attribute__((visibility("default")))
+#else
+#define GL_INIT_EXPORT
+#endif
+#endif
+
+#else  // defined(COMPONENT_BUILD)
+#define GL_INIT_EXPORT
+#endif
+
+#endif  // UI_GL_INIT_GL_INIT_EXPORT_H_
diff --git a/ui/gl/test/gl_image_test_template.h b/ui/gl/test/gl_image_test_template.h
index 4459200b..543df8d7 100644
--- a/ui/gl/test/gl_image_test_template.h
+++ b/ui/gl/test/gl_image_test_template.h
@@ -24,6 +24,7 @@
 #include "ui/gl/gl_image.h"
 #include "ui/gl/gl_implementation.h"
 #include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 #include "ui/gl/test/gl_image_test_support.h"
 #include "ui/gl/test/gl_test_helper.h"
 
@@ -125,9 +126,9 @@
   // Overridden from testing::Test:
   void SetUp() override {
     GLImageTestSupport::InitializeGL();
-    surface_ = gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size());
-    context_ = gfx::GLContext::CreateGLContext(nullptr, surface_.get(),
-                                               gfx::PreferIntegratedGpu);
+    surface_ = gl::init::CreateOffscreenGLSurface(gfx::Size());
+    context_ = gl::init::CreateGLContext(nullptr, surface_.get(),
+                                         gfx::PreferIntegratedGpu);
     context_->MakeCurrent(surface_.get());
   }
   void TearDown() override {
diff --git a/ui/ozone/demo/BUILD.gn b/ui/ozone/demo/BUILD.gn
index c05bb92..e904e19 100644
--- a/ui/ozone/demo/BUILD.gn
+++ b/ui/ozone/demo/BUILD.gn
@@ -32,6 +32,7 @@
     "//ui/events/ozone:events_ozone_layout",
     "//ui/gfx/geometry",
     "//ui/gl",
+    "//ui/gl/init",
     "//ui/ozone",
     "//ui/platform_window",
   ]
diff --git a/ui/ozone/demo/gl_renderer.cc b/ui/ozone/demo/gl_renderer.cc
index 9551f1e..93fe3d8 100644
--- a/ui/ozone/demo/gl_renderer.cc
+++ b/ui/ozone/demo/gl_renderer.cc
@@ -10,6 +10,7 @@
 #include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_context.h"
 #include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 namespace ui {
 
@@ -22,8 +23,8 @@
 }
 
 bool GlRenderer::Initialize() {
-  context_ = gfx::GLContext::CreateGLContext(NULL, surface_.get(),
-                                             gfx::PreferIntegratedGpu);
+  context_ = gl::init::CreateGLContext(nullptr, surface_.get(),
+                                       gfx::PreferIntegratedGpu);
   if (!context_.get()) {
     LOG(ERROR) << "Failed to create GL context";
     return false;
diff --git a/ui/ozone/demo/ozone_demo.cc b/ui/ozone/demo/ozone_demo.cc
index f3933137..f3a0e4b 100644
--- a/ui/ozone/demo/ozone_demo.cc
+++ b/ui/ozone/demo/ozone_demo.cc
@@ -22,6 +22,7 @@
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 #include "ui/ozone/demo/gl_renderer.h"
 #include "ui/ozone/demo/software_renderer.h"
 #include "ui/ozone/demo/surfaceless_gl_renderer.h"
@@ -45,9 +46,9 @@
 scoped_refptr<gfx::GLSurface> CreateGLSurface(gfx::AcceleratedWidget widget) {
   scoped_refptr<gfx::GLSurface> surface;
   if (!base::CommandLine::ForCurrentProcess()->HasSwitch(kDisableSurfaceless))
-    surface = gfx::GLSurface::CreateSurfacelessViewGLSurface(widget);
+    surface = gl::init::CreateSurfacelessViewGLSurface(widget);
   if (!surface)
-    surface = gfx::GLSurface::CreateViewGLSurface(widget);
+    surface = gl::init::CreateViewGLSurface(widget);
   return surface;
 }
 
@@ -197,8 +198,7 @@
 
 bool RendererFactory::Initialize() {
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
-  if (!command_line->HasSwitch(kDisableGpu) &&
-      gfx::GLSurface::InitializeOneOff() &&
+  if (!command_line->HasSwitch(kDisableGpu) && gl::init::InitializeGLOneOff() &&
       gpu_helper_.Initialize(base::ThreadTaskRunnerHandle::Get(),
                              base::ThreadTaskRunnerHandle::Get())) {
     type_ = GL;
diff --git a/ui/ozone/demo/ozone_demos.gyp b/ui/ozone/demo/ozone_demos.gyp
index 4e7a8c0..7f860a5 100644
--- a/ui/ozone/demo/ozone_demos.gyp
+++ b/ui/ozone/demo/ozone_demos.gyp
@@ -16,6 +16,7 @@
         '../../../ui/events/ozone/events_ozone.gyp:events_ozone_layout',
         '../../../ui/gfx/gfx.gyp:gfx_geometry',
         '../../../ui/gl/gl.gyp:gl',
+        '../../../ui/gl/init/gl_init.gyp:gl_init',
         '../../../ui/ozone/ozone.gyp:ozone',
         '../../../ui/ozone/ozone.gyp:ozone_base',
       ],
diff --git a/ui/surface/surface.gyp b/ui/surface/surface.gyp
index e45e2ae8..f4be6f7 100644
--- a/ui/surface/surface.gyp
+++ b/ui/surface/surface.gyp
@@ -26,6 +26,7 @@
         '../base/ui_base.gyp:ui_base',
         '../gfx/gfx.gyp:gfx_geometry',
         '../gl/gl.gyp:gl',
+        '../gl/init/gl_init.gyp:gl_init',
       ],
       'sources': [
         'surface_export.h',
diff --git a/ui/views/examples/BUILD.gn b/ui/views/examples/BUILD.gn
index 6aed028f..5e1cfb6 100644
--- a/ui/views/examples/BUILD.gn
+++ b/ui/views/examples/BUILD.gn
@@ -110,7 +110,7 @@
     "//ui/compositor",
     "//ui/compositor:test_support",
     "//ui/gfx",
-    "//ui/gl",
+    "//ui/gl/init",
     "//ui/resources:ui_test_pak",
     "//ui/views",
     "//ui/views:test_support",
diff --git a/ui/views/examples/DEPS b/ui/views/examples/DEPS
index 06e440bb..47e7bcd 100644
--- a/ui/views/examples/DEPS
+++ b/ui/views/examples/DEPS
@@ -2,6 +2,6 @@
   "+content/public",
   "+content/shell",
   "+sandbox",
-  "+ui/gl/gl_surface.h",  # To initialize GL bindings.
+  "+ui/gl/init/gl_factory.h",  # To initialize GL bindings.
   "+ui/views_content_client",
 ]
diff --git a/ui/views/examples/examples_main.cc b/ui/views/examples/examples_main.cc
index 8151ed72..d3889a8 100644
--- a/ui/views/examples/examples_main.cc
+++ b/ui/views/examples/examples_main.cc
@@ -21,7 +21,7 @@
 #include "ui/base/ui_base_paths.h"
 #include "ui/compositor/test/in_process_context_factory.h"
 #include "ui/display/screen.h"
-#include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 #include "ui/views/examples/example_base.h"
 #include "ui/views/examples/examples_window.h"
 #include "ui/views/test/desktop_test_views_delegate.h"
@@ -59,7 +59,7 @@
   gfx::InitializeThreadedX11();
 #endif
 
-  gfx::GLSurface::InitializeOneOff();
+  gl::init::InitializeGLOneOff();
 
   // The ContextFactory must exist before any Compositors are created.
   bool context_factory_for_test = false;