GrGLCreateNativeInterface_mac.cpp revision 4f1dae40e24d57d647db01443b8bf2410514b8b5
11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
104f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#include "gl/GrGLInterface.h"
111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include <OpenGL/gl.h>
131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include <OpenGL/glext.h>
141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include <mach-o/dyld.h>
161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// This uses deprecated functions, should rewrite using dlopen, dlsym, dlclose
191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid* GetProcAddress(const char* name) {
201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    NSSymbol symbol = NULL;
211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (NSIsSymbolNameDefined(name)) {
221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        symbol = NSLookupAndBindSymbol(name);
231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return NULL == symbol ? NULL : NSAddressOfSymbol(symbol);
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define GET_PROC(name) ((GrGL ## name ## Proc) GetProcAddress("_gl" #name))
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define GET_PROC_SUFFIX(name, suffix) ((GrGL ## name ## Proc) GetProcAddress("_gl" #name #suffix))
291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerconst GrGLInterface* GrGLCreateNativeInterface() {
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // The gl functions are not context-specific so we create one global
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // interface
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static SkAutoTUnref<GrGLInterface> glInterface;
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (!glInterface.get()) {
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrGLInterface* interface = new GrGLInterface;
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        glInterface.reset(interface);
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const char* verStr = (const char*) glGetString(GL_VERSION);
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrGLVersion ver = GrGLGetVersionFromString(verStr);
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const char* extStr = (const char*) glGetString(GL_EXTENSIONS);
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBindingsExported = kDesktop_GrGLBinding;
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fActiveTexture = glActiveTexture;
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fAttachShader = glAttachShader;
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBeginQuery = glBeginQuery;
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBindAttribLocation = glBindAttribLocation;
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBindBuffer = glBindBuffer;
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (ver >= GR_GL_VER(3,0)) {
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            #if GL_VERSION_3_0
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fBindFragDataLocation = glBindFragDataLocation;
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            #else
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fBindFragDataLocation = GET_PROC(BindFragDataLocation);
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            #endif
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBindTexture = glBindTexture;
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBlendColor = glBlendColor;
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBlendFunc = glBlendFunc;
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBufferData = glBufferData;
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBufferSubData = glBufferSubData;
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fClear = glClear;
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fClearColor = glClearColor;
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fClearStencil = glClearStencil;
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fColorMask = glColorMask;
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fColorPointer = glColorPointer;
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fCompileShader = glCompileShader;
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fCompressedTexImage2D = glCompressedTexImage2D;
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fCreateProgram = glCreateProgram;
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fCreateShader = glCreateShader;
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fCullFace = glCullFace;
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDeleteBuffers = glDeleteBuffers;
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDeleteProgram = glDeleteProgram;
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDeleteQueries = glDeleteQueries;
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDeleteShader = glDeleteShader;
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDeleteTextures = glDeleteTextures;
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDepthMask = glDepthMask;
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDisable = glDisable;
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDisableVertexAttribArray =
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                            glDisableVertexAttribArray;
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDrawArrays = glDrawArrays;
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDrawBuffer = glDrawBuffer;
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDrawBuffers = glDrawBuffers;
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDrawElements = glDrawElements;
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fEnable = glEnable;
831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fEnableVertexAttribArray = glEnableVertexAttribArray;
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fEndQuery = glEndQuery;
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fFinish = glFinish;
861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fFlush = glFlush;
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fFrontFace = glFrontFace;
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGenBuffers = glGenBuffers;
891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGenQueries = glGenQueries;
901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetBufferParameteriv = glGetBufferParameteriv;
911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetError = glGetError;
921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetIntegerv = glGetIntegerv;
931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetProgramInfoLog = glGetProgramInfoLog;
941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetProgramiv = glGetProgramiv;
951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetQueryiv = glGetQueryiv;
961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetQueryObjectiv = glGetQueryObjectiv;
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetQueryObjectuiv = glGetQueryObjectuiv;
981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetShaderInfoLog = glGetShaderInfoLog;
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetShaderiv = glGetShaderiv;
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetString = glGetString;
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetTexLevelParameteriv = glGetTexLevelParameteriv;
1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGenTextures = glGenTextures;
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetUniformLocation = glGetUniformLocation;
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fLineWidth = glLineWidth;
1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fLinkProgram = glLinkProgram;
1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fMapBuffer = glMapBuffer;
1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fPixelStorei = glPixelStorei;
1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fReadBuffer = glReadBuffer;
1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fReadPixels = glReadPixels;
1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fScissor = glScissor;
1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fShaderSource = glShaderSource;
1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fStencilFunc = glStencilFunc;
1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fStencilFuncSeparate = glStencilFuncSeparate;
1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fStencilMask = glStencilMask;
1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fStencilMaskSeparate = glStencilMaskSeparate;
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fStencilOp = glStencilOp;
1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fStencilOpSeparate = glStencilOpSeparate;
1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // mac uses GLenum for internalFormat param (non-standard)
1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // amounts to int vs. uint.
1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fTexImage2D = (GrGLTexImage2DProc)glTexImage2D;
1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fTexParameteri = glTexParameteri;
1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #if GL_ARB_texture_storage || GL_VERSION_4_2
1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fTexStorage2D = glTexStorage2D
1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #elif GL_EXT_texture_storage
1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fTexStorage2D = glTexStorage2DEXT;
1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #else
1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (ver >= GR_GL_VER(4,2) ||
1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrGLHasExtensionFromString("GL_ARB_texture_storage", extStr)) {
1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GET_PROC(TexStorage2D);
1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else if (GrGLHasExtensionFromString("GL_EXT_texture_storage", extStr)) {
1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GET_PROC_SUFFIX(TexStorage2D, EXT);
1321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #endif
1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fTexSubImage2D = glTexSubImage2D;
1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform1f = glUniform1f;
1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform1i = glUniform1i;
1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform1fv = glUniform1fv;
1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform1iv = glUniform1iv;
1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform2f = glUniform2f;
1401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform2i = glUniform2i;
1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform2fv = glUniform2fv;
1421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform2iv = glUniform2iv;
1431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform3f = glUniform3f;
1441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform3i = glUniform3i;
1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform3fv = glUniform3fv;
1461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform3iv = glUniform3iv;
1471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform4f = glUniform4f;
1481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform4i = glUniform4i;
1491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform4fv = glUniform4fv;
1501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform4iv = glUniform4iv;
1511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform4fv = glUniform4fv;
1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniformMatrix2fv = glUniformMatrix2fv;
1531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniformMatrix3fv = glUniformMatrix3fv;
1541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniformMatrix4fv = glUniformMatrix4fv;
1551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUnmapBuffer = glUnmapBuffer;
1561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUseProgram = glUseProgram;
1571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fVertexAttrib4fv = glVertexAttrib4fv;
1581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fVertexAttribPointer = glVertexAttribPointer;
1591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fViewport = glViewport;
1601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (ver >= GR_GL_VER(3,3) || GrGLHasExtensionFromString("GL_ARB_timer_query", extStr)) {
1621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // ARB extension doesn't use the ARB suffix on the function name
1631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            #if GL_ARB_timer_query || GL_VERSION_3_3
1641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fQueryCounter = glQueryCounter;
1651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fGetQueryObjecti64v = glGetQueryObjecti64v;
1661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fGetQueryObjectui64v = glGetQueryObjectui64v;
1671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            #else
1681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fQueryCounter = GET_PROC(QueryCounter);
1691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fGetQueryObjecti64v = GET_PROC(GetQueryObjecti64v);
1701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fGetQueryObjectui64v = GET_PROC(GetQueryObjectui64v);
1711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            #endif
1721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else if (GrGLHasExtensionFromString("GL_EXT_timer_query", extStr)) {
1731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            #if GL_EXT_timer_query
1741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fGetQueryObjecti64v = glGetQueryObjecti64vEXT;
1751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fGetQueryObjectui64v = glGetQueryObjectui64vEXT;
1761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            #else
1771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fGetQueryObjecti64v = GET_PROC_SUFFIX(GetQueryObjecti64v, EXT);
1781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fGetQueryObjectui64v = GET_PROC_SUFFIX(GetQueryObjectui64v, EXT);
1791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            #endif
1801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
1811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (ver >= GR_GL_VER(3,0) || GrGLHasExtensionFromString("GL_ARB_framebuffer_object", extStr)) {
1831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // ARB extension doesn't use the ARB suffix on the function names
1841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            #if GL_VERSION_3_0 || GL_ARB_framebuffer_object
1851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fGenFramebuffers = glGenFramebuffers;
1861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameteriv;
1871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fGetRenderbufferParameteriv = glGetRenderbufferParameteriv;
1881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fBindFramebuffer = glBindFramebuffer;
1891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fFramebufferTexture2D = glFramebufferTexture2D;
1901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fCheckFramebufferStatus = glCheckFramebufferStatus;
1911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fDeleteFramebuffers = glDeleteFramebuffers;
1921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fRenderbufferStorage = glRenderbufferStorage;
1931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fGenRenderbuffers = glGenRenderbuffers;
1941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fDeleteRenderbuffers = glDeleteRenderbuffers;
1951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fFramebufferRenderbuffer = glFramebufferRenderbuffer;
1961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fBindRenderbuffer = glBindRenderbuffer;
1971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fRenderbufferStorageMultisample = glRenderbufferStorageMultisample;
1981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fBlitFramebuffer = glBlitFramebuffer;
1991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            #else
2001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fGenFramebuffers = GET_PROC(GenFramebuffers);
2011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fGetFramebufferAttachmentParameteriv = GET_PROC(GetFramebufferAttachmentParameteriv);
2021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fGetRenderbufferParameteriv = GET_PROC(GetRenderbufferParameteriv);
2031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fBindFramebuffer = GET_PROC(BindFramebuffer);
2041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fFramebufferTexture2D = GET_PROC(FramebufferTexture2D);
2051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fCheckFramebufferStatus = GET_PROC(CheckFramebufferStatus);
2061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fDeleteFramebuffers = GET_PROC(DeleteFramebuffers);
2071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fRenderbufferStorage = GET_PROC(RenderbufferStorage);
2081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fGenRenderbuffers = GET_PROC(GenRenderbuffers);
2091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fDeleteRenderbuffers = GET_PROC(DeleteRenderbuffers);
2101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fFramebufferRenderbuffer = GET_PROC(FramebufferRenderbuffer);
2111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fBindRenderbuffer = GET_PROC(BindRenderbuffer);
2121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fRenderbufferStorageMultisample = GET_PROC(RenderbufferStorageMultisample);
2131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fBlitFramebuffer = GET_PROC(BlitFramebuffer);
2141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            #endif
2151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
2161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (GrGLHasExtensionFromString("GL_EXT_framebuffer_object", extStr)) {
2171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                #if GL_EXT_framebuffer_object
2181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fGenFramebuffers = glGenFramebuffersEXT;
2191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameterivEXT;
2201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fGetRenderbufferParameteriv = glGetRenderbufferParameterivEXT;
2211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fBindFramebuffer = glBindFramebufferEXT;
2221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fFramebufferTexture2D = glFramebufferTexture2DEXT;
2231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fCheckFramebufferStatus = glCheckFramebufferStatusEXT;
2241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fDeleteFramebuffers = glDeleteFramebuffersEXT;
2251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fRenderbufferStorage = glRenderbufferStorageEXT;
2261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fGenRenderbuffers = glGenRenderbuffersEXT;
2271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fDeleteRenderbuffers = glDeleteRenderbuffersEXT;
2281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fFramebufferRenderbuffer = glFramebufferRenderbufferEXT;
2291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fBindRenderbuffer = glBindRenderbufferEXT;
2301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                #else
2311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fGenFramebuffers = GET_PROC_SUFFIX(GenFramebuffers, EXT);
2321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fGetFramebufferAttachmentParameteriv = GET_PROC_SUFFIX(GetFramebufferAttachmentParameteriv, EXT);
2331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fGetRenderbufferParameteriv = GET_PROC_SUFFIX(GetRenderbufferParameteriv, EXT);
2341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fBindFramebuffer = GET_PROC_SUFFIX(BindFramebuffer, EXT);
2351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fFramebufferTexture2D = GET_PROC_SUFFIX(FramebufferTexture2D, EXT);
2361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fCheckFramebufferStatus = GET_PROC_SUFFIX(CheckFramebufferStatus, EXT);
2371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fDeleteFramebuffers = GET_PROC_SUFFIX(DeleteFramebuffers, EXT);
2381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fRenderbufferStorage = GET_PROC_SUFFIX(RenderbufferStorage, EXT);
2391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fGenRenderbuffers = GET_PROC_SUFFIX(GenRenderbuffers, EXT);
2401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fDeleteRenderbuffers = GET_PROC_SUFFIX(DeleteRenderbuffers, EXT);
2411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fFramebufferRenderbuffer = GET_PROC_SUFFIX(FramebufferRenderbuffer, EXT);
2421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fBindRenderbuffer = GET_PROC_SUFFIX(BindRenderbuffer, EXT);
2431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                #endif
2441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
2451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (GrGLHasExtensionFromString("GL_EXT_framebuffer_multisample", extStr)) {
2461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                #if GL_EXT_framebuffer_multisample
2471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fRenderbufferStorageMultisample = glRenderbufferStorageMultisampleEXT;
2481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                #else
2491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fRenderbufferStorageMultisample = GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT);
2501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                #endif
2511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
2521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (GrGLHasExtensionFromString("", extStr)) {
2531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                #if GL_EXT_framebuffer_blit
2541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fBlitFramebuffer = glBlitFramebufferEXT;
2551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                #else
2561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    interface->fBlitFramebuffer = GET_PROC_SUFFIX(BlitFramebuffer, EXT);
2571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                #endif
2581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
2591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
2601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (ver >= GR_GL_VER(3,3) || GrGLHasExtensionFromString("GL_ARB_blend_func_extended", extStr)) {
2611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // ARB extension doesn't use the ARB suffix on the function name
2621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            #if GL_VERSION_3_3 || GL_ARB_blend_func_extended
2631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fBindFragDataLocationIndexed = glBindFragDataLocationIndexed;
2641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            #else
2651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                interface->fBindFragDataLocationIndexed = GET_PROC(BindFragDataLocationIndexed);
2661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            #endif
2671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
2681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBindingsExported = kDesktop_GrGLBinding;
2701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
2711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glInterface.get()->ref();
2721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return glInterface.get();
2731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
274