1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 #include "gl/GrGLInterface.h" 11 12 #define GL_GLEXT_PROTOTYPES 13 #include <GL/osmesa.h> 14 15 #define GR_GL_GET_PROC(F) interface->f ## F = (GrGL ## F ## Proc) \ 16 OSMesaGetProcAddress("gl" #F); 17 #define GR_GL_GET_PROC_SUFFIX(F, S) interface->f ## F = (GrGL ## F ## Proc) \ 18 OSMesaGetProcAddress("gl" #F #S); 19 20 // We use OSMesaGetProcAddress for every gl function to avoid accidentally using 21 // non-Mesa gl functions. 22 23 const GrGLInterface* GrGLCreateMesaInterface() { 24 if (NULL != OSMesaGetCurrentContext()) { 25 GrGLGetStringProc getString = (GrGLGetStringProc) OSMesaGetProcAddress("glGetString"); 26 const char* versionString = (const char*) getString(GL_VERSION); 27 const char* extString = (const char*) getString(GL_EXTENSIONS); 28 GrGLVersion glVer = GrGLGetVersionFromString(versionString); 29 30 if (glVer < GR_GL_VER(1,5)) { 31 // We must have array and element_array buffer objects. 32 return NULL; 33 } 34 GrGLInterface* interface = new GrGLInterface(); 35 36 GR_GL_GET_PROC(ActiveTexture); 37 GR_GL_GET_PROC(BeginQuery); 38 GR_GL_GET_PROC(AttachShader); 39 GR_GL_GET_PROC(BindAttribLocation); 40 GR_GL_GET_PROC(BindBuffer); 41 GR_GL_GET_PROC(BindFragDataLocation); 42 GR_GL_GET_PROC(BindTexture); 43 GR_GL_GET_PROC(BlendColor); 44 GR_GL_GET_PROC(BlendFunc); 45 GR_GL_GET_PROC(BufferData); 46 GR_GL_GET_PROC(BufferSubData); 47 GR_GL_GET_PROC(Clear); 48 GR_GL_GET_PROC(ClearColor); 49 GR_GL_GET_PROC(ClearStencil); 50 GR_GL_GET_PROC(ColorMask); 51 GR_GL_GET_PROC(CompileShader); 52 GR_GL_GET_PROC(CompressedTexImage2D); 53 GR_GL_GET_PROC(CreateProgram); 54 GR_GL_GET_PROC(CreateShader); 55 GR_GL_GET_PROC(CullFace); 56 GR_GL_GET_PROC(DeleteBuffers); 57 GR_GL_GET_PROC(DeleteProgram); 58 GR_GL_GET_PROC(DeleteQueries); 59 GR_GL_GET_PROC(DeleteShader); 60 GR_GL_GET_PROC(DeleteTextures); 61 GR_GL_GET_PROC(DepthMask); 62 GR_GL_GET_PROC(Disable); 63 GR_GL_GET_PROC(DisableVertexAttribArray); 64 GR_GL_GET_PROC(DrawArrays); 65 GR_GL_GET_PROC(DrawBuffer); 66 GR_GL_GET_PROC(DrawBuffers); 67 GR_GL_GET_PROC(DrawElements); 68 GR_GL_GET_PROC(Enable); 69 GR_GL_GET_PROC(EnableVertexAttribArray); 70 GR_GL_GET_PROC(EndQuery); 71 GR_GL_GET_PROC(Finish); 72 GR_GL_GET_PROC(Flush); 73 GR_GL_GET_PROC(FrontFace); 74 GR_GL_GET_PROC(GenBuffers); 75 GR_GL_GET_PROC(GenQueries); 76 GR_GL_GET_PROC(GetBufferParameteriv); 77 GR_GL_GET_PROC(GetError); 78 GR_GL_GET_PROC(GetIntegerv); 79 GR_GL_GET_PROC(GetProgramInfoLog); 80 GR_GL_GET_PROC(GetProgramiv); 81 if (glVer >= GR_GL_VER(3,3) || 82 GrGLHasExtensionFromString("GL_ARB_timer_query", extString)) { 83 GR_GL_GET_PROC(GetQueryObjecti64v); 84 GR_GL_GET_PROC(GetQueryObjectui64v) 85 GR_GL_GET_PROC(QueryCounter); 86 } else if (GrGLHasExtensionFromString("GL_EXT_timer_query", extString)) { 87 GR_GL_GET_PROC_SUFFIX(GetQueryObjecti64v, EXT); 88 GR_GL_GET_PROC_SUFFIX(GetQueryObjectui64v, EXT); 89 } 90 GR_GL_GET_PROC(GetQueryObjectiv); 91 GR_GL_GET_PROC(GetQueryObjectuiv); 92 GR_GL_GET_PROC(GetQueryiv); 93 GR_GL_GET_PROC(GetShaderInfoLog); 94 GR_GL_GET_PROC(GetShaderiv); 95 GR_GL_GET_PROC(GetString); 96 GR_GL_GET_PROC(GetTexLevelParameteriv); 97 GR_GL_GET_PROC(GenTextures); 98 GR_GL_GET_PROC(GetUniformLocation); 99 GR_GL_GET_PROC(LineWidth); 100 GR_GL_GET_PROC(LinkProgram); 101 GR_GL_GET_PROC(MapBuffer); 102 GR_GL_GET_PROC(PixelStorei); 103 GR_GL_GET_PROC(ReadBuffer); 104 GR_GL_GET_PROC(ReadPixels); 105 GR_GL_GET_PROC(Scissor); 106 GR_GL_GET_PROC(ShaderSource); 107 GR_GL_GET_PROC(StencilFunc); 108 GR_GL_GET_PROC(StencilFuncSeparate); 109 GR_GL_GET_PROC(StencilMask); 110 GR_GL_GET_PROC(StencilMaskSeparate); 111 GR_GL_GET_PROC(StencilOp); 112 GR_GL_GET_PROC(StencilOpSeparate); 113 GR_GL_GET_PROC(TexImage2D) 114 GR_GL_GET_PROC(TexParameteri); 115 GR_GL_GET_PROC(TexStorage2D); 116 if (NULL == interface->fTexStorage2D) { 117 GR_GL_GET_PROC_SUFFIX(TexStorage2D, EXT); 118 } 119 GR_GL_GET_PROC(TexSubImage2D); 120 GR_GL_GET_PROC(Uniform1f); 121 GR_GL_GET_PROC(Uniform1i); 122 GR_GL_GET_PROC(Uniform1fv); 123 GR_GL_GET_PROC(Uniform1iv); 124 GR_GL_GET_PROC(Uniform2f); 125 GR_GL_GET_PROC(Uniform2i); 126 GR_GL_GET_PROC(Uniform2fv); 127 GR_GL_GET_PROC(Uniform2iv); 128 GR_GL_GET_PROC(Uniform3f); 129 GR_GL_GET_PROC(Uniform3i); 130 GR_GL_GET_PROC(Uniform3fv); 131 GR_GL_GET_PROC(Uniform3iv); 132 GR_GL_GET_PROC(Uniform4f); 133 GR_GL_GET_PROC(Uniform4i); 134 GR_GL_GET_PROC(Uniform4fv); 135 GR_GL_GET_PROC(Uniform4iv); 136 GR_GL_GET_PROC(UniformMatrix2fv); 137 GR_GL_GET_PROC(UniformMatrix3fv); 138 GR_GL_GET_PROC(UniformMatrix4fv); 139 GR_GL_GET_PROC(UnmapBuffer); 140 GR_GL_GET_PROC(UseProgram); 141 GR_GL_GET_PROC(VertexAttrib4fv); 142 GR_GL_GET_PROC(VertexAttribPointer); 143 GR_GL_GET_PROC(Viewport); 144 145 // First look for GL3.0 FBO or GL_ARB_framebuffer_object (same since 146 // GL_ARB_framebuffer_object doesn't use ARB suffix.) 147 if (glVer >= GR_GL_VER(3,0) || 148 GrGLHasExtensionFromString("GL_ARB_framebuffer_object", 149 extString)) { 150 GR_GL_GET_PROC(GenFramebuffers); 151 GR_GL_GET_PROC(GetFramebufferAttachmentParameteriv); 152 GR_GL_GET_PROC(GetRenderbufferParameteriv); 153 GR_GL_GET_PROC(BindFramebuffer); 154 GR_GL_GET_PROC(FramebufferTexture2D); 155 GR_GL_GET_PROC(CheckFramebufferStatus); 156 GR_GL_GET_PROC(DeleteFramebuffers); 157 GR_GL_GET_PROC(RenderbufferStorage); 158 GR_GL_GET_PROC(GenRenderbuffers); 159 GR_GL_GET_PROC(DeleteRenderbuffers); 160 GR_GL_GET_PROC(FramebufferRenderbuffer); 161 GR_GL_GET_PROC(BindRenderbuffer); 162 GR_GL_GET_PROC(RenderbufferStorageMultisample); 163 GR_GL_GET_PROC(BlitFramebuffer); 164 } else if (GrGLHasExtensionFromString("GL_EXT_framebuffer_object", 165 extString)) { 166 GR_GL_GET_PROC_SUFFIX(GenFramebuffers, EXT); 167 GR_GL_GET_PROC_SUFFIX(GetFramebufferAttachmentParameteriv, EXT); 168 GR_GL_GET_PROC_SUFFIX(GetRenderbufferParameteriv, EXT); 169 GR_GL_GET_PROC_SUFFIX(BindFramebuffer, EXT); 170 GR_GL_GET_PROC_SUFFIX(FramebufferTexture2D, EXT); 171 GR_GL_GET_PROC_SUFFIX(CheckFramebufferStatus, EXT); 172 GR_GL_GET_PROC_SUFFIX(DeleteFramebuffers, EXT); 173 GR_GL_GET_PROC_SUFFIX(RenderbufferStorage, EXT); 174 GR_GL_GET_PROC_SUFFIX(GenRenderbuffers, EXT); 175 GR_GL_GET_PROC_SUFFIX(DeleteRenderbuffers, EXT); 176 GR_GL_GET_PROC_SUFFIX(FramebufferRenderbuffer, EXT); 177 GR_GL_GET_PROC_SUFFIX(BindRenderbuffer, EXT); 178 if (GrGLHasExtensionFromString("GL_EXT_framebuffer_multisample", 179 extString)) { 180 GR_GL_GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT); 181 } 182 if (GrGLHasExtensionFromString("GL_EXT_framebuffer_blit", 183 extString)) { 184 GR_GL_GET_PROC_SUFFIX(BlitFramebuffer, EXT); 185 } 186 } else { 187 // we must have FBOs 188 delete interface; 189 return NULL; 190 } 191 GR_GL_GET_PROC(BindFragDataLocationIndexed); 192 interface->fBindingsExported = kDesktop_GrGLBinding; 193 return interface; 194 } else { 195 return NULL; 196 } 197 } 198