Make GrGLInterface great for Win32 x86 again

Cherry pick to m67

No-Tree-Checks: true
No-Try: true
No-Presubmit: true
Bug: skia:8262
Change-Id: I607644198d5dc7992e2b89eb34651eb1dc88c6ba
Reviewed-On: https://skia-review.googlesource.com/149225
Reviewed-By: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
Reviewed-on: https://skia-review.googlesource.com/150141
Reviewed-by: Brian Salomon <bsalomon@google.com>
diff --git a/include/gpu/gl/GrGLExtensions.h b/include/gpu/gl/GrGLExtensions.h
index 0b1ff44..9859700 100644
--- a/include/gpu/gl/GrGLExtensions.h
+++ b/include/gpu/gl/GrGLExtensions.h
@@ -40,10 +40,10 @@
      * NULL if on desktop GL with version 3.0 or higher. Otherwise it will fail.
      */
     bool init(GrGLStandard standard,
-              GrGLFunction<GrGLGetStringProc> getString,
-              GrGLFunction<GrGLGetStringiProc> getStringi,
-              GrGLFunction<GrGLGetIntegervProc> getIntegerv,
-              GrGLFunction<GrEGLQueryStringProc> queryString = nullptr,
+              GrGLFunction<GrGLGetStringFn> getString,
+              GrGLFunction<GrGLGetStringiFn> getStringi,
+              GrGLFunction<GrGLGetIntegervFn> getIntegerv,
+              GrGLFunction<GrEGLQueryStringFn> queryString = nullptr,
               GrEGLDisplay eglDisplay = nullptr);
 
     bool isInitialized() const { return fInitialized; }
diff --git a/include/gpu/gl/GrGLFunctions.h b/include/gpu/gl/GrGLFunctions.h
index af1b9f7..f30e28f 100644
--- a/include/gpu/gl/GrGLFunctions.h
+++ b/include/gpu/gl/GrGLFunctions.h
@@ -9,274 +9,279 @@
 #ifndef GrGLFunctions_DEFINED
 #define GrGLFunctions_DEFINED
 
-#include "GrGLTypes.h"
+#include <cstring>
 #include "../private/SkTLogic.h"
+#include "GrGLTypes.h"
 
 extern "C" {
 
 ///////////////////////////////////////////////////////////////////////////////
 
-typedef GrGLvoid (* GrGLActiveTextureProc)(GrGLenum texture);
-typedef GrGLvoid (* GrGLAttachShaderProc)(GrGLuint program, GrGLuint shader);
-typedef GrGLvoid (* GrGLBeginQueryProc)(GrGLenum target, GrGLuint id);
-typedef GrGLvoid (* GrGLBindAttribLocationProc)(GrGLuint program, GrGLuint index, const char* name);
-typedef GrGLvoid (* GrGLBindBufferProc)(GrGLenum target, GrGLuint buffer);
-typedef GrGLvoid (* GrGLBindFramebufferProc)(GrGLenum target, GrGLuint framebuffer);
-typedef GrGLvoid (* GrGLBindRenderbufferProc)(GrGLenum target, GrGLuint renderbuffer);
-typedef GrGLvoid (* GrGLBindTextureProc)(GrGLenum target, GrGLuint texture);
-typedef GrGLvoid (* GrGLBindFragDataLocationProc)(GrGLuint program, GrGLuint colorNumber, const GrGLchar* name);
-typedef GrGLvoid (* GrGLBindFragDataLocationIndexedProc)(GrGLuint program, GrGLuint colorNumber, GrGLuint index, const GrGLchar * name);
-typedef GrGLvoid (* GrGLBindVertexArrayProc)(GrGLuint array);
-typedef GrGLvoid (* GrGLBlendBarrierProc)();
-typedef GrGLvoid (* GrGLBlendColorProc)(GrGLclampf red, GrGLclampf green, GrGLclampf blue, GrGLclampf alpha);
-typedef GrGLvoid (* GrGLBlendEquationProc)(GrGLenum mode);
-typedef GrGLvoid (* GrGLBlendFuncProc)(GrGLenum sfactor, GrGLenum dfactor);
-typedef GrGLvoid (* GrGLBlitFramebufferProc)(GrGLint srcX0, GrGLint srcY0, GrGLint srcX1, GrGLint srcY1, GrGLint dstX0, GrGLint dstY0, GrGLint dstX1, GrGLint dstY1, GrGLbitfield mask, GrGLenum filter);
-typedef GrGLvoid (* GrGLBufferDataProc)(GrGLenum target, GrGLsizeiptr size, const GrGLvoid* data, GrGLenum usage);
-typedef GrGLvoid (* GrGLBufferSubDataProc)(GrGLenum target, GrGLintptr offset, GrGLsizeiptr size, const GrGLvoid* data);
-typedef GrGLenum (* GrGLCheckFramebufferStatusProc)(GrGLenum target);
-typedef GrGLvoid (* GrGLClearProc)(GrGLbitfield mask);
-typedef GrGLvoid (* GrGLClearColorProc)(GrGLclampf red, GrGLclampf green, GrGLclampf blue, GrGLclampf alpha);
-typedef GrGLvoid (* GrGLClearStencilProc)(GrGLint s);
-typedef GrGLvoid (* GrGLClearTexImageProc)(GrGLuint texture, GrGLint level, GrGLenum format, GrGLenum type,const GrGLvoid * data);
-typedef GrGLvoid (* GrGLClearTexSubImageProc)(GrGLuint texture, GrGLint level, GrGLint xoffset, GrGLint yoffset, GrGLint zoffset, GrGLsizei width, GrGLsizei height, GrGLsizei depth, GrGLenum format, GrGLenum type,const GrGLvoid * data);
-typedef GrGLvoid (* GrGLColorMaskProc)(GrGLboolean red, GrGLboolean green, GrGLboolean blue, GrGLboolean alpha);
-typedef GrGLvoid (* GrGLCompileShaderProc)(GrGLuint shader);
-typedef GrGLvoid (* GrGLCompressedTexImage2DProc)(GrGLenum target, GrGLint level, GrGLenum internalformat, GrGLsizei width, GrGLsizei height, GrGLint border, GrGLsizei imageSize, const GrGLvoid* data);
-typedef GrGLvoid (* GrGLCompressedTexSubImage2DProc)(GrGLenum target, GrGLint level, GrGLint xoffset, GrGLint yoffset, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLsizei imageSize, const GrGLvoid* data);
-typedef GrGLvoid (* GrGLCopyTexSubImage2DProc)(GrGLenum target, GrGLint level, GrGLint xoffset, GrGLint yoffset, GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height);
-typedef GrGLuint (* GrGLCreateProgramProc)();
-typedef GrGLuint (* GrGLCreateShaderProc)(GrGLenum type);
-typedef GrGLvoid (* GrGLCullFaceProc)(GrGLenum mode);
-typedef GrGLvoid (* GrGLDeleteBuffersProc)(GrGLsizei n, const GrGLuint* buffers);
-typedef GrGLvoid (* GrGLDeleteFramebuffersProc)(GrGLsizei n, const GrGLuint *framebuffers);
-typedef GrGLvoid (* GrGLDeleteProgramProc)(GrGLuint program);
-typedef GrGLvoid (* GrGLDeleteQueriesProc)(GrGLsizei n, const GrGLuint *ids);
-typedef GrGLvoid (* GrGLDeleteRenderbuffersProc)(GrGLsizei n, const GrGLuint *renderbuffers);
-typedef GrGLvoid (* GrGLDeleteShaderProc)(GrGLuint shader);
-typedef GrGLvoid (* GrGLDeleteTexturesProc)(GrGLsizei n, const GrGLuint* textures);
-typedef GrGLvoid (* GrGLDeleteVertexArraysProc)(GrGLsizei n, const GrGLuint *arrays);
-typedef GrGLvoid (* GrGLDepthMaskProc)(GrGLboolean flag);
-typedef GrGLvoid (* GrGLDisableProc)(GrGLenum cap);
-typedef GrGLvoid (* GrGLDisableVertexAttribArrayProc)(GrGLuint index);
-typedef GrGLvoid (* GrGLDrawArraysProc)(GrGLenum mode, GrGLint first, GrGLsizei count);
-typedef GrGLvoid (* GrGLDrawArraysInstancedProc)(GrGLenum mode, GrGLint first, GrGLsizei count, GrGLsizei primcount);
-typedef GrGLvoid (* GrGLDrawArraysIndirectProc)(GrGLenum mode, const GrGLvoid* indirect);
-typedef GrGLvoid (* GrGLDrawBufferProc)(GrGLenum mode);
-typedef GrGLvoid (* GrGLDrawBuffersProc)(GrGLsizei n, const GrGLenum* bufs);
-typedef GrGLvoid (* GrGLDrawElementsProc)(GrGLenum mode, GrGLsizei count, GrGLenum type, const GrGLvoid* indices);
-typedef GrGLvoid (* GrGLDrawElementsInstancedProc)(GrGLenum mode, GrGLsizei count, GrGLenum type, const GrGLvoid *indices, GrGLsizei primcount);
-typedef GrGLvoid (* GrGLDrawElementsIndirectProc)(GrGLenum mode, GrGLenum type, const GrGLvoid* indirect);
-typedef GrGLvoid (* GrGLDrawRangeElementsProc)(GrGLenum mode, GrGLuint start, GrGLuint end, GrGLsizei count, GrGLenum type, const GrGLvoid* indices);
-typedef GrGLvoid (* GrGLEnableProc)(GrGLenum cap);
-typedef GrGLvoid (* GrGLEnableVertexAttribArrayProc)(GrGLuint index);
-typedef GrGLvoid (* GrGLEndQueryProc)(GrGLenum target);
-typedef GrGLvoid (* GrGLFinishProc)();
-typedef GrGLvoid (* GrGLFlushProc)();
-typedef GrGLvoid (* GrGLFlushMappedBufferRangeProc)(GrGLenum target, GrGLintptr offset, GrGLsizeiptr length);
-typedef GrGLvoid (* GrGLFramebufferRenderbufferProc)(GrGLenum target, GrGLenum attachment, GrGLenum renderbuffertarget, GrGLuint renderbuffer);
-typedef GrGLvoid (* GrGLFramebufferTexture2DProc)(GrGLenum target, GrGLenum attachment, GrGLenum textarget, GrGLuint texture, GrGLint level);
-typedef GrGLvoid (* GrGLFramebufferTexture2DMultisampleProc)(GrGLenum target, GrGLenum attachment, GrGLenum textarget, GrGLuint texture, GrGLint level, GrGLsizei samples);
-typedef GrGLvoid (* GrGLFrontFaceProc)(GrGLenum mode);
-typedef GrGLvoid (* GrGLGenBuffersProc)(GrGLsizei n, GrGLuint* buffers);
-typedef GrGLvoid (* GrGLGenFramebuffersProc)(GrGLsizei n, GrGLuint *framebuffers);
-typedef GrGLvoid (* GrGLGenerateMipmapProc)(GrGLenum target);
-typedef GrGLvoid (* GrGLGenQueriesProc)(GrGLsizei n, GrGLuint *ids);
-typedef GrGLvoid (* GrGLGenRenderbuffersProc)(GrGLsizei n, GrGLuint *renderbuffers);
-typedef GrGLvoid (* GrGLGenTexturesProc)(GrGLsizei n, GrGLuint* textures);
-typedef GrGLvoid (* GrGLGenVertexArraysProc)(GrGLsizei n, GrGLuint *arrays);
-typedef GrGLvoid (* GrGLGetBufferParameterivProc)(GrGLenum target, GrGLenum pname, GrGLint* params);
-typedef GrGLenum (* GrGLGetErrorProc)();
-typedef GrGLvoid (* GrGLGetFramebufferAttachmentParameterivProc)(GrGLenum target, GrGLenum attachment, GrGLenum pname, GrGLint* params);
-typedef GrGLvoid (* GrGLGetIntegervProc)(GrGLenum pname, GrGLint* params);
-typedef GrGLvoid (* GrGLGetMultisamplefvProc)(GrGLenum pname, GrGLuint index, GrGLfloat* val);
-typedef GrGLvoid (* GrGLGetProgramBinaryProc)(GrGLuint program, GrGLsizei bufsize, GrGLsizei* length, GrGLenum *binaryFormat, void *binary);
-typedef GrGLvoid (* GrGLGetProgramInfoLogProc)(GrGLuint program, GrGLsizei bufsize, GrGLsizei* length, char* infolog);
-typedef GrGLvoid (* GrGLGetProgramivProc)(GrGLuint program, GrGLenum pname, GrGLint* params);
-typedef GrGLvoid (* GrGLGetQueryivProc)(GrGLenum GLtarget, GrGLenum pname, GrGLint *params);
-typedef GrGLvoid (* GrGLGetQueryObjecti64vProc)(GrGLuint id, GrGLenum pname, GrGLint64 *params);
-typedef GrGLvoid (* GrGLGetQueryObjectivProc)(GrGLuint id, GrGLenum pname, GrGLint *params);
-typedef GrGLvoid (* GrGLGetQueryObjectui64vProc)(GrGLuint id, GrGLenum pname, GrGLuint64 *params);
-typedef GrGLvoid (* GrGLGetQueryObjectuivProc)(GrGLuint id, GrGLenum pname, GrGLuint *params);
-typedef GrGLvoid (* GrGLGetRenderbufferParameterivProc)(GrGLenum target, GrGLenum pname, GrGLint* params);
-typedef GrGLvoid (* GrGLGetShaderInfoLogProc)(GrGLuint shader, GrGLsizei bufsize, GrGLsizei* length, char* infolog);
-typedef GrGLvoid (* GrGLGetShaderivProc)(GrGLuint shader, GrGLenum pname, GrGLint* params);
-typedef GrGLvoid (* GrGLGetShaderPrecisionFormatProc)(GrGLenum shadertype, GrGLenum precisiontype, GrGLint *range, GrGLint *precision);
-typedef const GrGLubyte* (* GrGLGetStringProc)(GrGLenum name);
-typedef const GrGLubyte* (* GrGLGetStringiProc)(GrGLenum name, GrGLuint index);
-typedef GrGLvoid (* GrGLGetTexLevelParameterivProc)(GrGLenum target, GrGLint level, GrGLenum pname, GrGLint* params);
-typedef GrGLint (* GrGLGetUniformLocationProc)(GrGLuint program, const char* name);
-typedef GrGLvoid (* GrGLInsertEventMarkerProc)(GrGLsizei length, const char* marker);
-typedef GrGLvoid (* GrGLInvalidateBufferDataProc)(GrGLuint buffer);
-typedef GrGLvoid (* GrGLInvalidateBufferSubDataProc)(GrGLuint buffer, GrGLintptr offset, GrGLsizeiptr length);
-typedef GrGLvoid (* GrGLInvalidateFramebufferProc)(GrGLenum target, GrGLsizei numAttachments,  const GrGLenum *attachments);
-typedef GrGLvoid (* GrGLInvalidateSubFramebufferProc)(GrGLenum target, GrGLsizei numAttachments, const GrGLenum *attachments, GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height);
-typedef GrGLvoid (* GrGLInvalidateTexImageProc)(GrGLuint texture, GrGLint level);
-typedef GrGLvoid (* GrGLInvalidateTexSubImageProc)(GrGLuint texture, GrGLint level, GrGLint xoffset, GrGLint yoffset, GrGLint zoffset, GrGLsizei width, GrGLsizei height, GrGLsizei depth);
-typedef GrGLboolean (* GrGLIsTextureProc)(GrGLuint texture);
-typedef GrGLvoid (* GrGLLineWidthProc)(GrGLfloat width);
-typedef GrGLvoid (* GrGLLinkProgramProc)(GrGLuint program);
-typedef GrGLvoid* (* GrGLMapBufferProc)(GrGLenum target, GrGLenum access);
-typedef GrGLvoid* (* GrGLMapBufferRangeProc)(GrGLenum target, GrGLintptr offset, GrGLsizeiptr length, GrGLbitfield access);
-typedef GrGLvoid* (* GrGLMapBufferSubDataProc)(GrGLuint target, GrGLintptr offset, GrGLsizeiptr size, GrGLenum access);
-typedef GrGLvoid* (* GrGLMapTexSubImage2DProc)(GrGLenum target, GrGLint level, GrGLint xoffset, GrGLint yoffset, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, GrGLenum access);
-typedef GrGLvoid (* GrGLPixelStoreiProc)(GrGLenum pname, GrGLint param);
-typedef GrGLvoid (* GrGLPolygonModeProc)(GrGLenum face, GrGLenum mode);
-typedef GrGLvoid (* GrGLPopGroupMarkerProc)();
-typedef GrGLvoid (* GrGLProgramBinaryProc)(GrGLuint program, GrGLenum binaryFormat, void *binary, GrGLsizei length);
-typedef GrGLvoid (* GrGLProgramParameteriProc)(GrGLuint program, GrGLenum pname, GrGLint value);
-typedef GrGLvoid (* GrGLPushGroupMarkerProc)(GrGLsizei length, const char* marker);
-typedef GrGLvoid (* GrGLQueryCounterProc)(GrGLuint id, GrGLenum target);
-typedef GrGLvoid (* GrGLRasterSamplesProc)(GrGLuint samples, GrGLboolean fixedsamplelocations);
-typedef GrGLvoid (* GrGLReadBufferProc)(GrGLenum src);
-typedef GrGLvoid (* GrGLReadPixelsProc)(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, GrGLvoid* pixels);
-typedef GrGLvoid (* GrGLRenderbufferStorageProc)(GrGLenum target, GrGLenum internalformat, GrGLsizei width, GrGLsizei height);
-typedef GrGLvoid (* GrGLRenderbufferStorageMultisampleProc)(GrGLenum target, GrGLsizei samples, GrGLenum internalformat, GrGLsizei width, GrGLsizei height);
-typedef GrGLvoid (* GrGLResolveMultisampleFramebufferProc)();
-typedef GrGLvoid (* GrGLScissorProc)(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height);
+using GrGLActiveTextureFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum texture);
+using GrGLAttachShaderFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint program, GrGLuint shader);
+using GrGLBeginQueryFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLuint id);
+using GrGLBindAttribLocationFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint program, GrGLuint index, const char* name);
+using GrGLBindBufferFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLuint buffer);
+using GrGLBindFramebufferFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLuint framebuffer);
+using GrGLBindRenderbufferFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLuint renderbuffer);
+using GrGLBindTextureFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLuint texture);
+using GrGLBindFragDataLocationFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint program, GrGLuint colorNumber, const GrGLchar* name);
+using GrGLBindFragDataLocationIndexedFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint program, GrGLuint colorNumber, GrGLuint index, const GrGLchar* name);
+using GrGLBindVertexArrayFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint array);
+using GrGLBlendBarrierFn = GrGLvoid GR_GL_FUNCTION_TYPE();
+using GrGLBlendColorFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLclampf red, GrGLclampf green, GrGLclampf blue, GrGLclampf alpha);
+using GrGLBlendEquationFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum mode);
+using GrGLBlendFuncFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum sfactor, GrGLenum dfactor);
+using GrGLBlitFramebufferFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint srcX0, GrGLint srcY0, GrGLint srcX1, GrGLint srcY1, GrGLint dstX0, GrGLint dstY0, GrGLint dstX1, GrGLint dstY1, GrGLbitfield mask, GrGLenum filter);
+using GrGLBufferDataFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLsizeiptr size, const GrGLvoid* data, GrGLenum usage);
+using GrGLBufferSubDataFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLintptr offset, GrGLsizeiptr size, const GrGLvoid* data);
+using GrGLCheckFramebufferStatusFn = GrGLenum GR_GL_FUNCTION_TYPE(GrGLenum target);
+using GrGLClearFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLbitfield mask);
+using GrGLClearColorFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLclampf red, GrGLclampf green, GrGLclampf blue, GrGLclampf alpha);
+using GrGLClearStencilFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint s);
+using GrGLClearTexImageFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint texture, GrGLint level, GrGLenum format, GrGLenum type, const GrGLvoid* data);
+using GrGLClearTexSubImageFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint texture, GrGLint level, GrGLint xoffset, GrGLint yoffset, GrGLint zoffset, GrGLsizei width, GrGLsizei height, GrGLsizei depth, GrGLenum format, GrGLenum type, const GrGLvoid* data);
+using GrGLColorMaskFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLboolean red, GrGLboolean green, GrGLboolean blue, GrGLboolean alpha);
+using GrGLCompileShaderFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint shader);
+using GrGLCompressedTexImage2DFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLint level, GrGLenum internalformat, GrGLsizei width, GrGLsizei height, GrGLint border, GrGLsizei imageSize, const GrGLvoid* data);
+using GrGLCompressedTexSubImage2DFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLint level, GrGLint xoffset, GrGLint yoffset, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLsizei imageSize, const GrGLvoid* data);
+using GrGLCopyTexSubImage2DFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLint level, GrGLint xoffset, GrGLint yoffset, GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height);
+using GrGLCreateProgramFn = GrGLuint GR_GL_FUNCTION_TYPE();
+using GrGLCreateShaderFn = GrGLuint GR_GL_FUNCTION_TYPE(GrGLenum type);
+using GrGLCullFaceFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum mode);
+using GrGLDeleteBuffersFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsizei n, const GrGLuint* buffers);
+using GrGLDeleteFramebuffersFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsizei n, const GrGLuint* framebuffers);
+using GrGLDeleteProgramFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint program);
+using GrGLDeleteQueriesFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsizei n, const GrGLuint* ids);
+using GrGLDeleteRenderbuffersFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsizei n, const GrGLuint* renderbuffers);
+using GrGLDeleteShaderFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint shader);
+using GrGLDeleteTexturesFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsizei n, const GrGLuint* textures);
+using GrGLDeleteVertexArraysFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsizei n, const GrGLuint* arrays);
+using GrGLDepthMaskFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLboolean flag);
+using GrGLDisableFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum cap);
+using GrGLDisableVertexAttribArrayFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint index);
+using GrGLDrawArraysFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum mode, GrGLint first, GrGLsizei count);
+using GrGLDrawArraysInstancedFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum mode, GrGLint first, GrGLsizei count, GrGLsizei primcount);
+using GrGLDrawArraysIndirectFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum mode, const GrGLvoid* indirect);
+using GrGLDrawBufferFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum mode);
+using GrGLDrawBuffersFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsizei n, const GrGLenum* bufs);
+using GrGLDrawElementsFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum mode, GrGLsizei count, GrGLenum type, const GrGLvoid* indices);
+using GrGLDrawElementsInstancedFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum mode, GrGLsizei count, GrGLenum type, const GrGLvoid* indices, GrGLsizei primcount);
+using GrGLDrawElementsIndirectFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum mode, GrGLenum type, const GrGLvoid* indirect);
+using GrGLDrawRangeElementsFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum mode, GrGLuint start, GrGLuint end, GrGLsizei count, GrGLenum type, const GrGLvoid* indices);
+using GrGLEnableFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum cap);
+using GrGLEnableVertexAttribArrayFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint index);
+using GrGLEndQueryFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target);
+using GrGLFinishFn = GrGLvoid GR_GL_FUNCTION_TYPE();
+using GrGLFlushFn = GrGLvoid GR_GL_FUNCTION_TYPE();
+using GrGLFlushMappedBufferRangeFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLintptr offset, GrGLsizeiptr length);
+using GrGLFramebufferRenderbufferFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLenum attachment, GrGLenum renderbuffertarget, GrGLuint renderbuffer);
+using GrGLFramebufferTexture2DFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLenum attachment, GrGLenum textarget, GrGLuint texture, GrGLint level);
+using GrGLFramebufferTexture2DMultisampleFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLenum attachment, GrGLenum textarget, GrGLuint texture, GrGLint level, GrGLsizei samples);
+using GrGLFrontFaceFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum mode);
+using GrGLGenBuffersFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsizei n, GrGLuint* buffers);
+using GrGLGenFramebuffersFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsizei n, GrGLuint* framebuffers);
+using GrGLGenerateMipmapFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target);
+using GrGLGenQueriesFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsizei n, GrGLuint* ids);
+using GrGLGenRenderbuffersFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsizei n, GrGLuint* renderbuffers);
+using GrGLGenTexturesFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsizei n, GrGLuint* textures);
+using GrGLGenVertexArraysFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsizei n, GrGLuint* arrays);
+using GrGLGetBufferParameterivFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLenum pname, GrGLint* params);
+using GrGLGetErrorFn = GrGLenum GR_GL_FUNCTION_TYPE();
+using GrGLGetFramebufferAttachmentParameterivFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLenum attachment, GrGLenum pname, GrGLint* params);
+using GrGLGetIntegervFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum pname, GrGLint* params);
+using GrGLGetMultisamplefvFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum pname, GrGLuint index, GrGLfloat* val);
+using GrGLGetProgramBinaryFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint program, GrGLsizei bufsize, GrGLsizei* length, GrGLenum* binaryFormat, void* binary);
+using GrGLGetProgramInfoLogFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint program, GrGLsizei bufsize, GrGLsizei* length, char* infolog);
+using GrGLGetProgramivFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint program, GrGLenum pname, GrGLint* params);
+using GrGLGetQueryivFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum GLtarget, GrGLenum pname, GrGLint* params);
+using GrGLGetQueryObjecti64vFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint id, GrGLenum pname, GrGLint64* params);
+using GrGLGetQueryObjectivFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint id, GrGLenum pname, GrGLint* params);
+using GrGLGetQueryObjectui64vFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint id, GrGLenum pname, GrGLuint64* params);
+using GrGLGetQueryObjectuivFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint id, GrGLenum pname, GrGLuint* params);
+using GrGLGetRenderbufferParameterivFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLenum pname, GrGLint* params);
+using GrGLGetShaderInfoLogFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint shader, GrGLsizei bufsize, GrGLsizei* length, char* infolog);
+using GrGLGetShaderivFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint shader, GrGLenum pname, GrGLint* params);
+using GrGLGetShaderPrecisionFormatFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum shadertype, GrGLenum precisiontype, GrGLint* range, GrGLint* precision);
+using GrGLGetStringFn = const GrGLubyte* GR_GL_FUNCTION_TYPE(GrGLenum name);
+using GrGLGetStringiFn = const GrGLubyte* GR_GL_FUNCTION_TYPE(GrGLenum name, GrGLuint index);
+using GrGLGetTexLevelParameterivFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLint level, GrGLenum pname, GrGLint* params);
+using GrGLGetUniformLocationFn = GrGLint GR_GL_FUNCTION_TYPE(GrGLuint program, const char* name);
+using GrGLInsertEventMarkerFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsizei length, const char* marker);
+using GrGLInvalidateBufferDataFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint buffer);
+using GrGLInvalidateBufferSubDataFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint buffer, GrGLintptr offset, GrGLsizeiptr length);
+using GrGLInvalidateFramebufferFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLsizei numAttachments, const GrGLenum* attachments);
+using GrGLInvalidateSubFramebufferFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLsizei numAttachments, const GrGLenum* attachments, GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height);
+using GrGLInvalidateTexImageFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint texture, GrGLint level);
+using GrGLInvalidateTexSubImageFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint texture, GrGLint level, GrGLint xoffset, GrGLint yoffset, GrGLint zoffset, GrGLsizei width, GrGLsizei height, GrGLsizei depth);
+using GrGLIsTextureFn = GrGLboolean GR_GL_FUNCTION_TYPE(GrGLuint texture);
+using GrGLLineWidthFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLfloat width);
+using GrGLLinkProgramFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint program);
+using GrGLMapBufferFn = GrGLvoid* GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLenum access);
+using GrGLMapBufferRangeFn = GrGLvoid* GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLintptr offset, GrGLsizeiptr length, GrGLbitfield access);
+using GrGLMapBufferSubDataFn = GrGLvoid* GR_GL_FUNCTION_TYPE(GrGLuint target, GrGLintptr offset, GrGLsizeiptr size, GrGLenum access);
+using GrGLMapTexSubImage2DFn = GrGLvoid* GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLint level, GrGLint xoffset, GrGLint yoffset, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, GrGLenum access);
+using GrGLPixelStoreiFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum pname, GrGLint param);
+using GrGLPolygonModeFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum face, GrGLenum mode);
+using GrGLPopGroupMarkerFn = GrGLvoid GR_GL_FUNCTION_TYPE();
+using GrGLProgramBinaryFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint program, GrGLenum binaryFormat, void* binary, GrGLsizei length);
+using GrGLProgramParameteriFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint program, GrGLenum pname, GrGLint value);
+using GrGLPushGroupMarkerFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsizei length, const char* marker);
+using GrGLQueryCounterFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint id, GrGLenum target);
+using GrGLRasterSamplesFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint samples, GrGLboolean fixedsamplelocations);
+using GrGLReadBufferFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum src);
+using GrGLReadPixelsFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, GrGLvoid* pixels);
+using GrGLRenderbufferStorageFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLenum internalformat, GrGLsizei width, GrGLsizei height);
+using GrGLRenderbufferStorageMultisampleFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLsizei samples, GrGLenum internalformat, GrGLsizei width, GrGLsizei height);
+using GrGLResolveMultisampleFramebufferFn = GrGLvoid GR_GL_FUNCTION_TYPE();
+using GrGLScissorFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height);
 // GL_CHROMIUM_bind_uniform_location
-typedef GrGLvoid (* GrGLBindUniformLocationProc)(GrGLuint program, GrGLint location, const char* name);
+using GrGLBindUniformLocationFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint program, GrGLint location, const char* name);
 
 #if GR_GL_USE_NEW_SHADER_SOURCE_SIGNATURE
-typedef GrGLvoid (* GrGLShaderSourceProc)(GrGLuint shader, GrGLsizei count, const char* const * str, const GrGLint* length);
+using GrGLShaderSourceFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint shader, GrGLsizei count, const char* const* str, const GrGLint* length);
 #else
-typedef GrGLvoid (* GrGLShaderSourceProc)(GrGLuint shader, GrGLsizei count, const char** str, const GrGLint* length);
+using GrGLShaderSourceFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint shader, GrGLsizei count, const char** str, const GrGLint* length);
 #endif
-typedef GrGLvoid (* GrGLStencilFuncProc)(GrGLenum func, GrGLint ref, GrGLuint mask);
-typedef GrGLvoid (* GrGLStencilFuncSeparateProc)(GrGLenum face, GrGLenum func, GrGLint ref, GrGLuint mask);
-typedef GrGLvoid (* GrGLStencilMaskProc)(GrGLuint mask);
-typedef GrGLvoid (* GrGLStencilMaskSeparateProc)(GrGLenum face, GrGLuint mask);
-typedef GrGLvoid (* GrGLStencilOpProc)(GrGLenum fail, GrGLenum zfail, GrGLenum zpass);
-typedef GrGLvoid (* GrGLStencilOpSeparateProc)(GrGLenum face, GrGLenum fail, GrGLenum zfail, GrGLenum zpass);
-typedef GrGLvoid (* GrGLTexBufferProc)(GrGLenum target, GrGLenum internalformat, GrGLuint buffer);
-typedef GrGLvoid (* GrGLTexBufferRangeProc)(GrGLenum target, GrGLenum internalformat, GrGLuint buffer, GrGLintptr offset, GrGLsizeiptr size);
-typedef GrGLvoid (* GrGLTexImage2DProc)(GrGLenum target, GrGLint level, GrGLint internalformat, GrGLsizei width, GrGLsizei height, GrGLint border, GrGLenum format, GrGLenum type, const GrGLvoid* pixels);
-typedef GrGLvoid (* GrGLTexParameteriProc)(GrGLenum target, GrGLenum pname, GrGLint param);
-typedef GrGLvoid (* GrGLTexParameterivProc)(GrGLenum target, GrGLenum pname, const GrGLint* params);
-typedef GrGLvoid (* GrGLTexStorage2DProc)(GrGLenum target, GrGLsizei levels, GrGLenum internalformat, GrGLsizei width, GrGLsizei height);
-typedef GrGLvoid (* GrGLDiscardFramebufferProc)(GrGLenum target, GrGLsizei numAttachments, const GrGLenum* attachments);
-typedef GrGLvoid (* GrGLTexSubImage2DProc)(GrGLenum target, GrGLint level, GrGLint xoffset, GrGLint yoffset, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, const GrGLvoid* pixels);
-typedef GrGLvoid (* GrGLTextureBarrierProc)();
-typedef GrGLvoid (* GrGLUniform1fProc)(GrGLint location, GrGLfloat v0);
-typedef GrGLvoid (* GrGLUniform1iProc)(GrGLint location, GrGLint v0);
-typedef GrGLvoid (* GrGLUniform1fvProc)(GrGLint location, GrGLsizei count, const GrGLfloat* v);
-typedef GrGLvoid (* GrGLUniform1ivProc)(GrGLint location, GrGLsizei count, const GrGLint* v);
-typedef GrGLvoid (* GrGLUniform2fProc)(GrGLint location, GrGLfloat v0, GrGLfloat v1);
-typedef GrGLvoid (* GrGLUniform2iProc)(GrGLint location, GrGLint v0, GrGLint v1);
-typedef GrGLvoid (* GrGLUniform2fvProc)(GrGLint location, GrGLsizei count, const GrGLfloat* v);
-typedef GrGLvoid (* GrGLUniform2ivProc)(GrGLint location, GrGLsizei count, const GrGLint* v);
-typedef GrGLvoid (* GrGLUniform3fProc)(GrGLint location, GrGLfloat v0, GrGLfloat v1, GrGLfloat v2);
-typedef GrGLvoid (* GrGLUniform3iProc)(GrGLint location, GrGLint v0, GrGLint v1, GrGLint v2);
-typedef GrGLvoid (* GrGLUniform3fvProc)(GrGLint location, GrGLsizei count, const GrGLfloat* v);
-typedef GrGLvoid (* GrGLUniform3ivProc)(GrGLint location, GrGLsizei count, const GrGLint* v);
-typedef GrGLvoid (* GrGLUniform4fProc)(GrGLint location, GrGLfloat v0, GrGLfloat v1, GrGLfloat v2, GrGLfloat v3);
-typedef GrGLvoid (* GrGLUniform4iProc)(GrGLint location, GrGLint v0, GrGLint v1, GrGLint v2, GrGLint v3);
-typedef GrGLvoid (* GrGLUniform4fvProc)(GrGLint location, GrGLsizei count, const GrGLfloat* v);
-typedef GrGLvoid (* GrGLUniform4ivProc)(GrGLint location, GrGLsizei count, const GrGLint* v);
-typedef GrGLvoid (* GrGLUniformMatrix2fvProc)(GrGLint location, GrGLsizei count, GrGLboolean transpose, const GrGLfloat* value);
-typedef GrGLvoid (* GrGLUniformMatrix3fvProc)(GrGLint location, GrGLsizei count, GrGLboolean transpose, const GrGLfloat* value);
-typedef GrGLvoid (* GrGLUniformMatrix4fvProc)(GrGLint location, GrGLsizei count, GrGLboolean transpose, const GrGLfloat* value);
-typedef GrGLboolean (* GrGLUnmapBufferProc)(GrGLenum target);
-typedef GrGLvoid (* GrGLUnmapBufferSubDataProc)(const GrGLvoid* mem);
-typedef GrGLvoid (* GrGLUnmapTexSubImage2DProc)(const GrGLvoid* mem);
-typedef GrGLvoid (* GrGLUseProgramProc)(GrGLuint program);
-typedef GrGLvoid (* GrGLVertexAttrib1fProc)(GrGLuint indx, const GrGLfloat value);
-typedef GrGLvoid (* GrGLVertexAttrib2fvProc)(GrGLuint indx, const GrGLfloat* values);
-typedef GrGLvoid (* GrGLVertexAttrib3fvProc)(GrGLuint indx, const GrGLfloat* values);
-typedef GrGLvoid (* GrGLVertexAttrib4fvProc)(GrGLuint indx, const GrGLfloat* values);
-typedef GrGLvoid (* GrGLVertexAttribDivisorProc)(GrGLuint index, GrGLuint divisor);
-typedef GrGLvoid (* GrGLVertexAttribIPointerProc)(GrGLuint indx, GrGLint size, GrGLenum type, GrGLsizei stride, const GrGLvoid* ptr);
-typedef GrGLvoid (* GrGLVertexAttribPointerProc)(GrGLuint indx, GrGLint size, GrGLenum type, GrGLboolean normalized, GrGLsizei stride, const GrGLvoid* ptr);
-typedef GrGLvoid (* GrGLViewportProc)(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height);
+using GrGLStencilFuncFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum func, GrGLint ref, GrGLuint mask);
+using GrGLStencilFuncSeparateFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum face, GrGLenum func, GrGLint ref, GrGLuint mask);
+using GrGLStencilMaskFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint mask);
+using GrGLStencilMaskSeparateFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum face, GrGLuint mask);
+using GrGLStencilOpFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum fail, GrGLenum zfail, GrGLenum zpass);
+using GrGLStencilOpSeparateFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum face, GrGLenum fail, GrGLenum zfail, GrGLenum zpass);
+using GrGLTexBufferFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLenum internalformat, GrGLuint buffer);
+using GrGLTexBufferRangeFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLenum internalformat, GrGLuint buffer, GrGLintptr offset, GrGLsizeiptr size);
+using GrGLTexImage2DFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLint level, GrGLint internalformat, GrGLsizei width, GrGLsizei height, GrGLint border, GrGLenum format, GrGLenum type, const GrGLvoid* pixels);
+using GrGLTexParameteriFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLenum pname, GrGLint param);
+using GrGLTexParameterivFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLenum pname, const GrGLint* params);
+using GrGLTexStorage2DFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLsizei levels, GrGLenum internalformat, GrGLsizei width, GrGLsizei height);
+using GrGLDiscardFramebufferFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLsizei numAttachments, const GrGLenum* attachments);
+using GrGLTexSubImage2DFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLint level, GrGLint xoffset, GrGLint yoffset, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, const GrGLvoid* pixels);
+using GrGLTextureBarrierFn = GrGLvoid GR_GL_FUNCTION_TYPE();
+using GrGLUniform1fFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint location, GrGLfloat v0);
+using GrGLUniform1iFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint location, GrGLint v0);
+using GrGLUniform1fvFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint location, GrGLsizei count, const GrGLfloat* v);
+using GrGLUniform1ivFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint location, GrGLsizei count, const GrGLint* v);
+using GrGLUniform2fFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint location, GrGLfloat v0, GrGLfloat v1);
+using GrGLUniform2iFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint location, GrGLint v0, GrGLint v1);
+using GrGLUniform2fvFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint location, GrGLsizei count, const GrGLfloat* v);
+using GrGLUniform2ivFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint location, GrGLsizei count, const GrGLint* v);
+using GrGLUniform3fFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint location, GrGLfloat v0, GrGLfloat v1, GrGLfloat v2);
+using GrGLUniform3iFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint location, GrGLint v0, GrGLint v1, GrGLint v2);
+using GrGLUniform3fvFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint location, GrGLsizei count, const GrGLfloat* v);
+using GrGLUniform3ivFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint location, GrGLsizei count, const GrGLint* v);
+using GrGLUniform4fFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint location, GrGLfloat v0, GrGLfloat v1, GrGLfloat v2, GrGLfloat v3);
+using GrGLUniform4iFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint location, GrGLint v0, GrGLint v1, GrGLint v2, GrGLint v3);
+using GrGLUniform4fvFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint location, GrGLsizei count, const GrGLfloat* v);
+using GrGLUniform4ivFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint location, GrGLsizei count, const GrGLint* v);
+using GrGLUniformMatrix2fvFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint location, GrGLsizei count, GrGLboolean transpose, const GrGLfloat* value);
+using GrGLUniformMatrix3fvFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint location, GrGLsizei count, GrGLboolean transpose, const GrGLfloat* value);
+using GrGLUniformMatrix4fvFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint location, GrGLsizei count, GrGLboolean transpose, const GrGLfloat* value);
+using GrGLUnmapBufferFn = GrGLboolean GR_GL_FUNCTION_TYPE(GrGLenum target);
+using GrGLUnmapBufferSubDataFn = GrGLvoid GR_GL_FUNCTION_TYPE(const GrGLvoid* mem);
+using GrGLUnmapTexSubImage2DFn = GrGLvoid GR_GL_FUNCTION_TYPE(const GrGLvoid* mem);
+using GrGLUseProgramFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint program);
+using GrGLVertexAttrib1fFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint indx, const GrGLfloat value);
+using GrGLVertexAttrib2fvFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint indx, const GrGLfloat* values);
+using GrGLVertexAttrib3fvFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint indx, const GrGLfloat* values);
+using GrGLVertexAttrib4fvFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint indx, const GrGLfloat* values);
+using GrGLVertexAttribDivisorFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint index, GrGLuint divisor);
+using GrGLVertexAttribIPointerFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint indx, GrGLint size, GrGLenum type, GrGLsizei stride, const GrGLvoid* ptr);
+using GrGLVertexAttribPointerFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint indx, GrGLint size, GrGLenum type, GrGLboolean normalized, GrGLsizei stride, const GrGLvoid* ptr);
+using GrGLViewportFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height);
 
 /* GL_NV_path_rendering */
-typedef GrGLvoid (* GrGLMatrixLoadfProc)(GrGLenum matrixMode, const GrGLfloat* m);
-typedef GrGLvoid (* GrGLMatrixLoadIdentityProc)(GrGLenum);
-typedef GrGLvoid (* GrGLPathCommandsProc)(GrGLuint path, GrGLsizei numCommands, const GrGLubyte *commands, GrGLsizei numCoords, GrGLenum coordType, const GrGLvoid *coords);
-typedef GrGLvoid (* GrGLPathParameteriProc)(GrGLuint path, GrGLenum pname, GrGLint value);
-typedef GrGLvoid (* GrGLPathParameterfProc)(GrGLuint path, GrGLenum pname, GrGLfloat value);
-typedef GrGLuint (* GrGLGenPathsProc)(GrGLsizei range);
-typedef GrGLvoid (* GrGLDeletePathsProc)(GrGLuint path, GrGLsizei range);
-typedef GrGLboolean (* GrGLIsPathProc)(GrGLuint path);
-typedef GrGLvoid (* GrGLPathStencilFuncProc)(GrGLenum func, GrGLint ref, GrGLuint mask);
-typedef GrGLvoid (* GrGLStencilFillPathProc)(GrGLuint path, GrGLenum fillMode, GrGLuint mask);
-typedef GrGLvoid (* GrGLStencilStrokePathProc)(GrGLuint path, GrGLint reference, GrGLuint mask);
-typedef GrGLvoid (* GrGLStencilFillPathInstancedProc)(GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths, GrGLuint pathBase, GrGLenum fillMode, GrGLuint mask, GrGLenum transformType, const GrGLfloat *transformValues);
-typedef GrGLvoid (* GrGLStencilStrokePathInstancedProc)(GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths, GrGLuint pathBase, GrGLint reference, GrGLuint mask, GrGLenum transformType, const GrGLfloat *transformValues);
-typedef GrGLvoid (* GrGLCoverFillPathProc)(GrGLuint path, GrGLenum coverMode);
-typedef GrGLvoid (* GrGLCoverStrokePathProc)(GrGLuint name, GrGLenum coverMode);
-typedef GrGLvoid (* GrGLCoverFillPathInstancedProc)(GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths, GrGLuint pathBase, GrGLenum coverMode, GrGLenum transformType, const GrGLfloat *transformValues);
-typedef GrGLvoid (* GrGLCoverStrokePathInstancedProc)(GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths, GrGLuint pathBase, GrGLenum coverMode, GrGLenum transformType, const GrGLfloat* transformValues);
+using GrGLMatrixLoadfFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum matrixMode, const GrGLfloat* m);
+using GrGLMatrixLoadIdentityFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum);
+using GrGLPathCommandsFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint path, GrGLsizei numCommands, const GrGLubyte* commands, GrGLsizei numCoords, GrGLenum coordType, const GrGLvoid* coords);
+using GrGLPathParameteriFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint path, GrGLenum pname, GrGLint value);
+using GrGLPathParameterfFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint path, GrGLenum pname, GrGLfloat value);
+using GrGLGenPathsFn = GrGLuint GR_GL_FUNCTION_TYPE(GrGLsizei range);
+using GrGLDeletePathsFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint path, GrGLsizei range);
+using GrGLIsPathFn = GrGLboolean GR_GL_FUNCTION_TYPE(GrGLuint path);
+using GrGLPathStencilFuncFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum func, GrGLint ref, GrGLuint mask);
+using GrGLStencilFillPathFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint path, GrGLenum fillMode, GrGLuint mask);
+using GrGLStencilStrokePathFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint path, GrGLint reference, GrGLuint mask);
+using GrGLStencilFillPathInstancedFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid* paths, GrGLuint pathBase, GrGLenum fillMode, GrGLuint mask, GrGLenum transformType, const GrGLfloat* transformValues);
+using GrGLStencilStrokePathInstancedFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid* paths, GrGLuint pathBase, GrGLint reference, GrGLuint mask, GrGLenum transformType, const GrGLfloat* transformValues);
+using GrGLCoverFillPathFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint path, GrGLenum coverMode);
+using GrGLCoverStrokePathFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint name, GrGLenum coverMode);
+using GrGLCoverFillPathInstancedFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid* paths, GrGLuint pathBase, GrGLenum coverMode, GrGLenum transformType, const GrGLfloat* transformValues);
+using GrGLCoverStrokePathInstancedFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid* paths, GrGLuint pathBase, GrGLenum coverMode, GrGLenum transformType, const GrGLfloat* transformValues);
 // NV_path_rendering v1.2
-typedef GrGLvoid (* GrGLStencilThenCoverFillPathProc)(GrGLuint path, GrGLenum fillMode, GrGLuint mask, GrGLenum coverMode);
-typedef GrGLvoid (* GrGLStencilThenCoverStrokePathProc)(GrGLuint path, GrGLint reference, GrGLuint mask, GrGLenum coverMode);
-typedef GrGLvoid (* GrGLStencilThenCoverFillPathInstancedProc)(GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths, GrGLuint pathBase, GrGLenum fillMode, GrGLuint mask, GrGLenum coverMode, GrGLenum transformType, const GrGLfloat *transformValues);
-typedef GrGLvoid (* GrGLStencilThenCoverStrokePathInstancedProc)(GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths, GrGLuint pathBase, GrGLint reference, GrGLuint mask, GrGLenum coverMode, GrGLenum transformType, const GrGLfloat *transformValues);
+using GrGLStencilThenCoverFillPathFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint path, GrGLenum fillMode, GrGLuint mask, GrGLenum coverMode);
+using GrGLStencilThenCoverStrokePathFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint path, GrGLint reference, GrGLuint mask, GrGLenum coverMode);
+using GrGLStencilThenCoverFillPathInstancedFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid* paths, GrGLuint pathBase, GrGLenum fillMode, GrGLuint mask, GrGLenum coverMode, GrGLenum transformType, const GrGLfloat* transformValues);
+using GrGLStencilThenCoverStrokePathInstancedFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid* paths, GrGLuint pathBase, GrGLint reference, GrGLuint mask, GrGLenum coverMode, GrGLenum transformType, const GrGLfloat* transformValues);
 // NV_path_rendering v1.3
-typedef GrGLvoid (* GrGLProgramPathFragmentInputGenProc)(GrGLuint program, GrGLint location, GrGLenum genMode, GrGLint components,const GrGLfloat *coeffs);
+using GrGLProgramPathFragmentInputGenFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint program, GrGLint location, GrGLenum genMode, GrGLint components, const GrGLfloat* coeffs);
 // CHROMIUM_path_rendering
-typedef GrGLvoid (* GrGLBindFragmentInputLocationProc)(GrGLuint program, GrGLint location, const GrGLchar* name);
+using GrGLBindFragmentInputLocationFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLuint program, GrGLint location, const GrGLchar* name);
 
 /* ARB_program_interface_query */
-typedef GrGLint (* GrGLGetProgramResourceLocationProc)(GrGLuint program, GrGLenum programInterface, const GrGLchar *name);
+using GrGLGetProgramResourceLocationFn = GrGLint GR_GL_FUNCTION_TYPE(GrGLuint program, GrGLenum programInterface, const GrGLchar* name);
 
 /* GL_NV_framebuffer_mixed_samples */
-typedef GrGLvoid (* GrGLCoverageModulationProc)(GrGLenum components);
+using GrGLCoverageModulationFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum components);
 
 /* EXT_multi_draw_indirect */
-typedef GrGLvoid (* GrGLMultiDrawArraysIndirectProc)(GrGLenum mode, const GrGLvoid *indirect, GrGLsizei drawcount, GrGLsizei stride);
-typedef GrGLvoid (* GrGLMultiDrawElementsIndirectProc)(GrGLenum mode, GrGLenum type, const GrGLvoid *indirect, GrGLsizei drawcount, GrGLsizei stride);
+using GrGLMultiDrawArraysIndirectFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum mode, const GrGLvoid* indirect, GrGLsizei drawcount, GrGLsizei stride);
+using GrGLMultiDrawElementsIndirectFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum mode, GrGLenum type, const GrGLvoid* indirect, GrGLsizei drawcount, GrGLsizei stride);
 
 /* ARB_sample_shading */
-typedef GrGLvoid (* GrGLMinSampleShadingProc)(GrGLfloat value);
+using GrGLMinSampleShadingFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLfloat value);
 
 /* ARB_sync */
-typedef GrGLsync (* GrGLFenceSyncProc)(GrGLenum condition, GrGLbitfield flags);
-typedef GrGLboolean (* GrGLIsSyncProc)(GrGLsync sync);
-typedef GrGLenum (* GrGLClientWaitSyncProc)(GrGLsync sync, GrGLbitfield flags, GrGLuint64 timeout);
-typedef GrGLvoid (* GrGLWaitSyncProc)(GrGLsync sync, GrGLbitfield flags, GrGLuint64 timeout);
-typedef GrGLvoid (* GrGLDeleteSyncProc)(GrGLsync sync);
+using GrGLFenceSyncFn = GrGLsync GR_GL_FUNCTION_TYPE(GrGLenum condition, GrGLbitfield flags);
+using GrGLIsSyncFn = GrGLboolean GR_GL_FUNCTION_TYPE(GrGLsync sync);
+using GrGLClientWaitSyncFn = GrGLenum GR_GL_FUNCTION_TYPE(GrGLsync sync, GrGLbitfield flags, GrGLuint64 timeout);
+using GrGLWaitSyncFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsync sync, GrGLbitfield flags, GrGLuint64 timeout);
+using GrGLDeleteSyncFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLsync sync);
 
 /* ARB_internalformat_query */
-typedef GrGLvoid (* GrGLGetInternalformativProc)(GrGLenum target, GrGLenum internalformat, GrGLenum pname, GrGLsizei bufSize, GrGLint *params);
+using GrGLGetInternalformativFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum target, GrGLenum internalformat, GrGLenum pname, GrGLsizei bufSize, GrGLint* params);
 
 /* KHR_debug */
-typedef GrGLvoid (* GrGLDebugMessageControlProc)(GrGLenum source, GrGLenum type, GrGLenum severity, GrGLsizei count, const GrGLuint* ids, GrGLboolean enabled);
-typedef GrGLvoid (* GrGLDebugMessageInsertProc)(GrGLenum source, GrGLenum type, GrGLuint id, GrGLenum severity, GrGLsizei length,  const GrGLchar* buf);
-typedef GrGLvoid (* GrGLDebugMessageCallbackProc)(GRGLDEBUGPROC callback, const GrGLvoid* userParam);
-typedef GrGLuint (* GrGLGetDebugMessageLogProc)(GrGLuint count, GrGLsizei bufSize, GrGLenum* sources, GrGLenum* types, GrGLuint* ids, GrGLenum* severities, GrGLsizei* lengths,  GrGLchar* messageLog);
-typedef GrGLvoid (* GrGLPushDebugGroupProc)(GrGLenum source, GrGLuint id, GrGLsizei length,  const GrGLchar * message);
-typedef GrGLvoid (* GrGLPopDebugGroupProc)();
-typedef GrGLvoid (* GrGLObjectLabelProc)(GrGLenum identifier, GrGLuint name, GrGLsizei length, const GrGLchar *label);
+using GrGLDebugMessageControlFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum source, GrGLenum type, GrGLenum severity, GrGLsizei count, const GrGLuint* ids, GrGLboolean enabled);
+using GrGLDebugMessageInsertFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum source, GrGLenum type, GrGLuint id, GrGLenum severity, GrGLsizei length, const GrGLchar* buf);
+using GrGLDebugMessageCallbackFn = GrGLvoid GR_GL_FUNCTION_TYPE(GRGLDEBUGPROC callback, const GrGLvoid* userParam);
+using GrGLGetDebugMessageLogFn = GrGLuint GR_GL_FUNCTION_TYPE(GrGLuint count, GrGLsizei bufSize, GrGLenum* sources, GrGLenum* types, GrGLuint* ids, GrGLenum* severities, GrGLsizei* lengths, GrGLchar* messageLog);
+using GrGLPushDebugGroupFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum source, GrGLuint id, GrGLsizei length, const GrGLchar* message);
+using GrGLPopDebugGroupFn = GrGLvoid GR_GL_FUNCTION_TYPE();
+using GrGLObjectLabelFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum identifier, GrGLuint name, GrGLsizei length, const GrGLchar* label);
 
 /** EXT_window_rectangles */
-typedef GrGLvoid (* GrGLWindowRectanglesProc)(GrGLenum mode, GrGLsizei count, const GrGLint box[]);
+using GrGLWindowRectanglesFn = GrGLvoid GR_GL_FUNCTION_TYPE(GrGLenum mode, GrGLsizei count, const GrGLint box[]);
 
 /** EGL functions */
-typedef const char* (* GrEGLQueryStringProc)(GrEGLDisplay dpy, GrEGLint name);
-typedef GrEGLDisplay (* GrEGLGetCurrentDisplayProc)();
-typedef GrEGLImage (* GrEGLCreateImageProc)(GrEGLDisplay dpy, GrEGLContext ctx, GrEGLenum target, GrEGLClientBuffer buffer, const GrEGLint *attrib_list);
-typedef GrEGLBoolean (* GrEGLDestroyImageProc)(GrEGLDisplay dpy, GrEGLImage image);
+using GrEGLQueryStringFn = const char* GR_GL_FUNCTION_TYPE(GrEGLDisplay dpy, GrEGLint name);
+using GrEGLGetCurrentDisplayFn = GrEGLDisplay GR_GL_FUNCTION_TYPE();
+using GrEGLCreateImageFn = GrEGLImage GR_GL_FUNCTION_TYPE(GrEGLDisplay dpy, GrEGLContext ctx, GrEGLenum target, GrEGLClientBuffer buffer, const GrEGLint* attrib_list);
+using GrEGLDestroyImageFn = GrEGLBoolean GR_GL_FUNCTION_TYPE(GrEGLDisplay dpy, GrEGLImage image);
 }  // extern "C"
 
+// Legacy name used in Chrome. TODO: Remove when removed from Chrome.
+using GrGLGetStringProc = GrGLGetStringFn;
+
 // This is a lighter-weight std::function, trying to reduce code size and compile time
 // by only supporting the exact use cases we require.
 template <typename T> class GrGLFunction;
 
 template <typename R, typename... Args>
-class GrGLFunction<R(*)(Args...)>{
+class GrGLFunction<R GR_GL_FUNCTION_TYPE(Args...)> {
 public:
+    using Fn = R GR_GL_FUNCTION_TYPE(Args...);
     // Construct empty.
-    GrGLFunction() : fCall(nullptr) {}
-    GrGLFunction(std::nullptr_t) : GrGLFunction() {}
+    GrGLFunction() = default;
+    GrGLFunction(std::nullptr_t) {}
 
     // Construct from a simple function pointer.
-    GrGLFunction(R (GR_GL_FUNCTION_TYPE* fn_ptr)(Args...)) : GrGLFunction() {
+    GrGLFunction(Fn* fn_ptr) {
+        static_assert(sizeof(fn_ptr) <= sizeof(fBuf), "fBuf is too small");
         if (fn_ptr) {
             memcpy(fBuf, &fn_ptr, sizeof(fn_ptr));
             fCall = [](const void* buf, Args... args) {
-                auto fn_ptr = *(R (GR_GL_FUNCTION_TYPE**)(Args...))buf;
-                return fn_ptr(args...);
+                return (*(Fn**)buf)(std::forward<Args>(args)...);
             };
         }
     }
@@ -285,10 +290,10 @@
     template <typename Closure>
     GrGLFunction(Closure closure) : GrGLFunction() {
         static_assert(sizeof(Closure) <= sizeof(fBuf), "fBuf is too small");
-    #if defined(__APPLE__)   // I am having serious trouble getting these to work with all STLs...
+#if defined(__APPLE__)  // I am having serious trouble getting these to work with all STLs...
         static_assert(std::is_trivially_copyable<Closure>::value, "");
         static_assert(std::is_trivially_destructible<Closure>::value, "");
-    #endif
+#endif
 
         memcpy(fBuf, &closure, sizeof(closure));
         fCall = [](const void* buf, Args... args) {
@@ -297,18 +302,38 @@
         };
     }
 
+    // See other (temporary) specialization below.
+    GrGLFunction(const GrGLFunction<R(*)(Args...)>& that);
+
     R operator()(Args... args) const {
         SkASSERT(fCall);
-        return fCall(fBuf, args...);
+        return fCall(fBuf, std::forward<Args>(args)...);
     }
 
-    explicit operator bool() const {
-        return fCall != nullptr;
-    }
+    explicit operator bool() const { return fCall != nullptr; }
 
 private:
-    R (*fCall)(const void*, Args...);
+    using Call = R(const void* buf, Args...);
+    Call* fCall = nullptr;
     size_t fBuf[4];
 };
 
+/**
+ * Chrome instantiates GrGLFunctions on function pointers that don't include GR_GL_FUNCTION_TYPE.
+ * This can go away after Chrome is updated to use the above specialization.
+ */
+template <typename R, typename... Args>
+class GrGLFunction<R (*)(Args...)> : public GrGLFunction<R GR_GL_FUNCTION_TYPE(Args...)> {
+public:
+    template <typename Closure>
+    GrGLFunction(Closure closure)
+            : GrGLFunction<R GR_GL_FUNCTION_TYPE(Args...)>(std::move(closure)) {}
+};
+
+template <typename R, typename... Args>
+GrGLFunction<R GR_GL_FUNCTION_TYPE(Args...)>::GrGLFunction(const GrGLFunction<R (*)(Args...)>& that)
+        : fCall(that.fCall) {
+    memcpy(fBuf, that.fBuf, sizeof(fBuf));
+}
+
 #endif
diff --git a/include/gpu/gl/GrGLInterface.h b/include/gpu/gl/GrGLInterface.h
index bf2685e..fb05564 100644
--- a/include/gpu/gl/GrGLInterface.h
+++ b/include/gpu/gl/GrGLInterface.h
@@ -79,123 +79,123 @@
      * operator.
      */
     struct Functions {
-        GrGLFunction<GrGLActiveTextureProc> fActiveTexture;
-        GrGLFunction<GrGLAttachShaderProc> fAttachShader;
-        GrGLFunction<GrGLBeginQueryProc> fBeginQuery;
-        GrGLFunction<GrGLBindAttribLocationProc> fBindAttribLocation;
-        GrGLFunction<GrGLBindBufferProc> fBindBuffer;
-        GrGLFunction<GrGLBindFragDataLocationProc> fBindFragDataLocation;
-        GrGLFunction<GrGLBindFragDataLocationIndexedProc> fBindFragDataLocationIndexed;
-        GrGLFunction<GrGLBindFramebufferProc> fBindFramebuffer;
-        GrGLFunction<GrGLBindRenderbufferProc> fBindRenderbuffer;
-        GrGLFunction<GrGLBindTextureProc> fBindTexture;
-        GrGLFunction<GrGLBindVertexArrayProc> fBindVertexArray;
-        GrGLFunction<GrGLBlendBarrierProc> fBlendBarrier;
-        GrGLFunction<GrGLBlendColorProc> fBlendColor;
-        GrGLFunction<GrGLBlendEquationProc> fBlendEquation;
-        GrGLFunction<GrGLBlendFuncProc> fBlendFunc;
-        GrGLFunction<GrGLBlitFramebufferProc> fBlitFramebuffer;
-        GrGLFunction<GrGLBufferDataProc> fBufferData;
-        GrGLFunction<GrGLBufferSubDataProc> fBufferSubData;
-        GrGLFunction<GrGLCheckFramebufferStatusProc> fCheckFramebufferStatus;
-        GrGLFunction<GrGLClearProc> fClear;
-        GrGLFunction<GrGLClearColorProc> fClearColor;
-        GrGLFunction<GrGLClearStencilProc> fClearStencil;
-        GrGLFunction<GrGLClearTexImageProc> fClearTexImage;
-        GrGLFunction<GrGLClearTexSubImageProc> fClearTexSubImage;
-        GrGLFunction<GrGLColorMaskProc> fColorMask;
-        GrGLFunction<GrGLCompileShaderProc> fCompileShader;
-        GrGLFunction<GrGLCompressedTexImage2DProc> fCompressedTexImage2D;
-        GrGLFunction<GrGLCompressedTexSubImage2DProc> fCompressedTexSubImage2D;
-        GrGLFunction<GrGLCopyTexSubImage2DProc> fCopyTexSubImage2D;
-        GrGLFunction<GrGLCreateProgramProc> fCreateProgram;
-        GrGLFunction<GrGLCreateShaderProc> fCreateShader;
-        GrGLFunction<GrGLCullFaceProc> fCullFace;
-        GrGLFunction<GrGLDeleteBuffersProc> fDeleteBuffers;
-        GrGLFunction<GrGLDeleteFramebuffersProc> fDeleteFramebuffers;
-        GrGLFunction<GrGLDeleteProgramProc> fDeleteProgram;
-        GrGLFunction<GrGLDeleteQueriesProc> fDeleteQueries;
-        GrGLFunction<GrGLDeleteRenderbuffersProc> fDeleteRenderbuffers;
-        GrGLFunction<GrGLDeleteShaderProc> fDeleteShader;
-        GrGLFunction<GrGLDeleteTexturesProc> fDeleteTextures;
-        GrGLFunction<GrGLDeleteVertexArraysProc> fDeleteVertexArrays;
-        GrGLFunction<GrGLDepthMaskProc> fDepthMask;
-        GrGLFunction<GrGLDisableProc> fDisable;
-        GrGLFunction<GrGLDisableVertexAttribArrayProc> fDisableVertexAttribArray;
-        GrGLFunction<GrGLDrawArraysProc> fDrawArrays;
-        GrGLFunction<GrGLDrawArraysIndirectProc> fDrawArraysIndirect;
-        GrGLFunction<GrGLDrawArraysInstancedProc> fDrawArraysInstanced;
-        GrGLFunction<GrGLDrawBufferProc> fDrawBuffer;
-        GrGLFunction<GrGLDrawBuffersProc> fDrawBuffers;
-        GrGLFunction<GrGLDrawElementsProc> fDrawElements;
-        GrGLFunction<GrGLDrawElementsIndirectProc> fDrawElementsIndirect;
-        GrGLFunction<GrGLDrawElementsInstancedProc> fDrawElementsInstanced;
-        GrGLFunction<GrGLDrawRangeElementsProc> fDrawRangeElements;
-        GrGLFunction<GrGLEnableProc> fEnable;
-        GrGLFunction<GrGLEnableVertexAttribArrayProc> fEnableVertexAttribArray;
-        GrGLFunction<GrGLEndQueryProc> fEndQuery;
-        GrGLFunction<GrGLFinishProc> fFinish;
-        GrGLFunction<GrGLFlushProc> fFlush;
-        GrGLFunction<GrGLFlushMappedBufferRangeProc> fFlushMappedBufferRange;
-        GrGLFunction<GrGLFramebufferRenderbufferProc> fFramebufferRenderbuffer;
-        GrGLFunction<GrGLFramebufferTexture2DProc> fFramebufferTexture2D;
-        GrGLFunction<GrGLFramebufferTexture2DMultisampleProc> fFramebufferTexture2DMultisample;
-        GrGLFunction<GrGLFrontFaceProc> fFrontFace;
-        GrGLFunction<GrGLGenBuffersProc> fGenBuffers;
-        GrGLFunction<GrGLGenFramebuffersProc> fGenFramebuffers;
-        GrGLFunction<GrGLGenerateMipmapProc> fGenerateMipmap;
-        GrGLFunction<GrGLGenQueriesProc> fGenQueries;
-        GrGLFunction<GrGLGenRenderbuffersProc> fGenRenderbuffers;
-        GrGLFunction<GrGLGenTexturesProc> fGenTextures;
-        GrGLFunction<GrGLGenVertexArraysProc> fGenVertexArrays;
-        GrGLFunction<GrGLGetBufferParameterivProc> fGetBufferParameteriv;
-        GrGLFunction<GrGLGetErrorProc> fGetError;
-        GrGLFunction<GrGLGetFramebufferAttachmentParameterivProc> fGetFramebufferAttachmentParameteriv;
-        GrGLFunction<GrGLGetIntegervProc> fGetIntegerv;
-        GrGLFunction<GrGLGetMultisamplefvProc> fGetMultisamplefv;
-        GrGLFunction<GrGLGetProgramBinaryProc> fGetProgramBinary;
-        GrGLFunction<GrGLGetProgramInfoLogProc> fGetProgramInfoLog;
-        GrGLFunction<GrGLGetProgramivProc> fGetProgramiv;
-        GrGLFunction<GrGLGetQueryObjecti64vProc> fGetQueryObjecti64v;
-        GrGLFunction<GrGLGetQueryObjectivProc> fGetQueryObjectiv;
-        GrGLFunction<GrGLGetQueryObjectui64vProc> fGetQueryObjectui64v;
-        GrGLFunction<GrGLGetQueryObjectuivProc> fGetQueryObjectuiv;
-        GrGLFunction<GrGLGetQueryivProc> fGetQueryiv;
-        GrGLFunction<GrGLGetRenderbufferParameterivProc> fGetRenderbufferParameteriv;
-        GrGLFunction<GrGLGetShaderInfoLogProc> fGetShaderInfoLog;
-        GrGLFunction<GrGLGetShaderivProc> fGetShaderiv;
-        GrGLFunction<GrGLGetShaderPrecisionFormatProc> fGetShaderPrecisionFormat;
-        GrGLFunction<GrGLGetStringProc> fGetString;
-        GrGLFunction<GrGLGetStringiProc> fGetStringi;
-        GrGLFunction<GrGLGetTexLevelParameterivProc> fGetTexLevelParameteriv;
-        GrGLFunction<GrGLGetUniformLocationProc> fGetUniformLocation;
-        GrGLFunction<GrGLInsertEventMarkerProc> fInsertEventMarker;
-        GrGLFunction<GrGLInvalidateBufferDataProc> fInvalidateBufferData;
-        GrGLFunction<GrGLInvalidateBufferSubDataProc> fInvalidateBufferSubData;
-        GrGLFunction<GrGLInvalidateFramebufferProc> fInvalidateFramebuffer;
-        GrGLFunction<GrGLInvalidateSubFramebufferProc> fInvalidateSubFramebuffer;
-        GrGLFunction<GrGLInvalidateTexImageProc> fInvalidateTexImage;
-        GrGLFunction<GrGLInvalidateTexSubImageProc> fInvalidateTexSubImage;
-        GrGLFunction<GrGLIsTextureProc> fIsTexture;
-        GrGLFunction<GrGLLineWidthProc> fLineWidth;
-        GrGLFunction<GrGLLinkProgramProc> fLinkProgram;
-        GrGLFunction<GrGLProgramBinaryProc> fProgramBinary;
-        GrGLFunction<GrGLProgramParameteriProc> fProgramParameteri;
-        GrGLFunction<GrGLMapBufferProc> fMapBuffer;
-        GrGLFunction<GrGLMapBufferRangeProc> fMapBufferRange;
-        GrGLFunction<GrGLMapBufferSubDataProc> fMapBufferSubData;
-        GrGLFunction<GrGLMapTexSubImage2DProc> fMapTexSubImage2D;
-        GrGLFunction<GrGLMultiDrawArraysIndirectProc> fMultiDrawArraysIndirect;
-        GrGLFunction<GrGLMultiDrawElementsIndirectProc> fMultiDrawElementsIndirect;
-        GrGLFunction<GrGLPixelStoreiProc> fPixelStorei;
-        GrGLFunction<GrGLPolygonModeProc> fPolygonMode;
-        GrGLFunction<GrGLPopGroupMarkerProc> fPopGroupMarker;
-        GrGLFunction<GrGLPushGroupMarkerProc> fPushGroupMarker;
-        GrGLFunction<GrGLQueryCounterProc> fQueryCounter;
-        GrGLFunction<GrGLRasterSamplesProc> fRasterSamples;
-        GrGLFunction<GrGLReadBufferProc> fReadBuffer;
-        GrGLFunction<GrGLReadPixelsProc> fReadPixels;
-        GrGLFunction<GrGLRenderbufferStorageProc> fRenderbufferStorage;
+        GrGLFunction<GrGLActiveTextureFn> fActiveTexture;
+        GrGLFunction<GrGLAttachShaderFn> fAttachShader;
+        GrGLFunction<GrGLBeginQueryFn> fBeginQuery;
+        GrGLFunction<GrGLBindAttribLocationFn> fBindAttribLocation;
+        GrGLFunction<GrGLBindBufferFn> fBindBuffer;
+        GrGLFunction<GrGLBindFragDataLocationFn> fBindFragDataLocation;
+        GrGLFunction<GrGLBindFragDataLocationIndexedFn> fBindFragDataLocationIndexed;
+        GrGLFunction<GrGLBindFramebufferFn> fBindFramebuffer;
+        GrGLFunction<GrGLBindRenderbufferFn> fBindRenderbuffer;
+        GrGLFunction<GrGLBindTextureFn> fBindTexture;
+        GrGLFunction<GrGLBindVertexArrayFn> fBindVertexArray;
+        GrGLFunction<GrGLBlendBarrierFn> fBlendBarrier;
+        GrGLFunction<GrGLBlendColorFn> fBlendColor;
+        GrGLFunction<GrGLBlendEquationFn> fBlendEquation;
+        GrGLFunction<GrGLBlendFuncFn> fBlendFunc;
+        GrGLFunction<GrGLBlitFramebufferFn> fBlitFramebuffer;
+        GrGLFunction<GrGLBufferDataFn> fBufferData;
+        GrGLFunction<GrGLBufferSubDataFn> fBufferSubData;
+        GrGLFunction<GrGLCheckFramebufferStatusFn> fCheckFramebufferStatus;
+        GrGLFunction<GrGLClearFn> fClear;
+        GrGLFunction<GrGLClearColorFn> fClearColor;
+        GrGLFunction<GrGLClearStencilFn> fClearStencil;
+        GrGLFunction<GrGLClearTexImageFn> fClearTexImage;
+        GrGLFunction<GrGLClearTexSubImageFn> fClearTexSubImage;
+        GrGLFunction<GrGLColorMaskFn> fColorMask;
+        GrGLFunction<GrGLCompileShaderFn> fCompileShader;
+        GrGLFunction<GrGLCompressedTexImage2DFn> fCompressedTexImage2D;
+        GrGLFunction<GrGLCompressedTexSubImage2DFn> fCompressedTexSubImage2D;
+        GrGLFunction<GrGLCopyTexSubImage2DFn> fCopyTexSubImage2D;
+        GrGLFunction<GrGLCreateProgramFn> fCreateProgram;
+        GrGLFunction<GrGLCreateShaderFn> fCreateShader;
+        GrGLFunction<GrGLCullFaceFn> fCullFace;
+        GrGLFunction<GrGLDeleteBuffersFn> fDeleteBuffers;
+        GrGLFunction<GrGLDeleteFramebuffersFn> fDeleteFramebuffers;
+        GrGLFunction<GrGLDeleteProgramFn> fDeleteProgram;
+        GrGLFunction<GrGLDeleteQueriesFn> fDeleteQueries;
+        GrGLFunction<GrGLDeleteRenderbuffersFn> fDeleteRenderbuffers;
+        GrGLFunction<GrGLDeleteShaderFn> fDeleteShader;
+        GrGLFunction<GrGLDeleteTexturesFn> fDeleteTextures;
+        GrGLFunction<GrGLDeleteVertexArraysFn> fDeleteVertexArrays;
+        GrGLFunction<GrGLDepthMaskFn> fDepthMask;
+        GrGLFunction<GrGLDisableFn> fDisable;
+        GrGLFunction<GrGLDisableVertexAttribArrayFn> fDisableVertexAttribArray;
+        GrGLFunction<GrGLDrawArraysFn> fDrawArrays;
+        GrGLFunction<GrGLDrawArraysIndirectFn> fDrawArraysIndirect;
+        GrGLFunction<GrGLDrawArraysInstancedFn> fDrawArraysInstanced;
+        GrGLFunction<GrGLDrawBufferFn> fDrawBuffer;
+        GrGLFunction<GrGLDrawBuffersFn> fDrawBuffers;
+        GrGLFunction<GrGLDrawElementsFn> fDrawElements;
+        GrGLFunction<GrGLDrawElementsIndirectFn> fDrawElementsIndirect;
+        GrGLFunction<GrGLDrawElementsInstancedFn> fDrawElementsInstanced;
+        GrGLFunction<GrGLDrawRangeElementsFn> fDrawRangeElements;
+        GrGLFunction<GrGLEnableFn> fEnable;
+        GrGLFunction<GrGLEnableVertexAttribArrayFn> fEnableVertexAttribArray;
+        GrGLFunction<GrGLEndQueryFn> fEndQuery;
+        GrGLFunction<GrGLFinishFn> fFinish;
+        GrGLFunction<GrGLFlushFn> fFlush;
+        GrGLFunction<GrGLFlushMappedBufferRangeFn> fFlushMappedBufferRange;
+        GrGLFunction<GrGLFramebufferRenderbufferFn> fFramebufferRenderbuffer;
+        GrGLFunction<GrGLFramebufferTexture2DFn> fFramebufferTexture2D;
+        GrGLFunction<GrGLFramebufferTexture2DMultisampleFn> fFramebufferTexture2DMultisample;
+        GrGLFunction<GrGLFrontFaceFn> fFrontFace;
+        GrGLFunction<GrGLGenBuffersFn> fGenBuffers;
+        GrGLFunction<GrGLGenFramebuffersFn> fGenFramebuffers;
+        GrGLFunction<GrGLGenerateMipmapFn> fGenerateMipmap;
+        GrGLFunction<GrGLGenQueriesFn> fGenQueries;
+        GrGLFunction<GrGLGenRenderbuffersFn> fGenRenderbuffers;
+        GrGLFunction<GrGLGenTexturesFn> fGenTextures;
+        GrGLFunction<GrGLGenVertexArraysFn> fGenVertexArrays;
+        GrGLFunction<GrGLGetBufferParameterivFn> fGetBufferParameteriv;
+        GrGLFunction<GrGLGetErrorFn> fGetError;
+        GrGLFunction<GrGLGetFramebufferAttachmentParameterivFn> fGetFramebufferAttachmentParameteriv;
+        GrGLFunction<GrGLGetIntegervFn> fGetIntegerv;
+        GrGLFunction<GrGLGetMultisamplefvFn> fGetMultisamplefv;
+        GrGLFunction<GrGLGetProgramBinaryFn> fGetProgramBinary;
+        GrGLFunction<GrGLGetProgramInfoLogFn> fGetProgramInfoLog;
+        GrGLFunction<GrGLGetProgramivFn> fGetProgramiv;
+        GrGLFunction<GrGLGetQueryObjecti64vFn> fGetQueryObjecti64v;
+        GrGLFunction<GrGLGetQueryObjectivFn> fGetQueryObjectiv;
+        GrGLFunction<GrGLGetQueryObjectui64vFn> fGetQueryObjectui64v;
+        GrGLFunction<GrGLGetQueryObjectuivFn> fGetQueryObjectuiv;
+        GrGLFunction<GrGLGetQueryivFn> fGetQueryiv;
+        GrGLFunction<GrGLGetRenderbufferParameterivFn> fGetRenderbufferParameteriv;
+        GrGLFunction<GrGLGetShaderInfoLogFn> fGetShaderInfoLog;
+        GrGLFunction<GrGLGetShaderivFn> fGetShaderiv;
+        GrGLFunction<GrGLGetShaderPrecisionFormatFn> fGetShaderPrecisionFormat;
+        GrGLFunction<GrGLGetStringFn> fGetString;
+        GrGLFunction<GrGLGetStringiFn> fGetStringi;
+        GrGLFunction<GrGLGetTexLevelParameterivFn> fGetTexLevelParameteriv;
+        GrGLFunction<GrGLGetUniformLocationFn> fGetUniformLocation;
+        GrGLFunction<GrGLInsertEventMarkerFn> fInsertEventMarker;
+        GrGLFunction<GrGLInvalidateBufferDataFn> fInvalidateBufferData;
+        GrGLFunction<GrGLInvalidateBufferSubDataFn> fInvalidateBufferSubData;
+        GrGLFunction<GrGLInvalidateFramebufferFn> fInvalidateFramebuffer;
+        GrGLFunction<GrGLInvalidateSubFramebufferFn> fInvalidateSubFramebuffer;
+        GrGLFunction<GrGLInvalidateTexImageFn> fInvalidateTexImage;
+        GrGLFunction<GrGLInvalidateTexSubImageFn> fInvalidateTexSubImage;
+        GrGLFunction<GrGLIsTextureFn> fIsTexture;
+        GrGLFunction<GrGLLineWidthFn> fLineWidth;
+        GrGLFunction<GrGLLinkProgramFn> fLinkProgram;
+        GrGLFunction<GrGLProgramBinaryFn> fProgramBinary;
+        GrGLFunction<GrGLProgramParameteriFn> fProgramParameteri;
+        GrGLFunction<GrGLMapBufferFn> fMapBuffer;
+        GrGLFunction<GrGLMapBufferRangeFn> fMapBufferRange;
+        GrGLFunction<GrGLMapBufferSubDataFn> fMapBufferSubData;
+        GrGLFunction<GrGLMapTexSubImage2DFn> fMapTexSubImage2D;
+        GrGLFunction<GrGLMultiDrawArraysIndirectFn> fMultiDrawArraysIndirect;
+        GrGLFunction<GrGLMultiDrawElementsIndirectFn> fMultiDrawElementsIndirect;
+        GrGLFunction<GrGLPixelStoreiFn> fPixelStorei;
+        GrGLFunction<GrGLPolygonModeFn> fPolygonMode;
+        GrGLFunction<GrGLPopGroupMarkerFn> fPopGroupMarker;
+        GrGLFunction<GrGLPushGroupMarkerFn> fPushGroupMarker;
+        GrGLFunction<GrGLQueryCounterFn> fQueryCounter;
+        GrGLFunction<GrGLRasterSamplesFn> fRasterSamples;
+        GrGLFunction<GrGLReadBufferFn> fReadBuffer;
+        GrGLFunction<GrGLReadPixelsFn> fReadPixels;
+        GrGLFunction<GrGLRenderbufferStorageFn> fRenderbufferStorage;
 
         //  On OpenGL ES there are multiple incompatible extensions that add support for MSAA
         //  and ES3 adds MSAA support to the standard. On an ES3 driver we may still use the
@@ -212,127 +212,127 @@
         //  functionality.
 
         //  GL_EXT_multisampled_render_to_texture (preferred) or GL_IMG_multisampled_render_to_texture
-        GrGLFunction<GrGLRenderbufferStorageMultisampleProc> fRenderbufferStorageMultisampleES2EXT;
+        GrGLFunction<GrGLRenderbufferStorageMultisampleFn> fRenderbufferStorageMultisampleES2EXT;
         //  GL_APPLE_framebuffer_multisample
-        GrGLFunction<GrGLRenderbufferStorageMultisampleProc> fRenderbufferStorageMultisampleES2APPLE;
+        GrGLFunction<GrGLRenderbufferStorageMultisampleFn> fRenderbufferStorageMultisampleES2APPLE;
 
         //  This is used to store the pointer for GL_ARB/EXT/ANGLE/CHROMIUM_framebuffer_multisample or
         //  the standard function in ES3+ or GL 3.0+.
-        GrGLFunction<GrGLRenderbufferStorageMultisampleProc> fRenderbufferStorageMultisample;
+        GrGLFunction<GrGLRenderbufferStorageMultisampleFn> fRenderbufferStorageMultisample;
 
         // Pointer to BindUniformLocationCHROMIUM from the GL_CHROMIUM_bind_uniform_location extension.
-        GrGLFunction<GrGLBindUniformLocationProc> fBindUniformLocation;
+        GrGLFunction<GrGLBindUniformLocationFn> fBindUniformLocation;
 
-        GrGLFunction<GrGLResolveMultisampleFramebufferProc> fResolveMultisampleFramebuffer;
-        GrGLFunction<GrGLScissorProc> fScissor;
-        GrGLFunction<GrGLShaderSourceProc> fShaderSource;
-        GrGLFunction<GrGLStencilFuncProc> fStencilFunc;
-        GrGLFunction<GrGLStencilFuncSeparateProc> fStencilFuncSeparate;
-        GrGLFunction<GrGLStencilMaskProc> fStencilMask;
-        GrGLFunction<GrGLStencilMaskSeparateProc> fStencilMaskSeparate;
-        GrGLFunction<GrGLStencilOpProc> fStencilOp;
-        GrGLFunction<GrGLStencilOpSeparateProc> fStencilOpSeparate;
-        GrGLFunction<GrGLTexBufferProc> fTexBuffer;
-        GrGLFunction<GrGLTexBufferRangeProc> fTexBufferRange;
-        GrGLFunction<GrGLTexImage2DProc> fTexImage2D;
-        GrGLFunction<GrGLTexParameteriProc> fTexParameteri;
-        GrGLFunction<GrGLTexParameterivProc> fTexParameteriv;
-        GrGLFunction<GrGLTexSubImage2DProc> fTexSubImage2D;
-        GrGLFunction<GrGLTexStorage2DProc> fTexStorage2D;
-        GrGLFunction<GrGLTextureBarrierProc> fTextureBarrier;
-        GrGLFunction<GrGLDiscardFramebufferProc> fDiscardFramebuffer;
-        GrGLFunction<GrGLUniform1fProc> fUniform1f;
-        GrGLFunction<GrGLUniform1iProc> fUniform1i;
-        GrGLFunction<GrGLUniform1fvProc> fUniform1fv;
-        GrGLFunction<GrGLUniform1ivProc> fUniform1iv;
-        GrGLFunction<GrGLUniform2fProc> fUniform2f;
-        GrGLFunction<GrGLUniform2iProc> fUniform2i;
-        GrGLFunction<GrGLUniform2fvProc> fUniform2fv;
-        GrGLFunction<GrGLUniform2ivProc> fUniform2iv;
-        GrGLFunction<GrGLUniform3fProc> fUniform3f;
-        GrGLFunction<GrGLUniform3iProc> fUniform3i;
-        GrGLFunction<GrGLUniform3fvProc> fUniform3fv;
-        GrGLFunction<GrGLUniform3ivProc> fUniform3iv;
-        GrGLFunction<GrGLUniform4fProc> fUniform4f;
-        GrGLFunction<GrGLUniform4iProc> fUniform4i;
-        GrGLFunction<GrGLUniform4fvProc> fUniform4fv;
-        GrGLFunction<GrGLUniform4ivProc> fUniform4iv;
-        GrGLFunction<GrGLUniformMatrix2fvProc> fUniformMatrix2fv;
-        GrGLFunction<GrGLUniformMatrix3fvProc> fUniformMatrix3fv;
-        GrGLFunction<GrGLUniformMatrix4fvProc> fUniformMatrix4fv;
-        GrGLFunction<GrGLUnmapBufferProc> fUnmapBuffer;
-        GrGLFunction<GrGLUnmapBufferSubDataProc> fUnmapBufferSubData;
-        GrGLFunction<GrGLUnmapTexSubImage2DProc> fUnmapTexSubImage2D;
-        GrGLFunction<GrGLUseProgramProc> fUseProgram;
-        GrGLFunction<GrGLVertexAttrib1fProc> fVertexAttrib1f;
-        GrGLFunction<GrGLVertexAttrib2fvProc> fVertexAttrib2fv;
-        GrGLFunction<GrGLVertexAttrib3fvProc> fVertexAttrib3fv;
-        GrGLFunction<GrGLVertexAttrib4fvProc> fVertexAttrib4fv;
-        GrGLFunction<GrGLVertexAttribDivisorProc> fVertexAttribDivisor;
-        GrGLFunction<GrGLVertexAttribIPointerProc> fVertexAttribIPointer;
-        GrGLFunction<GrGLVertexAttribPointerProc> fVertexAttribPointer;
-        GrGLFunction<GrGLViewportProc> fViewport;
+        GrGLFunction<GrGLResolveMultisampleFramebufferFn> fResolveMultisampleFramebuffer;
+        GrGLFunction<GrGLScissorFn> fScissor;
+        GrGLFunction<GrGLShaderSourceFn> fShaderSource;
+        GrGLFunction<GrGLStencilFuncFn> fStencilFunc;
+        GrGLFunction<GrGLStencilFuncSeparateFn> fStencilFuncSeparate;
+        GrGLFunction<GrGLStencilMaskFn> fStencilMask;
+        GrGLFunction<GrGLStencilMaskSeparateFn> fStencilMaskSeparate;
+        GrGLFunction<GrGLStencilOpFn> fStencilOp;
+        GrGLFunction<GrGLStencilOpSeparateFn> fStencilOpSeparate;
+        GrGLFunction<GrGLTexBufferFn> fTexBuffer;
+        GrGLFunction<GrGLTexBufferRangeFn> fTexBufferRange;
+        GrGLFunction<GrGLTexImage2DFn> fTexImage2D;
+        GrGLFunction<GrGLTexParameteriFn> fTexParameteri;
+        GrGLFunction<GrGLTexParameterivFn> fTexParameteriv;
+        GrGLFunction<GrGLTexSubImage2DFn> fTexSubImage2D;
+        GrGLFunction<GrGLTexStorage2DFn> fTexStorage2D;
+        GrGLFunction<GrGLTextureBarrierFn> fTextureBarrier;
+        GrGLFunction<GrGLDiscardFramebufferFn> fDiscardFramebuffer;
+        GrGLFunction<GrGLUniform1fFn> fUniform1f;
+        GrGLFunction<GrGLUniform1iFn> fUniform1i;
+        GrGLFunction<GrGLUniform1fvFn> fUniform1fv;
+        GrGLFunction<GrGLUniform1ivFn> fUniform1iv;
+        GrGLFunction<GrGLUniform2fFn> fUniform2f;
+        GrGLFunction<GrGLUniform2iFn> fUniform2i;
+        GrGLFunction<GrGLUniform2fvFn> fUniform2fv;
+        GrGLFunction<GrGLUniform2ivFn> fUniform2iv;
+        GrGLFunction<GrGLUniform3fFn> fUniform3f;
+        GrGLFunction<GrGLUniform3iFn> fUniform3i;
+        GrGLFunction<GrGLUniform3fvFn> fUniform3fv;
+        GrGLFunction<GrGLUniform3ivFn> fUniform3iv;
+        GrGLFunction<GrGLUniform4fFn> fUniform4f;
+        GrGLFunction<GrGLUniform4iFn> fUniform4i;
+        GrGLFunction<GrGLUniform4fvFn> fUniform4fv;
+        GrGLFunction<GrGLUniform4ivFn> fUniform4iv;
+        GrGLFunction<GrGLUniformMatrix2fvFn> fUniformMatrix2fv;
+        GrGLFunction<GrGLUniformMatrix3fvFn> fUniformMatrix3fv;
+        GrGLFunction<GrGLUniformMatrix4fvFn> fUniformMatrix4fv;
+        GrGLFunction<GrGLUnmapBufferFn> fUnmapBuffer;
+        GrGLFunction<GrGLUnmapBufferSubDataFn> fUnmapBufferSubData;
+        GrGLFunction<GrGLUnmapTexSubImage2DFn> fUnmapTexSubImage2D;
+        GrGLFunction<GrGLUseProgramFn> fUseProgram;
+        GrGLFunction<GrGLVertexAttrib1fFn> fVertexAttrib1f;
+        GrGLFunction<GrGLVertexAttrib2fvFn> fVertexAttrib2fv;
+        GrGLFunction<GrGLVertexAttrib3fvFn> fVertexAttrib3fv;
+        GrGLFunction<GrGLVertexAttrib4fvFn> fVertexAttrib4fv;
+        GrGLFunction<GrGLVertexAttribDivisorFn> fVertexAttribDivisor;
+        GrGLFunction<GrGLVertexAttribIPointerFn> fVertexAttribIPointer;
+        GrGLFunction<GrGLVertexAttribPointerFn> fVertexAttribPointer;
+        GrGLFunction<GrGLViewportFn> fViewport;
 
         /* GL_NV_path_rendering */
-        GrGLFunction<GrGLMatrixLoadfProc> fMatrixLoadf;
-        GrGLFunction<GrGLMatrixLoadIdentityProc> fMatrixLoadIdentity;
-        GrGLFunction<GrGLGetProgramResourceLocationProc> fGetProgramResourceLocation;
-        GrGLFunction<GrGLPathCommandsProc> fPathCommands;
-        GrGLFunction<GrGLPathParameteriProc> fPathParameteri;
-        GrGLFunction<GrGLPathParameterfProc> fPathParameterf;
-        GrGLFunction<GrGLGenPathsProc> fGenPaths;
-        GrGLFunction<GrGLDeletePathsProc> fDeletePaths;
-        GrGLFunction<GrGLIsPathProc> fIsPath;
-        GrGLFunction<GrGLPathStencilFuncProc> fPathStencilFunc;
-        GrGLFunction<GrGLStencilFillPathProc> fStencilFillPath;
-        GrGLFunction<GrGLStencilStrokePathProc> fStencilStrokePath;
-        GrGLFunction<GrGLStencilFillPathInstancedProc> fStencilFillPathInstanced;
-        GrGLFunction<GrGLStencilStrokePathInstancedProc> fStencilStrokePathInstanced;
-        GrGLFunction<GrGLCoverFillPathProc> fCoverFillPath;
-        GrGLFunction<GrGLCoverStrokePathProc> fCoverStrokePath;
-        GrGLFunction<GrGLCoverFillPathInstancedProc> fCoverFillPathInstanced;
-        GrGLFunction<GrGLCoverStrokePathInstancedProc> fCoverStrokePathInstanced;
+        GrGLFunction<GrGLMatrixLoadfFn> fMatrixLoadf;
+        GrGLFunction<GrGLMatrixLoadIdentityFn> fMatrixLoadIdentity;
+        GrGLFunction<GrGLGetProgramResourceLocationFn> fGetProgramResourceLocation;
+        GrGLFunction<GrGLPathCommandsFn> fPathCommands;
+        GrGLFunction<GrGLPathParameteriFn> fPathParameteri;
+        GrGLFunction<GrGLPathParameterfFn> fPathParameterf;
+        GrGLFunction<GrGLGenPathsFn> fGenPaths;
+        GrGLFunction<GrGLDeletePathsFn> fDeletePaths;
+        GrGLFunction<GrGLIsPathFn> fIsPath;
+        GrGLFunction<GrGLPathStencilFuncFn> fPathStencilFunc;
+        GrGLFunction<GrGLStencilFillPathFn> fStencilFillPath;
+        GrGLFunction<GrGLStencilStrokePathFn> fStencilStrokePath;
+        GrGLFunction<GrGLStencilFillPathInstancedFn> fStencilFillPathInstanced;
+        GrGLFunction<GrGLStencilStrokePathInstancedFn> fStencilStrokePathInstanced;
+        GrGLFunction<GrGLCoverFillPathFn> fCoverFillPath;
+        GrGLFunction<GrGLCoverStrokePathFn> fCoverStrokePath;
+        GrGLFunction<GrGLCoverFillPathInstancedFn> fCoverFillPathInstanced;
+        GrGLFunction<GrGLCoverStrokePathInstancedFn> fCoverStrokePathInstanced;
         // NV_path_rendering v1.2
-        GrGLFunction<GrGLStencilThenCoverFillPathProc> fStencilThenCoverFillPath;
-        GrGLFunction<GrGLStencilThenCoverStrokePathProc> fStencilThenCoverStrokePath;
-        GrGLFunction<GrGLStencilThenCoverFillPathInstancedProc> fStencilThenCoverFillPathInstanced;
-        GrGLFunction<GrGLStencilThenCoverStrokePathInstancedProc> fStencilThenCoverStrokePathInstanced;
+        GrGLFunction<GrGLStencilThenCoverFillPathFn> fStencilThenCoverFillPath;
+        GrGLFunction<GrGLStencilThenCoverStrokePathFn> fStencilThenCoverStrokePath;
+        GrGLFunction<GrGLStencilThenCoverFillPathInstancedFn> fStencilThenCoverFillPathInstanced;
+        GrGLFunction<GrGLStencilThenCoverStrokePathInstancedFn> fStencilThenCoverStrokePathInstanced;
         // NV_path_rendering v1.3
-        GrGLFunction<GrGLProgramPathFragmentInputGenProc> fProgramPathFragmentInputGen;
+        GrGLFunction<GrGLProgramPathFragmentInputGenFn> fProgramPathFragmentInputGen;
         // CHROMIUM_path_rendering
-        GrGLFunction<GrGLBindFragmentInputLocationProc> fBindFragmentInputLocation;
+        GrGLFunction<GrGLBindFragmentInputLocationFn> fBindFragmentInputLocation;
 
         /* NV_framebuffer_mixed_samples */
-        GrGLFunction<GrGLCoverageModulationProc> fCoverageModulation;
+        GrGLFunction<GrGLCoverageModulationFn> fCoverageModulation;
 
         /* ARB_sample_shading */
-        GrGLFunction<GrGLMinSampleShadingProc> fMinSampleShading;
+        GrGLFunction<GrGLMinSampleShadingFn> fMinSampleShading;
 
         /* ARB_sync */
-        GrGLFunction<GrGLFenceSyncProc> fFenceSync;
-        GrGLFunction<GrGLIsSyncProc> fIsSync;
-        GrGLFunction<GrGLClientWaitSyncProc> fClientWaitSync;
-        GrGLFunction<GrGLWaitSyncProc> fWaitSync;
-        GrGLFunction<GrGLDeleteSyncProc> fDeleteSync;
+        GrGLFunction<GrGLFenceSyncFn> fFenceSync;
+        GrGLFunction<GrGLIsSyncFn> fIsSync;
+        GrGLFunction<GrGLClientWaitSyncFn> fClientWaitSync;
+        GrGLFunction<GrGLWaitSyncFn> fWaitSync;
+        GrGLFunction<GrGLDeleteSyncFn> fDeleteSync;
 
         /* ARB_internalforamt_query */
-        GrGLFunction<GrGLGetInternalformativProc> fGetInternalformativ;
+        GrGLFunction<GrGLGetInternalformativFn> fGetInternalformativ;
 
         /* KHR_debug */
-        GrGLFunction<GrGLDebugMessageControlProc> fDebugMessageControl;
-        GrGLFunction<GrGLDebugMessageInsertProc> fDebugMessageInsert;
-        GrGLFunction<GrGLDebugMessageCallbackProc> fDebugMessageCallback;
-        GrGLFunction<GrGLGetDebugMessageLogProc> fGetDebugMessageLog;
-        GrGLFunction<GrGLPushDebugGroupProc> fPushDebugGroup;
-        GrGLFunction<GrGLPopDebugGroupProc> fPopDebugGroup;
-        GrGLFunction<GrGLObjectLabelProc> fObjectLabel;
+        GrGLFunction<GrGLDebugMessageControlFn> fDebugMessageControl;
+        GrGLFunction<GrGLDebugMessageInsertFn> fDebugMessageInsert;
+        GrGLFunction<GrGLDebugMessageCallbackFn> fDebugMessageCallback;
+        GrGLFunction<GrGLGetDebugMessageLogFn> fGetDebugMessageLog;
+        GrGLFunction<GrGLPushDebugGroupFn> fPushDebugGroup;
+        GrGLFunction<GrGLPopDebugGroupFn> fPopDebugGroup;
+        GrGLFunction<GrGLObjectLabelFn> fObjectLabel;
 
         /* EXT_window_rectangles */
-        GrGLFunction<GrGLWindowRectanglesProc> fWindowRectangles;
+        GrGLFunction<GrGLWindowRectanglesFn> fWindowRectangles;
 
         /* EGL functions */
-        GrGLFunction<GrEGLCreateImageProc> fEGLCreateImage;
-        GrGLFunction<GrEGLDestroyImageProc> fEGLDestroyImage;
+        GrGLFunction<GrEGLCreateImageFn> fEGLCreateImage;
+        GrGLFunction<GrEGLDestroyImageFn> fEGLDestroyImage;
     } fFunctions;
 
     // This exists for internal testing.
diff --git a/src/gpu/gl/GrGLAssembleInterface.cpp b/src/gpu/gl/GrGLAssembleInterface.cpp
index 6282488..34d9265 100644
--- a/src/gpu/gl/GrGLAssembleInterface.cpp
+++ b/src/gpu/gl/GrGLAssembleInterface.cpp
@@ -9,11 +9,11 @@
 #include "gl/GrGLAssembleInterface.h"
 #include "GrGLUtil.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_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 ## Proc) get(ctx, "egl" #F #S)
+#define GET_EGL_PROC_SUFFIX(F, S) functions->fEGL##F = (GrEGL##F##Fn*)get(ctx, "egl" #F #S)
 
 sk_sp<const GrGLInterface> GrGLMakeAssembledInterface(void *ctx, GrGLGetProc get) {
     GET_PROC_LOCAL(GetString);
@@ -36,13 +36,13 @@
     return nullptr;
 }
 
-static void get_egl_query_and_display(GrEGLQueryStringProc* queryString, GrEGLDisplay* display,
+static void get_egl_query_and_display(GrEGLQueryStringFn** queryString, GrEGLDisplay* display,
                                       void* ctx, GrGLGetProc get) {
-    *queryString = (GrEGLQueryStringProc) get(ctx, "eglQueryString");
+    *queryString = (GrEGLQueryStringFn*)get(ctx, "eglQueryString");
     *display = GR_EGL_NO_DISPLAY;
     if (*queryString) {
-        GrEGLGetCurrentDisplayProc getCurrentDisplay =
-            (GrEGLGetCurrentDisplayProc) get(ctx, "eglGetCurrentDisplay");
+        GrEGLGetCurrentDisplayFn* getCurrentDisplay =
+                (GrEGLGetCurrentDisplayFn*)get(ctx, "eglGetCurrentDisplay");
         if (getCurrentDisplay) {
             *display = getCurrentDisplay();
         } else {
@@ -69,7 +69,7 @@
         return nullptr;
     }
 
-    GrEGLQueryStringProc queryString;
+    GrEGLQueryStringFn* queryString;
     GrEGLDisplay display;
     get_egl_query_and_display(&queryString, &display, ctx, get);
     GrGLExtensions extensions;
@@ -429,7 +429,7 @@
 
     GET_PROC_LOCAL(GetIntegerv);
     GET_PROC_LOCAL(GetStringi);
-    GrEGLQueryStringProc queryString;
+    GrEGLQueryStringFn* queryString;
     GrEGLDisplay display;
     get_egl_query_and_display(&queryString, &display, ctx, get);
     GrGLExtensions extensions;
@@ -666,12 +666,18 @@
 
     if (extensions.has("GL_EXT_multisampled_render_to_texture")) {
         GET_PROC_SUFFIX(FramebufferTexture2DMultisample, EXT);
-        functions->fRenderbufferStorageMultisampleES2EXT = (GrGLRenderbufferStorageMultisampleProc) get(ctx, "glRenderbufferStorageMultisampleEXT");
+        functions->fRenderbufferStorageMultisampleES2EXT =
+                (GrGLRenderbufferStorageMultisampleFn*)get(ctx,
+                                                           "glRenderbufferStorageMultisampleEXT");
     } else if (extensions.has("GL_IMG_multisampled_render_to_texture")) {
         GET_PROC_SUFFIX(FramebufferTexture2DMultisample, IMG);
-        functions->fRenderbufferStorageMultisampleES2EXT = (GrGLRenderbufferStorageMultisampleProc) get(ctx, "glRenderbufferStorageMultisampleIMG");
+        functions->fRenderbufferStorageMultisampleES2EXT =
+                (GrGLRenderbufferStorageMultisampleFn*)get(ctx,
+                                                           "glRenderbufferStorageMultisampleIMG");
     } else if (extensions.has("GL_APPLE_framebuffer_multisample")) {
-        functions->fRenderbufferStorageMultisampleES2APPLE = (GrGLRenderbufferStorageMultisampleProc) get(ctx, "glRenderbufferStorageMultisampleAPPLE");
+        functions->fRenderbufferStorageMultisampleES2APPLE =
+                (GrGLRenderbufferStorageMultisampleFn*)get(ctx,
+                                                           "glRenderbufferStorageMultisampleAPPLE");
         GET_PROC_SUFFIX(ResolveMultisampleFramebuffer, APPLE);
     }
 
diff --git a/src/gpu/gl/GrGLExtensions.cpp b/src/gpu/gl/GrGLExtensions.cpp
index 6530eaf..b6898c4 100644
--- a/src/gpu/gl/GrGLExtensions.cpp
+++ b/src/gpu/gl/GrGLExtensions.cpp
@@ -66,10 +66,10 @@
 }
 
 bool GrGLExtensions::init(GrGLStandard standard,
-                          GrGLFunction<GrGLGetStringProc> getString,
-                          GrGLFunction<GrGLGetStringiProc> getStringi,
-                          GrGLFunction<GrGLGetIntegervProc> getIntegerv,
-                          GrGLFunction<GrEGLQueryStringProc> queryString,
+                          GrGLFunction<GrGLGetStringFn> getString,
+                          GrGLFunction<GrGLGetStringiFn> getStringi,
+                          GrGLFunction<GrGLGetIntegervFn> getIntegerv,
+                          GrGLFunction<GrEGLQueryStringFn> queryString,
                           GrEGLDisplay eglDisplay) {
     fInitialized = false;
     fStrings.reset();
diff --git a/src/gpu/gl/GrGLTestInterface.cpp b/src/gpu/gl/GrGLTestInterface.cpp
index 3874048..e44deec 100644
--- a/src/gpu/gl/GrGLTestInterface.cpp
+++ b/src/gpu/gl/GrGLTestInterface.cpp
@@ -8,11 +8,11 @@
 #include "GrGLTestInterface.h"
 
 namespace {
-    template<typename R, typename... A>
-    GrGLFunction<R(*)(A...)> bind_to_member(GrGLTestInterface* interface,
-                                            R (GrGLTestInterface::*member)(A...)) {
-        return [interface, member] (A... a) -> R { return (interface->*member)(a...); };
-    }
+template <typename R, typename... A>
+GrGLFunction<R GR_GL_FUNCTION_TYPE(A...)> bind_to_member(GrGLTestInterface* interface,
+                                                         R (GrGLTestInterface::*member)(A...)) {
+    return [interface, member](A... a) -> R { return (interface->*member)(a...); };
+}
 }  // anonymous namespace
 
 GrGLTestInterface::GrGLTestInterface() {
diff --git a/src/gpu/gl/win/GrGLMakeNativeInterface_win.cpp b/src/gpu/gl/win/GrGLMakeNativeInterface_win.cpp
index 2a2cedd..3b5951f 100644
--- a/src/gpu/gl/win/GrGLMakeNativeInterface_win.cpp
+++ b/src/gpu/gl/win/GrGLMakeNativeInterface_win.cpp
@@ -72,7 +72,7 @@
         return nullptr;
     }
 
-    GrGLGetStringProc getString = (GrGLGetStringProc)getter.getProc("glGetString");
+    GrGLGetStringFn* getString = (GrGLGetStringFn*)getter.getProc("glGetString");
     if (nullptr == getString) {
         return nullptr;
     }