GrGLCreateNativeInterface_win.cpp revision 0efcc37952afb7629a5c905cc597f1cb837b987c
1f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com */
8f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com
9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
106c8c34e65ff8248ec7374e0d662d7f5684d800fatomhudson@google.com#include "gl/GrGLInterface.h"
119c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com#include "../GrGLUtil.h"
12373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com#define WIN32_LEAN_AND_MEAN
13f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com#include <Windows.h>
14f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com#include <GL/GL.h>
15f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com
16f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com/*
17f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com * Windows makes the GL funcs all be __stdcall instead of __cdecl :(
18f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com * This implementation will only work if GR_GL_FUNCTION_TYPE is __stdcall.
19f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com * Otherwise, a springboard would be needed that hides the calling convention.
20f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com */
21f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com
226fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com#define GR_GL_GET_PROC(F) interface->f ## F = (GrGL ## F ## Proc) wglGetProcAddress("gl" #F);
236fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com#define GR_GL_GET_PROC_SUFFIX(F, S) interface->f ## F = (GrGL ## F ## Proc) wglGetProcAddress("gl" #F #S);
24747bf293d47d7437791caed8e8990370b57a7766tomhudson@google.com
25373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.comconst GrGLInterface* GrGLCreateNativeInterface() {
260b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com    // wglGetProcAddress requires a context.
276fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com    // GL Function pointers retrieved in one context may not be valid in another
286fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com    // context. For that reason we create a new GrGLInterface each time we're
296fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com    // called.
300b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com    if (NULL != wglGetCurrentContext()) {
310b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        const char* versionString = (const char*) glGetString(GL_VERSION);
320b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        const char* extString = (const char*) glGetString(GL_EXTENSIONS);
33c82b8899d97c2a26f5991bc771ad3beb8257edaebsalomon@google.com        GrGLVersion glVer = GrGLGetVersionFromString(versionString);
34f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com
35c82b8899d97c2a26f5991bc771ad3beb8257edaebsalomon@google.com        if (glVer < GR_GL_VER(1,5)) {
360b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            // We must have array and element_array buffer objects.
376fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com            return NULL;
380b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        }
396fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        GrGLInterface* interface = new GrGLInterface();
40f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com
410b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        // Functions that are part of GL 1.1 will return NULL in
420b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        // wglGetProcAddress
437d1276ff67bc8a03f1c62c10ed05dae87349f782bsalomon@google.com        interface->fBindTexture = glBindTexture;
446fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fBlendFunc = glBlendFunc;
45e788430144d1474329878abd1ddb39cc0ca52a0arobertphillips@google.com
46e788430144d1474329878abd1ddb39cc0ca52a0arobertphillips@google.com        if (glVer >= GR_GL_VER(1,4) ||
470efcc37952afb7629a5c905cc597f1cb837b987cbsalomon@google.com            GrGLHasExtensionFromString("GL_ARB_imaging", extString) ||
480efcc37952afb7629a5c905cc597f1cb837b987cbsalomon@google.com            GrGLHasExtensionFromString("GL_EXT_blend_color", extString)) {
49e788430144d1474329878abd1ddb39cc0ca52a0arobertphillips@google.com            GR_GL_GET_PROC(BlendColor);
500efcc37952afb7629a5c905cc597f1cb837b987cbsalomon@google.com        }
51e788430144d1474329878abd1ddb39cc0ca52a0arobertphillips@google.com
526fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fClear = glClear;
536fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fClearColor = glClearColor;
546fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fClearStencil = glClearStencil;
556fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fColorMask = glColorMask;
566fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fCullFace = glCullFace;
576fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fDeleteTextures = glDeleteTextures;
586fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fDepthMask = glDepthMask;
596fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fDisable = glDisable;
606fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fDrawArrays = glDrawArrays;
616fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fDrawElements = glDrawElements;
626fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fDrawBuffer = glDrawBuffer;
636fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fEnable = glEnable;
646fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fFrontFace = glFrontFace;
65373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com        interface->fFinish = glFinish;
66373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com        interface->fFlush = glFlush;
676fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fGenTextures = glGenTextures;
686fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fGetError = glGetError;
696fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fGetIntegerv = glGetIntegerv;
706fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fGetString = glGetString;
716fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fGetTexLevelParameteriv = glGetTexLevelParameteriv;
726fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fLineWidth = glLineWidth;
73fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com        interface->fLoadIdentity = glLoadIdentity;
74fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com        interface->fLoadMatrixf = glLoadMatrixf;
75fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com        interface->fMatrixMode = glMatrixMode;
766fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fPixelStorei = glPixelStorei;
776fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fReadBuffer = glReadBuffer;
786fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fReadPixels = glReadPixels;
796fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fScissor = glScissor;
806fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fStencilFunc = glStencilFunc;
816fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fStencilMask = glStencilMask;
826fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fStencilOp = glStencilOp;
836fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fTexImage2D = glTexImage2D;
846fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fTexParameteri = glTexParameteri;
854d063dea5ee9d5a62e3566a07cb8386cb1a59585bsalomon@google.com        interface->fTexParameteriv = glTexParameteriv;
86280e99f1a61f2cf66a8ee9b9e6c517f3d2290de7bsalomon@google.com        if (glVer >= GR_GL_VER(4,2) ||
87280e99f1a61f2cf66a8ee9b9e6c517f3d2290de7bsalomon@google.com            GrGLHasExtensionFromString("GL_ARB_texture_storage", extString)) {
88280e99f1a61f2cf66a8ee9b9e6c517f3d2290de7bsalomon@google.com            GR_GL_GET_PROC(TexStorage2D);
89280e99f1a61f2cf66a8ee9b9e6c517f3d2290de7bsalomon@google.com        } else if (GrGLHasExtensionFromString("GL_EXT_texture_storage", extString)) {
90280e99f1a61f2cf66a8ee9b9e6c517f3d2290de7bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(TexStorage2D, EXT);
91280e99f1a61f2cf66a8ee9b9e6c517f3d2290de7bsalomon@google.com        }
926fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fTexSubImage2D = glTexSubImage2D;
936fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fViewport = glViewport;
94f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com
950b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(ActiveTexture);
960b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(AttachShader);
97f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com        GR_GL_GET_PROC(BeginQuery);
980b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(BindAttribLocation);
990b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(BindBuffer);
100bc5cf51627505f763586100675aa60b66d743c7ebsalomon@google.com        GR_GL_GET_PROC(BindFragDataLocation);
1010b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(BufferData);
1020b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(BufferSubData);
1030b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(CompileShader);
1040b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(CompressedTexImage2D);
1050b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(CreateProgram);
1060b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(CreateShader);
1070b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(DeleteBuffers);
108f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com        GR_GL_GET_PROC(DeleteQueries);
1090b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(DeleteProgram);
1100b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(DeleteShader);
1110b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(DisableVertexAttribArray);
1120b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(DrawBuffers);
1130b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(EnableVertexAttribArray);
114f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com        GR_GL_GET_PROC(EndQuery);
1150b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(GenBuffers);
116f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com        GR_GL_GET_PROC(GenQueries);
1170b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(GetBufferParameteriv);
118f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com        GR_GL_GET_PROC(GetQueryiv);
119f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com        GR_GL_GET_PROC(GetQueryObjectiv);
120f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com        GR_GL_GET_PROC(GetQueryObjectuiv);
121f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com        if (glVer > GR_GL_VER(3,3) ||
122f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com            GrGLHasExtensionFromString("GL_ARB_timer_query", extString)) {
123f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com            GR_GL_GET_PROC(GetQueryObjecti64v);
124f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com            GR_GL_GET_PROC(GetQueryObjectui64v);
125f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com            GR_GL_GET_PROC(QueryCounter);
126f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com        } else if (GrGLHasExtensionFromString("GL_EXT_timer_query", extString)) {
127f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GetQueryObjecti64v, EXT);
128e173992c2319205fdc263ccd10d7a9018c23013cbsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GetQueryObjectui64v, EXT);
129f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com        }
1300b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(GetProgramInfoLog);
1310b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(GetProgramiv);
1320b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(GetShaderInfoLog);
1330b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(GetShaderiv);
1340b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(GetUniformLocation);
1350b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(LinkProgram);
136c9668ecdb7188a90b050771727da899c54dc7013bsalomon@google.com        if (GrGLHasExtensionFromString("GL_NV_framebuffer_multisample_coverage", extString)) {
137c9668ecdb7188a90b050771727da899c54dc7013bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(RenderbufferStorageMultisampleCoverage, NV);
138c9668ecdb7188a90b050771727da899c54dc7013bsalomon@google.com        }
1390b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(ShaderSource);
1400b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(StencilFuncSeparate);
1410b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(StencilMaskSeparate);
1420b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(StencilOpSeparate);
1430b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(Uniform1f);
1440b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(Uniform1i);
1450b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(Uniform1fv);
1460b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(Uniform1iv);
1470b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(Uniform2f);
1480b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(Uniform2i);
1490b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(Uniform2fv);
1500b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(Uniform2iv);
1510b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(Uniform3f);
1520b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(Uniform3i);
1530b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(Uniform3fv);
1540b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(Uniform3iv);
1550b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(Uniform4f);
1560b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(Uniform4i);
1570b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(Uniform4fv);
1580b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(Uniform4iv);
1590b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(UniformMatrix2fv);
1600b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(UniformMatrix3fv);
1610b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(UniformMatrix4fv);
1620b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(UseProgram);
1630b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(VertexAttrib4fv);
1640b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(VertexAttribPointer);
1650b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(BindFragDataLocationIndexed);
166f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com
1670b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        // First look for GL3.0 FBO or GL_ARB_framebuffer_object (same since
1680b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        // GL_ARB_framebuffer_object doesn't use ARB suffix.)
169c82b8899d97c2a26f5991bc771ad3beb8257edaebsalomon@google.com        if (glVer > GR_GL_VER(3,0) ||
170c82b8899d97c2a26f5991bc771ad3beb8257edaebsalomon@google.com            GrGLHasExtensionFromString("GL_ARB_framebuffer_object", extString)) {
1710b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC(GenFramebuffers);
1720b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC(GetFramebufferAttachmentParameteriv);
1730b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC(GetRenderbufferParameteriv);
1740b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC(BindFramebuffer);
1750b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC(FramebufferTexture2D);
1760b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC(CheckFramebufferStatus);
1770b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC(DeleteFramebuffers);
1780b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC(RenderbufferStorage);
1790b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC(GenRenderbuffers);
1800b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC(DeleteRenderbuffers);
1810b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC(FramebufferRenderbuffer);
1820b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC(BindRenderbuffer);
1830b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC(RenderbufferStorageMultisample);
1840b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC(BlitFramebuffer);
185c82b8899d97c2a26f5991bc771ad3beb8257edaebsalomon@google.com        } else if (GrGLHasExtensionFromString("GL_EXT_framebuffer_object",
186c82b8899d97c2a26f5991bc771ad3beb8257edaebsalomon@google.com                   extString)) {
1870b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GenFramebuffers, EXT);
1880b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GetFramebufferAttachmentParameteriv, EXT);
1890b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GetRenderbufferParameteriv, EXT);
1900b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(BindFramebuffer, EXT);
1910b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(FramebufferTexture2D, EXT);
1920b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(CheckFramebufferStatus, EXT);
1930b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(DeleteFramebuffers, EXT);
1940b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(RenderbufferStorage, EXT);
1950b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GenRenderbuffers, EXT);
1960b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(DeleteRenderbuffers, EXT);
1970b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(FramebufferRenderbuffer, EXT);
1980b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(BindRenderbuffer, EXT);
199c82b8899d97c2a26f5991bc771ad3beb8257edaebsalomon@google.com            if (GrGLHasExtensionFromString("GL_EXT_framebuffer_multisample", extString)) {
2000b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com                GR_GL_GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT);
2010b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            }
202c82b8899d97c2a26f5991bc771ad3beb8257edaebsalomon@google.com            if (GrGLHasExtensionFromString("GL_EXT_framebuffer_blit", extString)) {
2030b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com                GR_GL_GET_PROC_SUFFIX(BlitFramebuffer, EXT);
204f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com            }
2050b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        } else {
2060b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com            // we must have FBOs
2076fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com            delete interface;
2086fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com            return NULL;
2090b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        }
2100b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(MapBuffer);
2110b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com        GR_GL_GET_PROC(UnmapBuffer);
212f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com
213fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com        if (GrGLHasExtensionFromString("GL_NV_path_rendering", extString)) {
214fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(PathCommands, NV);
215fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(PathCoords, NV);
216fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(PathSubCommands, NV);
217fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(PathSubCoords, NV);
218fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(PathString, NV);
219fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(PathGlyphs, NV);
220fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(PathGlyphRange, NV);
221fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(WeightPaths, NV);
222fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(CopyPath, NV);
223fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(InterpolatePaths, NV);
224fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(TransformPath, NV);
225fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(PathParameteriv, NV);
226fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(PathParameteri, NV);
227fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(PathParameterfv, NV);
228fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(PathParameterf, NV);
229fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(PathDashArray, NV);
230fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GenPaths, NV);
231fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(DeletePaths, NV);
232fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(IsPath, NV);
233fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(PathStencilFunc, NV);
234fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(PathStencilDepthOffset, NV);
235fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(StencilFillPath, NV);
236fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(StencilStrokePath, NV);
237fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(StencilFillPathInstanced, NV);
238fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(StencilStrokePathInstanced, NV);
239fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(PathCoverDepthFunc, NV);
240fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(PathColorGen, NV);
241fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(PathTexGen, NV);
242fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(PathFogGen, NV);
243fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(CoverFillPath, NV);
244fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(CoverStrokePath, NV);
245fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(CoverFillPathInstanced, NV);
246fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(CoverStrokePathInstanced, NV);
247fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GetPathParameteriv, NV);
248fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GetPathParameterfv, NV);
249fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GetPathCommands, NV);
250fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GetPathCoords, NV);
251fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GetPathDashArray, NV);
252fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GetPathMetrics, NV);
253fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GetPathMetricRange, NV);
254fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GetPathSpacing, NV);
255fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GetPathColorGeniv, NV);
256fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GetPathColorGenfv, NV);
257fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GetPathTexGeniv, NV);
258fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GetPathTexGenfv, NV);
259fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(IsPointInFillPath, NV);
260fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(IsPointInStrokePath, NV);
261fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(GetPathLength, NV);
262fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com            GR_GL_GET_PROC_SUFFIX(PointAlongPath, NV);
263fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com        }
264fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com
2656fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        interface->fBindingsExported = kDesktop_GrGLBinding;
266f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com
2676fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        return interface;
2686fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com    } else {
2696fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com        return NULL;
270f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com    }
271f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com}
272