GrGLCreateNativeInterface_unix.cpp revision a3baf3be0e2a3128fb73bd41d40d130f75a4dc86
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#include "../GrGLUtil.h" 12 13#include <GL/glx.h> 14#include <GL/gl.h> 15#include <GL/glext.h> 16#include <GL/glu.h> 17 18#define GR_GL_GET_PROC(F) interface->fFunctions.f ## F = (GrGL ## F ## Proc) \ 19 glXGetProcAddress(reinterpret_cast<const GLubyte*>("gl" #F)); 20#define GR_GL_GET_PROC_SUFFIX(F, S) interface->fFunctions.f ## F = (GrGL ## F ## Proc) \ 21 glXGetProcAddress(reinterpret_cast<const GLubyte*>("gl" #F #S)); 22 23const GrGLInterface* GrGLCreateNativeInterface() { 24 if (NULL != glXGetCurrentContext()) { 25 26 const char* versionString = (const char*) glGetString(GL_VERSION); 27 GrGLVersion glVer = GrGLGetVersionFromString(versionString); 28 29 // This may or may not succeed depending on the gl version. 30 GrGLGetStringiProc glGetStringi = 31 (GrGLGetStringiProc) glXGetProcAddress(reinterpret_cast<const GLubyte*>("glGetStringi")); 32 33 GrGLExtensions extensions; 34 if (!extensions.init(kGL_GrGLStandard, glGetString, glGetStringi, glGetIntegerv)) { 35 return NULL; 36 } 37 38 if (glVer < GR_GL_VER(1,5)) { 39 // We must have array and element_array buffer objects. 40 return NULL; 41 } 42 43 GrGLInterface* interface = SkNEW(GrGLInterface()); 44 GrGLInterface::Functions* functions = &interface->fFunctions; 45 46 functions->fActiveTexture = glActiveTexture; 47 GR_GL_GET_PROC(AttachShader); 48 GR_GL_GET_PROC(BindAttribLocation); 49 GR_GL_GET_PROC(BindBuffer); 50 GR_GL_GET_PROC(BindFragDataLocation); 51 GR_GL_GET_PROC(BeginQuery); 52 functions->fBindTexture = glBindTexture; 53 functions->fBlendFunc = glBlendFunc; 54 55 if (glVer >= GR_GL_VER(1,4) || 56 extensions.has("GL_ARB_imaging") || 57 extensions.has("GL_EXT_blend_color")) { 58 GR_GL_GET_PROC(BlendColor); 59 } 60 61 GR_GL_GET_PROC(BufferData); 62 GR_GL_GET_PROC(BufferSubData); 63 functions->fClear = glClear; 64 functions->fClearColor = glClearColor; 65 functions->fClearStencil = glClearStencil; 66 functions->fClientActiveTexture = glClientActiveTexture; 67 functions->fColorMask = glColorMask; 68 GR_GL_GET_PROC(CompileShader); 69 functions->fCompressedTexImage2D = glCompressedTexImage2D; 70 functions->fCopyTexSubImage2D = glCopyTexSubImage2D; 71 GR_GL_GET_PROC(CreateProgram); 72 GR_GL_GET_PROC(CreateShader); 73 functions->fCullFace = glCullFace; 74 GR_GL_GET_PROC(DeleteBuffers); 75 GR_GL_GET_PROC(DeleteProgram); 76 GR_GL_GET_PROC(DeleteQueries); 77 GR_GL_GET_PROC(DeleteShader); 78 functions->fDeleteTextures = glDeleteTextures; 79 functions->fDepthMask = glDepthMask; 80 functions->fDisable = glDisable; 81 functions->fDisableClientState = glDisableClientState; 82 GR_GL_GET_PROC(DisableVertexAttribArray); 83 functions->fDrawArrays = glDrawArrays; 84 functions->fDrawBuffer = glDrawBuffer; 85 GR_GL_GET_PROC(DrawBuffers); 86 functions->fDrawElements = glDrawElements; 87 functions->fEnable = glEnable; 88 functions->fEnableClientState = glEnableClientState; 89 GR_GL_GET_PROC(EnableVertexAttribArray); 90 GR_GL_GET_PROC(EndQuery); 91 functions->fFinish = glFinish; 92 functions->fFlush = glFlush; 93 functions->fFrontFace = glFrontFace; 94 GR_GL_GET_PROC(GenBuffers); 95 GR_GL_GET_PROC(GenerateMipmap); 96 GR_GL_GET_PROC(GetBufferParameteriv); 97 functions->fGetError = glGetError; 98 functions->fGetIntegerv = glGetIntegerv; 99 GR_GL_GET_PROC(GetQueryObjectiv); 100 GR_GL_GET_PROC(GetQueryObjectuiv); 101 if (glVer >= GR_GL_VER(3,3) || extensions.has("GL_ARB_timer_query")) { 102 GR_GL_GET_PROC(GetQueryObjecti64v); 103 GR_GL_GET_PROC(GetQueryObjectui64v); 104 GR_GL_GET_PROC(QueryCounter); 105 } else if (extensions.has("GL_EXT_timer_query")) { 106 GR_GL_GET_PROC_SUFFIX(GetQueryObjecti64v, EXT); 107 GR_GL_GET_PROC_SUFFIX(GetQueryObjectui64v, EXT); 108 } 109 GR_GL_GET_PROC(GetQueryiv); 110 GR_GL_GET_PROC(GetProgramInfoLog); 111 GR_GL_GET_PROC(GetProgramiv); 112 GR_GL_GET_PROC(GetShaderInfoLog); 113 GR_GL_GET_PROC(GetShaderiv); 114 functions->fGetString = glGetString; 115 GR_GL_GET_PROC(GetStringi); 116 functions->fGetTexLevelParameteriv = glGetTexLevelParameteriv; 117 GR_GL_GET_PROC(GenQueries); 118 functions->fGenTextures = glGenTextures; 119 GR_GL_GET_PROC(GetUniformLocation); 120 functions->fLineWidth = glLineWidth; 121 GR_GL_GET_PROC(LinkProgram); 122 GR_GL_GET_PROC(MapBuffer); 123 functions->fPixelStorei = glPixelStorei; 124 functions->fReadBuffer = glReadBuffer; 125 functions->fReadPixels = glReadPixels; 126 functions->fScissor = glScissor; 127 GR_GL_GET_PROC(ShaderSource); 128 functions->fStencilFunc = glStencilFunc; 129 GR_GL_GET_PROC(StencilFuncSeparate); 130 functions->fStencilMask = glStencilMask; 131 GR_GL_GET_PROC(StencilMaskSeparate); 132 functions->fStencilOp = glStencilOp; 133 GR_GL_GET_PROC(StencilOpSeparate); 134 functions->fTexImage2D = glTexImage2D; 135 functions->fTexGenf = glTexGenf; 136 functions->fTexGenfv = glTexGenfv; 137 functions->fTexGeni = glTexGeni; 138 functions->fTexParameteri = glTexParameteri; 139 functions->fTexParameteriv = glTexParameteriv; 140 if (glVer >= GR_GL_VER(4,2) || extensions.has("GL_ARB_texture_storage")) { 141 GR_GL_GET_PROC(TexStorage2D); 142 } else if (extensions.has("GL_EXT_texture_storage")) { 143 GR_GL_GET_PROC_SUFFIX(TexStorage2D, EXT); 144 } 145 functions->fTexSubImage2D = glTexSubImage2D; 146 GR_GL_GET_PROC(Uniform1f); 147 GR_GL_GET_PROC(Uniform1i); 148 GR_GL_GET_PROC(Uniform1fv); 149 GR_GL_GET_PROC(Uniform1iv); 150 GR_GL_GET_PROC(Uniform2f); 151 GR_GL_GET_PROC(Uniform2i); 152 GR_GL_GET_PROC(Uniform2fv); 153 GR_GL_GET_PROC(Uniform2iv); 154 GR_GL_GET_PROC(Uniform3f); 155 GR_GL_GET_PROC(Uniform3i); 156 GR_GL_GET_PROC(Uniform3fv); 157 GR_GL_GET_PROC(Uniform3iv); 158 GR_GL_GET_PROC(Uniform4f); 159 GR_GL_GET_PROC(Uniform4i); 160 GR_GL_GET_PROC(Uniform4fv); 161 GR_GL_GET_PROC(Uniform4iv); 162 GR_GL_GET_PROC(UniformMatrix2fv); 163 GR_GL_GET_PROC(UniformMatrix3fv); 164 GR_GL_GET_PROC(UniformMatrix4fv); 165 GR_GL_GET_PROC(UnmapBuffer); 166 GR_GL_GET_PROC(UseProgram); 167 GR_GL_GET_PROC(VertexAttrib4fv); 168 GR_GL_GET_PROC(VertexAttribPointer); 169 GR_GL_GET_PROC(VertexPointer); 170 functions->fViewport = glViewport; 171 GR_GL_GET_PROC(BindFragDataLocationIndexed); 172 173 if (glVer >= GR_GL_VER(3,0) || extensions.has("GL_ARB_vertex_array_object")) { 174 // no ARB suffix for GL_ARB_vertex_array_object 175 GR_GL_GET_PROC(BindVertexArray); 176 GR_GL_GET_PROC(GenVertexArrays); 177 GR_GL_GET_PROC(DeleteVertexArrays); 178 } 179 180 // First look for GL3.0 FBO or GL_ARB_framebuffer_object (same since 181 // GL_ARB_framebuffer_object doesn't use ARB suffix.) 182 if (glVer >= GR_GL_VER(3,0) || extensions.has("GL_ARB_framebuffer_object")) { 183 GR_GL_GET_PROC(GenFramebuffers); 184 GR_GL_GET_PROC(GetFramebufferAttachmentParameteriv); 185 GR_GL_GET_PROC(GetRenderbufferParameteriv); 186 GR_GL_GET_PROC(BindFramebuffer); 187 GR_GL_GET_PROC(FramebufferTexture2D); 188 GR_GL_GET_PROC(CheckFramebufferStatus); 189 GR_GL_GET_PROC(DeleteFramebuffers); 190 GR_GL_GET_PROC(RenderbufferStorage); 191 GR_GL_GET_PROC(GenRenderbuffers); 192 GR_GL_GET_PROC(DeleteRenderbuffers); 193 GR_GL_GET_PROC(FramebufferRenderbuffer); 194 GR_GL_GET_PROC(BindRenderbuffer); 195 GR_GL_GET_PROC(RenderbufferStorageMultisample); 196 GR_GL_GET_PROC(BlitFramebuffer); 197 } else if (extensions.has("GL_EXT_framebuffer_object")) { 198 GR_GL_GET_PROC_SUFFIX(GenFramebuffers, EXT); 199 GR_GL_GET_PROC_SUFFIX(GetFramebufferAttachmentParameteriv, EXT); 200 GR_GL_GET_PROC_SUFFIX(GetRenderbufferParameteriv, EXT); 201 GR_GL_GET_PROC_SUFFIX(BindFramebuffer, EXT); 202 GR_GL_GET_PROC_SUFFIX(FramebufferTexture2D, EXT); 203 GR_GL_GET_PROC_SUFFIX(CheckFramebufferStatus, EXT); 204 GR_GL_GET_PROC_SUFFIX(DeleteFramebuffers, EXT); 205 GR_GL_GET_PROC_SUFFIX(RenderbufferStorage, EXT); 206 GR_GL_GET_PROC_SUFFIX(GenRenderbuffers, EXT); 207 GR_GL_GET_PROC_SUFFIX(DeleteRenderbuffers, EXT); 208 GR_GL_GET_PROC_SUFFIX(FramebufferRenderbuffer, EXT); 209 GR_GL_GET_PROC_SUFFIX(BindRenderbuffer, EXT); 210 if (extensions.has("GL_EXT_framebuffer_multisample")) { 211 GR_GL_GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT); 212 } 213 if (extensions.has("GL_EXT_framebuffer_blit")) { 214 GR_GL_GET_PROC_SUFFIX(BlitFramebuffer, EXT); 215 } 216 } else { 217 // we must have FBOs 218 delete interface; 219 return NULL; 220 } 221 222 GR_GL_GET_PROC(LoadIdentity); 223 GR_GL_GET_PROC(LoadMatrixf); 224 GR_GL_GET_PROC(MatrixMode); 225 226 if (extensions.has("GL_NV_path_rendering")) { 227 GR_GL_GET_PROC_SUFFIX(PathCommands, NV); 228 GR_GL_GET_PROC_SUFFIX(PathCoords, NV); 229 GR_GL_GET_PROC_SUFFIX(PathSubCommands, NV); 230 GR_GL_GET_PROC_SUFFIX(PathSubCoords, NV); 231 GR_GL_GET_PROC_SUFFIX(PathString, NV); 232 GR_GL_GET_PROC_SUFFIX(PathGlyphs, NV); 233 GR_GL_GET_PROC_SUFFIX(PathGlyphRange, NV); 234 GR_GL_GET_PROC_SUFFIX(WeightPaths, NV); 235 GR_GL_GET_PROC_SUFFIX(CopyPath, NV); 236 GR_GL_GET_PROC_SUFFIX(InterpolatePaths, NV); 237 GR_GL_GET_PROC_SUFFIX(TransformPath, NV); 238 GR_GL_GET_PROC_SUFFIX(PathParameteriv, NV); 239 GR_GL_GET_PROC_SUFFIX(PathParameteri, NV); 240 GR_GL_GET_PROC_SUFFIX(PathParameterfv, NV); 241 GR_GL_GET_PROC_SUFFIX(PathParameterf, NV); 242 GR_GL_GET_PROC_SUFFIX(PathDashArray, NV); 243 GR_GL_GET_PROC_SUFFIX(GenPaths, NV); 244 GR_GL_GET_PROC_SUFFIX(DeletePaths, NV); 245 GR_GL_GET_PROC_SUFFIX(IsPath, NV); 246 GR_GL_GET_PROC_SUFFIX(PathStencilFunc, NV); 247 GR_GL_GET_PROC_SUFFIX(PathStencilDepthOffset, NV); 248 GR_GL_GET_PROC_SUFFIX(StencilFillPath, NV); 249 GR_GL_GET_PROC_SUFFIX(StencilStrokePath, NV); 250 GR_GL_GET_PROC_SUFFIX(StencilFillPathInstanced, NV); 251 GR_GL_GET_PROC_SUFFIX(StencilStrokePathInstanced, NV); 252 GR_GL_GET_PROC_SUFFIX(PathCoverDepthFunc, NV); 253 GR_GL_GET_PROC_SUFFIX(PathColorGen, NV); 254 GR_GL_GET_PROC_SUFFIX(PathTexGen, NV); 255 GR_GL_GET_PROC_SUFFIX(PathFogGen, NV); 256 GR_GL_GET_PROC_SUFFIX(CoverFillPath, NV); 257 GR_GL_GET_PROC_SUFFIX(CoverStrokePath, NV); 258 GR_GL_GET_PROC_SUFFIX(CoverFillPathInstanced, NV); 259 GR_GL_GET_PROC_SUFFIX(CoverStrokePathInstanced, NV); 260 GR_GL_GET_PROC_SUFFIX(GetPathParameteriv, NV); 261 GR_GL_GET_PROC_SUFFIX(GetPathParameterfv, NV); 262 GR_GL_GET_PROC_SUFFIX(GetPathCommands, NV); 263 GR_GL_GET_PROC_SUFFIX(GetPathCoords, NV); 264 GR_GL_GET_PROC_SUFFIX(GetPathDashArray, NV); 265 GR_GL_GET_PROC_SUFFIX(GetPathMetrics, NV); 266 GR_GL_GET_PROC_SUFFIX(GetPathMetricRange, NV); 267 GR_GL_GET_PROC_SUFFIX(GetPathSpacing, NV); 268 GR_GL_GET_PROC_SUFFIX(GetPathColorGeniv, NV); 269 GR_GL_GET_PROC_SUFFIX(GetPathColorGenfv, NV); 270 GR_GL_GET_PROC_SUFFIX(GetPathTexGeniv, NV); 271 GR_GL_GET_PROC_SUFFIX(GetPathTexGenfv, NV); 272 GR_GL_GET_PROC_SUFFIX(IsPointInFillPath, NV); 273 GR_GL_GET_PROC_SUFFIX(IsPointInStrokePath, NV); 274 GR_GL_GET_PROC_SUFFIX(GetPathLength, NV); 275 GR_GL_GET_PROC_SUFFIX(PointAlongPath, NV); 276 } 277 278 if (extensions.has("GL_EXT_debug_marker")) { 279 GR_GL_GET_PROC_SUFFIX(InsertEventMarker, EXT); 280 GR_GL_GET_PROC_SUFFIX(PushGroupMarker, EXT); 281 GR_GL_GET_PROC_SUFFIX(PopGroupMarker, EXT); 282 } 283 284 interface->fStandard = kGL_GrGLStandard; 285 interface->fExtensions.swap(&extensions); 286 287 return interface; 288 } else { 289 return NULL; 290 } 291} 292