diff --git a/src/gpu/gl/GrGLAssembleGLESInterfaceAutogen.cpp b/src/gpu/gl/GrGLAssembleGLESInterfaceAutogen.cpp
new file mode 100644
index 0000000..0ed73d7
--- /dev/null
+++ b/src/gpu/gl/GrGLAssembleGLESInterfaceAutogen.cpp
@@ -0,0 +1,502 @@
+/*
+ * Copyright 2019 Google LLC
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * THIS FILE IS AUTOGENERATED
+ * Make edits to tools/gpu/gl/interface/templates.go or they will
+ * be overwritten.
+ */
+
+#include "gl/GrGLAssembleInterface.h"
+#include "gl/GrGLAssembleHelpers.h"
+#include "gl/GrGLUtil.h"
+
+#define GET_PROC(F) functions->f##F = (GrGL##F##Fn*)get(ctx, "gl" #F)
+#define GET_PROC_SUFFIX(F, S) functions->f##F = (GrGL##F##Fn*)get(ctx, "gl" #F #S)
+#define GET_PROC_LOCAL(F) GrGL##F##Fn* F = (GrGL##F##Fn*)get(ctx, "gl" #F)
+
+#define GET_EGL_PROC_SUFFIX(F, S) functions->fEGL##F = (GrEGL##F##Fn*)get(ctx, "egl" #F #S)
+
+#if SK_DISABLE_GL_ES_INTERFACE
+sk_sp<const GrGLInterface> GrGLMakeAssembledGLESInterface(void *ctx, GrGLGetProc get) {
+    return nullptr;
+}
+#else
+sk_sp<const GrGLInterface> GrGLMakeAssembledGLESInterface(void *ctx, GrGLGetProc get) {
+    GET_PROC_LOCAL(GetString);
+    if (nullptr == GetString) {
+        return nullptr;
+    }
+
+    const char* verStr = reinterpret_cast<const char*>(GetString(GR_GL_VERSION));
+    GrGLVersion glVer = GrGLGetVersionFromString(verStr);
+
+    if (glVer < GR_GL_VER(2,0)) {
+        return nullptr;
+    }
+
+    GET_PROC_LOCAL(GetIntegerv);
+    GET_PROC_LOCAL(GetStringi);
+    GrEGLQueryStringFn* queryString;
+    GrEGLDisplay display;
+    GrGetEGLQueryAndDisplay(&queryString, &display, ctx, get);
+    GrGLExtensions extensions;
+    if (!extensions.init(kGLES_GrGLStandard, GetString, GetStringi, GetIntegerv, queryString,
+                         display)) {
+        return nullptr;
+    }
+
+    sk_sp<GrGLInterface> interface(new GrGLInterface);
+    GrGLInterface::Functions* functions = &interface->fFunctions;
+
+    // Autogenerated content follows
+    GET_PROC(ActiveTexture);
+    GET_PROC(AttachShader);
+    GET_PROC(BindAttribLocation);
+    GET_PROC(BindBuffer);
+    GET_PROC(BindTexture);
+    GET_PROC(BlendColor);
+    GET_PROC(BlendEquation);
+    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(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(GenTextures);
+    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(GetUniformLocation);
+    GET_PROC(IsTexture);
+    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(TexParameterf);
+    GET_PROC(TexParameterfv);
+    GET_PROC(TexParameteri);
+    GET_PROC(TexParameteriv);
+    GET_PROC(TexSubImage2D);
+    GET_PROC(Uniform1f);
+    GET_PROC(Uniform1fv);
+    GET_PROC(Uniform1i);
+    GET_PROC(Uniform1iv);
+    GET_PROC(Uniform2f);
+    GET_PROC(Uniform2fv);
+    GET_PROC(Uniform2i);
+    GET_PROC(Uniform2iv);
+    GET_PROC(Uniform3f);
+    GET_PROC(Uniform3fv);
+    GET_PROC(Uniform3i);
+    GET_PROC(Uniform3iv);
+    GET_PROC(Uniform4f);
+    GET_PROC(Uniform4fv);
+    GET_PROC(Uniform4i);
+    GET_PROC(Uniform4iv);
+    GET_PROC(UniformMatrix2fv);
+    GET_PROC(UniformMatrix3fv);
+    GET_PROC(UniformMatrix4fv);
+    GET_PROC(UseProgram);
+    GET_PROC(VertexAttrib1f);
+    GET_PROC(VertexAttrib2fv);
+    GET_PROC(VertexAttrib3fv);
+    GET_PROC(VertexAttrib4fv);
+    GET_PROC(VertexAttribPointer);
+    GET_PROC(Viewport);
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(GetStringi);
+    }
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(BindVertexArray);
+        GET_PROC(DeleteVertexArrays);
+        GET_PROC(GenVertexArrays);
+    } else if (extensions.has("GL_OES_vertex_array_object")) {
+        GET_PROC_SUFFIX(BindVertexArray, OES);
+        GET_PROC_SUFFIX(DeleteVertexArrays, OES);
+        GET_PROC_SUFFIX(GenVertexArrays, OES);
+    }
+
+    if (glVer >= GR_GL_VER(3,0) && extensions.has("GL_EXT_blend_func_extended")) {
+        GET_PROC_SUFFIX(BindFragDataLocation, EXT);
+    }
+
+    if (glVer >= GR_GL_VER(3,0) && extensions.has("GL_EXT_blend_func_extended")) {
+        GET_PROC_SUFFIX(BindFragDataLocationIndexed, EXT);
+    }
+
+    if (extensions.has("GL_KHR_blend_equation_advanced")) {
+        GET_PROC_SUFFIX(BlendBarrier, KHR);
+    } else if (extensions.has("GL_NV_blend_equation_advanced")) {
+        GET_PROC_SUFFIX(BlendBarrier, NV);
+    }
+
+    if (extensions.has("GL_EXT_clear_texture")) {
+        GET_PROC_SUFFIX(ClearTexImage, EXT);
+        GET_PROC_SUFFIX(ClearTexSubImage, EXT);
+    }
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(DrawArraysInstanced);
+        GET_PROC(DrawElementsInstanced);
+    } else if (extensions.has("GL_EXT_draw_instanced")) {
+        GET_PROC_SUFFIX(DrawArraysInstanced, EXT);
+        GET_PROC_SUFFIX(DrawElementsInstanced, EXT);
+    }
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(DrawBuffers);
+        GET_PROC(ReadBuffer);
+    }
+
+    if (glVer >= GR_GL_VER(3,1)) {
+        GET_PROC(DrawArraysIndirect);
+        GET_PROC(DrawElementsIndirect);
+    }
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(DrawRangeElements);
+    }
+
+    if (glVer >= GR_GL_VER(3,1)) {
+        GET_PROC(GetMultisamplefv);
+    }
+
+    if (glVer >= GR_GL_VER(3,1)) {
+        GET_PROC(GetTexLevelParameteriv);
+    }
+
+    if (extensions.has("GL_EXT_multi_draw_indirect")) {
+        GET_PROC_SUFFIX(MultiDrawArraysIndirect, EXT);
+        GET_PROC_SUFFIX(MultiDrawElementsIndirect, EXT);
+    }
+
+    if (glVer >= GR_GL_VER(3,2)) {
+        GET_PROC(TexBuffer);
+    } else if (extensions.has("GL_OES_texture_buffer")) {
+        GET_PROC_SUFFIX(TexBuffer, OES);
+    } else if (extensions.has("GL_EXT_texture_buffer")) {
+        GET_PROC_SUFFIX(TexBuffer, EXT);
+    }
+
+    if (glVer >= GR_GL_VER(3,2)) {
+        GET_PROC(TexBufferRange);
+    } else if (extensions.has("GL_OES_texture_buffer")) {
+        GET_PROC_SUFFIX(TexBufferRange, OES);
+    } else if (extensions.has("GL_EXT_texture_buffer")) {
+        GET_PROC_SUFFIX(TexBufferRange, EXT);
+    }
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(TexStorage2D);
+    } else if (extensions.has("GL_EXT_texture_storage")) {
+        GET_PROC_SUFFIX(TexStorage2D, EXT);
+    }
+
+    if (extensions.has("GL_NV_texture_barrier")) {
+        GET_PROC_SUFFIX(TextureBarrier, NV);
+    }
+
+    if (extensions.has("GL_EXT_discard_framebuffer")) {
+        GET_PROC_SUFFIX(DiscardFramebuffer, EXT);
+    }
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(VertexAttribDivisor);
+    } else if (extensions.has("GL_EXT_instanced_arrays")) {
+        GET_PROC_SUFFIX(VertexAttribDivisor, EXT);
+    }
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(VertexAttribIPointer);
+    }
+
+    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(GenerateMipmap);
+    GET_PROC(GetFramebufferAttachmentParameteriv);
+    GET_PROC(GetRenderbufferParameteriv);
+    GET_PROC(RenderbufferStorage);
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(BlitFramebuffer);
+    } else if (extensions.has("GL_CHROMIUM_framebuffer_multisample")) {
+        GET_PROC_SUFFIX(BlitFramebuffer, CHROMIUM);
+    } else if (extensions.has("GL_ANGLE_framebuffer_blit")) {
+        GET_PROC_SUFFIX(BlitFramebuffer, ANGLE);
+    }
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(RenderbufferStorageMultisample);
+    } else if (extensions.has("GL_CHROMIUM_framebuffer_multisample")) {
+        GET_PROC_SUFFIX(RenderbufferStorageMultisample, CHROMIUM);
+    } else if (extensions.has("GL_ANGLE_framebuffer_multisample")) {
+        GET_PROC_SUFFIX(RenderbufferStorageMultisample, ANGLE);
+    }
+
+    if (extensions.has("GL_CHROMIUM_map_sub")) {
+        GET_PROC_SUFFIX(MapBufferSubData, CHROMIUM);
+        GET_PROC_SUFFIX(MapTexSubImage2D, CHROMIUM);
+        GET_PROC_SUFFIX(UnmapBufferSubData, CHROMIUM);
+        GET_PROC_SUFFIX(UnmapTexSubImage2D, CHROMIUM);
+    }
+
+    if (extensions.has("GL_EXT_multisampled_render_to_texture")) {
+        GET_PROC_SUFFIX(FramebufferTexture2DMultisample, EXT);
+    } else if (extensions.has("GL_IMG_multisampled_render_to_texture")) {
+        GET_PROC_SUFFIX(FramebufferTexture2DMultisample, IMG);
+    }
+
+    if (extensions.has("GL_EXT_multisampled_render_to_texture")) {
+        functions->fRenderbufferStorageMultisampleES2EXT =(GrGLRenderbufferStorageMultisampleFn*)get(ctx, "glRenderbufferStorageMultisampleEXT");
+    }
+
+    if (extensions.has("GL_IMG_multisampled_render_to_texture")) {
+        functions->fRenderbufferStorageMultisampleES2EXT =(GrGLRenderbufferStorageMultisampleFn*)get(ctx, "glRenderbufferStorageMultisampleIMG");
+    }
+
+    if (extensions.has("GL_APPLE_framebuffer_multisample")) {
+        GET_PROC_SUFFIX(ResolveMultisampleFramebuffer, APPLE);
+        functions->fRenderbufferStorageMultisampleES2APPLE =(GrGLRenderbufferStorageMultisampleFn*)get(ctx, "glRenderbufferStorageMultisampleAPPLE");
+    }
+
+    if (extensions.has("GL_OES_mapbuffer")) {
+        GET_PROC_SUFFIX(MapBuffer, OES);
+    }
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(UnmapBuffer);
+    } else if (extensions.has("GL_OES_mapbuffer")) {
+        GET_PROC_SUFFIX(UnmapBuffer, OES);
+    }
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(FlushMappedBufferRange);
+        GET_PROC(MapBufferRange);
+    } else if (extensions.has("GL_EXT_map_buffer_range")) {
+        GET_PROC_SUFFIX(FlushMappedBufferRange, EXT);
+        GET_PROC_SUFFIX(MapBufferRange, EXT);
+    }
+
+    if (extensions.has("GL_EXT_debug_marker")) {
+        GET_PROC_SUFFIX(InsertEventMarker, EXT);
+        GET_PROC_SUFFIX(PopGroupMarker, EXT);
+        GET_PROC_SUFFIX(PushGroupMarker, EXT);
+    }
+
+    if (glVer >= GR_GL_VER(3,1)) {
+        GET_PROC(GetProgramResourceLocation);
+    }
+
+    if (extensions.has("GL_CHROMIUM_path_rendering")) {
+        GET_PROC_SUFFIX(MatrixLoadIdentity, CHROMIUM);
+        GET_PROC_SUFFIX(MatrixLoadf, CHROMIUM);
+    } else if (extensions.has("GL_NV_path_rendering")) {
+        GET_PROC_SUFFIX(MatrixLoadIdentity, EXT);
+        GET_PROC_SUFFIX(MatrixLoadf, EXT);
+    }
+
+    if (extensions.has("GL_CHROMIUM_path_rendering")) {
+        GET_PROC_SUFFIX(CoverFillPath, CHROMIUM);
+        GET_PROC_SUFFIX(CoverFillPathInstanced, CHROMIUM);
+        GET_PROC_SUFFIX(CoverStrokePath, CHROMIUM);
+        GET_PROC_SUFFIX(CoverStrokePathInstanced, CHROMIUM);
+        GET_PROC_SUFFIX(DeletePaths, CHROMIUM);
+        GET_PROC_SUFFIX(GenPaths, CHROMIUM);
+        GET_PROC_SUFFIX(IsPath, CHROMIUM);
+        GET_PROC_SUFFIX(PathCommands, CHROMIUM);
+        GET_PROC_SUFFIX(PathParameterf, CHROMIUM);
+        GET_PROC_SUFFIX(PathParameteri, CHROMIUM);
+        GET_PROC_SUFFIX(PathStencilFunc, CHROMIUM);
+        GET_PROC_SUFFIX(ProgramPathFragmentInputGen, CHROMIUM);
+        GET_PROC_SUFFIX(StencilFillPath, CHROMIUM);
+        GET_PROC_SUFFIX(StencilFillPathInstanced, CHROMIUM);
+        GET_PROC_SUFFIX(StencilStrokePath, CHROMIUM);
+        GET_PROC_SUFFIX(StencilStrokePathInstanced, CHROMIUM);
+        GET_PROC_SUFFIX(StencilThenCoverFillPath, CHROMIUM);
+        GET_PROC_SUFFIX(StencilThenCoverFillPathInstanced, CHROMIUM);
+        GET_PROC_SUFFIX(StencilThenCoverStrokePath, CHROMIUM);
+        GET_PROC_SUFFIX(StencilThenCoverStrokePathInstanced, CHROMIUM);
+    } else if (extensions.has("GL_NV_path_rendering")) {
+        GET_PROC_SUFFIX(CoverFillPath, NV);
+        GET_PROC_SUFFIX(CoverFillPathInstanced, NV);
+        GET_PROC_SUFFIX(CoverStrokePath, NV);
+        GET_PROC_SUFFIX(CoverStrokePathInstanced, NV);
+        GET_PROC_SUFFIX(DeletePaths, NV);
+        GET_PROC_SUFFIX(GenPaths, NV);
+        GET_PROC_SUFFIX(IsPath, NV);
+        GET_PROC_SUFFIX(PathCommands, NV);
+        GET_PROC_SUFFIX(PathParameterf, NV);
+        GET_PROC_SUFFIX(PathParameteri, NV);
+        GET_PROC_SUFFIX(PathStencilFunc, NV);
+        GET_PROC_SUFFIX(ProgramPathFragmentInputGen, NV);
+        GET_PROC_SUFFIX(StencilFillPath, NV);
+        GET_PROC_SUFFIX(StencilFillPathInstanced, NV);
+        GET_PROC_SUFFIX(StencilStrokePath, NV);
+        GET_PROC_SUFFIX(StencilStrokePathInstanced, NV);
+        GET_PROC_SUFFIX(StencilThenCoverFillPath, NV);
+        GET_PROC_SUFFIX(StencilThenCoverFillPathInstanced, NV);
+        GET_PROC_SUFFIX(StencilThenCoverStrokePath, NV);
+        GET_PROC_SUFFIX(StencilThenCoverStrokePathInstanced, NV);
+    }
+
+    if (extensions.has("GL_CHROMIUM_path_rendering")) {
+        GET_PROC_SUFFIX(BindFragmentInputLocation, CHROMIUM);
+    }
+
+    if (extensions.has("GL_CHROMIUM_framebuffer_mixed_samples")) {
+        GET_PROC_SUFFIX(CoverageModulation, CHROMIUM);
+    } else if (extensions.has("GL_NV_framebuffer_mixed_samples")) {
+        GET_PROC_SUFFIX(CoverageModulation, NV);
+    }
+
+    if (extensions.has("GL_KHR_debug")) {
+        GET_PROC_SUFFIX(DebugMessageCallback, KHR);
+        GET_PROC_SUFFIX(DebugMessageControl, KHR);
+        GET_PROC_SUFFIX(DebugMessageInsert, KHR);
+        GET_PROC_SUFFIX(GetDebugMessageLog, KHR);
+        GET_PROC_SUFFIX(ObjectLabel, KHR);
+        GET_PROC_SUFFIX(PopDebugGroup, KHR);
+        GET_PROC_SUFFIX(PushDebugGroup, KHR);
+    }
+
+    if (extensions.has("GL_CHROMIUM_bind_uniform_location")) {
+        GET_PROC_SUFFIX(BindUniformLocation, CHROMIUM);
+    }
+
+    if (extensions.has("GL_EXT_window_rectangles")) {
+        GET_PROC_SUFFIX(WindowRectangles, EXT);
+    }
+
+    if (extensions.has("EGL_KHR_image")) {
+        GET_EGL_PROC_SUFFIX(CreateImage, KHR);
+        GET_EGL_PROC_SUFFIX(DestroyImage, KHR);
+    } else if (extensions.has("EGL_KHR_image_base")) {
+        GET_EGL_PROC_SUFFIX(CreateImage, KHR);
+        GET_EGL_PROC_SUFFIX(DestroyImage, KHR);
+    }
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(ClientWaitSync);
+        GET_PROC(DeleteSync);
+        GET_PROC(FenceSync);
+        GET_PROC(IsSync);
+        GET_PROC(WaitSync);
+    } else if (extensions.has("GL_APPLE_sync")) {
+        GET_PROC_SUFFIX(ClientWaitSync, APPLE);
+        GET_PROC_SUFFIX(DeleteSync, APPLE);
+        GET_PROC_SUFFIX(FenceSync, APPLE);
+        GET_PROC_SUFFIX(IsSync, APPLE);
+        GET_PROC_SUFFIX(WaitSync, APPLE);
+    }
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(GetInternalformativ);
+    }
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(GetProgramBinary);
+        GET_PROC(ProgramBinary);
+        GET_PROC(ProgramParameteri);
+    }
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(BindSampler);
+        GET_PROC(DeleteSamplers);
+        GET_PROC(GenSamplers);
+        GET_PROC(SamplerParameteri);
+        GET_PROC(SamplerParameteriv);
+    }
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(BeginQuery);
+        GET_PROC(DeleteQueries);
+        GET_PROC(EndQuery);
+        GET_PROC(GenQueries);
+        GET_PROC(GetQueryObjectuiv);
+        GET_PROC(GetQueryiv);
+    } else if (extensions.has("GL_EXT_occlusion_query_boolean")) {
+        GET_PROC_SUFFIX(BeginQuery, EXT);
+        GET_PROC_SUFFIX(DeleteQueries, EXT);
+        GET_PROC_SUFFIX(EndQuery, EXT);
+        GET_PROC_SUFFIX(GenQueries, EXT);
+        GET_PROC_SUFFIX(GetQueryObjectuiv, EXT);
+        GET_PROC_SUFFIX(GetQueryiv, EXT);
+    }
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(InvalidateFramebuffer);
+        GET_PROC(InvalidateSubFramebuffer);
+    }
+
+    GET_PROC(GetShaderPrecisionFormat);
+
+
+    // End autogenerated content
+    // TODO(kjlubick): Do we want a feature that removes the extension if it doesn't have
+    // the function? This is common on some low-end GPUs.
+
+    if (extensions.has("GL_KHR_debug")) {
+        // In general we have a policy against removing extension strings when the driver does
+        // not provide function pointers for an advertised extension. However, because there is a
+        // known device that advertises GL_KHR_debug but fails to provide the functions and this is
+        // a debugging- only extension we've made an exception. This also can happen when using
+        // APITRACE.
+        if (!interface->fFunctions.fDebugMessageControl) {
+            extensions.remove("GL_KHR_debug");
+        }
+    }
+    interface->fStandard = kGLES_GrGLStandard;
+    interface->fExtensions.swap(&extensions);
+
+    return std::move(interface);
+}
+#endif
diff --git a/src/gpu/gl/GrGLAssembleGLInterfaceAutogen.cpp b/src/gpu/gl/GrGLAssembleGLInterfaceAutogen.cpp
new file mode 100644
index 0000000..31833c7
--- /dev/null
+++ b/src/gpu/gl/GrGLAssembleGLInterfaceAutogen.cpp
@@ -0,0 +1,504 @@
+/*
+ * Copyright 2019 Google LLC
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * THIS FILE IS AUTOGENERATED
+ * Make edits to tools/gpu/gl/interface/templates.go or they will
+ * be overwritten.
+ */
+
+#include "gl/GrGLAssembleInterface.h"
+#include "gl/GrGLAssembleHelpers.h"
+#include "gl/GrGLUtil.h"
+
+#define GET_PROC(F) functions->f##F = (GrGL##F##Fn*)get(ctx, "gl" #F)
+#define GET_PROC_SUFFIX(F, S) functions->f##F = (GrGL##F##Fn*)get(ctx, "gl" #F #S)
+#define GET_PROC_LOCAL(F) GrGL##F##Fn* F = (GrGL##F##Fn*)get(ctx, "gl" #F)
+
+#define GET_EGL_PROC_SUFFIX(F, S) functions->fEGL##F = (GrEGL##F##Fn*)get(ctx, "egl" #F #S)
+
+#if SK_DISABLE_GL_INTERFACE
+sk_sp<const GrGLInterface> GrGLMakeAssembledGLInterface(void *ctx, GrGLGetProc get) {
+    return nullptr;
+}
+#else
+sk_sp<const GrGLInterface> GrGLMakeAssembledGLInterface(void *ctx, GrGLGetProc get) {
+    GET_PROC_LOCAL(GetString);
+    GET_PROC_LOCAL(GetStringi);
+    GET_PROC_LOCAL(GetIntegerv);
+
+    // GetStringi may be nullptr depending on the GL version.
+    if (nullptr == GetString || nullptr == GetIntegerv) {
+        return nullptr;
+    }
+
+    const char* versionString = (const char*) GetString(GR_GL_VERSION);
+    GrGLVersion glVer = GrGLGetVersionFromString(versionString);
+
+    if (glVer < GR_GL_VER(2,0) || GR_GL_INVALID_VER == glVer) {
+        // This is our minimum for non-ES GL.
+        return nullptr;
+    }
+
+    GrEGLQueryStringFn* queryString;
+    GrEGLDisplay display;
+    GrGetEGLQueryAndDisplay(&queryString, &display, ctx, get);
+    GrGLExtensions extensions;
+    if (!extensions.init(kGL_GrGLStandard, GetString, GetStringi, GetIntegerv, queryString,
+                         display)) {
+        return nullptr;
+    }
+
+    sk_sp<GrGLInterface> interface(new GrGLInterface());
+    GrGLInterface::Functions* functions = &interface->fFunctions;
+
+    // Autogenerated content follows
+    GET_PROC(ActiveTexture);
+    GET_PROC(AttachShader);
+    GET_PROC(BindAttribLocation);
+    GET_PROC(BindBuffer);
+    GET_PROC(BindTexture);
+    GET_PROC(BlendColor);
+    GET_PROC(BlendEquation);
+    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(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(GenTextures);
+    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(GetUniformLocation);
+    GET_PROC(IsTexture);
+    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(TexParameterf);
+    GET_PROC(TexParameterfv);
+    GET_PROC(TexParameteri);
+    GET_PROC(TexParameteriv);
+    GET_PROC(TexSubImage2D);
+    GET_PROC(Uniform1f);
+    GET_PROC(Uniform1fv);
+    GET_PROC(Uniform1i);
+    GET_PROC(Uniform1iv);
+    GET_PROC(Uniform2f);
+    GET_PROC(Uniform2fv);
+    GET_PROC(Uniform2i);
+    GET_PROC(Uniform2iv);
+    GET_PROC(Uniform3f);
+    GET_PROC(Uniform3fv);
+    GET_PROC(Uniform3i);
+    GET_PROC(Uniform3iv);
+    GET_PROC(Uniform4f);
+    GET_PROC(Uniform4fv);
+    GET_PROC(Uniform4i);
+    GET_PROC(Uniform4iv);
+    GET_PROC(UniformMatrix2fv);
+    GET_PROC(UniformMatrix3fv);
+    GET_PROC(UniformMatrix4fv);
+    GET_PROC(UseProgram);
+    GET_PROC(VertexAttrib1f);
+    GET_PROC(VertexAttrib2fv);
+    GET_PROC(VertexAttrib3fv);
+    GET_PROC(VertexAttrib4fv);
+    GET_PROC(VertexAttribPointer);
+    GET_PROC(Viewport);
+
+    GET_PROC(DrawBuffer);
+    GET_PROC(PolygonMode);
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(GetStringi);
+    }
+
+    GET_PROC(BindVertexArray);
+    GET_PROC(DeleteVertexArrays);
+    GET_PROC(GenVertexArrays);
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(BindFragDataLocation);
+    }
+
+    if (glVer >= GR_GL_VER(3,3)) {
+        GET_PROC(BindFragDataLocationIndexed);
+    } else if (extensions.has("GL_ARB_blend_func_extended")) {
+        GET_PROC(BindFragDataLocationIndexed);
+    }
+
+    if (extensions.has("GL_KHR_blend_equation_advanced")) {
+        GET_PROC_SUFFIX(BlendBarrier, KHR);
+    } else if (extensions.has("GL_NV_blend_equation_advanced")) {
+        GET_PROC_SUFFIX(BlendBarrier, NV);
+    }
+
+    if (glVer >= GR_GL_VER(4,4)) {
+        GET_PROC(ClearTexImage);
+        GET_PROC(ClearTexSubImage);
+    } else if (extensions.has("GL_ARB_clear_texture")) {
+        GET_PROC(ClearTexImage);
+        GET_PROC(ClearTexSubImage);
+    }
+
+    if (glVer >= GR_GL_VER(3,1)) {
+        GET_PROC(DrawArraysInstanced);
+        GET_PROC(DrawElementsInstanced);
+    } else if (extensions.has("GL_ARB_draw_instanced")) {
+        GET_PROC(DrawArraysInstanced);
+        GET_PROC(DrawElementsInstanced);
+    } else if (extensions.has("GL_EXT_draw_instanced")) {
+        GET_PROC_SUFFIX(DrawArraysInstanced, EXT);
+        GET_PROC_SUFFIX(DrawElementsInstanced, EXT);
+    }
+
+    GET_PROC(DrawBuffers);
+    GET_PROC(ReadBuffer);
+
+    if (glVer >= GR_GL_VER(4,0)) {
+        GET_PROC(DrawArraysIndirect);
+        GET_PROC(DrawElementsIndirect);
+    } else if (extensions.has("GL_ARB_draw_indirect")) {
+        GET_PROC(DrawArraysIndirect);
+        GET_PROC(DrawElementsIndirect);
+    }
+
+    GET_PROC(DrawRangeElements);
+
+    if (glVer >= GR_GL_VER(3,2)) {
+        GET_PROC(GetMultisamplefv);
+    } else if (extensions.has("GL_ARB_texture_multisample")) {
+        GET_PROC(GetMultisamplefv);
+    }
+
+    GET_PROC(GetTexLevelParameteriv);
+
+    if (glVer >= GR_GL_VER(4,3)) {
+        GET_PROC(MultiDrawArraysIndirect);
+        GET_PROC(MultiDrawElementsIndirect);
+    } else if (extensions.has("GL_ARB_multi_draw_indirect")) {
+        GET_PROC(MultiDrawArraysIndirect);
+        GET_PROC(MultiDrawElementsIndirect);
+    }
+
+    if (glVer >= GR_GL_VER(3,1)) {
+        GET_PROC(TexBuffer);
+    }
+
+    if (glVer >= GR_GL_VER(4,3)) {
+        GET_PROC(TexBufferRange);
+    }
+
+    if (glVer >= GR_GL_VER(4,2)) {
+        GET_PROC(TexStorage2D);
+    } else if (extensions.has("GL_ARB_texture_storage")) {
+        GET_PROC(TexStorage2D);
+    } else if (extensions.has("GL_EXT_texture_storage")) {
+        GET_PROC_SUFFIX(TexStorage2D, EXT);
+    }
+
+    if (glVer >= GR_GL_VER(4,5)) {
+        GET_PROC(TextureBarrier);
+    } else if (extensions.has("GL_ARB_texture_barrier")) {
+        GET_PROC(TextureBarrier);
+    } else if (extensions.has("GL_NV_texture_barrier")) {
+        GET_PROC_SUFFIX(TextureBarrier, NV);
+    }
+
+    if (glVer >= GR_GL_VER(3,2)) {
+        GET_PROC(VertexAttribDivisor);
+    } else if (extensions.has("GL_ARB_instanced_arrays")) {
+        GET_PROC(VertexAttribDivisor);
+    }
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(VertexAttribIPointer);
+    }
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        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(GenerateMipmap);
+        GET_PROC(GetFramebufferAttachmentParameteriv);
+        GET_PROC(GetRenderbufferParameteriv);
+        GET_PROC(RenderbufferStorage);
+    } else if (extensions.has("GL_ARB_framebuffer_object")) {
+        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(GenerateMipmap);
+        GET_PROC(GetFramebufferAttachmentParameteriv);
+        GET_PROC(GetRenderbufferParameteriv);
+        GET_PROC(RenderbufferStorage);
+    } else if (extensions.has("GL_EXT_framebuffer_object")) {
+        GET_PROC_SUFFIX(BindFramebuffer, EXT);
+        GET_PROC_SUFFIX(BindRenderbuffer, EXT);
+        GET_PROC_SUFFIX(CheckFramebufferStatus, EXT);
+        GET_PROC_SUFFIX(DeleteFramebuffers, EXT);
+        GET_PROC_SUFFIX(DeleteRenderbuffers, EXT);
+        GET_PROC_SUFFIX(FramebufferRenderbuffer, EXT);
+        GET_PROC_SUFFIX(FramebufferTexture2D, EXT);
+        GET_PROC_SUFFIX(GenFramebuffers, EXT);
+        GET_PROC_SUFFIX(GenRenderbuffers, EXT);
+        GET_PROC_SUFFIX(GenerateMipmap, EXT);
+        GET_PROC_SUFFIX(GetFramebufferAttachmentParameteriv, EXT);
+        GET_PROC_SUFFIX(GetRenderbufferParameteriv, EXT);
+        GET_PROC_SUFFIX(RenderbufferStorage, EXT);
+    }
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(BlitFramebuffer);
+    } else if (extensions.has("GL_ARB_framebuffer_object")) {
+        GET_PROC(BlitFramebuffer);
+    } else if (extensions.has("GL_EXT_framebuffer_blit")) {
+        GET_PROC_SUFFIX(BlitFramebuffer, EXT);
+    }
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(RenderbufferStorageMultisample);
+    } else if (extensions.has("GL_ARB_framebuffer_object")) {
+        GET_PROC(RenderbufferStorageMultisample);
+    } else if (extensions.has("GL_EXT_framebuffer_multisample")) {
+        GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT);
+    }
+
+    GET_PROC(MapBuffer);
+
+    GET_PROC(UnmapBuffer);
+
+    if (glVer >= GR_GL_VER(3,0)) {
+        GET_PROC(FlushMappedBufferRange);
+        GET_PROC(MapBufferRange);
+    } else if (extensions.has("GL_ARB_map_buffer_range")) {
+        GET_PROC(FlushMappedBufferRange);
+        GET_PROC(MapBufferRange);
+    }
+
+    if (extensions.has("GL_EXT_debug_marker")) {
+        GET_PROC_SUFFIX(InsertEventMarker, EXT);
+        GET_PROC_SUFFIX(PopGroupMarker, EXT);
+        GET_PROC_SUFFIX(PushGroupMarker, EXT);
+    }
+
+    if (glVer >= GR_GL_VER(4,3)) {
+        GET_PROC(GetProgramResourceLocation);
+    } else if (extensions.has("GL_ARB_program_interface_query")) {
+        GET_PROC(GetProgramResourceLocation);
+    }
+
+    if (extensions.has("GL_NV_path_rendering")) {
+        GET_PROC_SUFFIX(MatrixLoadIdentity, EXT);
+        GET_PROC_SUFFIX(MatrixLoadf, EXT);
+    }
+
+    if (extensions.has("GL_NV_path_rendering")) {
+        GET_PROC_SUFFIX(CoverFillPath, NV);
+        GET_PROC_SUFFIX(CoverFillPathInstanced, NV);
+        GET_PROC_SUFFIX(CoverStrokePath, NV);
+        GET_PROC_SUFFIX(CoverStrokePathInstanced, NV);
+        GET_PROC_SUFFIX(DeletePaths, NV);
+        GET_PROC_SUFFIX(GenPaths, NV);
+        GET_PROC_SUFFIX(IsPath, NV);
+        GET_PROC_SUFFIX(PathCommands, NV);
+        GET_PROC_SUFFIX(PathParameterf, NV);
+        GET_PROC_SUFFIX(PathParameteri, NV);
+        GET_PROC_SUFFIX(PathStencilFunc, NV);
+        GET_PROC_SUFFIX(ProgramPathFragmentInputGen, NV);
+        GET_PROC_SUFFIX(StencilFillPath, NV);
+        GET_PROC_SUFFIX(StencilFillPathInstanced, NV);
+        GET_PROC_SUFFIX(StencilStrokePath, NV);
+        GET_PROC_SUFFIX(StencilStrokePathInstanced, NV);
+        GET_PROC_SUFFIX(StencilThenCoverFillPath, NV);
+        GET_PROC_SUFFIX(StencilThenCoverFillPathInstanced, NV);
+        GET_PROC_SUFFIX(StencilThenCoverStrokePath, NV);
+        GET_PROC_SUFFIX(StencilThenCoverStrokePathInstanced, NV);
+    }
+
+    if (extensions.has("GL_NV_framebuffer_mixed_samples")) {
+        GET_PROC_SUFFIX(CoverageModulation, NV);
+    }
+
+    if (glVer >= GR_GL_VER(4,3)) {
+        GET_PROC(DebugMessageCallback);
+        GET_PROC(DebugMessageControl);
+        GET_PROC(DebugMessageInsert);
+        GET_PROC(GetDebugMessageLog);
+        GET_PROC(ObjectLabel);
+        GET_PROC(PopDebugGroup);
+        GET_PROC(PushDebugGroup);
+    } else if (extensions.has("GL_KHR_debug")) {
+        GET_PROC(DebugMessageCallback);
+        GET_PROC(DebugMessageControl);
+        GET_PROC(DebugMessageInsert);
+        GET_PROC(GetDebugMessageLog);
+        GET_PROC(ObjectLabel);
+        GET_PROC(PopDebugGroup);
+        GET_PROC(PushDebugGroup);
+    }
+
+    if (extensions.has("GL_EXT_window_rectangles")) {
+        GET_PROC_SUFFIX(WindowRectangles, EXT);
+    }
+
+    if (extensions.has("EGL_KHR_image")) {
+        GET_EGL_PROC_SUFFIX(CreateImage, KHR);
+        GET_EGL_PROC_SUFFIX(DestroyImage, KHR);
+    } else if (extensions.has("EGL_KHR_image_base")) {
+        GET_EGL_PROC_SUFFIX(CreateImage, KHR);
+        GET_EGL_PROC_SUFFIX(DestroyImage, KHR);
+    }
+
+    if (glVer >= GR_GL_VER(3,2)) {
+        GET_PROC(ClientWaitSync);
+        GET_PROC(DeleteSync);
+        GET_PROC(FenceSync);
+        GET_PROC(IsSync);
+        GET_PROC(WaitSync);
+    } else if (extensions.has("GL_ARB_sync")) {
+        GET_PROC(ClientWaitSync);
+        GET_PROC(DeleteSync);
+        GET_PROC(FenceSync);
+        GET_PROC(IsSync);
+        GET_PROC(WaitSync);
+    }
+
+    if (glVer >= GR_GL_VER(4,2)) {
+        GET_PROC(GetInternalformativ);
+    } else if (extensions.has("GL_ARB_internalformat_query")) {
+        GET_PROC(GetInternalformativ);
+    }
+
+    if (glVer >= GR_GL_VER(4,1)) {
+        GET_PROC(GetProgramBinary);
+        GET_PROC(ProgramBinary);
+        GET_PROC(ProgramParameteri);
+    }
+
+    if (glVer >= GR_GL_VER(3,2)) {
+        GET_PROC(BindSampler);
+        GET_PROC(DeleteSamplers);
+        GET_PROC(GenSamplers);
+        GET_PROC(SamplerParameteri);
+        GET_PROC(SamplerParameteriv);
+    } else if (extensions.has("GL_ARB_sampler_objects")) {
+        GET_PROC(BindSampler);
+        GET_PROC(DeleteSamplers);
+        GET_PROC(GenSamplers);
+        GET_PROC(SamplerParameteri);
+        GET_PROC(SamplerParameteriv);
+    }
+
+    GET_PROC(GetQueryObjectiv);
+
+    GET_PROC(BeginQuery);
+    GET_PROC(DeleteQueries);
+    GET_PROC(EndQuery);
+    GET_PROC(GenQueries);
+    GET_PROC(GetQueryObjectuiv);
+    GET_PROC(GetQueryiv);
+
+    if (glVer >= GR_GL_VER(3,3)) {
+        GET_PROC(GetQueryObjecti64v);
+        GET_PROC(GetQueryObjectui64v);
+    } else if (extensions.has("GL_ARB_timer_query")) {
+        GET_PROC(GetQueryObjecti64v);
+        GET_PROC(GetQueryObjectui64v);
+    } else if (extensions.has("GL_EXT_timer_query")) {
+        GET_PROC_SUFFIX(GetQueryObjecti64v, EXT);
+        GET_PROC_SUFFIX(GetQueryObjectui64v, EXT);
+    }
+
+    if (glVer >= GR_GL_VER(3,3)) {
+        GET_PROC(QueryCounter);
+    } else if (extensions.has("GL_ARB_timer_query")) {
+        GET_PROC(QueryCounter);
+    }
+
+    if (glVer >= GR_GL_VER(4,3)) {
+        GET_PROC(InvalidateBufferData);
+        GET_PROC(InvalidateBufferSubData);
+        GET_PROC(InvalidateTexImage);
+        GET_PROC(InvalidateTexSubImage);
+    } else if (extensions.has("GL_ARB_invalidate_subdata")) {
+        GET_PROC(InvalidateBufferData);
+        GET_PROC(InvalidateBufferSubData);
+        GET_PROC(InvalidateTexImage);
+        GET_PROC(InvalidateTexSubImage);
+    }
+
+    if (glVer >= GR_GL_VER(4,3)) {
+        GET_PROC(InvalidateFramebuffer);
+        GET_PROC(InvalidateSubFramebuffer);
+    } else if (extensions.has("GL_ARB_invalidate_subdata")) {
+        GET_PROC(InvalidateFramebuffer);
+        GET_PROC(InvalidateSubFramebuffer);
+    }
+
+    if (glVer >= GR_GL_VER(4,3)) {
+        GET_PROC(GetShaderPrecisionFormat);
+    } else if (extensions.has("GL_ARB_ES2_compatibility")) {
+        GET_PROC(GetShaderPrecisionFormat);
+    }
+
+
+    // End autogenerated content
+    interface->fStandard = kGL_GrGLStandard;
+    interface->fExtensions.swap(&extensions);
+
+    return std::move(interface);
+}
+#endif
diff --git a/src/gpu/gl/GrGLAssembleInterface_gl.cpp b/src/gpu/gl/GrGLAssembleInterface_gl.cpp
index e4d3463..1c8527f 100644
--- a/src/gpu/gl/GrGLAssembleInterface_gl.cpp
+++ b/src/gpu/gl/GrGLAssembleInterface_gl.cpp
@@ -117,9 +117,8 @@
     GET_PROC(Flush);
     GET_PROC(FrontFace);
     GET_PROC(GenBuffers);
-    GET_PROC(GetBufferParameteriv);
-    GET_PROC(GetError);
-    GET_PROC(GetIntegerv);
+    GET_PROC(GenQueries);
+    GET_PROC(GenTextures);
     if (glVer >= GR_GL_VER(3,2) || extensions.has("GL_ARB_texture_multisample")) {
         GET_PROC(GetMultisamplefv);
     }
@@ -133,17 +132,18 @@
         GET_PROC_SUFFIX(GetQueryObjecti64v, EXT);
         GET_PROC_SUFFIX(GetQueryObjectui64v, EXT);
     }
-    GET_PROC(GetQueryiv);
+    GET_PROC(GetBufferParameteriv);
+    GET_PROC(GetError);
+    GET_PROC(GetIntegerv);
     GET_PROC(GetProgramInfoLog);
     GET_PROC(GetProgramiv);
+    GET_PROC(GetQueryiv);
     GET_PROC(GetShaderInfoLog);
+    GET_PROC(GetShaderPrecisionFormat);
     GET_PROC(GetShaderiv);
     GET_PROC(GetString);
     GET_PROC(GetStringi);
-    GET_PROC(GetShaderPrecisionFormat);
     GET_PROC(GetTexLevelParameteriv);
-    GET_PROC(GenQueries);
-    GET_PROC(GenTextures);
     GET_PROC(GetUniformLocation);
     GET_PROC(IsTexture);
     GET_PROC(LineWidth);
@@ -190,20 +190,20 @@
         GET_PROC_SUFFIX(TextureBarrier, NV);
     }
     GET_PROC(Uniform1f);
-    GET_PROC(Uniform1i);
     GET_PROC(Uniform1fv);
+    GET_PROC(Uniform1i);
     GET_PROC(Uniform1iv);
     GET_PROC(Uniform2f);
-    GET_PROC(Uniform2i);
     GET_PROC(Uniform2fv);
+    GET_PROC(Uniform2i);
     GET_PROC(Uniform2iv);
     GET_PROC(Uniform3f);
-    GET_PROC(Uniform3i);
     GET_PROC(Uniform3fv);
+    GET_PROC(Uniform3i);
     GET_PROC(Uniform3iv);
     GET_PROC(Uniform4f);
-    GET_PROC(Uniform4i);
     GET_PROC(Uniform4fv);
+    GET_PROC(Uniform4i);
     GET_PROC(Uniform4iv);
     GET_PROC(UniformMatrix2fv);
     GET_PROC(UniformMatrix3fv);
@@ -246,35 +246,35 @@
     // First look for GL3.0 FBO or GL_ARB_framebuffer_object (same since
     // GL_ARB_framebuffer_object doesn't use ARB suffix.)
     if (glVer >= GR_GL_VER(3,0) || extensions.has("GL_ARB_framebuffer_object")) {
-        GET_PROC(GenerateMipmap);
-        GET_PROC(GenFramebuffers);
-        GET_PROC(GetFramebufferAttachmentParameteriv);
-        GET_PROC(GetRenderbufferParameteriv);
         GET_PROC(BindFramebuffer);
-        GET_PROC(FramebufferTexture2D);
+        GET_PROC(BindRenderbuffer);
+        GET_PROC(BlitFramebuffer);
         GET_PROC(CheckFramebufferStatus);
         GET_PROC(DeleteFramebuffers);
-        GET_PROC(RenderbufferStorage);
-        GET_PROC(GenRenderbuffers);
         GET_PROC(DeleteRenderbuffers);
         GET_PROC(FramebufferRenderbuffer);
-        GET_PROC(BindRenderbuffer);
+        GET_PROC(FramebufferTexture2D);
+        GET_PROC(GenFramebuffers);
+        GET_PROC(GenRenderbuffers);
+        GET_PROC(GenerateMipmap);
+        GET_PROC(GetFramebufferAttachmentParameteriv);
+        GET_PROC(GetRenderbufferParameteriv);
+        GET_PROC(RenderbufferStorage);
         GET_PROC(RenderbufferStorageMultisample);
-        GET_PROC(BlitFramebuffer);
     } else if (extensions.has("GL_EXT_framebuffer_object")) {
-        GET_PROC_SUFFIX(GenerateMipmap, EXT);
-        GET_PROC_SUFFIX(GenFramebuffers, EXT);
-        GET_PROC_SUFFIX(GetFramebufferAttachmentParameteriv, EXT);
-        GET_PROC_SUFFIX(GetRenderbufferParameteriv, EXT);
         GET_PROC_SUFFIX(BindFramebuffer, EXT);
-        GET_PROC_SUFFIX(FramebufferTexture2D, EXT);
+        GET_PROC_SUFFIX(BindRenderbuffer, EXT);
         GET_PROC_SUFFIX(CheckFramebufferStatus, EXT);
         GET_PROC_SUFFIX(DeleteFramebuffers, EXT);
-        GET_PROC_SUFFIX(RenderbufferStorage, EXT);
-        GET_PROC_SUFFIX(GenRenderbuffers, EXT);
         GET_PROC_SUFFIX(DeleteRenderbuffers, EXT);
         GET_PROC_SUFFIX(FramebufferRenderbuffer, EXT);
-        GET_PROC_SUFFIX(BindRenderbuffer, EXT);
+        GET_PROC_SUFFIX(FramebufferTexture2D, EXT);
+        GET_PROC_SUFFIX(GenFramebuffers, EXT);
+        GET_PROC_SUFFIX(GenRenderbuffers, EXT);
+        GET_PROC_SUFFIX(GenerateMipmap, EXT);
+        GET_PROC_SUFFIX(GetFramebufferAttachmentParameteriv, EXT);
+        GET_PROC_SUFFIX(GetRenderbufferParameteriv, EXT);
+        GET_PROC_SUFFIX(RenderbufferStorage, EXT);
         if (extensions.has("GL_EXT_framebuffer_multisample")) {
             GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT);
         }
@@ -287,28 +287,29 @@
     }
 
     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(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(MatrixLoadf, EXT);
+
         GET_PROC_SUFFIX(CoverFillPath, NV);
-        GET_PROC_SUFFIX(CoverStrokePath, NV);
         GET_PROC_SUFFIX(CoverFillPathInstanced, NV);
+        GET_PROC_SUFFIX(CoverStrokePath, 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(DeletePaths, NV);
+        GET_PROC_SUFFIX(GenPaths, NV);
+        GET_PROC_SUFFIX(IsPath, NV);
+        GET_PROC_SUFFIX(PathCommands, NV);
+        GET_PROC_SUFFIX(PathParameterf, NV);
+        GET_PROC_SUFFIX(PathParameteri, NV);
+        GET_PROC_SUFFIX(PathStencilFunc, NV);
         GET_PROC_SUFFIX(ProgramPathFragmentInputGen, NV);
+        GET_PROC_SUFFIX(StencilFillPath, NV);
+        GET_PROC_SUFFIX(StencilFillPathInstanced, NV);
+        GET_PROC_SUFFIX(StencilStrokePath, NV);
+        GET_PROC_SUFFIX(StencilStrokePathInstanced, NV);
+        GET_PROC_SUFFIX(StencilThenCoverFillPath, NV);
+        GET_PROC_SUFFIX(StencilThenCoverFillPathInstanced, NV);
+        GET_PROC_SUFFIX(StencilThenCoverStrokePath, NV);
+        GET_PROC_SUFFIX(StencilThenCoverStrokePathInstanced, NV);
     }
 
     if (extensions.has("GL_NV_framebuffer_mixed_samples")) {
@@ -355,11 +356,11 @@
     }
 
     if (glVer >= GR_GL_VER(3, 2) || extensions.has("GL_ARB_sync")) {
+        GET_PROC(ClientWaitSync);
+        GET_PROC(DeleteSync);
         GET_PROC(FenceSync);
         GET_PROC(IsSync);
-        GET_PROC(ClientWaitSync);
         GET_PROC(WaitSync);
-        GET_PROC(DeleteSync);
     }
 
     if (glVer >= GR_GL_VER(4,2) || extensions.has("GL_ARB_internalformat_query")) {
diff --git a/src/gpu/gl/GrGLAssembleInterface_gles.cpp b/src/gpu/gl/GrGLAssembleInterface_gles.cpp
index 8c9f8b4..bfe811a 100644
--- a/src/gpu/gl/GrGLAssembleInterface_gles.cpp
+++ b/src/gpu/gl/GrGLAssembleInterface_gles.cpp
@@ -334,53 +334,55 @@
     }
 
     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(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(MatrixLoadf, EXT);
+
         GET_PROC_SUFFIX(CoverFillPath, NV);
-        GET_PROC_SUFFIX(CoverStrokePath, NV);
         GET_PROC_SUFFIX(CoverFillPathInstanced, NV);
+        GET_PROC_SUFFIX(CoverStrokePath, 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(DeletePaths, NV);
+        GET_PROC_SUFFIX(GenPaths, NV);
+        GET_PROC_SUFFIX(IsPath, NV);
+        GET_PROC_SUFFIX(PathCommands, NV);
+        GET_PROC_SUFFIX(PathParameterf, NV);
+        GET_PROC_SUFFIX(PathParameteri, NV);
+        GET_PROC_SUFFIX(PathStencilFunc, NV);
         GET_PROC_SUFFIX(ProgramPathFragmentInputGen, NV);
+        GET_PROC_SUFFIX(StencilFillPath, NV);
+        GET_PROC_SUFFIX(StencilFillPathInstanced, NV);
+        GET_PROC_SUFFIX(StencilStrokePath, NV);
+        GET_PROC_SUFFIX(StencilStrokePathInstanced, NV);
+        GET_PROC_SUFFIX(StencilThenCoverFillPath, NV);
+        GET_PROC_SUFFIX(StencilThenCoverFillPathInstanced, NV);
+        GET_PROC_SUFFIX(StencilThenCoverStrokePath, NV);
+        GET_PROC_SUFFIX(StencilThenCoverStrokePathInstanced, NV);
     }
 
     if (extensions.has("GL_CHROMIUM_path_rendering")) {
-        GET_PROC_SUFFIX(MatrixLoadf, CHROMIUM);
         GET_PROC_SUFFIX(MatrixLoadIdentity, CHROMIUM);
-        GET_PROC_SUFFIX(PathCommands, CHROMIUM);
-        GET_PROC_SUFFIX(PathParameteri, CHROMIUM);
-        GET_PROC_SUFFIX(PathParameterf, CHROMIUM);
-        GET_PROC_SUFFIX(GenPaths, CHROMIUM);
-        GET_PROC_SUFFIX(DeletePaths, CHROMIUM);
-        GET_PROC_SUFFIX(IsPath, CHROMIUM);
-        GET_PROC_SUFFIX(PathStencilFunc, CHROMIUM);
-        GET_PROC_SUFFIX(StencilFillPath, CHROMIUM);
-        GET_PROC_SUFFIX(StencilStrokePath, CHROMIUM);
-        GET_PROC_SUFFIX(StencilFillPathInstanced, CHROMIUM);
-        GET_PROC_SUFFIX(StencilStrokePathInstanced, CHROMIUM);
+        GET_PROC_SUFFIX(MatrixLoadf, CHROMIUM);
+
         GET_PROC_SUFFIX(CoverFillPath, CHROMIUM);
-        GET_PROC_SUFFIX(CoverStrokePath, CHROMIUM);
         GET_PROC_SUFFIX(CoverFillPathInstanced, CHROMIUM);
+        GET_PROC_SUFFIX(CoverStrokePath, CHROMIUM);
         GET_PROC_SUFFIX(CoverStrokePathInstanced, CHROMIUM);
-        GET_PROC_SUFFIX(StencilThenCoverFillPath, CHROMIUM);
-        GET_PROC_SUFFIX(StencilThenCoverStrokePath, CHROMIUM);
-        GET_PROC_SUFFIX(StencilThenCoverFillPathInstanced, CHROMIUM);
-        GET_PROC_SUFFIX(StencilThenCoverStrokePathInstanced, CHROMIUM);
+        GET_PROC_SUFFIX(DeletePaths, CHROMIUM);
+        GET_PROC_SUFFIX(GenPaths, CHROMIUM);
+        GET_PROC_SUFFIX(IsPath, CHROMIUM);
+        GET_PROC_SUFFIX(PathCommands, CHROMIUM);
+        GET_PROC_SUFFIX(PathParameterf, CHROMIUM);
+        GET_PROC_SUFFIX(PathParameteri, CHROMIUM);
+        GET_PROC_SUFFIX(PathStencilFunc, CHROMIUM);
         GET_PROC_SUFFIX(ProgramPathFragmentInputGen, CHROMIUM);
+        GET_PROC_SUFFIX(StencilFillPath, CHROMIUM);
+        GET_PROC_SUFFIX(StencilFillPathInstanced, CHROMIUM);
+        GET_PROC_SUFFIX(StencilStrokePath, CHROMIUM);
+        GET_PROC_SUFFIX(StencilStrokePathInstanced, CHROMIUM);
+        GET_PROC_SUFFIX(StencilThenCoverFillPath, CHROMIUM);
+        GET_PROC_SUFFIX(StencilThenCoverFillPathInstanced, CHROMIUM);
+        GET_PROC_SUFFIX(StencilThenCoverStrokePath, CHROMIUM);
+        GET_PROC_SUFFIX(StencilThenCoverStrokePathInstanced, CHROMIUM);
         // GL_CHROMIUM_path_rendering additions:
         GET_PROC_SUFFIX(BindFragmentInputLocation, CHROMIUM);
     }
@@ -424,17 +426,17 @@
     }
 
     if (version >= GR_GL_VER(3, 0)) {
+        GET_PROC(ClientWaitSync);
+        GET_PROC(DeleteSync);
         GET_PROC(FenceSync);
         GET_PROC(IsSync);
-        GET_PROC(ClientWaitSync);
         GET_PROC(WaitSync);
-        GET_PROC(DeleteSync);
     } else if (extensions.has("GL_APPLE_sync")) {
+        GET_PROC_SUFFIX(ClientWaitSync, APPLE);
+        GET_PROC_SUFFIX(DeleteSync, APPLE);
         GET_PROC_SUFFIX(FenceSync, APPLE);
         GET_PROC_SUFFIX(IsSync, APPLE);
-        GET_PROC_SUFFIX(ClientWaitSync, APPLE);
         GET_PROC_SUFFIX(WaitSync, APPLE);
-        GET_PROC_SUFFIX(DeleteSync, APPLE);
     }
 
     if (version >= GR_GL_VER(3,0)) {
diff --git a/src/gpu/gl/GrGLInterfaceAutogen.cpp b/src/gpu/gl/GrGLInterfaceAutogen.cpp
new file mode 100644
index 0000000..3e2de68
--- /dev/null
+++ b/src/gpu/gl/GrGLInterfaceAutogen.cpp
@@ -0,0 +1,702 @@
+/*
+ * Copyright 2011 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 AUTOGENERATED
+ * Make edits to tools/gpu/gl/interface/templates.go or they will
+ * be overwritten.
+ */
+
+#include "gl/GrGLInterface.h"
+#include "gl/GrGLExtensions.h"
+#include "gl/GrGLUtil.h"
+
+#include <stdio.h>
+
+GrGLInterface::GrGLInterface() {
+    fStandard = kNone_GrGLStandard;
+}
+
+#define RETURN_FALSE_INTERFACE                                                 \
+    SkDEBUGF("%s:%d GrGLInterface::validate() failed.\n", __FILE__, __LINE__); \
+    return false
+
+bool GrGLInterface::validate() const {
+
+    if (kNone_GrGLStandard == fStandard) {
+        RETURN_FALSE_INTERFACE;
+    }
+
+    if (!fExtensions.isInitialized()) {
+        RETURN_FALSE_INTERFACE;
+    }
+
+    GrGLVersion glVer = GrGLGetVersion(this);
+    if (GR_GL_INVALID_VER == glVer) {
+        RETURN_FALSE_INTERFACE;
+    }
+    // Autogenerated content follows
+    if (!fFunctions.fActiveTexture ||
+        !fFunctions.fAttachShader ||
+        !fFunctions.fBindAttribLocation ||
+        !fFunctions.fBindBuffer ||
+        !fFunctions.fBindTexture ||
+        !fFunctions.fBlendColor ||
+        !fFunctions.fBlendEquation ||
+        !fFunctions.fBlendFunc ||
+        !fFunctions.fBufferData ||
+        !fFunctions.fBufferSubData ||
+        !fFunctions.fClear ||
+        !fFunctions.fClearColor ||
+        !fFunctions.fClearStencil ||
+        !fFunctions.fColorMask ||
+        !fFunctions.fCompileShader ||
+        !fFunctions.fCompressedTexImage2D ||
+        !fFunctions.fCompressedTexSubImage2D ||
+        !fFunctions.fCopyTexSubImage2D ||
+        !fFunctions.fCreateProgram ||
+        !fFunctions.fCreateShader ||
+        !fFunctions.fCullFace ||
+        !fFunctions.fDeleteBuffers ||
+        !fFunctions.fDeleteProgram ||
+        !fFunctions.fDeleteShader ||
+        !fFunctions.fDeleteTextures ||
+        !fFunctions.fDepthMask ||
+        !fFunctions.fDisable ||
+        !fFunctions.fDisableVertexAttribArray ||
+        !fFunctions.fDrawArrays ||
+        !fFunctions.fDrawElements ||
+        !fFunctions.fEnable ||
+        !fFunctions.fEnableVertexAttribArray ||
+        !fFunctions.fFinish ||
+        !fFunctions.fFlush ||
+        !fFunctions.fFrontFace ||
+        !fFunctions.fGenBuffers ||
+        !fFunctions.fGenTextures ||
+        !fFunctions.fGetBufferParameteriv ||
+        !fFunctions.fGetError ||
+        !fFunctions.fGetIntegerv ||
+        !fFunctions.fGetProgramInfoLog ||
+        !fFunctions.fGetProgramiv ||
+        !fFunctions.fGetShaderInfoLog ||
+        !fFunctions.fGetShaderiv ||
+        !fFunctions.fGetString ||
+        !fFunctions.fGetUniformLocation ||
+        !fFunctions.fIsTexture ||
+        !fFunctions.fLineWidth ||
+        !fFunctions.fLinkProgram ||
+        !fFunctions.fPixelStorei ||
+        !fFunctions.fReadPixels ||
+        !fFunctions.fScissor ||
+        !fFunctions.fShaderSource ||
+        !fFunctions.fStencilFunc ||
+        !fFunctions.fStencilFuncSeparate ||
+        !fFunctions.fStencilMask ||
+        !fFunctions.fStencilMaskSeparate ||
+        !fFunctions.fStencilOp ||
+        !fFunctions.fStencilOpSeparate ||
+        !fFunctions.fTexImage2D ||
+        !fFunctions.fTexParameterf ||
+        !fFunctions.fTexParameterfv ||
+        !fFunctions.fTexParameteri ||
+        !fFunctions.fTexParameteriv ||
+        !fFunctions.fTexSubImage2D ||
+        !fFunctions.fUniform1f ||
+        !fFunctions.fUniform1fv ||
+        !fFunctions.fUniform1i ||
+        !fFunctions.fUniform1iv ||
+        !fFunctions.fUniform2f ||
+        !fFunctions.fUniform2fv ||
+        !fFunctions.fUniform2i ||
+        !fFunctions.fUniform2iv ||
+        !fFunctions.fUniform3f ||
+        !fFunctions.fUniform3fv ||
+        !fFunctions.fUniform3i ||
+        !fFunctions.fUniform3iv ||
+        !fFunctions.fUniform4f ||
+        !fFunctions.fUniform4fv ||
+        !fFunctions.fUniform4i ||
+        !fFunctions.fUniform4iv ||
+        !fFunctions.fUniformMatrix2fv ||
+        !fFunctions.fUniformMatrix3fv ||
+        !fFunctions.fUniformMatrix4fv ||
+        !fFunctions.fUseProgram ||
+        !fFunctions.fVertexAttrib1f ||
+        !fFunctions.fVertexAttrib2fv ||
+        !fFunctions.fVertexAttrib3fv ||
+        !fFunctions.fVertexAttrib4fv ||
+        !fFunctions.fVertexAttribPointer ||
+        !fFunctions.fViewport) {
+        RETURN_FALSE_INTERFACE;
+    }
+
+    if (GR_IS_GR_GL(fStandard)) {
+        if (!fFunctions.fDrawBuffer ||
+            !fFunctions.fPolygonMode) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(3,0)))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,0))))) {
+        if (!fFunctions.fGetStringi) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if (GR_IS_GR_GL(fStandard) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,0)) ||
+          fExtensions.has("GL_OES_vertex_array_object")))) {
+        if (!fFunctions.fBindVertexArray ||
+            !fFunctions.fDeleteVertexArrays ||
+            !fFunctions.fGenVertexArrays) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(3,0)))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,0) && fExtensions.has("GL_EXT_blend_func_extended"))))) {
+        if (!fFunctions.fBindFragDataLocation) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(3,3)) ||
+          fExtensions.has("GL_ARB_blend_func_extended"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,0) && fExtensions.has("GL_EXT_blend_func_extended"))))) {
+        if (!fFunctions.fBindFragDataLocationIndexed) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          fExtensions.has("GL_KHR_blend_equation_advanced") ||
+          fExtensions.has("GL_NV_blend_equation_advanced"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          fExtensions.has("GL_KHR_blend_equation_advanced") ||
+          fExtensions.has("GL_NV_blend_equation_advanced")))) {
+        if (!fFunctions.fBlendBarrier) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(4,4)) ||
+          fExtensions.has("GL_ARB_clear_texture"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          fExtensions.has("GL_EXT_clear_texture")))) {
+        if (!fFunctions.fClearTexImage ||
+            !fFunctions.fClearTexSubImage) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(3,1)) ||
+          fExtensions.has("GL_ARB_draw_instanced") ||
+          fExtensions.has("GL_EXT_draw_instanced"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,0)) ||
+          fExtensions.has("GL_EXT_draw_instanced")))) {
+        if (!fFunctions.fDrawArraysInstanced ||
+            !fFunctions.fDrawElementsInstanced) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if (GR_IS_GR_GL(fStandard) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,0))))) {
+        if (!fFunctions.fDrawBuffers ||
+            !fFunctions.fReadBuffer) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(4,0)) ||
+          fExtensions.has("GL_ARB_draw_indirect"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,1))))) {
+        if (!fFunctions.fDrawArraysIndirect ||
+            !fFunctions.fDrawElementsIndirect) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if (GR_IS_GR_GL(fStandard) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,0))))) {
+        if (!fFunctions.fDrawRangeElements) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(3,2)) ||
+          fExtensions.has("GL_ARB_texture_multisample"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,1))))) {
+        if (!fFunctions.fGetMultisamplefv) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if (GR_IS_GR_GL(fStandard) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,1))))) {
+        if (!fFunctions.fGetTexLevelParameteriv) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(4,3)) ||
+          fExtensions.has("GL_ARB_multi_draw_indirect"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          fExtensions.has("GL_EXT_multi_draw_indirect")))) {
+        if (!fFunctions.fMultiDrawArraysIndirect ||
+            !fFunctions.fMultiDrawElementsIndirect) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(3,1)))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,2)) ||
+          fExtensions.has("GL_OES_texture_buffer") ||
+          fExtensions.has("GL_EXT_texture_buffer")))) {
+        if (!fFunctions.fTexBuffer) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(4,3)))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,2)) ||
+          fExtensions.has("GL_OES_texture_buffer") ||
+          fExtensions.has("GL_EXT_texture_buffer")))) {
+        if (!fFunctions.fTexBufferRange) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(4,2)) ||
+          fExtensions.has("GL_ARB_texture_storage") ||
+          fExtensions.has("GL_EXT_texture_storage"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,0)) ||
+          fExtensions.has("GL_EXT_texture_storage")))) {
+        if (!fFunctions.fTexStorage2D) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(4,5)) ||
+          fExtensions.has("GL_ARB_texture_barrier") ||
+          fExtensions.has("GL_NV_texture_barrier"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          fExtensions.has("GL_NV_texture_barrier")))) {
+        if (!fFunctions.fTextureBarrier) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL_ES(fStandard) && (
+          fExtensions.has("GL_EXT_discard_framebuffer")))) {
+        if (!fFunctions.fDiscardFramebuffer) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(3,2)) ||
+          fExtensions.has("GL_ARB_instanced_arrays"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,0)) ||
+          fExtensions.has("GL_EXT_instanced_arrays")))) {
+        if (!fFunctions.fVertexAttribDivisor) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(3,0)))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,0))))) {
+        if (!fFunctions.fVertexAttribIPointer) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(3,0)) ||
+          fExtensions.has("GL_ARB_framebuffer_object") ||
+          fExtensions.has("GL_EXT_framebuffer_object"))) ||
+       GR_IS_GR_GL_ES(fStandard)) {
+        if (!fFunctions.fBindFramebuffer ||
+            !fFunctions.fBindRenderbuffer ||
+            !fFunctions.fCheckFramebufferStatus ||
+            !fFunctions.fDeleteFramebuffers ||
+            !fFunctions.fDeleteRenderbuffers ||
+            !fFunctions.fFramebufferRenderbuffer ||
+            !fFunctions.fFramebufferTexture2D ||
+            !fFunctions.fGenFramebuffers ||
+            !fFunctions.fGenRenderbuffers ||
+            !fFunctions.fGenerateMipmap ||
+            !fFunctions.fGetFramebufferAttachmentParameteriv ||
+            !fFunctions.fGetRenderbufferParameteriv ||
+            !fFunctions.fRenderbufferStorage) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(3,0)) ||
+          fExtensions.has("GL_ARB_framebuffer_object") ||
+          fExtensions.has("GL_EXT_framebuffer_blit"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,0)) ||
+          fExtensions.has("GL_CHROMIUM_framebuffer_multisample") ||
+          fExtensions.has("GL_ANGLE_framebuffer_blit")))) {
+        if (!fFunctions.fBlitFramebuffer) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(3,0)) ||
+          fExtensions.has("GL_ARB_framebuffer_object") ||
+          fExtensions.has("GL_EXT_framebuffer_multisample"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,0)) ||
+          fExtensions.has("GL_CHROMIUM_framebuffer_multisample") ||
+          fExtensions.has("GL_ANGLE_framebuffer_multisample")))) {
+        if (!fFunctions.fRenderbufferStorageMultisample) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL_ES(fStandard) && (
+          fExtensions.has("GL_CHROMIUM_map_sub")))) {
+        if (!fFunctions.fMapBufferSubData ||
+            !fFunctions.fMapTexSubImage2D ||
+            !fFunctions.fUnmapBufferSubData ||
+            !fFunctions.fUnmapTexSubImage2D) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL_ES(fStandard) && (
+          fExtensions.has("GL_EXT_multisampled_render_to_texture") ||
+          fExtensions.has("GL_IMG_multisampled_render_to_texture")))) {
+        if (!fFunctions.fFramebufferTexture2DMultisample) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL_ES(fStandard) && (
+          fExtensions.has("GL_EXT_multisampled_render_to_texture")))) {
+        if (!fFunctions.fRenderbufferStorageMultisampleES2EXT) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL_ES(fStandard) && (
+          fExtensions.has("GL_IMG_multisampled_render_to_texture")))) {
+        if (!fFunctions.fRenderbufferStorageMultisampleES2EXT) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL_ES(fStandard) && (
+          fExtensions.has("GL_APPLE_framebuffer_multisample")))) {
+        if (!fFunctions.fResolveMultisampleFramebuffer ||
+            !fFunctions.fRenderbufferStorageMultisampleES2APPLE) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if (GR_IS_GR_GL(fStandard) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          fExtensions.has("GL_OES_mapbuffer")))) {
+        if (!fFunctions.fMapBuffer) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if (GR_IS_GR_GL(fStandard) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,0)) ||
+          fExtensions.has("GL_OES_mapbuffer")))) {
+        if (!fFunctions.fUnmapBuffer) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(3,0)) ||
+          fExtensions.has("GL_ARB_map_buffer_range"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,0)) ||
+          fExtensions.has("GL_EXT_map_buffer_range")))) {
+        if (!fFunctions.fFlushMappedBufferRange ||
+            !fFunctions.fMapBufferRange) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          fExtensions.has("GL_EXT_debug_marker"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          fExtensions.has("GL_EXT_debug_marker")))) {
+        if (!fFunctions.fInsertEventMarker ||
+            !fFunctions.fPopGroupMarker ||
+            !fFunctions.fPushGroupMarker) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(4,3)) ||
+          fExtensions.has("GL_ARB_program_interface_query"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,1))))) {
+        if (!fFunctions.fGetProgramResourceLocation) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          fExtensions.has("GL_NV_path_rendering"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          fExtensions.has("GL_CHROMIUM_path_rendering") ||
+          fExtensions.has("GL_NV_path_rendering")))) {
+        if (!fFunctions.fMatrixLoadIdentity ||
+            !fFunctions.fMatrixLoadf) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          fExtensions.has("GL_NV_path_rendering"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          fExtensions.has("GL_CHROMIUM_path_rendering") ||
+          fExtensions.has("GL_NV_path_rendering")))) {
+        if (!fFunctions.fCoverFillPath ||
+            !fFunctions.fCoverFillPathInstanced ||
+            !fFunctions.fCoverStrokePath ||
+            !fFunctions.fCoverStrokePathInstanced ||
+            !fFunctions.fDeletePaths ||
+            !fFunctions.fGenPaths ||
+            !fFunctions.fIsPath ||
+            !fFunctions.fPathCommands ||
+            !fFunctions.fPathParameterf ||
+            !fFunctions.fPathParameteri ||
+            !fFunctions.fPathStencilFunc ||
+            !fFunctions.fStencilFillPath ||
+            !fFunctions.fStencilFillPathInstanced ||
+            !fFunctions.fStencilStrokePath ||
+            !fFunctions.fStencilStrokePathInstanced) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL_ES(fStandard) && (
+          fExtensions.has("GL_CHROMIUM_path_rendering")))) {
+        if (!fFunctions.fBindFragmentInputLocation) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          fExtensions.has("GL_NV_framebuffer_mixed_samples"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          fExtensions.has("GL_CHROMIUM_framebuffer_mixed_samples") ||
+          fExtensions.has("GL_NV_framebuffer_mixed_samples")))) {
+        if (!fFunctions.fCoverageModulation) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(4,3)) ||
+          fExtensions.has("GL_KHR_debug"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          fExtensions.has("GL_KHR_debug")))) {
+        if (!fFunctions.fDebugMessageCallback ||
+            !fFunctions.fDebugMessageControl ||
+            !fFunctions.fDebugMessageInsert ||
+            !fFunctions.fGetDebugMessageLog ||
+            !fFunctions.fObjectLabel ||
+            !fFunctions.fPopDebugGroup ||
+            !fFunctions.fPushDebugGroup) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL_ES(fStandard) && (
+          fExtensions.has("GL_CHROMIUM_bind_uniform_location")))) {
+        if (!fFunctions.fBindUniformLocation) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          fExtensions.has("GL_EXT_window_rectangles"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          fExtensions.has("GL_EXT_window_rectangles")))) {
+        if (!fFunctions.fWindowRectangles) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          fExtensions.has("EGL_KHR_image") ||
+          fExtensions.has("EGL_KHR_image_base"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          fExtensions.has("EGL_KHR_image") ||
+          fExtensions.has("EGL_KHR_image_base")))) {
+        if (!fFunctions.fEGLCreateImage ||
+            !fFunctions.fEGLDestroyImage) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(3,2)) ||
+          fExtensions.has("GL_ARB_sync"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,0)) ||
+          fExtensions.has("GL_APPLE_sync")))) {
+        if (!fFunctions.fClientWaitSync ||
+            !fFunctions.fDeleteSync ||
+            !fFunctions.fFenceSync ||
+            !fFunctions.fIsSync ||
+            !fFunctions.fWaitSync) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(4,2)) ||
+          fExtensions.has("GL_ARB_internalformat_query"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,0))))) {
+        if (!fFunctions.fGetInternalformativ) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(4,1)))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,0))))) {
+        if (!fFunctions.fGetProgramBinary ||
+            !fFunctions.fProgramBinary ||
+            !fFunctions.fProgramParameteri) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(3,2)) ||
+          fExtensions.has("GL_ARB_sampler_objects"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,0))))) {
+        if (!fFunctions.fBindSampler ||
+            !fFunctions.fDeleteSamplers ||
+            !fFunctions.fGenSamplers ||
+            !fFunctions.fSamplerParameteri ||
+            !fFunctions.fSamplerParameteriv) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if (GR_IS_GR_GL(fStandard)) {
+        if (!fFunctions.fGetQueryObjectiv) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if (GR_IS_GR_GL(fStandard) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,0)) ||
+          fExtensions.has("GL_EXT_occlusion_query_boolean")))) {
+        // all functions were marked optional
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(3,3)) ||
+          fExtensions.has("GL_ARB_timer_query") ||
+          fExtensions.has("GL_EXT_timer_query")))) {
+        if (!fFunctions.fGetQueryObjecti64v ||
+            !fFunctions.fGetQueryObjectui64v) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(3,3)) ||
+          fExtensions.has("GL_ARB_timer_query")))) {
+        if (!fFunctions.fQueryCounter) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(4,3)) ||
+          fExtensions.has("GL_ARB_invalidate_subdata")))) {
+        if (!fFunctions.fInvalidateBufferData ||
+            !fFunctions.fInvalidateBufferSubData ||
+            !fFunctions.fInvalidateTexImage ||
+            !fFunctions.fInvalidateTexSubImage) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(4,3)) ||
+          fExtensions.has("GL_ARB_invalidate_subdata"))) ||
+       (GR_IS_GR_GL_ES(fStandard) && (
+          (glVer >= GR_GL_VER(3,0))))) {
+        if (!fFunctions.fInvalidateFramebuffer ||
+            !fFunctions.fInvalidateSubFramebuffer) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+    if ((GR_IS_GR_GL(fStandard) && (
+          (glVer >= GR_GL_VER(4,3)) ||
+          fExtensions.has("GL_ARB_ES2_compatibility"))) ||
+       GR_IS_GR_GL_ES(fStandard)) {
+        if (!fFunctions.fGetShaderPrecisionFormat) {
+            RETURN_FALSE_INTERFACE;
+        }
+    }
+
+
+    // End autogenerated content
+    return true;
+}
+
+#if GR_TEST_UTILS
+
+void GrGLInterface::abandon() const {
+    const_cast<GrGLInterface*>(this)->fFunctions = GrGLInterface::Functions();
+}
+
+#endif // GR_TEST_UTILS
