Remove reliance on linked in GL functions for assembling GLES interfaces.

Make Android pull in gl2.h directly to workaround broken eglGetProcAddress for unextended GLES2 functions.

Use interface assembler for angle and iOS.

R=robertphillips@google.com

Author: bsalomon@google.com

Review URL: https://codereview.chromium.org/500153002
diff --git a/src/gpu/gl/GrGLAssembleGLESInterface.h b/src/gpu/gl/GrGLAssembleGLESInterface.h
deleted file mode 100644
index 8162c2d..0000000
--- a/src/gpu/gl/GrGLAssembleGLESInterface.h
+++ /dev/null
@@ -1,290 +0,0 @@
-
-/*
- * Copyright 2014 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/* This file is meant to be included "inline" the implementation that is using the function.
- * The platform native GL implementation header file should be included before this file.
- * Following macros should be defined before this file is included:
- * GET_PROC and GET_PROC_SUFFIX
- *   Call the get function and assign to the interface instance
- * GET_PROC_LOCAL
- *   Call the get function and assign to a local variable
- * GET_LINKED and GET_LINKED_SUFFIX
- *   Get the link-time address of the function and assign it to the interface instance. If
- *   using the linked addresses is not intended, can be the same as GET_PROC.
- */
-
-/**
- * Generic function for creating a GrGLInterface for an OpenGL ES (but not Open GL) context. It
- * calls get() to get each function address. ctx is a generic ptr passed to and interpreted by
- * get().
- */
-static const GrGLInterface* GrGLAssembleGLESInterface(void* ctx, GrGLGetProc get) {
-    const char* verStr = reinterpret_cast<const char*>(glGetString(GR_GL_VERSION));
-    GrGLVersion version = GrGLGetVersionFromString(verStr);
-
-    if (version < GR_GL_VER(2,0)) {
-        return NULL;
-    }
-
-    GET_PROC_LOCAL(GetIntegerv);
-    GET_PROC_LOCAL(GetStringi);
-    GrGLExtensions extensions;
-    if (!extensions.init(kGLES_GrGLStandard, glGetString, GetStringi, GetIntegerv)) {
-        return NULL;
-    }
-
-    GrGLInterface* interface = SkNEW(GrGLInterface);
-    GrGLInterface::Functions* functions = &interface->fFunctions;
-
-    GET_LINKED(ActiveTexture);
-    GET_LINKED(AttachShader);
-    GET_LINKED(BindAttribLocation);
-    GET_LINKED(BindBuffer);
-    GET_LINKED(BindTexture);
-    GET_LINKED_SUFFIX(BindVertexArray, OES);
-    GET_LINKED(BlendColor);
-    GET_LINKED(BlendFunc);
-    GET_LINKED(BufferData);
-    GET_LINKED(BufferSubData);
-    GET_LINKED(Clear);
-    GET_LINKED(ClearColor);
-    GET_LINKED(ClearStencil);
-    GET_LINKED(ColorMask);
-    GET_LINKED(CompileShader);
-    GET_LINKED(CompressedTexImage2D);
-    GET_LINKED(CompressedTexSubImage2D);
-    GET_LINKED(CopyTexSubImage2D);
-    GET_LINKED(CreateProgram);
-    GET_LINKED(CreateShader);
-    GET_LINKED(CullFace);
-    GET_LINKED(DeleteBuffers);
-    GET_LINKED(DeleteProgram);
-    GET_LINKED(DeleteShader);
-    GET_LINKED(DeleteTextures);
-    GET_LINKED_SUFFIX(DeleteVertexArrays, OES);
-    GET_LINKED(DepthMask);
-    GET_LINKED(Disable);
-    GET_LINKED(DisableVertexAttribArray);
-    GET_LINKED(DrawArrays);
-    GET_LINKED(DrawElements);
-    GET_LINKED(Enable);
-    GET_LINKED(EnableVertexAttribArray);
-    GET_LINKED(Finish);
-    GET_LINKED(Flush);
-    GET_LINKED(FrontFace);
-    GET_LINKED(GenBuffers);
-    GET_LINKED(GenerateMipmap);
-    GET_LINKED(GenTextures);
-    GET_LINKED_SUFFIX(GenVertexArrays, OES);
-    GET_LINKED(GetBufferParameteriv);
-    GET_LINKED(GetError);
-    GET_LINKED(GetIntegerv);
-    GET_LINKED(GetProgramInfoLog);
-    GET_LINKED(GetProgramiv);
-    GET_LINKED(GetShaderInfoLog);
-    GET_LINKED(GetShaderiv);
-    GET_LINKED(GetString);
-#if GL_ES_VERSION_3_0
-    GET_LINKED(GetStringi);
-#else
-    GET_PROC(GetStringi);
-#endif
-    GET_LINKED(GetUniformLocation);
-    GET_LINKED(LineWidth);
-    GET_LINKED(LinkProgram);
-    GET_LINKED(PixelStorei);
-    GET_LINKED(ReadPixels);
-    GET_LINKED(Scissor);
-#if GR_GL_USE_NEW_SHADER_SOURCE_SIGNATURE
-    functions->fShaderSource = (GrGLShaderSourceProc) glShaderSource;
-#else
-    GET_LINKED(ShaderSource);
-#endif
-    GET_LINKED(StencilFunc);
-    GET_LINKED(StencilFuncSeparate);
-    GET_LINKED(StencilMask);
-    GET_LINKED(StencilMaskSeparate);
-    GET_LINKED(StencilOp);
-    GET_LINKED(StencilOpSeparate);
-    GET_LINKED(TexImage2D);
-    GET_LINKED(TexParameteri);
-    GET_LINKED(TexParameteriv);
-    GET_LINKED(TexSubImage2D);
-
-    if (version >= GR_GL_VER(3,0)) {
-#if GL_ES_VERSION_3_0
-        GET_LINKED(TexStorage2D);
-#else
-        GET_PROC(TexStorage2D);
-#endif
-    } else {
-#if GL_EXT_texture_storage
-        GET_LINKED_SUFFIX(TexStorage2D, EXT);
-#else
-        GET_PROC_SUFFIX(TexStorage2D, EXT);
-#endif
-    }
-
-#if GL_EXT_discard_framebuffer
-    GET_LINKED_SUFFIX(DiscardFramebuffer, EXT);
-#endif
-    GET_LINKED(Uniform1f);
-    GET_LINKED(Uniform1i);
-    GET_LINKED(Uniform1fv);
-    GET_LINKED(Uniform1iv);
-    GET_LINKED(Uniform2f);
-    GET_LINKED(Uniform2i);
-    GET_LINKED(Uniform2fv);
-    GET_LINKED(Uniform2iv);
-    GET_LINKED(Uniform3f);
-    GET_LINKED(Uniform3i);
-    GET_LINKED(Uniform3fv);
-    GET_LINKED(Uniform3iv);
-    GET_LINKED(Uniform4f);
-    GET_LINKED(Uniform4i);
-    GET_LINKED(Uniform4fv);
-    GET_LINKED(Uniform4iv);
-    GET_LINKED(UniformMatrix2fv);
-    GET_LINKED(UniformMatrix3fv);
-    GET_LINKED(UniformMatrix4fv);
-    GET_LINKED(UseProgram);
-    GET_LINKED(VertexAttrib4fv);
-    GET_LINKED(VertexAttribPointer);
-    GET_LINKED(Viewport);
-    GET_LINKED(BindFramebuffer);
-    GET_LINKED(BindRenderbuffer);
-    GET_LINKED(CheckFramebufferStatus);
-    GET_LINKED(DeleteFramebuffers);
-    GET_LINKED(DeleteRenderbuffers);
-    GET_LINKED(FramebufferRenderbuffer);
-    GET_LINKED(FramebufferTexture2D);
-
-    if (version >= GR_GL_VER(3,0)) {
-#if GL_ES_VERSION_3_0
-        GET_LINKED(RenderbufferStorageMultisample);
-        GET_LINKED(BlitFramebuffer);
-#else
-        GET_PROC(RenderbufferStorageMultisample);
-        GET_PROC(BlitFramebuffer);
-#endif
-    }
-
-    if (extensions.has("GL_EXT_multisampled_render_to_texture")) {
-#if GL_EXT_multisampled_render_to_texture
-        GET_LINKED_SUFFIX(FramebufferTexture2DMultisample, EXT);
-        functions->fRenderbufferStorageMultisampleES2EXT = glRenderbufferStorageMultisampleEXT;
-#else
-        GET_PROC_SUFFIX(FramebufferTexture2DMultisample, EXT);
-        functions->fRenderbufferStorageMultisampleES2EXT = (GrGLRenderbufferStorageMultisampleProc) get(ctx, "glRenderbufferStorageMultisampleEXT");
-#endif
-    } else if (extensions.has("GL_IMG_multisampled_render_to_texture")) {
-#if GL_IMG_multisampled_render_to_texture
-        GET_LINKED_SUFFIX(FramebufferTexture2DMultisample, IMG);
-        functions->fRenderbufferStorageMultisampleES2EXT = glRenderbufferStorageMultisampleIMG;
-#else
-        GET_PROC_SUFFIX(FramebufferTexture2DMultisample, IMG);
-        functions->fRenderbufferStorageMultisampleES2EXT = (GrGLRenderbufferStorageMultisampleProc) get(ctx, "glRenderbufferStorageMultisampleIMG");
-#endif
-    }
-
-    GET_LINKED(GenFramebuffers);
-    GET_LINKED(GenRenderbuffers);
-    GET_LINKED(GetFramebufferAttachmentParameteriv);
-    GET_LINKED(GetRenderbufferParameteriv);
-    GET_LINKED(RenderbufferStorage);
-
-#if GL_OES_mapbuffer
-    GET_LINKED_SUFFIX(MapBuffer, OES);
-    GET_LINKED_SUFFIX(UnmapBuffer, OES);
-#else
-    GET_PROC_SUFFIX(MapBuffer, OES);
-    GET_PROC_SUFFIX(UnmapBuffer, OES);
-#endif
-
-    if (version >= GR_GL_VER(3,0)) {
-#if GL_ES_VERSION_3_0
-        GET_LINKED(MapBufferRange);
-        GET_LINKED(FlushMappedBufferRange);
-#else
-        GET_PROC(MapBufferRange);
-        GET_PROC(FlushMappedBufferRange);
-#endif
-    } else if (extensions.has("GL_EXT_map_buffer_range")) {
-#if GL_EXT_map_buffer_range
-        GET_LINKED_SUFFIX(MapBufferRange, EXT);
-        GET_LINKED_SUFFIX(FlushMappedBufferRange, EXT);
-#else
-        GET_PROC_SUFFIX(MapBufferRange, EXT);
-        GET_PROC_SUFFIX(FlushMappedBufferRange, EXT);
-#endif
-    }
-
-    if (extensions.has("GL_EXT_debug_marker")) {
-        GET_PROC(InsertEventMarker);
-        GET_PROC(PushGroupMarker);
-        GET_PROC(PopGroupMarker);
-        // The below check is here because a device has been found that has the extension string but
-        // returns NULL from the eglGetProcAddress for the functions
-        if (NULL == functions->fInsertEventMarker ||
-            NULL == functions->fPushGroupMarker ||
-            NULL == functions->fPopGroupMarker) {
-            extensions.remove("GL_EXT_debug_marker");
-        }
-    }
-
-#if GL_ES_VERSION_3_0
-    GET_LINKED(InvalidateFramebuffer);
-    GET_LINKED(InvalidateSubFramebuffer);
-#else
-    GET_PROC(InvalidateFramebuffer);
-    GET_PROC(InvalidateSubFramebuffer);
-#endif
-    GET_PROC(InvalidateBufferData);
-    GET_PROC(InvalidateBufferSubData);
-    GET_PROC(InvalidateTexImage);
-    GET_PROC(InvalidateTexSubImage);
-
-#if GL_ES_VERSION_3_1
-    GET_LINKED(GetProgramResourceLocation);
-#else
-    if (version >= GR_GL_VER(3,1)) {
-        GET_PROC(GetProgramResourceLocation);
-    }
-#endif
-
-    if (extensions.has("GL_NV_path_rendering")) {
-        GET_PROC_SUFFIX(MatrixLoadf, EXT);
-        GET_PROC_SUFFIX(MatrixLoadIdentity, EXT);
-        GET_PROC_SUFFIX(PathCommands, NV);
-        GET_PROC_SUFFIX(PathCoords, NV);
-        GET_PROC_SUFFIX(PathParameteri, NV);
-        GET_PROC_SUFFIX(PathParameterf, NV);
-        GET_PROC_SUFFIX(GenPaths, NV);
-        GET_PROC_SUFFIX(DeletePaths, NV);
-        GET_PROC_SUFFIX(IsPath, NV);
-        GET_PROC_SUFFIX(PathStencilFunc, NV);
-        GET_PROC_SUFFIX(StencilFillPath, NV);
-        GET_PROC_SUFFIX(StencilStrokePath, NV);
-        GET_PROC_SUFFIX(StencilFillPathInstanced, NV);
-        GET_PROC_SUFFIX(StencilStrokePathInstanced, NV);
-        GET_PROC_SUFFIX(CoverFillPath, NV);
-        GET_PROC_SUFFIX(CoverStrokePath, NV);
-        GET_PROC_SUFFIX(CoverFillPathInstanced, NV);
-        GET_PROC_SUFFIX(CoverStrokePathInstanced, NV);
-        GET_PROC_SUFFIX(StencilThenCoverFillPath, NV);
-        GET_PROC_SUFFIX(StencilThenCoverStrokePath, NV);
-        GET_PROC_SUFFIX(StencilThenCoverFillPathInstanced, NV);
-        GET_PROC_SUFFIX(StencilThenCoverStrokePathInstanced, NV);
-        GET_PROC_SUFFIX(ProgramPathFragmentInputGen, NV);
-    }
-
-    interface->fStandard = kGLES_GrGLStandard;
-    interface->fExtensions.swap(&extensions);
-
-    return interface;
-}
diff --git a/src/gpu/gl/GrGLAssembleInterface.cpp b/src/gpu/gl/GrGLAssembleInterface.cpp
index 8fd173d..da88547 100644
--- a/src/gpu/gl/GrGLAssembleInterface.cpp
+++ b/src/gpu/gl/GrGLAssembleInterface.cpp
@@ -14,6 +14,27 @@
 #define GET_PROC_SUFFIX(F, S) functions->f ## F = (GrGL ## F ## Proc) get(ctx, "gl" #F #S)
 #define GET_PROC_LOCAL(F) GrGL ## F ## Proc F = (GrGL ## F ## Proc) get(ctx, "gl" #F)
 
+const GrGLInterface* GrGLAssembleInterface(void* ctx, GrGLGetProc get) {
+    GET_PROC_LOCAL(GetString);
+    if (NULL == GetString) {
+        return NULL;
+    }
+
+    const char* verStr = reinterpret_cast<const char*>(GetString(GR_GL_VERSION));
+    if (NULL == verStr) {
+        return NULL;
+    }
+
+    GrGLStandard standard = GrGLGetStandardInUseFromString(verStr);
+
+    if (kGLES_GrGLStandard == standard) {
+        return GrGLAssembleGLESInterface(ctx, get);
+    } else if (kGL_GrGLStandard == standard) {
+        return GrGLAssembleGLInterface(ctx, get);
+    }
+    return NULL;
+}
+
 const GrGLInterface* GrGLAssembleGLInterface(void* ctx, GrGLGetProc get) {
     GET_PROC_LOCAL(GetString);
     GET_PROC_LOCAL(GetStringi);
@@ -272,3 +293,220 @@
 
     return interface;
 }
+
+const GrGLInterface* GrGLAssembleGLESInterface(void* ctx, GrGLGetProc get) {
+    GET_PROC_LOCAL(GetString);
+    if (NULL == GetString) {
+        return NULL;
+    }
+
+    const char* verStr = reinterpret_cast<const char*>(GetString(GR_GL_VERSION));
+    GrGLVersion version = GrGLGetVersionFromString(verStr);
+
+    if (version < GR_GL_VER(2,0)) {
+        return NULL;
+    }
+
+    GET_PROC_LOCAL(GetIntegerv);
+    GET_PROC_LOCAL(GetStringi);
+    GrGLExtensions extensions;
+    if (!extensions.init(kGLES_GrGLStandard, GetString, GetStringi, GetIntegerv)) {
+        return NULL;
+    }
+
+    GrGLInterface* interface = SkNEW(GrGLInterface);
+    GrGLInterface::Functions* functions = &interface->fFunctions;
+
+    GET_PROC(ActiveTexture);
+    GET_PROC(AttachShader);
+    GET_PROC(BindAttribLocation);
+    GET_PROC(BindBuffer);
+    GET_PROC(BindTexture);
+    GET_PROC_SUFFIX(BindVertexArray, OES);
+    GET_PROC(BlendColor);
+    GET_PROC(BlendFunc);
+    GET_PROC(BufferData);
+    GET_PROC(BufferSubData);
+    GET_PROC(Clear);
+    GET_PROC(ClearColor);
+    GET_PROC(ClearStencil);
+    GET_PROC(ColorMask);
+    GET_PROC(CompileShader);
+    GET_PROC(CompressedTexImage2D);
+    GET_PROC(CompressedTexSubImage2D);
+    GET_PROC(CopyTexSubImage2D);
+    GET_PROC(CreateProgram);
+    GET_PROC(CreateShader);
+    GET_PROC(CullFace);
+    GET_PROC(DeleteBuffers);
+    GET_PROC(DeleteProgram);
+    GET_PROC(DeleteShader);
+    GET_PROC(DeleteTextures);
+    GET_PROC_SUFFIX(DeleteVertexArrays, OES);
+    GET_PROC(DepthMask);
+    GET_PROC(Disable);
+    GET_PROC(DisableVertexAttribArray);
+    GET_PROC(DrawArrays);
+    GET_PROC(DrawElements);
+    GET_PROC(Enable);
+    GET_PROC(EnableVertexAttribArray);
+    GET_PROC(Finish);
+    GET_PROC(Flush);
+    GET_PROC(FrontFace);
+    GET_PROC(GenBuffers);
+    GET_PROC(GenerateMipmap);
+    GET_PROC(GenTextures);
+    GET_PROC_SUFFIX(GenVertexArrays, OES);
+    GET_PROC(GetBufferParameteriv);
+    GET_PROC(GetError);
+    GET_PROC(GetIntegerv);
+    GET_PROC(GetProgramInfoLog);
+    GET_PROC(GetProgramiv);
+    GET_PROC(GetShaderInfoLog);
+    GET_PROC(GetShaderiv);
+    GET_PROC(GetString);
+    GET_PROC(GetStringi);
+    GET_PROC(GetUniformLocation);
+    GET_PROC(LineWidth);
+    GET_PROC(LinkProgram);
+    GET_PROC(PixelStorei);
+    GET_PROC(ReadPixels);
+    GET_PROC(Scissor);
+    GET_PROC(ShaderSource);
+    GET_PROC(StencilFunc);
+    GET_PROC(StencilFuncSeparate);
+    GET_PROC(StencilMask);
+    GET_PROC(StencilMaskSeparate);
+    GET_PROC(StencilOp);
+    GET_PROC(StencilOpSeparate);
+    GET_PROC(TexImage2D);
+    GET_PROC(TexParameteri);
+    GET_PROC(TexParameteriv);
+    GET_PROC(TexSubImage2D);
+
+    if (version >= GR_GL_VER(3,0)) {
+        GET_PROC(TexStorage2D);
+    } else {
+        GET_PROC_SUFFIX(TexStorage2D, EXT);
+    }
+
+    GET_PROC_SUFFIX(DiscardFramebuffer, EXT);
+    GET_PROC(Uniform1f);
+    GET_PROC(Uniform1i);
+    GET_PROC(Uniform1fv);
+    GET_PROC(Uniform1iv);
+    GET_PROC(Uniform2f);
+    GET_PROC(Uniform2i);
+    GET_PROC(Uniform2fv);
+    GET_PROC(Uniform2iv);
+    GET_PROC(Uniform3f);
+    GET_PROC(Uniform3i);
+    GET_PROC(Uniform3fv);
+    GET_PROC(Uniform3iv);
+    GET_PROC(Uniform4f);
+    GET_PROC(Uniform4i);
+    GET_PROC(Uniform4fv);
+    GET_PROC(Uniform4iv);
+    GET_PROC(UniformMatrix2fv);
+    GET_PROC(UniformMatrix3fv);
+    GET_PROC(UniformMatrix4fv);
+    GET_PROC(UseProgram);
+    GET_PROC(VertexAttrib4fv);
+    GET_PROC(VertexAttribPointer);
+    GET_PROC(Viewport);
+    GET_PROC(BindFramebuffer);
+    GET_PROC(BindRenderbuffer);
+    GET_PROC(CheckFramebufferStatus);
+    GET_PROC(DeleteFramebuffers);
+    GET_PROC(DeleteRenderbuffers);
+    GET_PROC(FramebufferRenderbuffer);
+    GET_PROC(FramebufferTexture2D);
+
+    if (version >= GR_GL_VER(3,0)) {
+        GET_PROC(RenderbufferStorageMultisample);
+        GET_PROC(BlitFramebuffer);
+    }
+
+    if (extensions.has("GL_EXT_multisampled_render_to_texture")) {
+        GET_PROC_SUFFIX(FramebufferTexture2DMultisample, EXT);
+        functions->fRenderbufferStorageMultisampleES2EXT = (GrGLRenderbufferStorageMultisampleProc) get(ctx, "glRenderbufferStorageMultisampleEXT");
+    } else if (extensions.has("GL_IMG_multisampled_render_to_texture")) {
+        GET_PROC_SUFFIX(FramebufferTexture2DMultisample, IMG);
+        functions->fRenderbufferStorageMultisampleES2EXT = (GrGLRenderbufferStorageMultisampleProc) get(ctx, "glRenderbufferStorageMultisampleIMG");
+    } else if (extensions.has("GL_APPLE_framebuffer_multisample")) {
+        functions->fRenderbufferStorageMultisampleES2APPLE = (GrGLRenderbufferStorageMultisampleProc) get(ctx, "glRenderbufferStorageMultisampleAPPLE");
+        GET_PROC_SUFFIX(ResolveMultisampleFramebuffer, APPLE);
+    }
+
+    GET_PROC(GenFramebuffers);
+    GET_PROC(GenRenderbuffers);
+    GET_PROC(GetFramebufferAttachmentParameteriv);
+    GET_PROC(GetRenderbufferParameteriv);
+    GET_PROC(RenderbufferStorage);
+
+    GET_PROC_SUFFIX(MapBuffer, OES);
+    GET_PROC_SUFFIX(UnmapBuffer, OES);
+
+    if (version >= GR_GL_VER(3,0)) {
+        GET_PROC(MapBufferRange);
+        GET_PROC(FlushMappedBufferRange);
+    } else if (extensions.has("GL_EXT_map_buffer_range")) {
+        GET_PROC_SUFFIX(MapBufferRange, EXT);
+        GET_PROC_SUFFIX(FlushMappedBufferRange, EXT);
+    }
+
+    if (extensions.has("GL_EXT_debug_marker")) {
+        GET_PROC(InsertEventMarker);
+        GET_PROC(PushGroupMarker);
+        GET_PROC(PopGroupMarker);
+        // The below check is here because a device has been found that has the extension string but
+        // returns NULL from the eglGetProcAddress for the functions
+        if (NULL == functions->fInsertEventMarker ||
+            NULL == functions->fPushGroupMarker ||
+            NULL == functions->fPopGroupMarker) {
+            extensions.remove("GL_EXT_debug_marker");
+        }
+    }
+
+    GET_PROC(InvalidateFramebuffer);
+    GET_PROC(InvalidateSubFramebuffer);
+    GET_PROC(InvalidateBufferData);
+    GET_PROC(InvalidateBufferSubData);
+    GET_PROC(InvalidateTexImage);
+    GET_PROC(InvalidateTexSubImage);
+
+    if (version >= GR_GL_VER(3,1)) {
+        GET_PROC(GetProgramResourceLocation);
+    }
+
+    if (extensions.has("GL_NV_path_rendering")) {
+        GET_PROC_SUFFIX(MatrixLoadf, EXT);
+        GET_PROC_SUFFIX(MatrixLoadIdentity, EXT);
+        GET_PROC_SUFFIX(PathCommands, NV);
+        GET_PROC_SUFFIX(PathCoords, NV);
+        GET_PROC_SUFFIX(PathParameteri, NV);
+        GET_PROC_SUFFIX(PathParameterf, NV);
+        GET_PROC_SUFFIX(GenPaths, NV);
+        GET_PROC_SUFFIX(DeletePaths, NV);
+        GET_PROC_SUFFIX(IsPath, NV);
+        GET_PROC_SUFFIX(PathStencilFunc, NV);
+        GET_PROC_SUFFIX(StencilFillPath, NV);
+        GET_PROC_SUFFIX(StencilStrokePath, NV);
+        GET_PROC_SUFFIX(StencilFillPathInstanced, NV);
+        GET_PROC_SUFFIX(StencilStrokePathInstanced, NV);
+        GET_PROC_SUFFIX(CoverFillPath, NV);
+        GET_PROC_SUFFIX(CoverStrokePath, NV);
+        GET_PROC_SUFFIX(CoverFillPathInstanced, NV);
+        GET_PROC_SUFFIX(CoverStrokePathInstanced, NV);
+        GET_PROC_SUFFIX(StencilThenCoverFillPath, NV);
+        GET_PROC_SUFFIX(StencilThenCoverStrokePath, NV);
+        GET_PROC_SUFFIX(StencilThenCoverFillPathInstanced, NV);
+        GET_PROC_SUFFIX(StencilThenCoverStrokePathInstanced, NV);
+        GET_PROC_SUFFIX(ProgramPathFragmentInputGen, NV);
+    }
+
+    interface->fStandard = kGLES_GrGLStandard;
+    interface->fExtensions.swap(&extensions);
+
+    return interface;
+}
diff --git a/src/gpu/gl/GrGLAssembleInterface.h b/src/gpu/gl/GrGLAssembleInterface.h
index 36a4513..aa0fbca 100644
--- a/src/gpu/gl/GrGLAssembleInterface.h
+++ b/src/gpu/gl/GrGLAssembleInterface.h
@@ -11,8 +11,22 @@
 typedef void(*GrGLFuncPtr)();
 typedef GrGLFuncPtr (*GrGLGetProc)(void* ctx, const char name[]);
 
+
+/**
+ * Generic function for creating a GrGLInterface for an either OpenGL or GLES. It calls
+ * get() to get each function address. ctx is a generic ptr passed to and interpreted by get().
+ */
+const GrGLInterface* GrGLAssembleInterface(void* ctx, GrGLGetProc get);
+
 /**
  * Generic function for creating a GrGLInterface for an OpenGL (but not GLES) context. It calls
  * get() to get each function address. ctx is a generic ptr passed to and interpreted by get().
  */
 const GrGLInterface* GrGLAssembleGLInterface(void* ctx, GrGLGetProc get);
+
+/**
+ * Generic function for creating a GrGLInterface for an OpenGL ES (but not Open GL) context. It
+ * calls get() to get each function address. ctx is a generic ptr passed to and interpreted by
+ * get().
+ */
+const GrGLInterface* GrGLAssembleGLESInterface(void* ctx, GrGLGetProc get);
diff --git a/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp b/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp
index df212b1..907a816 100644
--- a/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp
+++ b/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp
@@ -1,47 +1,415 @@
-// Modified from chromium/src/webkit/glue/gl_bindings_skia_cmd_buffer.cc
 
-// Copyright (c) 2011 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.
-
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
 #include "gl/GrGLInterface.h"
 #include "gl/GrGLAssembleInterface.h"
-#include "gl/GrGLExtensions.h"
 #include "gl/GrGLUtil.h"
 
-#ifndef GL_GLEXT_PROTOTYPES
-#define GL_GLEXT_PROTOTYPES
-#endif
-
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-
 #include <EGL/egl.h>
-
-#define GET_PROC(F) functions->f ## F = (GrGL ## F ## Proc) get(ctx, "gl" #F)
-#define GET_PROC_SUFFIX(F, S) functions->f ## F = (GrGL ## F ## Proc) get(ctx, "gl" #F #S)
-#define GET_PROC_LOCAL(F) GrGL ## F ## Proc F = (GrGL ## F ## Proc) get(ctx, "gl" #F)
-
-#define GET_LINKED(F) functions->f ## F = gl ## F
-#define GET_LINKED_SUFFIX(F, S) functions->f ## F = gl ## F ##S
-
-#include "gl/GrGLAssembleGLESInterface.h"
+#include <GLES2/gl2.h>
 
 static GrGLFuncPtr android_get_gl_proc(void* ctx, const char name[]) {
     SkASSERT(NULL == ctx);
+    // Some older drivers on Android have busted eglGetProcAdddress Functions that
+    // will return the wrong pointer for built in GLES2 functions. This set of functions
+    // was generated on a Xoom by finding mismatches between the function pulled in via gl2.h and
+    // the address returned by eglGetProcAddress.
+    if (0 == strcmp("glActiveTexture", name)) {
+        return (GrGLFuncPtr) glActiveTexture;
+    } else if (0 == strcmp("glAttachShader", name)) {
+        return (GrGLFuncPtr) glAttachShader;
+    } else if (0 == strcmp("glBindAttribLocation", name)) {
+        return (GrGLFuncPtr) glBindAttribLocation;
+    } else if (0 == strcmp("glBindBuffer", name)) {
+        return (GrGLFuncPtr) glBindBuffer;
+    } else if (0 == strcmp("glBindTexture", name)) {
+        return (GrGLFuncPtr) glBindTexture;
+    } else if (0 == strcmp("glBlendColor", name)) {
+        return (GrGLFuncPtr) glBlendColor;
+    } else if (0 == strcmp("glBlendFunc", name)) {
+        return (GrGLFuncPtr) glBlendFunc;
+    } else if (0 == strcmp("glBufferData", name)) {
+        return (GrGLFuncPtr) glBufferData;
+    } else if (0 == strcmp("glBufferSubData", name)) {
+        return (GrGLFuncPtr) glBufferSubData;
+    } else if (0 == strcmp("glClear", name)) {
+        return (GrGLFuncPtr) glClear;
+    } else if (0 == strcmp("glClearColor", name)) {
+        return (GrGLFuncPtr) glClearColor;
+    } else if (0 == strcmp("glClearStencil", name)) {
+        return (GrGLFuncPtr) glClearStencil;
+    } else if (0 == strcmp("glColorMask", name)) {
+        return (GrGLFuncPtr) glColorMask;
+    } else if (0 == strcmp("glCompileShader", name)) {
+        return (GrGLFuncPtr) glCompileShader;
+    } else if (0 == strcmp("glCompressedTexImage2D", name)) {
+        return (GrGLFuncPtr) glCompressedTexImage2D;
+    } else if (0 == strcmp("glCompressedTexSubImage2D", name)) {
+        return (GrGLFuncPtr) glCompressedTexSubImage2D;
+    } else if (0 == strcmp("glCopyTexSubImage2D", name)) {
+        return (GrGLFuncPtr) glCopyTexSubImage2D;
+    } else if (0 == strcmp("glCreateProgram", name)) {
+        return (GrGLFuncPtr) glCreateProgram;
+    } else if (0 == strcmp("glCreateShader", name)) {
+        return (GrGLFuncPtr) glCreateShader;
+    } else if (0 == strcmp("glCullFace", name)) {
+        return (GrGLFuncPtr) glCullFace;
+    } else if (0 == strcmp("glDeleteBuffers", name)) {
+        return (GrGLFuncPtr) glDeleteBuffers;
+    } else if (0 == strcmp("glDeleteProgram", name)) {
+        return (GrGLFuncPtr) glDeleteProgram;
+    } else if (0 == strcmp("glDeleteShader", name)) {
+        return (GrGLFuncPtr) glDeleteShader;
+    } else if (0 == strcmp("glDeleteTextures", name)) {
+        return (GrGLFuncPtr) glDeleteTextures;
+    } else if (0 == strcmp("glDepthMask", name)) {
+        return (GrGLFuncPtr) glDepthMask;
+    } else if (0 == strcmp("glDisable", name)) {
+        return (GrGLFuncPtr) glDisable;
+    } else if (0 == strcmp("glDisableVertexAttribArray", name)) {
+        return (GrGLFuncPtr) glDisableVertexAttribArray;
+    } else if (0 == strcmp("glDrawArrays", name)) {
+        return (GrGLFuncPtr) glDrawArrays;
+    } else if (0 == strcmp("glDrawElements", name)) {
+        return (GrGLFuncPtr) glDrawElements;
+    } else if (0 == strcmp("glEnable", name)) {
+        return (GrGLFuncPtr) glEnable;
+    } else if (0 == strcmp("glEnableVertexAttribArray", name)) {
+        return (GrGLFuncPtr) glEnableVertexAttribArray;
+    } else if (0 == strcmp("glFinish", name)) {
+        return (GrGLFuncPtr) glFinish;
+    } else if (0 == strcmp("glFlush", name)) {
+        return (GrGLFuncPtr) glFlush;
+    } else if (0 == strcmp("glFrontFace", name)) {
+        return (GrGLFuncPtr) glFrontFace;
+    } else if (0 == strcmp("glGenBuffers", name)) {
+        return (GrGLFuncPtr) glGenBuffers;
+    } else if (0 == strcmp("glGenerateMipmap", name)) {
+        return (GrGLFuncPtr) glGenerateMipmap;
+    } else if (0 == strcmp("glGenTextures", name)) {
+        return (GrGLFuncPtr) glGenTextures;
+    } else if (0 == strcmp("glGetBufferParameteriv", name)) {
+        return (GrGLFuncPtr) glGetBufferParameteriv;
+    } else if (0 == strcmp("glGetError", name)) {
+        return (GrGLFuncPtr) glGetError;
+    } else if (0 == strcmp("glGetIntegerv", name)) {
+        return (GrGLFuncPtr) glGetIntegerv;
+    } else if (0 == strcmp("glGetProgramInfoLog", name)) {
+        return (GrGLFuncPtr) glGetProgramInfoLog;
+    } else if (0 == strcmp("glGetProgramiv", name)) {
+        return (GrGLFuncPtr) glGetProgramiv;
+    } else if (0 == strcmp("glGetShaderInfoLog", name)) {
+        return (GrGLFuncPtr) glGetShaderInfoLog;
+    } else if (0 == strcmp("glGetShaderiv", name)) {
+        return (GrGLFuncPtr) glGetShaderiv;
+    } else if (0 == strcmp("glGetString", name)) {
+        return (GrGLFuncPtr) glGetString;
+    } else if (0 == strcmp("glGetUniformLocation", name)) {
+        return (GrGLFuncPtr) glGetUniformLocation;
+    } else if (0 == strcmp("glLineWidth", name)) {
+        return (GrGLFuncPtr) glLineWidth;
+    } else if (0 == strcmp("glLinkProgram", name)) {
+        return (GrGLFuncPtr) glLinkProgram;
+    } else if (0 == strcmp("glPixelStorei", name)) {
+        return (GrGLFuncPtr) glPixelStorei;
+    } else if (0 == strcmp("glReadPixels", name)) {
+        return (GrGLFuncPtr) glReadPixels;
+    } else if (0 == strcmp("glScissor", name)) {
+        return (GrGLFuncPtr) glScissor;
+    } else if (0 == strcmp("glShaderSource", name)) {
+        return (GrGLFuncPtr) glShaderSource;
+    } else if (0 == strcmp("glStencilFunc", name)) {
+        return (GrGLFuncPtr) glStencilFunc;
+    } else if (0 == strcmp("glStencilFuncSeparate", name)) {
+        return (GrGLFuncPtr) glStencilFuncSeparate;
+    } else if (0 == strcmp("glStencilMask", name)) {
+        return (GrGLFuncPtr) glStencilMask;
+    } else if (0 == strcmp("glStencilMaskSeparate", name)) {
+        return (GrGLFuncPtr) glStencilMaskSeparate;
+    } else if (0 == strcmp("glStencilOp", name)) {
+        return (GrGLFuncPtr) glStencilOp;
+    } else if (0 == strcmp("glStencilOpSeparate", name)) {
+        return (GrGLFuncPtr) glStencilOpSeparate;
+    } else if (0 == strcmp("glTexImage2D", name)) {
+        return (GrGLFuncPtr) glTexImage2D;
+    } else if (0 == strcmp("glTexParameteri", name)) {
+        return (GrGLFuncPtr) glTexParameteri;
+    } else if (0 == strcmp("glTexParameteriv", name)) {
+        return (GrGLFuncPtr) glTexParameteriv;
+    } else if (0 == strcmp("glTexSubImage2D", name)) {
+        return (GrGLFuncPtr) glTexSubImage2D;
+    } else if (0 == strcmp("glUniform1f", name)) {
+        return (GrGLFuncPtr) glUniform1f;
+    } else if (0 == strcmp("glUniform1i", name)) {
+        return (GrGLFuncPtr) glUniform1i;
+    } else if (0 == strcmp("glUniform1fv", name)) {
+        return (GrGLFuncPtr) glUniform1fv;
+    } else if (0 == strcmp("glUniform1iv", name)) {
+        return (GrGLFuncPtr) glUniform1iv;
+    } else if (0 == strcmp("glUniform2f", name)) {
+        return (GrGLFuncPtr) glUniform2f;
+    } else if (0 == strcmp("glUniform2i", name)) {
+        return (GrGLFuncPtr) glUniform2i;
+    } else if (0 == strcmp("glUniform2fv", name)) {
+        return (GrGLFuncPtr) glUniform2fv;
+    } else if (0 == strcmp("glUniform2iv", name)) {
+        return (GrGLFuncPtr) glUniform2iv;
+    } else if (0 == strcmp("glUniform3f", name)) {
+        return (GrGLFuncPtr) glUniform3f;
+    } else if (0 == strcmp("glUniform3i", name)) {
+        return (GrGLFuncPtr) glUniform3i;
+    } else if (0 == strcmp("glUniform3fv", name)) {
+        return (GrGLFuncPtr) glUniform3fv;
+    } else if (0 == strcmp("glUniform3iv", name)) {
+        return (GrGLFuncPtr) glUniform3iv;
+    } else if (0 == strcmp("glUniform4f", name)) {
+        return (GrGLFuncPtr) glUniform4f;
+    } else if (0 == strcmp("glUniform4i", name)) {
+        return (GrGLFuncPtr) glUniform4i;
+    } else if (0 == strcmp("glUniform4fv", name)) {
+        return (GrGLFuncPtr) glUniform4fv;
+    } else if (0 == strcmp("glUniform4iv", name)) {
+        return (GrGLFuncPtr) glUniform4iv;
+    } else if (0 == strcmp("glUniformMatrix2fv", name)) {
+        return (GrGLFuncPtr) glUniformMatrix2fv;
+    } else if (0 == strcmp("glUniformMatrix3fv", name)) {
+        return (GrGLFuncPtr) glUniformMatrix3fv;
+    } else if (0 == strcmp("glUniformMatrix4fv", name)) {
+        return (GrGLFuncPtr) glUniformMatrix4fv;
+    } else if (0 == strcmp("glUseProgram", name)) {
+        return (GrGLFuncPtr) glUseProgram;
+    } else if (0 == strcmp("glVertexAttrib4fv", name)) {
+        return (GrGLFuncPtr) glVertexAttrib4fv;
+    } else if (0 == strcmp("glVertexAttribPointer", name)) {
+        return (GrGLFuncPtr) glVertexAttribPointer;
+    } else if (0 == strcmp("glViewport", name)) {
+        return (GrGLFuncPtr) glViewport;
+    } else if (0 == strcmp("glBindFramebuffer", name)) {
+        return (GrGLFuncPtr) glBindFramebuffer;
+    } else if (0 == strcmp("glBindRenderbuffer", name)) {
+        return (GrGLFuncPtr) glBindRenderbuffer;
+    } else if (0 == strcmp("glCheckFramebufferStatus", name)) {
+        return (GrGLFuncPtr) glCheckFramebufferStatus;
+    } else if (0 == strcmp("glDeleteFramebuffers", name)) {
+        return (GrGLFuncPtr) glDeleteFramebuffers;
+    } else if (0 == strcmp("glDeleteRenderbuffers", name)) {
+        return (GrGLFuncPtr) glDeleteRenderbuffers;
+    } else if (0 == strcmp("glFramebufferRenderbuffer", name)) {
+        return (GrGLFuncPtr) glFramebufferRenderbuffer;
+    } else if (0 == strcmp("glFramebufferTexture2D", name)) {
+        return (GrGLFuncPtr) glFramebufferTexture2D;
+    } else if (0 == strcmp("glGenFramebuffers", name)) {
+        return (GrGLFuncPtr) glGenFramebuffers;
+    } else if (0 == strcmp("glGenRenderbuffers", name)) {
+        return (GrGLFuncPtr) glGenRenderbuffers;
+    } else if (0 == strcmp("glGetFramebufferAttachmentParameteriv", name)) {
+        return (GrGLFuncPtr) glGetFramebufferAttachmentParameteriv;
+    } else if (0 == strcmp("glGetRenderbufferParameteriv", name)) {
+        return (GrGLFuncPtr) glGetRenderbufferParameteriv;
+    } else if (0 == strcmp("glRenderbufferStorage", name)) {
+        return (GrGLFuncPtr) glRenderbufferStorage;
+    } else if (0 == strcmp("glActiveTexture", name)) {
+        return (GrGLFuncPtr) glActiveTexture;
+    } else if (0 == strcmp("glAttachShader", name)) {
+        return (GrGLFuncPtr) glAttachShader;
+    } else if (0 == strcmp("glBindAttribLocation", name)) {
+        return (GrGLFuncPtr) glBindAttribLocation;
+    } else if (0 == strcmp("glBindBuffer", name)) {
+        return (GrGLFuncPtr) glBindBuffer;
+    } else if (0 == strcmp("glBindTexture", name)) {
+        return (GrGLFuncPtr) glBindTexture;
+    } else if (0 == strcmp("glBlendColor", name)) {
+        return (GrGLFuncPtr) glBlendColor;
+    } else if (0 == strcmp("glBlendFunc", name)) {
+        return (GrGLFuncPtr) glBlendFunc;
+    } else if (0 == strcmp("glBufferData", name)) {
+        return (GrGLFuncPtr) glBufferData;
+    } else if (0 == strcmp("glBufferSubData", name)) {
+        return (GrGLFuncPtr) glBufferSubData;
+    } else if (0 == strcmp("glClear", name)) {
+        return (GrGLFuncPtr) glClear;
+    } else if (0 == strcmp("glClearColor", name)) {
+        return (GrGLFuncPtr) glClearColor;
+    } else if (0 == strcmp("glClearStencil", name)) {
+        return (GrGLFuncPtr) glClearStencil;
+    } else if (0 == strcmp("glColorMask", name)) {
+        return (GrGLFuncPtr) glColorMask;
+    } else if (0 == strcmp("glCompileShader", name)) {
+        return (GrGLFuncPtr) glCompileShader;
+    } else if (0 == strcmp("glCompressedTexImage2D", name)) {
+        return (GrGLFuncPtr) glCompressedTexImage2D;
+    } else if (0 == strcmp("glCompressedTexSubImage2D", name)) {
+        return (GrGLFuncPtr) glCompressedTexSubImage2D;
+    } else if (0 == strcmp("glCopyTexSubImage2D", name)) {
+        return (GrGLFuncPtr) glCopyTexSubImage2D;
+    } else if (0 == strcmp("glCreateProgram", name)) {
+        return (GrGLFuncPtr) glCreateProgram;
+    } else if (0 == strcmp("glCreateShader", name)) {
+        return (GrGLFuncPtr) glCreateShader;
+    } else if (0 == strcmp("glCullFace", name)) {
+        return (GrGLFuncPtr) glCullFace;
+    } else if (0 == strcmp("glDeleteBuffers", name)) {
+        return (GrGLFuncPtr) glDeleteBuffers;
+    } else if (0 == strcmp("glDeleteProgram", name)) {
+        return (GrGLFuncPtr) glDeleteProgram;
+    } else if (0 == strcmp("glDeleteShader", name)) {
+        return (GrGLFuncPtr) glDeleteShader;
+    } else if (0 == strcmp("glDeleteTextures", name)) {
+        return (GrGLFuncPtr) glDeleteTextures;
+    } else if (0 == strcmp("glDepthMask", name)) {
+        return (GrGLFuncPtr) glDepthMask;
+    } else if (0 == strcmp("glDisable", name)) {
+        return (GrGLFuncPtr) glDisable;
+    } else if (0 == strcmp("glDisableVertexAttribArray", name)) {
+        return (GrGLFuncPtr) glDisableVertexAttribArray;
+    } else if (0 == strcmp("glDrawArrays", name)) {
+        return (GrGLFuncPtr) glDrawArrays;
+    } else if (0 == strcmp("glDrawElements", name)) {
+        return (GrGLFuncPtr) glDrawElements;
+    } else if (0 == strcmp("glEnable", name)) {
+        return (GrGLFuncPtr) glEnable;
+    } else if (0 == strcmp("glEnableVertexAttribArray", name)) {
+        return (GrGLFuncPtr) glEnableVertexAttribArray;
+    } else if (0 == strcmp("glFinish", name)) {
+        return (GrGLFuncPtr) glFinish;
+    } else if (0 == strcmp("glFlush", name)) {
+        return (GrGLFuncPtr) glFlush;
+    } else if (0 == strcmp("glFrontFace", name)) {
+        return (GrGLFuncPtr) glFrontFace;
+    } else if (0 == strcmp("glGenBuffers", name)) {
+        return (GrGLFuncPtr) glGenBuffers;
+    } else if (0 == strcmp("glGenerateMipmap", name)) {
+        return (GrGLFuncPtr) glGenerateMipmap;
+    } else if (0 == strcmp("glGenTextures", name)) {
+        return (GrGLFuncPtr) glGenTextures;
+    } else if (0 == strcmp("glGetBufferParameteriv", name)) {
+        return (GrGLFuncPtr) glGetBufferParameteriv;
+    } else if (0 == strcmp("glGetError", name)) {
+        return (GrGLFuncPtr) glGetError;
+    } else if (0 == strcmp("glGetIntegerv", name)) {
+        return (GrGLFuncPtr) glGetIntegerv;
+    } else if (0 == strcmp("glGetProgramInfoLog", name)) {
+        return (GrGLFuncPtr) glGetProgramInfoLog;
+    } else if (0 == strcmp("glGetProgramiv", name)) {
+        return (GrGLFuncPtr) glGetProgramiv;
+    } else if (0 == strcmp("glGetShaderInfoLog", name)) {
+        return (GrGLFuncPtr) glGetShaderInfoLog;
+    } else if (0 == strcmp("glGetShaderiv", name)) {
+        return (GrGLFuncPtr) glGetShaderiv;
+    } else if (0 == strcmp("glGetString", name)) {
+        return (GrGLFuncPtr) glGetString;
+    } else if (0 == strcmp("glGetUniformLocation", name)) {
+        return (GrGLFuncPtr) glGetUniformLocation;
+    } else if (0 == strcmp("glLineWidth", name)) {
+        return (GrGLFuncPtr) glLineWidth;
+    } else if (0 == strcmp("glLinkProgram", name)) {
+        return (GrGLFuncPtr) glLinkProgram;
+    } else if (0 == strcmp("glPixelStorei", name)) {
+        return (GrGLFuncPtr) glPixelStorei;
+    } else if (0 == strcmp("glReadPixels", name)) {
+        return (GrGLFuncPtr) glReadPixels;
+    } else if (0 == strcmp("glScissor", name)) {
+        return (GrGLFuncPtr) glScissor;
+    } else if (0 == strcmp("glShaderSource", name)) {
+        return (GrGLFuncPtr) glShaderSource;
+    } else if (0 == strcmp("glStencilFunc", name)) {
+        return (GrGLFuncPtr) glStencilFunc;
+    } else if (0 == strcmp("glStencilFuncSeparate", name)) {
+        return (GrGLFuncPtr) glStencilFuncSeparate;
+    } else if (0 == strcmp("glStencilMask", name)) {
+        return (GrGLFuncPtr) glStencilMask;
+    } else if (0 == strcmp("glStencilMaskSeparate", name)) {
+        return (GrGLFuncPtr) glStencilMaskSeparate;
+    } else if (0 == strcmp("glStencilOp", name)) {
+        return (GrGLFuncPtr) glStencilOp;
+    } else if (0 == strcmp("glStencilOpSeparate", name)) {
+        return (GrGLFuncPtr) glStencilOpSeparate;
+    } else if (0 == strcmp("glTexImage2D", name)) {
+        return (GrGLFuncPtr) glTexImage2D;
+    } else if (0 == strcmp("glTexParameteri", name)) {
+        return (GrGLFuncPtr) glTexParameteri;
+    } else if (0 == strcmp("glTexParameteriv", name)) {
+        return (GrGLFuncPtr) glTexParameteriv;
+    } else if (0 == strcmp("glTexSubImage2D", name)) {
+        return (GrGLFuncPtr) glTexSubImage2D;
+    } else if (0 == strcmp("glUniform1f", name)) {
+        return (GrGLFuncPtr) glUniform1f;
+    } else if (0 == strcmp("glUniform1i", name)) {
+        return (GrGLFuncPtr) glUniform1i;
+    } else if (0 == strcmp("glUniform1fv", name)) {
+        return (GrGLFuncPtr) glUniform1fv;
+    } else if (0 == strcmp("glUniform1iv", name)) {
+        return (GrGLFuncPtr) glUniform1iv;
+    } else if (0 == strcmp("glUniform2f", name)) {
+        return (GrGLFuncPtr) glUniform2f;
+    } else if (0 == strcmp("glUniform2i", name)) {
+        return (GrGLFuncPtr) glUniform2i;
+    } else if (0 == strcmp("glUniform2fv", name)) {
+        return (GrGLFuncPtr) glUniform2fv;
+    } else if (0 == strcmp("glUniform2iv", name)) {
+        return (GrGLFuncPtr) glUniform2iv;
+    } else if (0 == strcmp("glUniform3f", name)) {
+        return (GrGLFuncPtr) glUniform3f;
+    } else if (0 == strcmp("glUniform3i", name)) {
+        return (GrGLFuncPtr) glUniform3i;
+    } else if (0 == strcmp("glUniform3fv", name)) {
+        return (GrGLFuncPtr) glUniform3fv;
+    } else if (0 == strcmp("glUniform3iv", name)) {
+        return (GrGLFuncPtr) glUniform3iv;
+    } else if (0 == strcmp("glUniform4f", name)) {
+        return (GrGLFuncPtr) glUniform4f;
+    } else if (0 == strcmp("glUniform4i", name)) {
+        return (GrGLFuncPtr) glUniform4i;
+    } else if (0 == strcmp("glUniform4fv", name)) {
+        return (GrGLFuncPtr) glUniform4fv;
+    } else if (0 == strcmp("glUniform4iv", name)) {
+        return (GrGLFuncPtr) glUniform4iv;
+    } else if (0 == strcmp("glUniformMatrix2fv", name)) {
+        return (GrGLFuncPtr) glUniformMatrix2fv;
+    } else if (0 == strcmp("glUniformMatrix3fv", name)) {
+        return (GrGLFuncPtr) glUniformMatrix3fv;
+    } else if (0 == strcmp("glUniformMatrix4fv", name)) {
+        return (GrGLFuncPtr) glUniformMatrix4fv;
+    } else if (0 == strcmp("glUseProgram", name)) {
+        return (GrGLFuncPtr) glUseProgram;
+    } else if (0 == strcmp("glVertexAttrib4fv", name)) {
+        return (GrGLFuncPtr) glVertexAttrib4fv;
+    } else if (0 == strcmp("glVertexAttribPointer", name)) {
+        return (GrGLFuncPtr) glVertexAttribPointer;
+    } else if (0 == strcmp("glViewport", name)) {
+        return (GrGLFuncPtr) glViewport;
+    } else if (0 == strcmp("glBindFramebuffer", name)) {
+        return (GrGLFuncPtr) glBindFramebuffer;
+    } else if (0 == strcmp("glBindRenderbuffer", name)) {
+        return (GrGLFuncPtr) glBindRenderbuffer;
+    } else if (0 == strcmp("glCheckFramebufferStatus", name)) {
+        return (GrGLFuncPtr) glCheckFramebufferStatus;
+    } else if (0 == strcmp("glDeleteFramebuffers", name)) {
+        return (GrGLFuncPtr) glDeleteFramebuffers;
+    } else if (0 == strcmp("glDeleteRenderbuffers", name)) {
+        return (GrGLFuncPtr) glDeleteRenderbuffers;
+    } else if (0 == strcmp("glFramebufferRenderbuffer", name)) {
+        return (GrGLFuncPtr) glFramebufferRenderbuffer;
+    } else if (0 == strcmp("glFramebufferTexture2D", name)) {
+        return (GrGLFuncPtr) glFramebufferTexture2D;
+    } else if (0 == strcmp("glGenFramebuffers", name)) {
+        return (GrGLFuncPtr) glGenFramebuffers;
+    } else if (0 == strcmp("glGenRenderbuffers", name)) {
+        return (GrGLFuncPtr) glGenRenderbuffers;
+    } else if (0 == strcmp("glGetFramebufferAttachmentParameteriv", name)) {
+        return (GrGLFuncPtr) glGetFramebufferAttachmentParameteriv;
+    } else if (0 == strcmp("glGetRenderbufferParameteriv", name)) {
+        return (GrGLFuncPtr) glGetRenderbufferParameteriv;
+    } else if (0 == strcmp("glRenderbufferStorage", name)) {
+        return (GrGLFuncPtr) glRenderbufferStorage;
+    }
     return eglGetProcAddress(name);
 }
 
 const GrGLInterface* GrGLCreateNativeInterface() {
-
-    const char* verStr = reinterpret_cast<const char*>(glGetString(GR_GL_VERSION));
-    GrGLStandard standard = GrGLGetStandardInUseFromString(verStr);
-
-    if (kGLES_GrGLStandard == standard) {
-        return GrGLAssembleGLESInterface(NULL, android_get_gl_proc);
-    } else if (kGL_GrGLStandard == standard) {
-        return GrGLAssembleGLInterface(NULL, android_get_gl_proc);
-    }
-
-    return NULL;
+    return GrGLAssembleInterface(NULL, android_get_gl_proc);
 }
diff --git a/src/gpu/gl/angle/GrGLCreateANGLEInterface.cpp b/src/gpu/gl/angle/GrGLCreateANGLEInterface.cpp
index 6552f7c..0d06b2d 100644
--- a/src/gpu/gl/angle/GrGLCreateANGLEInterface.cpp
+++ b/src/gpu/gl/angle/GrGLCreateANGLEInterface.cpp
@@ -8,17 +8,19 @@
 
 
 #include "gl/GrGLInterface.h"
+#include "gl/GrGLAssembleInterface.h"
 
-#ifndef GL_GLEXT_PROTOTYPES
-#define GL_GLEXT_PROTOTYPES
-#endif
-
-#include "GLES2/gl2.h"
-#include "GLES2/gl2ext.h"
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
 #include "EGL/egl.h"
 
-#define GET_PROC(name)             \
-    interface->fFunctions.f ## name = (GrGL ## name ## Proc) GetProcAddress(ghANGLELib, "gl" #name);
+static GrGLFuncPtr angle_get_gl_proc(void* ctx, const char name[]) {
+    GrGLFuncPtr proc = (GrGLFuncPtr) GetProcAddress((HMODULE)ctx, name);
+    if (NULL != proc) {
+        return proc;
+    }
+    return eglGetProcAddress(name);
+}
 
 const GrGLInterface* GrGLCreateANGLEInterface() {
 
@@ -33,155 +35,5 @@
         return NULL;
     }
 
-    GrGLInterface* interface = SkNEW(GrGLInterface);
-    interface->fStandard = kGLES_GrGLStandard;
-
-    GrGLInterface::Functions* functions = &interface->fFunctions;
-
-    GET_PROC(ActiveTexture);
-    GET_PROC(AttachShader);
-    GET_PROC(BindAttribLocation);
-    GET_PROC(BindBuffer);
-    GET_PROC(BindTexture);
-    functions->fBindVertexArray =
-        (GrGLBindVertexArrayProc) eglGetProcAddress("glBindVertexArrayOES");
-    GET_PROC(BlendColor);
-    GET_PROC(BlendFunc);
-    GET_PROC(BufferData);
-    GET_PROC(BufferSubData);
-    GET_PROC(Clear);
-    GET_PROC(ClearColor);
-    GET_PROC(ClearStencil);
-    GET_PROC(ColorMask);
-    GET_PROC(CompileShader);
-    GET_PROC(CompressedTexImage2D);
-    GET_PROC(CompressedTexSubImage2D);
-    GET_PROC(CopyTexSubImage2D);
-    GET_PROC(CreateProgram);
-    GET_PROC(CreateShader);
-    GET_PROC(CullFace);
-    GET_PROC(DeleteBuffers);
-    GET_PROC(DeleteProgram);
-    GET_PROC(DeleteShader);
-    GET_PROC(DeleteTextures);
-    functions->fDeleteVertexArrays =
-        (GrGLDeleteVertexArraysProc) eglGetProcAddress("glDeleteVertexArraysOES");
-    GET_PROC(DepthMask);
-    GET_PROC(Disable);
-    GET_PROC(DisableVertexAttribArray);
-    GET_PROC(DrawArrays);
-    GET_PROC(DrawElements);
-    GET_PROC(Enable);
-    GET_PROC(EnableVertexAttribArray);
-    GET_PROC(Finish);
-    GET_PROC(Flush);
-    GET_PROC(FrontFace);
-    GET_PROC(GenBuffers);
-    GET_PROC(GenerateMipmap);
-    GET_PROC(GenTextures);
-    functions->fGenVertexArrays =
-        (GrGLGenVertexArraysProc) eglGetProcAddress("glGenVertexArraysOES");
-    GET_PROC(GetBufferParameteriv);
-    GET_PROC(GetError);
-    GET_PROC(GetIntegerv);
-    GET_PROC(GetProgramInfoLog);
-    GET_PROC(GetProgramiv);
-    GET_PROC(GetShaderInfoLog);
-    GET_PROC(GetShaderiv);
-    GET_PROC(GetString);
-    GET_PROC(GetStringi);
-    GET_PROC(GetUniformLocation);
-    GET_PROC(LineWidth);
-    GET_PROC(LinkProgram);
-    GET_PROC(PixelStorei);
-    GET_PROC(ReadPixels);
-    GET_PROC(Scissor);
-    GET_PROC(ShaderSource);
-    GET_PROC(StencilFunc);
-    GET_PROC(StencilFuncSeparate);
-    GET_PROC(StencilMask);
-    GET_PROC(StencilMaskSeparate);
-    GET_PROC(StencilOp);
-    GET_PROC(StencilOpSeparate);
-    GET_PROC(TexImage2D);
-    GET_PROC(TexParameteri);
-    GET_PROC(TexParameteriv);
-    GET_PROC(TexSubImage2D);
-#if GL_ARB_texture_storage
-    GET_PROC(TexStorage2D);
-#elif GL_EXT_texture_storage
-    functions->fTexStorage2D = (GrGLTexStorage2DProc) eglGetProcAddress("glTexStorage2DEXT");
-#endif
-    GET_PROC(Uniform1f);
-    GET_PROC(Uniform1i);
-    GET_PROC(Uniform1fv);
-    GET_PROC(Uniform1iv);
-
-    GET_PROC(Uniform2f);
-    GET_PROC(Uniform2i);
-    GET_PROC(Uniform2fv);
-    GET_PROC(Uniform2iv);
-
-    GET_PROC(Uniform3f);
-    GET_PROC(Uniform3i);
-    GET_PROC(Uniform3fv);
-    GET_PROC(Uniform3iv);
-
-    GET_PROC(Uniform4f);
-    GET_PROC(Uniform4i);
-    GET_PROC(Uniform4fv);
-    GET_PROC(Uniform4iv);
-
-    GET_PROC(UniformMatrix2fv);
-    GET_PROC(UniformMatrix3fv);
-    GET_PROC(UniformMatrix4fv);
-    GET_PROC(UseProgram);
-    GET_PROC(VertexAttrib4fv);
-    GET_PROC(VertexAttribPointer);
-    GET_PROC(Viewport);
-    GET_PROC(BindFramebuffer);
-    GET_PROC(BindRenderbuffer);
-    GET_PROC(CheckFramebufferStatus);
-    GET_PROC(DeleteFramebuffers);
-    GET_PROC(DeleteRenderbuffers);
-    GET_PROC(FramebufferRenderbuffer);
-    GET_PROC(FramebufferTexture2D);
-    GET_PROC(GenFramebuffers);
-    GET_PROC(GenRenderbuffers);
-    GET_PROC(GetFramebufferAttachmentParameteriv);
-    GET_PROC(GetRenderbufferParameteriv);
-    GET_PROC(RenderbufferStorage);
-
-    functions->fMapBuffer = (GrGLMapBufferProc) eglGetProcAddress("glMapBufferOES");
-    functions->fUnmapBuffer = (GrGLUnmapBufferProc) eglGetProcAddress("glUnmapBufferOES");
-
-#if GL_ES_VERSION_3_0
-    functions->fMapBufferRange = GET_PROC(glMapBufferRange);
-    functions->fFlushMappedBufferRange = GET_PROC(glFlushMappedBufferRange);
-#else
-    functions->fMapBufferRange = (GrGLMapBufferRangeProc) eglGetProcAddress("glMapBufferRange");
-    functions->fFlushMappedBufferRange = (GrGLFlushMappedBufferRangeProc) eglGetProcAddress("glFlushMappedBufferRange");
-#endif
-
-    functions->fInsertEventMarker = (GrGLInsertEventMarkerProc) eglGetProcAddress("glInsertEventMarkerEXT");
-    functions->fPushGroupMarker = (GrGLInsertEventMarkerProc) eglGetProcAddress("glPushGroupMarkerEXT");
-    functions->fPopGroupMarker = (GrGLPopGroupMarkerProc) eglGetProcAddress("glPopGroupMarkerEXT");
-
-#if GL_ES_VERSION_3_0
-    GET_PROC(InvalidateFramebuffer);
-    GET_PROC(InvalidateSubFramebuffer);
-#else
-    functions->fInvalidateFramebuffer = (GrGLInvalidateFramebufferProc) eglGetProcAddress("glInvalidateFramebuffer");
-    functions->fInvalidateSubFramebuffer = (GrGLInvalidateSubFramebufferProc) eglGetProcAddress("glInvalidateSubFramebuffer");
-#endif
-    functions->fInvalidateBufferData = (GrGLInvalidateBufferDataProc) eglGetProcAddress("glInvalidateBufferData");
-    functions->fInvalidateBufferSubData = (GrGLInvalidateBufferSubDataProc) eglGetProcAddress("glInvalidateBufferSubData");
-    functions->fInvalidateTexImage = (GrGLInvalidateTexImageProc) eglGetProcAddress("glInvalidateTexImage");
-    functions->fInvalidateTexSubImage = (GrGLInvalidateTexSubImageProc) eglGetProcAddress("glInvalidateTexSubImage");
-
-    interface->fExtensions.init(kGLES_GrGLStandard,
-                                functions->fGetString,
-                                functions->fGetStringi,
-                                functions->fGetIntegerv);
-    return interface;
+    return GrGLAssembleGLESInterface(ghANGLELib, angle_get_gl_proc);
 }
diff --git a/src/gpu/gl/iOS/GrGLCreateNativeInterface_iOS.cpp b/src/gpu/gl/iOS/GrGLCreateNativeInterface_iOS.cpp
index 0408965..024a631 100644
--- a/src/gpu/gl/iOS/GrGLCreateNativeInterface_iOS.cpp
+++ b/src/gpu/gl/iOS/GrGLCreateNativeInterface_iOS.cpp
@@ -1,174 +1,56 @@
 
 /*
- * Copyright 2011 Google Inc.
+ * Copyright 2014 Google Inc.
  *
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
 
 #include "gl/GrGLInterface.h"
+#include "gl/GrGLAssembleInterface.h"
+#include <dlfcn.h>
 
-#import <OpenGLES/ES2/gl.h>
-#import <OpenGLES/ES2/glext.h>
+class GLLoader {
+public:
+    GLLoader() {
+        fLibrary = dlopen(
+            "/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib",
+            RTLD_LAZY);
+    }
+
+    ~GLLoader() {
+        if (NULL != fLibrary) {
+            dlclose(fLibrary);
+        }
+    }
+
+    void* handle() const {
+        return NULL == fLibrary ? RTLD_DEFAULT : fLibrary;
+    }
+
+private:
+    void* fLibrary;
+};
+
+class GLProcGetter {
+public:
+    GLProcGetter() {}
+
+    GrGLFuncPtr getProc(const char name[]) const {
+        return (GrGLFuncPtr) dlsym(fLoader.handle(), name);
+    }
+    
+private:
+    GLLoader fLoader;
+};
+
+static GrGLFuncPtr ios_get_gl_proc(void* ctx, const char name[]) {
+    SkASSERT(NULL != ctx);
+    const GLProcGetter* getter = (const GLProcGetter*) ctx;
+    return getter->getProc(name);
+}
 
 const GrGLInterface* GrGLCreateNativeInterface() {
-    GrGLInterface* interface = SkNEW(GrGLInterface);
-
-    GrGLInterface::Functions* functions = &interface->fFunctions;
-
-    functions->fActiveTexture = glActiveTexture;
-    functions->fAttachShader = glAttachShader;
-    functions->fBindAttribLocation = glBindAttribLocation;
-    functions->fBindBuffer = glBindBuffer;
-    functions->fBindTexture = glBindTexture;
-    functions->fBlendColor = glBlendColor;
-    functions->fBlendFunc = glBlendFunc;
-    functions->fBufferData = (GrGLBufferDataProc)glBufferData;
-    functions->fBufferSubData = (GrGLBufferSubDataProc)glBufferSubData;
-    functions->fClear = glClear;
-    functions->fClearColor = glClearColor;
-    functions->fClearStencil = glClearStencil;
-    functions->fColorMask = glColorMask;
-    functions->fCompileShader = glCompileShader;
-    functions->fCompressedTexImage2D = glCompressedTexImage2D;
-    functions->fCompressedTexSubImage2D = glCompressedTexSubImage2D;
-    functions->fCopyTexSubImage2D = glCopyTexSubImage2D;
-    functions->fCreateProgram = glCreateProgram;
-    functions->fCreateShader = glCreateShader;
-    functions->fCullFace = glCullFace;
-    functions->fDeleteBuffers = glDeleteBuffers;
-    functions->fDeleteProgram = glDeleteProgram;
-    functions->fDeleteShader = glDeleteShader;
-    functions->fDeleteTextures = glDeleteTextures;
-    functions->fDepthMask = glDepthMask;
-    functions->fDisable = glDisable;
-    functions->fDisableVertexAttribArray = glDisableVertexAttribArray;
-    functions->fDrawArrays = glDrawArrays;
-    functions->fDrawBuffer = NULL;
-    functions->fDrawBuffers = NULL;
-    functions->fDrawElements = glDrawElements;
-    functions->fEnable = glEnable;
-    functions->fEnableVertexAttribArray = glEnableVertexAttribArray;
-    functions->fFinish = glFinish;
-    functions->fFlush = glFlush;
-    functions->fFrontFace = glFrontFace;
-    functions->fGenBuffers = glGenBuffers;
-    functions->fGenerateMipmap = glGenerateMipmap;
-    functions->fGetBufferParameteriv = glGetBufferParameteriv;
-    functions->fGetError = glGetError;
-    functions->fGetIntegerv = glGetIntegerv;
-    functions->fGetProgramInfoLog = glGetProgramInfoLog;
-    functions->fGetProgramiv = glGetProgramiv;
-    functions->fGetShaderInfoLog = glGetShaderInfoLog;
-    functions->fGetShaderiv = glGetShaderiv;
-    functions->fGetString = glGetString;
-    functions->fGenTextures = glGenTextures;
-    functions->fGetUniformLocation = glGetUniformLocation;
-    functions->fLineWidth = glLineWidth;
-    functions->fLinkProgram = glLinkProgram;
-    functions->fPixelStorei = glPixelStorei;
-    functions->fReadBuffer = NULL;
-    functions->fReadPixels = glReadPixels;
-    functions->fScissor = glScissor;
-    functions->fShaderSource = (GrGLShaderSourceProc) glShaderSource;
-    functions->fStencilFunc = glStencilFunc;
-    functions->fStencilFuncSeparate = glStencilFuncSeparate;
-    functions->fStencilMask = glStencilMask;
-    functions->fStencilMaskSeparate = glStencilMaskSeparate;
-    functions->fStencilOp = glStencilOp;
-    functions->fStencilOpSeparate = glStencilOpSeparate;
-    // mac uses GLenum for internalFormat param (non-standard)
-    // amounts to int vs. uint.
-    functions->fTexImage2D = (GrGLTexImage2DProc)glTexImage2D;
-#if GL_ARB_texture_storage
-    functions->fTexStorage2D = glTexStorage2D;
-#elif GL_EXT_texture_storage
-    functions->fTexStorage2D = glTexStorage2DEXT;
-#endif
-#if GL_EXT_discard_framebuffer
-    functions->fDiscardFramebuffer = glDiscardFramebufferEXT;
-#endif
-    functions->fTexParameteri = glTexParameteri;
-    functions->fTexParameteriv = glTexParameteriv;
-    functions->fTexSubImage2D = glTexSubImage2D;
-    functions->fUniform1f = glUniform1f;
-    functions->fUniform1i = glUniform1i;
-    functions->fUniform1fv = glUniform1fv;
-    functions->fUniform1iv = glUniform1iv;
-    functions->fUniform2f = glUniform2f;
-    functions->fUniform2i = glUniform2i;
-    functions->fUniform2fv = glUniform2fv;
-    functions->fUniform2iv = glUniform2iv;
-    functions->fUniform3f = glUniform3f;
-    functions->fUniform3i = glUniform3i;
-    functions->fUniform3fv = glUniform3fv;
-    functions->fUniform3iv = glUniform3iv;
-    functions->fUniform4f = glUniform4f;
-    functions->fUniform4i = glUniform4i;
-    functions->fUniform4fv = glUniform4fv;
-    functions->fUniform4iv = glUniform4iv;
-    functions->fUniform4fv = glUniform4fv;
-    functions->fUniformMatrix2fv = glUniformMatrix2fv;
-    functions->fUniformMatrix3fv = glUniformMatrix3fv;
-    functions->fUniformMatrix4fv = glUniformMatrix4fv;
-    functions->fUseProgram = glUseProgram;
-    functions->fVertexAttrib4fv = glVertexAttrib4fv;
-    functions->fVertexAttribPointer = glVertexAttribPointer;
-    functions->fViewport = glViewport;
-    functions->fGenFramebuffers = glGenFramebuffers;
-    functions->fGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameteriv;
-    functions->fGetRenderbufferParameteriv = glGetRenderbufferParameteriv;
-    functions->fBindFramebuffer = glBindFramebuffer;
-    functions->fFramebufferTexture2D = glFramebufferTexture2D;
-    functions->fCheckFramebufferStatus = glCheckFramebufferStatus;
-    functions->fDeleteFramebuffers = glDeleteFramebuffers;
-    functions->fRenderbufferStorage = glRenderbufferStorage;
-    functions->fGenRenderbuffers = glGenRenderbuffers;
-    functions->fDeleteRenderbuffers = glDeleteRenderbuffers;
-    functions->fFramebufferRenderbuffer = glFramebufferRenderbuffer;
-    functions->fBindRenderbuffer = glBindRenderbuffer;
-
-#if GL_OES_mapbuffer
-    functions->fMapBuffer = glMapBufferOES;
-    functions->fUnmapBuffer = glUnmapBufferOES;
-#endif
-
-#if GL_EXT_map_buffer_range || GL_ES_VERSION_3_0
-    functions->fMapBufferRange = glMapBufferRangeEXT;
-    functions->fFlushMappedBufferRange = glFlushMappedBufferRangeEXT;
-#endif
-
-#if GL_APPLE_framebuffer_multisample
-    functions->fRenderbufferStorageMultisampleES2APPLE = glRenderbufferStorageMultisampleAPPLE;
-    functions->fResolveMultisampleFramebuffer = glResolveMultisampleFramebufferAPPLE;
-#endif
-
-#if GL_OES_vertex_array_object
-    functions->fBindVertexArray = glBindVertexArrayOES;
-    functions->fDeleteVertexArrays = glDeleteVertexArraysOES;
-    functions->fGenVertexArrays = glGenVertexArraysOES;
-#endif
-
-#if GL_EXT_debug_marker
-    functions->fInsertEventMarker = glInsertEventMarkerEXT;
-    functions->fPushGroupMarker = glPushGroupMarkerEXT;
-    functions->fPopGroupMarker = glPopGroupMarkerEXT;
-#endif
-
-#if GL_ES_VERSION_3_0 || GL_ARB_invalidate_subdata
-    functions->fInvalidateFramebuffer = glInvalidateFramebuffer;
-    functions->fInvalidateSubFramebuffer = glInvalidateSubFramebuffer;
-#endif
-
-#if GL_ARB_invalidate_subdata
-    functions->fInvalidateBufferData = glInvalidateBufferData;
-    functions->fInvalidateBufferSubData = glInvalidateBufferSubData;
-    functions->fInvalidateTexImage = glInvalidateTexImage;
-    functions->fInvalidateTexSubImage = glInvalidateTexSubImage;
-#endif
-
-    interface->fStandard = kGLES_GrGLStandard;
-    interface->fExtensions.init(kGLES_GrGLStandard, glGetString, NULL, glGetIntegerv);
-
-    return interface;
+    GLProcGetter getter;
+    return GrGLAssembleGLESInterface(&getter, ios_get_gl_proc);
 }
diff --git a/src/gpu/gl/iOS/SkNativeGLContext_iOS.mm b/src/gpu/gl/iOS/SkNativeGLContext_iOS.mm
index 1e11c0d..f04229f 100644
--- a/src/gpu/gl/iOS/SkNativeGLContext_iOS.mm
+++ b/src/gpu/gl/iOS/SkNativeGLContext_iOS.mm
@@ -36,10 +36,13 @@
 }
 
 void SkNativeGLContext::destroyGLContext() {
-    if ([EAGLContext currentContext] == EAGLCTX) {
-        [EAGLContext setCurrentContext:nil];
+    if (NULL != fEAGLContext) {
+        if ([EAGLContext currentContext] == EAGLCTX) {
+            [EAGLContext setCurrentContext:nil];
+        }
+        [EAGLCTX release];
+        fEAGLContext = NULL;
     }
-    [EAGLCTX release];
 }
 
 const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) {
diff --git a/src/gpu/gl/mesa/GrGLCreateMesaInterface.cpp b/src/gpu/gl/mesa/GrGLCreateMesaInterface.cpp
index a95b6fc..b914b0b 100644
--- a/src/gpu/gl/mesa/GrGLCreateMesaInterface.cpp
+++ b/src/gpu/gl/mesa/GrGLCreateMesaInterface.cpp
@@ -21,5 +21,5 @@
     if (NULL == OSMesaGetCurrentContext()) {
         return NULL;
     }
-    return GrGLAssembleGLInterface(NULL, osmesa_get);
+    return GrGLAssembleInterface(NULL, osmesa_get);
 }
diff --git a/src/gpu/gl/unix/GrGLCreateNativeInterface_unix.cpp b/src/gpu/gl/unix/GrGLCreateNativeInterface_unix.cpp
index b3c7a3c..45c8dc7 100644
--- a/src/gpu/gl/unix/GrGLCreateNativeInterface_unix.cpp
+++ b/src/gpu/gl/unix/GrGLCreateNativeInterface_unix.cpp
@@ -12,15 +12,6 @@
 
 #include <GL/glx.h>
 
-#define GET_PROC(F) functions->f ## F = (GrGL ## F ## Proc) get(ctx, "gl" #F)
-#define GET_PROC_SUFFIX(F, S) functions->f ## F = (GrGL ## F ## Proc) get(ctx, "gl" #F #S)
-#define GET_PROC_LOCAL(F) GrGL ## F ## Proc F = (GrGL ## F ## Proc) get(ctx, "gl" #F)
-
-#define GET_LINKED GET_PROC
-#define GET_LINKED_SUFFIX GET_PROC_SUFFIX
-
-#include "gl/GrGLAssembleGLESInterface.h"
-
 static GrGLFuncPtr glx_get(void* ctx, const char name[]) {
     SkASSERT(NULL == ctx);
     SkASSERT(NULL != glXGetCurrentContext());
@@ -32,13 +23,5 @@
         return NULL;
     }
 
-    const char* verStr = reinterpret_cast<const char*>(glGetString(GR_GL_VERSION));
-    GrGLStandard standard = GrGLGetStandardInUseFromString(verStr);
-
-    if (kGLES_GrGLStandard == standard) {
-        return GrGLAssembleGLESInterface(NULL, glx_get);
-    } else if (kGL_GrGLStandard == standard) {
-        return GrGLAssembleGLInterface(NULL, glx_get);
-    }
-    return NULL;
+    return GrGLAssembleInterface(NULL, glx_get);
 }
diff --git a/src/gpu/gl/win/GrGLCreateNativeInterface_win.cpp b/src/gpu/gl/win/GrGLCreateNativeInterface_win.cpp
index 7afa2e0..3aab86d 100644
--- a/src/gpu/gl/win/GrGLCreateNativeInterface_win.cpp
+++ b/src/gpu/gl/win/GrGLCreateNativeInterface_win.cpp
@@ -12,17 +12,6 @@
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 
-#include <GL/gl.h>
-
-#define GET_PROC(F) functions->f ## F = (GrGL ## F ## Proc) get(ctx, "gl" #F)
-#define GET_PROC_SUFFIX(F, S) functions->f ## F = (GrGL ## F ## Proc) get(ctx, "gl" #F #S)
-#define GET_PROC_LOCAL(F) GrGL ## F ## Proc F = (GrGL ## F ## Proc) get(ctx, "gl" #F)
-
-#define GET_LINKED GET_PROC
-#define GET_LINKED_SUFFIX GET_PROC_SUFFIX
-
-#include "gl/GrGLAssembleGLESInterface.h"
-
 class AutoLibraryUnload {
 public:
     AutoLibraryUnload(const char* moduleName) {