diff --git a/bench/nanobench.cpp b/bench/nanobench.cpp
index 21aeef4..65cef89 100644
--- a/bench/nanobench.cpp
+++ b/bench/nanobench.cpp
@@ -84,7 +84,7 @@
 }
 #define HUMANIZE(ms) humanize(ms).c_str()
 
-static double time(int loops, Benchmark* bench, SkCanvas* canvas, SkGLContextHelper* gl) {
+static double time(int loops, Benchmark* bench, SkCanvas* canvas, SkGLContext* gl) {
     if (canvas) {
         canvas->clear(SK_ColorWHITE);
     }
@@ -203,7 +203,7 @@
 }
 
 #if SK_SUPPORT_GPU
-static int gpu_bench(SkGLContextHelper* gl,
+static int gpu_bench(SkGLContext* gl,
                      Benchmark* bench,
                      SkCanvas* canvas,
                      double* samples) {
@@ -274,7 +274,7 @@
     const Config config;
     SkAutoTDelete<SkSurface> surface;
 #if SK_SUPPORT_GPU
-    SkGLContextHelper* gl;
+    SkGLContext* gl;
 #endif
 };
 
@@ -389,7 +389,7 @@
 }
 
 #if SK_SUPPORT_GPU
-static void fill_gpu_options(ResultsWriter* log, SkGLContextHelper* ctx) {
+static void fill_gpu_options(ResultsWriter* log, SkGLContext* ctx) {
     const GrGLubyte* version;
     SK_GL_RET(*ctx, version, GetString(GR_GL_VERSION));
     log->configOption("GL_VERSION", (const char*)(version));
diff --git a/gyp/gpu.gypi b/gyp/gpu.gypi
index eb520b5..a853cf5 100644
--- a/gyp/gpu.gypi
+++ b/gyp/gpu.gypi
@@ -279,7 +279,7 @@
       '<(skia_include_path)/gpu/SkGrPixelRef.h',
       '<(skia_include_path)/gpu/SkGrTexturePixelRef.h',
 
-      '<(skia_include_path)/gpu/gl/SkGLContextHelper.h',
+      '<(skia_include_path)/gpu/gl/SkGLContext.h',
 
       '<(skia_src_path)/gpu/SkGpuDevice.cpp',
       '<(skia_src_path)/gpu/SkGpuDevice.h',
@@ -290,7 +290,7 @@
       '<(skia_src_path)/image/SkImage_Gpu.cpp',
       '<(skia_src_path)/image/SkSurface_Gpu.cpp',
 
-      '<(skia_src_path)/gpu/gl/SkGLContextHelper.cpp'
+      '<(skia_src_path)/gpu/gl/SkGLContext.cpp'
     ],
     'skgpu_native_gl_sources': [
       '<(skia_src_path)/gpu/gl/GrGLDefaultInterface_native.cpp',
@@ -302,13 +302,12 @@
       '<(skia_src_path)/gpu/gl/android/GrGLCreateNativeInterface_android.cpp',
 
       # Sk files
-      '<(skia_include_path)/gpu/gl/SkNativeGLContext.h',
-      '<(skia_src_path)/gpu/gl/mac/SkNativeGLContext_mac.cpp',
-      '<(skia_src_path)/gpu/gl/nacl/SkNativeGLContext_nacl.cpp',
-      '<(skia_src_path)/gpu/gl/win/SkNativeGLContext_win.cpp',
-      '<(skia_src_path)/gpu/gl/glx/SkNativeGLContext_glx.cpp',
-      '<(skia_src_path)/gpu/gl/egl/SkNativeGLContext_egl.cpp',
-      '<(skia_src_path)/gpu/gl/iOS/SkNativeGLContext_iOS.mm',
+      '<(skia_src_path)/gpu/gl/mac/SkCreatePlatformGLContext_mac.cpp',
+      '<(skia_src_path)/gpu/gl/nacl/SkCreatePlatformGLContext_nacl.cpp',
+      '<(skia_src_path)/gpu/gl/win/SkCreatePlatformGLContext_win.cpp',
+      '<(skia_src_path)/gpu/gl/glx/SkCreatePlatformGLContext_glx.cpp',
+      '<(skia_src_path)/gpu/gl/egl/SkCreatePlatformGLContext_egl.cpp',
+      '<(skia_src_path)/gpu/gl/iOS/SkCreatePlatformGLContext_iOS.mm',
     ],
     'skgpu_mesa_gl_sources': [
       '<(skia_src_path)/gpu/gl/mesa/GrGLCreateMesaInterface.cpp',
diff --git a/gyp/public_headers.gypi b/gyp/public_headers.gypi
index 6e61b4e..4ee02d5 100644
--- a/gyp/public_headers.gypi
+++ b/gyp/public_headers.gypi
@@ -183,9 +183,8 @@
       'gpu/gl/GrGLInterface.h',
       'gpu/gl/SkANGLEGLContext.h',
       'gpu/gl/SkDebugGLContext.h',
-      'gpu/gl/SkGLContextHelper.h',
       'gpu/gl/SkMesaGLContext.h',
-      'gpu/gl/SkNativeGLContext.h',
+      'gpu/gl/SkGLContext.h',
       'gpu/gl/SkNullGLContext.h',
       'images/SkForceLinking.h',
       'images/SkMovie.h',
diff --git a/include/gpu/GrContextFactory.h b/include/gpu/GrContextFactory.h
index d78120c..eff1f58 100644
--- a/include/gpu/GrContextFactory.h
+++ b/include/gpu/GrContextFactory.h
@@ -15,7 +15,7 @@
 #if SK_MESA
     #include "gl/SkMesaGLContext.h"
 #endif
-#include "gl/SkNativeGLContext.h"
+#include "gl/SkGLContext.h"
 #include "gl/SkNullGLContext.h"
 
 #include "GrContext.h"
@@ -130,12 +130,12 @@
                 return fContexts[i].fGrContext;
             }
         }
-        SkAutoTUnref<SkGLContextHelper> glCtx;
+        SkAutoTUnref<SkGLContext> glCtx;
         SkAutoTUnref<GrContext> grCtx;
         switch (type) {
             case kNVPR_GLContextType: // fallthru
             case kNative_GLContextType:
-                glCtx.reset(SkNEW(SkNativeGLContext));
+                glCtx.reset(SkCreatePlatformGLContext());
                 break;
 #ifdef SK_ANGLE
             case kANGLE_GLContextType:
@@ -192,7 +192,7 @@
 
     // Returns the GLContext of the given type. If it has not been created yet,
     // NULL is returned instead.
-    SkGLContextHelper* getGLContext(GLContextType type) {
+    SkGLContext* getGLContext(GLContextType type) {
         for (int i = 0; i < fContexts.count(); ++i) {
             if (fContexts[i].fType == type) {
                 return fContexts[i].fGLContext;
@@ -207,7 +207,7 @@
 private:
     struct GPUContext {
         GLContextType             fType;
-        SkGLContextHelper*        fGLContext;
+        SkGLContext*              fGLContext;
         GrContext*                fGrContext;
     };
     SkTArray<GPUContext, true>    fContexts;
diff --git a/include/gpu/gl/SkANGLEGLContext.h b/include/gpu/gl/SkANGLEGLContext.h
index c5f62ff..18cdbdb 100644
--- a/include/gpu/gl/SkANGLEGLContext.h
+++ b/include/gpu/gl/SkANGLEGLContext.h
@@ -10,12 +10,12 @@
 
 #if SK_ANGLE
 
-#include "SkGLContextHelper.h"
+#include "SkGLContext.h"
 
 #include <GLES2/gl2.h>
 #include <EGL/egl.h>
 
-class SkANGLEGLContext : public SkGLContextHelper {
+class SkANGLEGLContext : public SkGLContext {
 public:
     SkANGLEGLContext();
 
@@ -24,17 +24,6 @@
     virtual void makeCurrent() const SK_OVERRIDE;
     virtual void swapBuffers() const SK_OVERRIDE;
 
-    class AutoContextRestore {
-    public:
-        AutoContextRestore();
-        ~AutoContextRestore();
-
-    private:
-        EGLContext fOldEGLContext;
-        EGLDisplay fOldDisplay;
-        EGLSurface fOldSurface;
-    };
-
 protected:
     virtual const GrGLInterface* createGLContext(
         GrGLStandard forcedGpuAPI) SK_OVERRIDE;
diff --git a/include/gpu/gl/SkDebugGLContext.h b/include/gpu/gl/SkDebugGLContext.h
index 7db9579..7926663 100644
--- a/include/gpu/gl/SkDebugGLContext.h
+++ b/include/gpu/gl/SkDebugGLContext.h
@@ -8,9 +8,9 @@
 #ifndef SkDebugGLContext_DEFINED
 #define SkDebugGLContext_DEFINED
 
-#include "SkGLContextHelper.h"
+#include "SkGLContext.h"
 
-class SkDebugGLContext : public SkGLContextHelper {
+class SkDebugGLContext : public SkGLContext {
 
 public:
     SkDebugGLContext() {}
diff --git a/include/gpu/gl/SkGLContextHelper.h b/include/gpu/gl/SkGLContext.h
similarity index 84%
rename from include/gpu/gl/SkGLContextHelper.h
rename to include/gpu/gl/SkGLContext.h
index c4d9bdf..83c9146 100644
--- a/include/gpu/gl/SkGLContextHelper.h
+++ b/include/gpu/gl/SkGLContext.h
@@ -5,8 +5,8 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#ifndef SkGLContextHelper_DEFINED
-#define SkGLContextHelper_DEFINED
+#ifndef SkGLContext_DEFINED
+#define SkGLContext_DEFINED
 
 #include "GrGLInterface.h"
 
@@ -15,12 +15,12 @@
  * Provides a GrGLInterface struct of function pointers for the context.
  */
 
-class SK_API SkGLContextHelper : public SkRefCnt {
+class SK_API SkGLContext : public SkRefCnt {
 public:
-    SK_DECLARE_INST_COUNT(SkGLContextHelper)
+    SK_DECLARE_INST_COUNT(SkGLContext)
 
-    SkGLContextHelper();
-    virtual ~SkGLContextHelper();
+    SkGLContext();
+    virtual ~SkGLContext();
 
     /**
      * Initializes the context and makes it current.
@@ -81,6 +81,14 @@
     typedef SkRefCnt INHERITED;
 };
 
+/** Creates platform-dependent GL context object
+ * Note: If Skia embedder needs a custom GL context that sets up the GL
+ * interface, this function should be implemented by the embedder.
+ * Otherwise, the default implementation for the platform should be compiled in
+ * the library.
+ */
+SK_API SkGLContext* SkCreatePlatformGLContext();
+
 /**
  * Helper macros for using the GL context through the GrGLInterface. Example:
  * SK_GL(glCtx, GenTextures(1, &texID));
diff --git a/include/gpu/gl/SkMesaGLContext.h b/include/gpu/gl/SkMesaGLContext.h
index 28349dd..ef00171 100644
--- a/include/gpu/gl/SkMesaGLContext.h
+++ b/include/gpu/gl/SkMesaGLContext.h
@@ -8,11 +8,11 @@
 #ifndef SkMesaGLContext_DEFINED
 #define SkMesaGLContext_DEFINED
 
-#include "SkGLContextHelper.h"
+#include "SkGLContext.h"
 
 #if SK_MESA
 
-class SkMesaGLContext : public SkGLContextHelper {
+class SkMesaGLContext : public SkGLContext {
 private:
     typedef intptr_t Context;
 
@@ -24,19 +24,6 @@
     virtual void makeCurrent() const SK_OVERRIDE;
     virtual void swapBuffers() const SK_OVERRIDE;
 
-    class AutoContextRestore {
-    public:
-        AutoContextRestore();
-        ~AutoContextRestore();
-
-    private:
-        Context fOldContext;
-        GrGLint fOldWidth;
-        GrGLint fOldHeight;
-        GrGLint fOldFormat;
-        void*   fOldImage;
-    };
-
 protected:
     virtual const GrGLInterface* createGLContext(GrGLStandard forcedGpuAPI) SK_OVERRIDE;
     virtual void destroyGLContext() SK_OVERRIDE;
diff --git a/include/gpu/gl/SkNativeGLContext.h b/include/gpu/gl/SkNativeGLContext.h
deleted file mode 100644
index 93b5b41..0000000
--- a/include/gpu/gl/SkNativeGLContext.h
+++ /dev/null
@@ -1,111 +0,0 @@
-
-/*
- * Copyright 2011 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-#ifndef SkNativeGLContext_DEFINED
-#define SkNativeGLContext_DEFINED
-
-#include "SkGLContextHelper.h"
-
-/* This struct is taken from a mesa demo.  Please update as required */
-static const struct { int major, minor; } gl_versions[] = {
-   {1, 0},
-   {1, 1},
-   {1, 2},
-   {1, 3},
-   {1, 4},
-   {1, 5},
-   {2, 0},
-   {2, 1},
-   {3, 0},
-   {3, 1},
-   {3, 2},
-   {3, 3},
-   {4, 0},
-   {4, 1},
-   {4, 2},
-   {4, 3},
-   {4, 4},
-   {0, 0} /* end of list */
-};
-#define NUM_GL_VERSIONS SK_ARRAY_COUNT(gl_versions)
-
-#if defined(SK_BUILD_FOR_MAC)
-    #include <OpenGL/OpenGL.h>
-#elif SK_EGL
-    #include <GLES2/gl2.h>
-    #include <EGL/egl.h>
-#elif defined(SK_BUILD_FOR_UNIX)
-    #include <X11/Xlib.h>
-    #include <GL/glx.h>
-#elif defined(SK_BUILD_FOR_WIN32)
-    #include <windows.h>
-    #include <GL/GL.h>
-    #include "SkWGL.h"
-#endif
-
-class SkNativeGLContext : public SkGLContextHelper {
-public:
-    SkNativeGLContext();
-
-    virtual ~SkNativeGLContext();
-
-    virtual void makeCurrent() const SK_OVERRIDE;
-    virtual void swapBuffers() const SK_OVERRIDE;
-
-    class AutoContextRestore {
-    public:
-        AutoContextRestore();
-        ~AutoContextRestore();
-
-    private:
-    #if defined(SK_BUILD_FOR_MAC)
-        CGLContextObj fOldCGLContext;
-    #elif SK_EGL
-        EGLContext fOldEGLContext;
-        EGLDisplay fOldDisplay;
-        EGLSurface fOldSurface;
-    #elif defined(SK_BUILD_FOR_UNIX)
-        GLXContext fOldGLXContext;
-        Display* fOldDisplay;
-        GLXDrawable fOldDrawable;
-    #elif defined(SK_BUILD_FOR_WIN32)
-        HDC fOldHDC;
-        HGLRC fOldHGLRC;
-
-    #elif defined(SK_BUILD_FOR_IOS)
-        void* fEAGLContext;
-    #endif
-    };
-
-protected:
-    virtual const GrGLInterface* createGLContext(GrGLStandard forcedGpuAPI) SK_OVERRIDE;
-    virtual void destroyGLContext() SK_OVERRIDE;
-
-private:
-#if defined(SK_BUILD_FOR_MAC)
-    CGLContextObj fContext;
-#elif SK_EGL
-    EGLContext fContext;
-    EGLDisplay fDisplay;
-    EGLSurface fSurface;
-#elif defined(SK_BUILD_FOR_UNIX)
-    GLXContext fContext;
-    Display* fDisplay;
-    Pixmap fPixmap;
-    GLXPixmap fGlxPixmap;
-#elif defined(SK_BUILD_FOR_WIN32)
-    HWND fWindow;
-    HDC fDeviceContext;
-    HGLRC fGlRenderContext;
-    static ATOM gWC;
-    SkWGLPbufferContext* fPbufferContext;
-#elif defined(SK_BUILD_FOR_IOS)
-    void* fEAGLContext;
-#endif
-};
-
-#endif
diff --git a/include/gpu/gl/SkNullGLContext.h b/include/gpu/gl/SkNullGLContext.h
index 6c2a1d7..16621fc 100644
--- a/include/gpu/gl/SkNullGLContext.h
+++ b/include/gpu/gl/SkNullGLContext.h
@@ -8,9 +8,9 @@
 #ifndef SkNullGLContext_DEFINED
 #define SkNullGLContext_DEFINED
 
-#include "SkGLContextHelper.h"
+#include "SkGLContext.h"
 
-class SK_API SkNullGLContext : public SkGLContextHelper {
+class SK_API SkNullGLContext : public SkGLContext {
 
 public:
     SkNullGLContext() {};
diff --git a/src/gpu/gl/SkGLContextHelper.cpp b/src/gpu/gl/SkGLContext.cpp
similarity index 95%
rename from src/gpu/gl/SkGLContextHelper.cpp
rename to src/gpu/gl/SkGLContext.cpp
index 03b70c3..92f65cd 100644
--- a/src/gpu/gl/SkGLContextHelper.cpp
+++ b/src/gpu/gl/SkGLContext.cpp
@@ -5,17 +5,17 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "gl/SkGLContextHelper.h"
+#include "gl/SkGLContext.h"
 #include "GrGLUtil.h"
 
-SkGLContextHelper::SkGLContextHelper()
+SkGLContext::SkGLContext()
     : fFBO(0)
     , fColorBufferID(0)
     , fDepthStencilBufferID(0)
     , fGL(NULL) {
 }
 
-SkGLContextHelper::~SkGLContextHelper() {
+SkGLContext::~SkGLContext() {
 
     if (fGL) {
         // TODO: determine why DeleteFramebuffers is generating a GL error in tests
@@ -27,7 +27,7 @@
     SkSafeUnref(fGL);
 }
 
-bool SkGLContextHelper::init(GrGLStandard forcedGpuAPI, int width,
+bool SkGLContext::init(GrGLStandard forcedGpuAPI, int width,
                              int height) {
     if (fGL) {
         fGL->unref();
@@ -135,7 +135,7 @@
     return false;
 }
 
-void SkGLContextHelper::testAbandon() {
+void SkGLContext::testAbandon() {
     if (fGL) {
         fGL->abandon();
     }
diff --git a/src/gpu/gl/angle/SkANGLEGLContext.cpp b/src/gpu/gl/angle/SkANGLEGLContext.cpp
index 81fcceb..4914ba5 100644
--- a/src/gpu/gl/angle/SkANGLEGLContext.cpp
+++ b/src/gpu/gl/angle/SkANGLEGLContext.cpp
@@ -8,21 +8,6 @@
 
 #include "gl/SkANGLEGLContext.h"
 
-SkANGLEGLContext::AutoContextRestore::AutoContextRestore() {
-    fOldEGLContext = eglGetCurrentContext();
-    fOldDisplay = eglGetCurrentDisplay();
-    fOldSurface = eglGetCurrentSurface(EGL_DRAW);
-
-}
-
-SkANGLEGLContext::AutoContextRestore::~AutoContextRestore() {
-    if (fOldDisplay) {
-        eglMakeCurrent(fOldDisplay, fOldSurface, fOldSurface, fOldEGLContext);
-    }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
 SkANGLEGLContext::SkANGLEGLContext()
     : fContext(EGL_NO_CONTEXT)
     , fDisplay(EGL_NO_DISPLAY)
diff --git a/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp b/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp
index 4bd8f99..287a43f 100644
--- a/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp
+++ b/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp
@@ -819,7 +819,7 @@
     //      The solution to this is probably to alter SkDebugGlContext's
     //      "makeCurrent" method to make a call like "makeCurrent(this)" to
     //      the debug GL interface (assuming that the application will create
-    //      multiple SkGLContextHelper's) to let it switch between the active
+    //      multiple SkGLContext's) to let it switch between the active
     //      context. Everything in the GrDebugGL object would then need to be
     //      moved to a GrContextObj and the GrDebugGL object would just switch
     //      between them. Note that this approach would also require that
diff --git a/src/gpu/gl/egl/SkNativeGLContext_egl.cpp b/src/gpu/gl/egl/SkCreatePlatformGLContext_egl.cpp
similarity index 83%
rename from src/gpu/gl/egl/SkNativeGLContext_egl.cpp
rename to src/gpu/gl/egl/SkCreatePlatformGLContext_egl.cpp
index d4d7219..dac2d11 100644
--- a/src/gpu/gl/egl/SkNativeGLContext_egl.cpp
+++ b/src/gpu/gl/egl/SkCreatePlatformGLContext_egl.cpp
@@ -5,34 +5,42 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "gl/SkNativeGLContext.h"
+#include "gl/SkGLContext.h"
 
-SkNativeGLContext::AutoContextRestore::AutoContextRestore() {
-    fOldEGLContext = eglGetCurrentContext();
-    fOldDisplay = eglGetCurrentDisplay();
-    fOldSurface = eglGetCurrentSurface(EGL_DRAW);
+#include <GLES2/gl2.h>
+#include <EGL/egl.h>
 
-}
+namespace {
 
-SkNativeGLContext::AutoContextRestore::~AutoContextRestore() {
-    if (fOldDisplay) {
-        eglMakeCurrent(fOldDisplay, fOldSurface, fOldSurface, fOldEGLContext);
-    }
-}
+class EGLGLContext : public SkGLContext  {
+public:
+    EGLGLContext();
 
-///////////////////////////////////////////////////////////////////////////////
+    virtual ~EGLGLContext();
 
-SkNativeGLContext::SkNativeGLContext()
+    virtual void makeCurrent() const SK_OVERRIDE;
+    virtual void swapBuffers() const SK_OVERRIDE;
+protected:
+    virtual const GrGLInterface* createGLContext(GrGLStandard forcedGpuAPI) SK_OVERRIDE;
+    virtual void destroyGLContext() SK_OVERRIDE;
+
+private:
+    EGLContext fContext;
+    EGLDisplay fDisplay;
+    EGLSurface fSurface;
+};
+
+EGLGLContext::EGLGLContext()
     : fContext(EGL_NO_CONTEXT)
     , fDisplay(EGL_NO_DISPLAY)
     , fSurface(EGL_NO_SURFACE) {
 }
 
-SkNativeGLContext::~SkNativeGLContext() {
+EGLGLContext::~EGLGLContext() {
     this->destroyGLContext();
 }
 
-void SkNativeGLContext::destroyGLContext() {
+void EGLGLContext::destroyGLContext() {
     if (fDisplay) {
         eglMakeCurrent(fDisplay, 0, 0, 0);
 
@@ -51,7 +59,7 @@
     }
 }
 
-const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) {
+const GrGLInterface* EGLGLContext::createGLContext(GrGLStandard forcedGpuAPI) {
     static const EGLint kEGLContextAttribsForOpenGL[] = {
         EGL_NONE
     };
@@ -169,14 +177,21 @@
     return interface;
 }
 
-void SkNativeGLContext::makeCurrent() const {
+void EGLGLContext::makeCurrent() const {
     if (!eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) {
         SkDebugf("Could not set the context.\n");
     }
 }
 
-void SkNativeGLContext::swapBuffers() const {
+void EGLGLContext::swapBuffers() const {
     if (!eglSwapBuffers(fDisplay, fSurface)) {
         SkDebugf("Could not complete eglSwapBuffers.\n");
     }
 }
+
+} // anonymous namespace
+
+SkGLContext* CreatePlatformGLContext() {
+    return SkNEW(EGLGLContext);
+}
+
diff --git a/src/gpu/gl/glx/SkNativeGLContext_glx.cpp b/src/gpu/gl/glx/SkCreatePlatformGLContext_glx.cpp
similarity index 87%
rename from src/gpu/gl/glx/SkNativeGLContext_glx.cpp
rename to src/gpu/gl/glx/SkCreatePlatformGLContext_glx.cpp
index bd130b5..794cdb6 100644
--- a/src/gpu/gl/glx/SkNativeGLContext_glx.cpp
+++ b/src/gpu/gl/glx/SkCreatePlatformGLContext_glx.cpp
@@ -5,25 +5,38 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "gl/SkNativeGLContext.h"
+#include "gl/SkGLContext.h"
 
+#include <X11/Xlib.h>
+#include <GL/glx.h>
 #include <GL/glu.h>
 
+namespace {
+
 /* Note: Skia requires glx 1.3 or newer */
 
-SkNativeGLContext::AutoContextRestore::AutoContextRestore() {
-    fOldGLXContext = glXGetCurrentContext();
-    fOldDisplay = glXGetCurrentDisplay();
-    fOldDrawable = glXGetCurrentDrawable();
-}
-
-SkNativeGLContext::AutoContextRestore::~AutoContextRestore() {
-    if (fOldDisplay) {
-        glXMakeCurrent(fOldDisplay, fOldDrawable, fOldGLXContext);
-    }
-}
-
-///////////////////////////////////////////////////////////////////////////////
+/* This struct is taken from a mesa demo.  Please update as required */
+static const struct { int major, minor; } gl_versions[] = {
+   {1, 0},
+   {1, 1},
+   {1, 2},
+   {1, 3},
+   {1, 4},
+   {1, 5},
+   {2, 0},
+   {2, 1},
+   {3, 0},
+   {3, 1},
+   {3, 2},
+   {3, 3},
+   {4, 0},
+   {4, 1},
+   {4, 2},
+   {4, 3},
+   {4, 4},
+   {0, 0} /* end of list */
+};
+#define NUM_GL_VERSIONS SK_ARRAY_COUNT(gl_versions)
 
 static bool ctxErrorOccurred = false;
 static int ctxErrorHandler(Display *dpy, XErrorEvent *ev) {
@@ -31,18 +44,37 @@
     return 0;
 }
 
-SkNativeGLContext::SkNativeGLContext()
+class GLXGLContext : public SkGLContext {
+public:
+    GLXGLContext();
+
+    virtual ~GLXGLContext();
+
+    virtual void makeCurrent() const SK_OVERRIDE;
+    virtual void swapBuffers() const SK_OVERRIDE;
+protected:
+    virtual const GrGLInterface* createGLContext(GrGLStandard forcedGpuAPI) SK_OVERRIDE;
+    virtual void destroyGLContext() SK_OVERRIDE;
+
+private:
+    GLXContext fContext;
+    Display* fDisplay;
+    Pixmap fPixmap;
+    GLXPixmap fGlxPixmap;
+};
+
+GLXGLContext::GLXGLContext()
     : fContext(NULL)
     , fDisplay(NULL)
     , fPixmap(0)
     , fGlxPixmap(0) {
 }
 
-SkNativeGLContext::~SkNativeGLContext() {
+GLXGLContext::~GLXGLContext() {
     this->destroyGLContext();
 }
 
-void SkNativeGLContext::destroyGLContext() {
+void GLXGLContext::destroyGLContext() {
     if (fDisplay) {
         glXMakeCurrent(fDisplay, 0, 0);
 
@@ -66,7 +98,7 @@
     }
 }
 
-const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) {
+const GrGLInterface* GLXGLContext::createGLContext(GrGLStandard forcedGpuAPI) {
     fDisplay = XOpenDisplay(0);
 
     if (!fDisplay) {
@@ -277,12 +309,18 @@
     return interface;
 }
 
-void SkNativeGLContext::makeCurrent() const {
+void GLXGLContext::makeCurrent() const {
     if (!glXMakeCurrent(fDisplay, fGlxPixmap, fContext)) {
         SkDebugf("Could not set the context.\n");
     }
 }
 
-void SkNativeGLContext::swapBuffers() const {
+void GLXGLContext::swapBuffers() const {
     glXSwapBuffers(fDisplay, fGlxPixmap);
 }
+
+} // anonymous namespace
+
+SkGLContext* SkCreatePlatformGLContext() {
+    return SkNEW(GLXGLContext);
+}
diff --git a/src/gpu/gl/iOS/SkCreatePlatformGLContext_iOS.mm b/src/gpu/gl/iOS/SkCreatePlatformGLContext_iOS.mm
new file mode 100644
index 0000000..ce44dd3
--- /dev/null
+++ b/src/gpu/gl/iOS/SkCreatePlatformGLContext_iOS.mm
@@ -0,0 +1,81 @@
+
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "gl/SkGLContext.h"
+#import <OpenGLES/EAGL.h>
+
+#define EAGLCTX ((EAGLContext*)(fEAGLContext))
+
+namespace {
+
+class IOSNativeGLContext : public SkNativeGLContext {
+public:
+    IOSNativeGLContext();
+
+    virtual ~IOSNativeGLContext();
+
+    virtual void makeCurrent() const SK_OVERRIDE;
+    virtual void swapBuffers() const SK_OVERRIDE;
+protected:
+    virtual const GrGLInterface* createGLContext(GrGLStandard forcedGpuAPI) SK_OVERRIDE;
+    virtual void destroyGLContext() SK_OVERRIDE;
+
+private:
+    void* fEAGLContext;
+};
+
+IOSNativeGLContext::IOSNativeGLContext()
+    : fEAGLContext(NULL) {
+}
+
+IOSNativeGLContext::~IOSNativeGLContext() {
+    this->destroyGLContext();
+}
+
+void IOSNativeGLContext::destroyGLContext() {
+    if (fEAGLContext) {
+        if ([EAGLContext currentContext] == EAGLCTX) {
+            [EAGLContext setCurrentContext:nil];
+        }
+        [EAGLCTX release];
+        fEAGLContext = NULL;
+    }
+}
+
+const GrGLInterface* IOSNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) {
+    if (kGL_GrGLStandard == forcedGpuAPI) {
+        return NULL;
+    }
+
+    fEAGLContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
+    [EAGLContext setCurrentContext:EAGLCTX];
+    
+    const GrGLInterface* interface = GrGLCreateNativeInterface();
+    if (!interface) {
+        SkDebugf("Failed to create gl interface");
+        this->destroyGLContext();
+        return NULL;
+    }
+    return interface;
+}
+
+void IOSNativeGLContext::makeCurrent() const {
+    if (![EAGLContext setCurrentContext:EAGLCTX]) {
+        SkDebugf("Could not set the context.\n");
+    }
+}
+
+void IOSNativeGLContext::swapBuffers() const { }
+
+} // anonymous namespace
+
+
+SkNativeGLContext* SkCreatePlatformGLContext() {
+    return SkNEW(IOSNativeGLContext);
+}
+
diff --git a/src/gpu/gl/iOS/SkNativeGLContext_iOS.mm b/src/gpu/gl/iOS/SkNativeGLContext_iOS.mm
deleted file mode 100644
index 1bdaf70..0000000
--- a/src/gpu/gl/iOS/SkNativeGLContext_iOS.mm
+++ /dev/null
@@ -1,71 +0,0 @@
-
-/*
- * Copyright 2012 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "gl/SkNativeGLContext.h"
-#import <OpenGLES/EAGL.h>
-
-#define EAGLCTX ((EAGLContext*)(fEAGLContext))
-
-SkNativeGLContext::AutoContextRestore::AutoContextRestore() {
-    fEAGLContext = [EAGLContext currentContext];
-    if (EAGLCTX) {
-        [EAGLCTX retain];
-    }
-}
-
-SkNativeGLContext::AutoContextRestore::~AutoContextRestore() {
-    if (EAGLCTX) {
-        [EAGLContext setCurrentContext:EAGLCTX];
-        [EAGLCTX release];
-    }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-SkNativeGLContext::SkNativeGLContext()
-    : fEAGLContext(NULL) {
-}
-
-SkNativeGLContext::~SkNativeGLContext() {
-    this->destroyGLContext();
-}
-
-void SkNativeGLContext::destroyGLContext() {
-    if (fEAGLContext) {
-        if ([EAGLContext currentContext] == EAGLCTX) {
-            [EAGLContext setCurrentContext:nil];
-        }
-        [EAGLCTX release];
-        fEAGLContext = NULL;
-    }
-}
-
-const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) {
-    if (kGL_GrGLStandard == forcedGpuAPI) {
-        return NULL;
-    }
-
-    fEAGLContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
-    [EAGLContext setCurrentContext:EAGLCTX];
-    
-    const GrGLInterface* interface = GrGLCreateNativeInterface();
-    if (!interface) {
-        SkDebugf("Failed to create gl interface");
-        this->destroyGLContext();
-        return NULL;
-    }
-    return interface;
-}
-
-void SkNativeGLContext::makeCurrent() const {
-    if (![EAGLContext setCurrentContext:EAGLCTX]) {
-        SkDebugf("Could not set the context.\n");
-    }
-}
-
-void SkNativeGLContext::swapBuffers() const { }
diff --git a/src/gpu/gl/mac/SkNativeGLContext_mac.cpp b/src/gpu/gl/mac/SkCreatePlatformGLContext_mac.cpp
similarity index 63%
rename from src/gpu/gl/mac/SkNativeGLContext_mac.cpp
rename to src/gpu/gl/mac/SkCreatePlatformGLContext_mac.cpp
index f63471c..35ec276 100644
--- a/src/gpu/gl/mac/SkNativeGLContext_mac.cpp
+++ b/src/gpu/gl/mac/SkCreatePlatformGLContext_mac.cpp
@@ -5,34 +5,43 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "gl/SkNativeGLContext.h"
+#include "gl/SkGLContext.h"
 #include "AvailabilityMacros.h"
 
-SkNativeGLContext::AutoContextRestore::AutoContextRestore() {
-    fOldCGLContext = CGLGetCurrentContext();
-}
+#include <OpenGL/OpenGL.h>
 
-SkNativeGLContext::AutoContextRestore::~AutoContextRestore() {
-    CGLSetCurrentContext(fOldCGLContext);
-}
+namespace {
+class MacGLContext : public SkGLContext {
+public:
+    MacGLContext();
 
-///////////////////////////////////////////////////////////////////////////////
+    virtual ~MacGLContext();
 
-SkNativeGLContext::SkNativeGLContext()
+    virtual void makeCurrent() const SK_OVERRIDE;
+    virtual void swapBuffers() const SK_OVERRIDE;
+protected:
+    virtual const GrGLInterface* createGLContext(GrGLStandard forcedGpuAPI) SK_OVERRIDE;
+    virtual void destroyGLContext() SK_OVERRIDE;
+
+private:
+    CGLContextObj fContext;
+};
+
+MacGLContext::MacGLContext()
     : fContext(NULL) {
 }
 
-SkNativeGLContext::~SkNativeGLContext() {
+MacGLContext::~MacGLContext() {
     this->destroyGLContext();
 }
 
-void SkNativeGLContext::destroyGLContext() {
+void MacGLContext::destroyGLContext() {
     if (fContext) {
         CGLReleaseContext(fContext);
     }
 }
 
-const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) {
+const GrGLInterface* MacGLContext::createGLContext(GrGLStandard forcedGpuAPI) {
     SkASSERT(NULL == fContext);
     if (kGLES_GrGLStandard == forcedGpuAPI) {
         return NULL;
@@ -75,10 +84,16 @@
     return interface;
 }
 
-void SkNativeGLContext::makeCurrent() const {
+void MacGLContext::makeCurrent() const {
     CGLSetCurrentContext(fContext);
 }
 
-void SkNativeGLContext::swapBuffers() const {
+void MacGLContext::swapBuffers() const {
     CGLFlushDrawable(fContext);
 }
+
+} // anonymous namespace
+
+SkGLContext* SkCreatePlatformGLContext() {
+    return SkNEW(MacGLContext);
+}
diff --git a/src/gpu/gl/mesa/SkMesaGLContext.cpp b/src/gpu/gl/mesa/SkMesaGLContext.cpp
index 31402c5..8c339c7 100644
--- a/src/gpu/gl/mesa/SkMesaGLContext.cpp
+++ b/src/gpu/gl/mesa/SkMesaGLContext.cpp
@@ -11,24 +11,6 @@
 #include "gl/SkMesaGLContext.h"
 #include "gl/GrGLDefines.h"
 
-SkMesaGLContext::AutoContextRestore::AutoContextRestore() {
-    fOldContext = (Context)OSMesaGetCurrentContext();
-    if (fOldContext) {
-        OSMesaGetColorBuffer((OSMesaContext)fOldContext,
-                              &fOldWidth, &fOldHeight,
-                              &fOldFormat, &fOldImage);
-    }
-}
-
-SkMesaGLContext::AutoContextRestore::~AutoContextRestore() {
-    if (fOldContext) {
-        OSMesaMakeCurrent((OSMesaContext)fOldContext, fOldImage,
-                          fOldFormat, fOldWidth, fOldHeight);
-    }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
 SkMesaGLContext::SkMesaGLContext()
     : fContext(static_cast<Context>(NULL))
     , fImage(NULL) {
diff --git a/src/gpu/gl/nacl/SkCreatePlatformGLContext_nacl.cpp b/src/gpu/gl/nacl/SkCreatePlatformGLContext_nacl.cpp
new file mode 100644
index 0000000..5e4b2e4
--- /dev/null
+++ b/src/gpu/gl/nacl/SkCreatePlatformGLContext_nacl.cpp
@@ -0,0 +1,60 @@
+
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+#include "gl/SkGLContext.h"
+
+#include <GLES2/gl2.h>
+#include <EGL/egl.h>
+
+namespace {
+class NACLGLContext : public SkGLContext  {
+public:
+    SkGLContextEGL();
+
+    virtual ~NACLGLContext();
+
+    virtual void makeCurrent() const SK_OVERRIDE;
+    virtual void swapBuffers() const SK_OVERRIDE;
+protected:
+    virtual const GrGLInterface* createGLContext(GrGLStandard forcedGpuAPI) SK_OVERRIDE;
+    virtual void destroyGLContext() SK_OVERRIDE;
+
+private:
+    EGLContext fContext;
+    EGLDisplay fDisplay;
+    EGLSurface fSurface;
+};
+
+NACLGLContext::NACLGLContext()
+    : fContext(NULL)
+    , fDisplay(NULL)
+{
+}
+
+NACLGLContext::~NACLGLContext() {
+    this->destroyGLContext();
+}
+
+void NACLGLContext::destroyGLContext() {
+}
+
+const GrGLInterface* NACLGLContext::createGLContext(GrGLStandard forcedGpuAPI) {
+    return NULL;
+}
+
+void NACLGLContext::makeCurrent() const {
+}
+
+void NACLGLContext::swapBuffers() const {
+}
+
+} // anonymous namespace
+
+NACLGLContext* SkCreatePlatformGLContext() {
+    return SkNEW(NACLGLContext);
+}
+
diff --git a/src/gpu/gl/nacl/SkNativeGLContext_nacl.cpp b/src/gpu/gl/nacl/SkNativeGLContext_nacl.cpp
deleted file mode 100644
index 334be1d..0000000
--- a/src/gpu/gl/nacl/SkNativeGLContext_nacl.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-
-/*
- * Copyright 2012 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-#include "gl/SkNativeGLContext.h"
-
-SkNativeGLContext::AutoContextRestore::AutoContextRestore() {
-}
-
-SkNativeGLContext::AutoContextRestore::~AutoContextRestore() {
-}
-
-SkNativeGLContext::SkNativeGLContext()
-    : fContext(NULL)
-    , fDisplay(NULL)
-{
-}
-
-SkNativeGLContext::~SkNativeGLContext() {
-    this->destroyGLContext();
-}
-
-void SkNativeGLContext::destroyGLContext() {
-}
-
-const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) {
-    return NULL;
-}
-
-void SkNativeGLContext::makeCurrent() const {
-}
-
-void SkNativeGLContext::swapBuffers() const {
-}
diff --git a/src/gpu/gl/win/SkNativeGLContext_win.cpp b/src/gpu/gl/win/SkCreatePlatformGLContext_win.cpp
similarity index 79%
rename from src/gpu/gl/win/SkNativeGLContext_win.cpp
rename to src/gpu/gl/win/SkCreatePlatformGLContext_win.cpp
index ab66ba4..d362556 100644
--- a/src/gpu/gl/win/SkNativeGLContext_win.cpp
+++ b/src/gpu/gl/win/SkCreatePlatformGLContext_win.cpp
@@ -6,36 +6,51 @@
  * found in the LICENSE file.
  */
 
-#include "gl/SkNativeGLContext.h"
+#include "gl/SkGLContext.h"
+
+#include <windows.h>
+#include <GL/GL.h>
+#include "SkWGL.h"
 
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 
-SkNativeGLContext::AutoContextRestore::AutoContextRestore() {
-    fOldHGLRC = wglGetCurrentContext();
-    fOldHDC = wglGetCurrentDC();
-}
+namespace {
 
-SkNativeGLContext::AutoContextRestore::~AutoContextRestore() {
-    wglMakeCurrent(fOldHDC, fOldHGLRC);
-}
+class WinGLContext : public SkGLContext {
+public:
+    WinGLContext();
 
-///////////////////////////////////////////////////////////////////////////////
+    virtual ~WinGLContext();
 
-ATOM SkNativeGLContext::gWC = 0;
+    virtual void makeCurrent() const SK_OVERRIDE;
+    virtual void swapBuffers() const SK_OVERRIDE;
+protected:
+    virtual const GrGLInterface* createGLContext(GrGLStandard forcedGpuAPI) SK_OVERRIDE;
+    virtual void destroyGLContext() SK_OVERRIDE;
 
-SkNativeGLContext::SkNativeGLContext()
+private:
+    HWND fWindow;
+    HDC fDeviceContext;
+    HGLRC fGlRenderContext;
+    static ATOM gWC;
+    SkWGLPbufferContext* fPbufferContext;
+};
+
+ATOM WinGLContext::gWC = 0;
+
+WinGLContext::WinGLContext()
     : fWindow(NULL)
     , fDeviceContext(NULL)
     , fGlRenderContext(0)
     , fPbufferContext(NULL) {
 }
 
-SkNativeGLContext::~SkNativeGLContext() {
+WinGLContext::~WinGLContext() {
     this->destroyGLContext();
 }
 
-void SkNativeGLContext::destroyGLContext() {
+void WinGLContext::destroyGLContext() {
     SkSafeSetNull(fPbufferContext);
     if (fGlRenderContext) {
         wglDeleteContext(fGlRenderContext);
@@ -51,7 +66,7 @@
     }
 }
 
-const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) {
+const GrGLInterface* WinGLContext::createGLContext(GrGLStandard forcedGpuAPI) {
     HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL);
 
     if (!gWC) {
@@ -134,7 +149,7 @@
     return interface;
 }
 
-void SkNativeGLContext::makeCurrent() const {
+void WinGLContext::makeCurrent() const {
     HDC dc;
     HGLRC glrc;
 
@@ -151,7 +166,7 @@
     }
 }
 
-void SkNativeGLContext::swapBuffers() const {
+void WinGLContext::swapBuffers() const {
     HDC dc;
 
     if (NULL == fPbufferContext) {
@@ -163,3 +178,10 @@
         SkDebugf("Could not complete SwapBuffers.\n");
     }
 }
+
+} // anonymous namespace
+
+SkGLContext* SkCreatePlatformGLContext() {
+    return SkNEW(WinGLContext);
+}
+
diff --git a/tests/GLInterfaceValidationTest.cpp b/tests/GLInterfaceValidationTest.cpp
index 797ba72..83f9e2e 100755
--- a/tests/GLInterfaceValidationTest.cpp
+++ b/tests/GLInterfaceValidationTest.cpp
@@ -17,20 +17,20 @@
         GrContextFactory::GLContextType glCtxType = (GrContextFactory::GLContextType)i;
         // this forces the factory to make the context if it hasn't yet
         factory->get(glCtxType);
-        SkGLContextHelper* glCtxHelper = factory->getGLContext(glCtxType);
+        SkGLContext* glCtx = factory->getGLContext(glCtxType);
 
         // We're supposed to fail the NVPR context type when we the native context that does not
         // support the NVPR extension.
         if (GrContextFactory::kNVPR_GLContextType == glCtxType &&
             factory->getGLContext(GrContextFactory::kNative_GLContextType) &&
             !factory->getGLContext(GrContextFactory::kNative_GLContextType)->hasExtension("GL_NV_path_rendering")) {
-            REPORTER_ASSERT(reporter, NULL == glCtxHelper);
+            REPORTER_ASSERT(reporter, NULL == glCtx);
             continue;
         }
 
-        REPORTER_ASSERT(reporter, glCtxHelper);
-        if (glCtxHelper) {
-            const GrGLInterface* interface = glCtxHelper->gl();
+        REPORTER_ASSERT(reporter, glCtx);
+        if (glCtx) {
+            const GrGLInterface* interface = glCtx->gl();
             REPORTER_ASSERT(reporter, interface->validate());
         }
     }
diff --git a/tests/Test.cpp b/tests/Test.cpp
index d0147e1..c458f89 100644
--- a/tests/Test.cpp
+++ b/tests/Test.cpp
@@ -15,7 +15,7 @@
 
 #if SK_SUPPORT_GPU
 #include "GrContext.h"
-#include "gl/SkNativeGLContext.h"
+#include "gl/SkGLContext.h"
 #else
 class GrContext;
 #endif
diff --git a/tools/PictureRenderer.cpp b/tools/PictureRenderer.cpp
index 705849d..ca44985 100644
--- a/tools/PictureRenderer.cpp
+++ b/tools/PictureRenderer.cpp
@@ -228,7 +228,7 @@
 
 void PictureRenderer::resetState(bool callFinish) {
 #if SK_SUPPORT_GPU
-    SkGLContextHelper* glContext = this->getGLContext();
+    SkGLContext* glContext = this->getGLContext();
     if (NULL == glContext) {
         SkASSERT(kBitmap_DeviceType == fDeviceType);
         return;
@@ -248,7 +248,7 @@
     pool->dumpPool();
 
 #if SK_SUPPORT_GPU
-    SkGLContextHelper* glContext = this->getGLContext();
+    SkGLContext* glContext = this->getGLContext();
     if (NULL == glContext) {
         SkASSERT(kBitmap_DeviceType == fDeviceType);
         return;
diff --git a/tools/PictureRenderer.h b/tools/PictureRenderer.h
index 04ac20f..8465af2 100644
--- a/tools/PictureRenderer.h
+++ b/tools/PictureRenderer.h
@@ -30,7 +30,7 @@
 
 class SkBitmap;
 class SkCanvas;
-class SkGLContextHelper;
+class SkGLContext;
 class SkThread;
 
 namespace sk_tools {
@@ -369,7 +369,7 @@
         }
     }
 
-    SkGLContextHelper* getGLContext() {
+    SkGLContext* getGLContext() {
         GrContextFactory::GLContextType glContextType
                 = GrContextFactory::kNull_GLContextType;
         switch(fDeviceType) {
diff --git a/tools/timer/GpuTimer.cpp b/tools/timer/GpuTimer.cpp
index aac10a3..0fdd999 100644
--- a/tools/timer/GpuTimer.cpp
+++ b/tools/timer/GpuTimer.cpp
@@ -6,10 +6,10 @@
  * found in the LICENSE file.
  */
 #include "GpuTimer.h"
-#include "gl/SkGLContextHelper.h"
+#include "gl/SkGLContext.h"
 #include "gl/GrGLUtil.h"
 
-GpuTimer::GpuTimer(const SkGLContextHelper* glctx) : fContext(glctx) {
+GpuTimer::GpuTimer(const SkGLContext* glctx) : fContext(glctx) {
     if (fContext) {
         fContext->ref();
         fContext->makeCurrent();
diff --git a/tools/timer/GpuTimer.h b/tools/timer/GpuTimer.h
index 2100312..da1fdab 100644
--- a/tools/timer/GpuTimer.h
+++ b/tools/timer/GpuTimer.h
@@ -7,18 +7,18 @@
 #ifndef GpuTimer_DEFINED
 #define GpuTimer_DEFINED
 
-class SkGLContextHelper;
+class SkGLContext;
 
 class GpuTimer {
 public:
-    GpuTimer(const SkGLContextHelper*);
+    GpuTimer(const SkGLContext*);
     ~GpuTimer();
     void start();
     double end();
 private:
     unsigned fQuery;
     int fStarted;
-    const SkGLContextHelper* fContext;
+    const SkGLContext* fContext;
     bool fSupported;
 };
 
diff --git a/tools/timer/Timer.cpp b/tools/timer/Timer.cpp
index 4f3fc85..a9f04af 100644
--- a/tools/timer/Timer.cpp
+++ b/tools/timer/Timer.cpp
@@ -6,7 +6,7 @@
  */
 #include "Timer.h"
 
-Timer::Timer(SkGLContextHelper* gl)
+Timer::Timer(SkGLContext* gl)
         : fCpu(-1.0)
         , fWall(-1.0)
         , fTruncatedCpu(-1.0)
diff --git a/tools/timer/Timer.h b/tools/timer/Timer.h
index 15c93f5..81d1ca5 100644
--- a/tools/timer/Timer.h
+++ b/tools/timer/Timer.h
@@ -21,7 +21,7 @@
     #include "GpuTimer.h"
 #endif
 
-class SkGLContextHelper;
+class SkGLContext;
 
 /**
  * SysTimers and GpuTimers are implemented orthogonally.
@@ -34,7 +34,7 @@
  */
 class Timer {
 public:
-    explicit Timer(SkGLContextHelper* gl = NULL);
+    explicit Timer(SkGLContext* gl = NULL);
 
     void start();
     void truncatedEnd();
