1 /* 2 Copyright 2011 Google Inc. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 #include "GrGLInterface.h" 18 19 #include "GL/osmesa.h" 20 #include <GL/glext.h> 21 #include <GL/glu.h> 22 23 #define GR_GL_GET_PROC(F) gDefaultInterface.f ## F = (GrGL ## F ## Proc) \ 24 OSMesaGetProcAddress("gl" #F); 25 #define GR_GL_GET_PROC_SUFFIX(F, S) gDefaultInterface.f ## F = (GrGL ## F ## Proc) \ 26 OSMesaGetProcAddress("gl" #F #S); 27 28 void GrGLSetDefaultGLInterface() { 29 static GrGLInterface gDefaultInterface; 30 static bool gDefaultInterfaceInit; 31 if (!gDefaultInterfaceInit && NULL != OSMesaGetCurrentContext()) { 32 int major, minor; 33 const char* versionString = (const char*) glGetString(GL_VERSION); 34 const char* extString = (const char*) glGetString(GL_EXTENSIONS); 35 gl_version_from_string(&major, &minor, versionString); 36 37 if (major == 1 && minor < 5) { 38 // We must have array and element_array buffer objects. 39 return; 40 } 41 42 gDefaultInterface.fActiveTexture = glActiveTexture; 43 GR_GL_GET_PROC(AttachShader); 44 GR_GL_GET_PROC(BindAttribLocation); 45 GR_GL_GET_PROC(BindBuffer); 46 gDefaultInterface.fBindTexture = glBindTexture; 47 gDefaultInterface.fBlendColor = glBlendColor; 48 gDefaultInterface.fBlendFunc = glBlendFunc; 49 GR_GL_GET_PROC(BufferData); 50 GR_GL_GET_PROC(BufferSubData); 51 gDefaultInterface.fClear = glClear; 52 gDefaultInterface.fClearColor = glClearColor; 53 gDefaultInterface.fClearStencil = glClearStencil; 54 gDefaultInterface.fClientActiveTexture = glClientActiveTexture; 55 gDefaultInterface.fColorMask = glColorMask; 56 gDefaultInterface.fColorPointer = glColorPointer; 57 gDefaultInterface.fColor4ub = glColor4ub; 58 GR_GL_GET_PROC(CompileShader); 59 gDefaultInterface.fCompressedTexImage2D = glCompressedTexImage2D; 60 GR_GL_GET_PROC(CreateProgram); 61 GR_GL_GET_PROC(CreateShader); 62 gDefaultInterface.fCullFace = glCullFace; 63 GR_GL_GET_PROC(DeleteBuffers); 64 GR_GL_GET_PROC(DeleteProgram); 65 GR_GL_GET_PROC(DeleteShader); 66 gDefaultInterface.fDeleteTextures = glDeleteTextures; 67 gDefaultInterface.fDepthMask = glDepthMask; 68 gDefaultInterface.fDisable = glDisable; 69 gDefaultInterface.fDisableClientState = glDisableClientState; 70 GR_GL_GET_PROC(DisableVertexAttribArray); 71 gDefaultInterface.fDrawArrays = glDrawArrays; 72 gDefaultInterface.fDrawElements = glDrawElements; 73 gDefaultInterface.fEnable = glEnable; 74 gDefaultInterface.fEnableClientState = glEnableClientState; 75 GR_GL_GET_PROC(EnableVertexAttribArray); 76 gDefaultInterface.fFrontFace = glFrontFace; 77 GR_GL_GET_PROC(GenBuffers); 78 GR_GL_GET_PROC(GetBufferParameteriv); 79 gDefaultInterface.fGetError = glGetError; 80 gDefaultInterface.fGetIntegerv = glGetIntegerv; 81 GR_GL_GET_PROC(GetProgramInfoLog); 82 GR_GL_GET_PROC(GetProgramiv); 83 GR_GL_GET_PROC(GetShaderInfoLog); 84 GR_GL_GET_PROC(GetShaderiv); 85 gDefaultInterface.fGetString = glGetString; 86 gDefaultInterface.fGenTextures = glGenTextures; 87 GR_GL_GET_PROC(GetUniformLocation); 88 gDefaultInterface.fLineWidth = glLineWidth; 89 GR_GL_GET_PROC(LinkProgram); 90 gDefaultInterface.fLoadMatrixf = glLoadMatrixf; 91 GR_GL_GET_PROC(MapBuffer); 92 gDefaultInterface.fMatrixMode = glMatrixMode; 93 gDefaultInterface.fPointSize = glPointSize; 94 gDefaultInterface.fPixelStorei = glPixelStorei; 95 gDefaultInterface.fReadPixels = glReadPixels; 96 gDefaultInterface.fScissor = glScissor; 97 gDefaultInterface.fShadeModel = glShadeModel; 98 GR_GL_GET_PROC(ShaderSource); 99 gDefaultInterface.fStencilFunc = glStencilFunc; 100 GR_GL_GET_PROC(StencilFuncSeparate); 101 gDefaultInterface.fStencilMask = glStencilMask; 102 GR_GL_GET_PROC(StencilMaskSeparate); 103 gDefaultInterface.fStencilOp = glStencilOp; 104 GR_GL_GET_PROC(StencilOpSeparate); 105 gDefaultInterface.fTexCoordPointer = glTexCoordPointer; 106 gDefaultInterface.fTexEnvi = glTexEnvi; 107 //OSMesa on Mac's glTexImage2D takes a GLenum for internalFormat rather than a GLint. 108 gDefaultInterface.fTexImage2D = reinterpret_cast<GrGLTexImage2DProc>(glTexImage2D); 109 gDefaultInterface.fTexParameteri = glTexParameteri; 110 gDefaultInterface.fTexSubImage2D = glTexSubImage2D; 111 GR_GL_GET_PROC(Uniform1f); 112 GR_GL_GET_PROC(Uniform1i); 113 GR_GL_GET_PROC(Uniform1fv); 114 GR_GL_GET_PROC(Uniform1iv); 115 GR_GL_GET_PROC(Uniform2f); 116 GR_GL_GET_PROC(Uniform2i); 117 GR_GL_GET_PROC(Uniform2fv); 118 GR_GL_GET_PROC(Uniform2iv); 119 GR_GL_GET_PROC(Uniform3f); 120 GR_GL_GET_PROC(Uniform3i); 121 GR_GL_GET_PROC(Uniform3fv); 122 GR_GL_GET_PROC(Uniform3iv); 123 GR_GL_GET_PROC(Uniform4f); 124 GR_GL_GET_PROC(Uniform4i); 125 GR_GL_GET_PROC(Uniform4fv); 126 GR_GL_GET_PROC(Uniform4iv); 127 GR_GL_GET_PROC(UniformMatrix2fv); 128 GR_GL_GET_PROC(UniformMatrix3fv); 129 GR_GL_GET_PROC(UniformMatrix4fv); 130 GR_GL_GET_PROC(UnmapBuffer); 131 GR_GL_GET_PROC(UseProgram); 132 GR_GL_GET_PROC(VertexAttrib4fv); 133 GR_GL_GET_PROC(VertexAttribPointer); 134 gDefaultInterface.fVertexPointer = glVertexPointer; 135 gDefaultInterface.fViewport = glViewport; 136 137 // First look for GL3.0 FBO or GL_ARB_framebuffer_object (same since 138 // GL_ARB_framebuffer_object doesn't use ARB suffix.) 139 if (major >= 3 || has_gl_extension_from_string( 140 "GL_ARB_framebuffer_object", extString)) { 141 GR_GL_GET_PROC(GenFramebuffers); 142 GR_GL_GET_PROC(BindFramebuffer); 143 GR_GL_GET_PROC(FramebufferTexture2D); 144 GR_GL_GET_PROC(CheckFramebufferStatus); 145 GR_GL_GET_PROC(DeleteFramebuffers); 146 GR_GL_GET_PROC(RenderbufferStorage); 147 GR_GL_GET_PROC(GenRenderbuffers); 148 GR_GL_GET_PROC(DeleteRenderbuffers); 149 GR_GL_GET_PROC(FramebufferRenderbuffer); 150 GR_GL_GET_PROC(BindRenderbuffer); 151 GR_GL_GET_PROC(RenderbufferStorageMultisample); 152 GR_GL_GET_PROC(BlitFramebuffer); 153 } else if (has_gl_extension_from_string("GL_EXT_framebuffer_object", 154 extString)) { 155 GR_GL_GET_PROC_SUFFIX(GenFramebuffers, EXT); 156 GR_GL_GET_PROC_SUFFIX(BindFramebuffer, EXT); 157 GR_GL_GET_PROC_SUFFIX(FramebufferTexture2D, EXT); 158 GR_GL_GET_PROC_SUFFIX(CheckFramebufferStatus, EXT); 159 GR_GL_GET_PROC_SUFFIX(DeleteFramebuffers, EXT); 160 GR_GL_GET_PROC_SUFFIX(RenderbufferStorage, EXT); 161 GR_GL_GET_PROC_SUFFIX(GenRenderbuffers, EXT); 162 GR_GL_GET_PROC_SUFFIX(DeleteRenderbuffers, EXT); 163 GR_GL_GET_PROC_SUFFIX(FramebufferRenderbuffer, EXT); 164 GR_GL_GET_PROC_SUFFIX(BindRenderbuffer, EXT); 165 if (has_gl_extension_from_string("GL_EXT_framebuffer_multisample", 166 extString)) { 167 GR_GL_GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT); 168 } 169 if (has_gl_extension_from_string("GL_EXT_framebuffer_blit", 170 extString)) { 171 GR_GL_GET_PROC_SUFFIX(BlitFramebuffer, EXT); 172 } 173 } else { 174 // we must have FBOs 175 return; 176 } 177 GR_GL_GET_PROC(BindFragDataLocationIndexed); 178 gDefaultInterface.fBindingsExported = kDesktop_GrGLBinding; 179 180 gDefaultInterfaceInit = true; 181 } 182 if (gDefaultInterfaceInit) 183 GrGLSetGLInterface(&gDefaultInterface); 184 } 185