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