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->f ## F = (GrGL ## F ## Proc) \ 19 glXGetProcAddress(reinterpret_cast<const GLubyte*>("gl" #F)); 20 #define GR_GL_GET_PROC_SUFFIX(F, S) interface->f ## F = (GrGL ## F ## Proc) \ 21 glXGetProcAddress(reinterpret_cast<const GLubyte*>("gl" #F #S)); 22 23 const GrGLInterface* GrGLCreateNativeInterface() { 24 if (NULL != glXGetCurrentContext()) { 25 const char* versionString = (const char*) glGetString(GL_VERSION); 26 const char* extString = (const char*) glGetString(GL_EXTENSIONS); 27 GrGLVersion glVer = GrGLGetVersionFromString(versionString); 28 29 if (glVer < GR_GL_VER(1,5)) { 30 // We must have array and element_array buffer objects. 31 return NULL; 32 } 33 34 GrGLInterface* interface = new GrGLInterface(); 35 36 interface->fActiveTexture = glActiveTexture; 37 GR_GL_GET_PROC(AttachShader); 38 GR_GL_GET_PROC(BindAttribLocation); 39 GR_GL_GET_PROC(BindBuffer); 40 GR_GL_GET_PROC(BindFragDataLocation); 41 GR_GL_GET_PROC(BeginQuery); 42 interface->fBindTexture = glBindTexture; 43 interface->fBlendFunc = glBlendFunc; 44 45 if (glVer >= GR_GL_VER(1,4) || 46 GrGLHasExtensionFromString("GL_ARB_imaging", extString) || 47 GrGLHasExtensionFromString("GL_EXT_blend_color", extString)) { 48 GR_GL_GET_PROC(BlendColor); 49 } 50 51 GR_GL_GET_PROC(BufferData); 52 GR_GL_GET_PROC(BufferSubData); 53 interface->fClear = glClear; 54 interface->fClearColor = glClearColor; 55 interface->fClearStencil = glClearStencil; 56 interface->fColorMask = glColorMask; 57 GR_GL_GET_PROC(CompileShader); 58 interface->fCompressedTexImage2D = glCompressedTexImage2D; 59 GR_GL_GET_PROC(CreateProgram); 60 GR_GL_GET_PROC(CreateShader); 61 interface->fCullFace = glCullFace; 62 GR_GL_GET_PROC(DeleteBuffers); 63 GR_GL_GET_PROC(DeleteProgram); 64 GR_GL_GET_PROC(DeleteQueries); 65 GR_GL_GET_PROC(DeleteShader); 66 interface->fDeleteTextures = glDeleteTextures; 67 interface->fDepthMask = glDepthMask; 68 interface->fDisable = glDisable; 69 GR_GL_GET_PROC(DisableVertexAttribArray); 70 interface->fDrawArrays = glDrawArrays; 71 interface->fDrawBuffer = glDrawBuffer; 72 GR_GL_GET_PROC(DrawBuffers); 73 interface->fDrawElements = glDrawElements; 74 interface->fEnable = glEnable; 75 GR_GL_GET_PROC(EnableVertexAttribArray); 76 GR_GL_GET_PROC(EndQuery); 77 interface->fFinish = glFinish; 78 interface->fFlush = glFlush; 79 interface->fFrontFace = glFrontFace; 80 GR_GL_GET_PROC(GenBuffers); 81 GR_GL_GET_PROC(GetBufferParameteriv); 82 interface->fGetError = glGetError; 83 interface->fGetIntegerv = glGetIntegerv; 84 GR_GL_GET_PROC(GetQueryObjectiv); 85 GR_GL_GET_PROC(GetQueryObjectuiv); 86 if (glVer >= GR_GL_VER(3,3) || 87 GrGLHasExtensionFromString("GL_ARB_timer_query", extString)) { 88 GR_GL_GET_PROC(GetQueryObjecti64v); 89 GR_GL_GET_PROC(GetQueryObjectui64v); 90 GR_GL_GET_PROC(QueryCounter); 91 } else if (GrGLHasExtensionFromString("GL_EXT_timer_query", extString)) { 92 GR_GL_GET_PROC_SUFFIX(GetQueryObjecti64v, EXT); 93 GR_GL_GET_PROC_SUFFIX(GetQueryObjectui64v, EXT); 94 } 95 GR_GL_GET_PROC(GetQueryiv); 96 GR_GL_GET_PROC(GetProgramInfoLog); 97 GR_GL_GET_PROC(GetProgramiv); 98 GR_GL_GET_PROC(GetShaderInfoLog); 99 GR_GL_GET_PROC(GetShaderiv); 100 interface->fGetString = glGetString; 101 interface->fGetTexLevelParameteriv = glGetTexLevelParameteriv; 102 GR_GL_GET_PROC(GenQueries); 103 interface->fGenTextures = glGenTextures; 104 GR_GL_GET_PROC(GetUniformLocation); 105 interface->fLineWidth = glLineWidth; 106 GR_GL_GET_PROC(LinkProgram); 107 GR_GL_GET_PROC(MapBuffer); 108 interface->fPixelStorei = glPixelStorei; 109 interface->fReadBuffer = glReadBuffer; 110 interface->fReadPixels = glReadPixels; 111 if (GrGLHasExtensionFromString("GL_NV_framebuffer_multisample_coverage", 112 extString)) { 113 GR_GL_GET_PROC_SUFFIX(RenderbufferStorageMultisampleCoverage, NV); 114 } 115 interface->fScissor = glScissor; 116 GR_GL_GET_PROC(ShaderSource); 117 interface->fStencilFunc = glStencilFunc; 118 GR_GL_GET_PROC(StencilFuncSeparate); 119 interface->fStencilMask = glStencilMask; 120 GR_GL_GET_PROC(StencilMaskSeparate); 121 interface->fStencilOp = glStencilOp; 122 GR_GL_GET_PROC(StencilOpSeparate); 123 interface->fTexImage2D = glTexImage2D; 124 interface->fTexParameteri = glTexParameteri; 125 interface->fTexParameteriv = glTexParameteriv; 126 if (glVer >= GR_GL_VER(4,2) || 127 GrGLHasExtensionFromString("GL_ARB_texture_storage", extString)) { 128 GR_GL_GET_PROC(TexStorage2D); 129 } else if (GrGLHasExtensionFromString("GL_EXT_texture_storage", extString)) { 130 GR_GL_GET_PROC_SUFFIX(TexStorage2D, EXT); 131 } 132 interface->fTexSubImage2D = glTexSubImage2D; 133 GR_GL_GET_PROC(Uniform1f); 134 GR_GL_GET_PROC(Uniform1i); 135 GR_GL_GET_PROC(Uniform1fv); 136 GR_GL_GET_PROC(Uniform1iv); 137 GR_GL_GET_PROC(Uniform2f); 138 GR_GL_GET_PROC(Uniform2i); 139 GR_GL_GET_PROC(Uniform2fv); 140 GR_GL_GET_PROC(Uniform2iv); 141 GR_GL_GET_PROC(Uniform3f); 142 GR_GL_GET_PROC(Uniform3i); 143 GR_GL_GET_PROC(Uniform3fv); 144 GR_GL_GET_PROC(Uniform3iv); 145 GR_GL_GET_PROC(Uniform4f); 146 GR_GL_GET_PROC(Uniform4i); 147 GR_GL_GET_PROC(Uniform4fv); 148 GR_GL_GET_PROC(Uniform4iv); 149 GR_GL_GET_PROC(UniformMatrix2fv); 150 GR_GL_GET_PROC(UniformMatrix3fv); 151 GR_GL_GET_PROC(UniformMatrix4fv); 152 GR_GL_GET_PROC(UnmapBuffer); 153 GR_GL_GET_PROC(UseProgram); 154 GR_GL_GET_PROC(VertexAttrib4fv); 155 GR_GL_GET_PROC(VertexAttribPointer); 156 interface->fViewport = glViewport; 157 GR_GL_GET_PROC(BindFragDataLocationIndexed); 158 159 // First look for GL3.0 FBO or GL_ARB_framebuffer_object (same since 160 // GL_ARB_framebuffer_object doesn't use ARB suffix.) 161 if (glVer >= GR_GL_VER(3,0) || 162 GrGLHasExtensionFromString("GL_ARB_framebuffer_object", 163 extString)) { 164 GR_GL_GET_PROC(GenFramebuffers); 165 GR_GL_GET_PROC(GetFramebufferAttachmentParameteriv); 166 GR_GL_GET_PROC(GetRenderbufferParameteriv); 167 GR_GL_GET_PROC(BindFramebuffer); 168 GR_GL_GET_PROC(FramebufferTexture2D); 169 GR_GL_GET_PROC(CheckFramebufferStatus); 170 GR_GL_GET_PROC(DeleteFramebuffers); 171 GR_GL_GET_PROC(RenderbufferStorage); 172 GR_GL_GET_PROC(GenRenderbuffers); 173 GR_GL_GET_PROC(DeleteRenderbuffers); 174 GR_GL_GET_PROC(FramebufferRenderbuffer); 175 GR_GL_GET_PROC(BindRenderbuffer); 176 GR_GL_GET_PROC(RenderbufferStorageMultisample); 177 GR_GL_GET_PROC(BlitFramebuffer); 178 } else if (GrGLHasExtensionFromString("GL_EXT_framebuffer_object", 179 extString)) { 180 GR_GL_GET_PROC_SUFFIX(GenFramebuffers, EXT); 181 GR_GL_GET_PROC_SUFFIX(GetFramebufferAttachmentParameteriv, EXT); 182 GR_GL_GET_PROC_SUFFIX(GetRenderbufferParameteriv, EXT); 183 GR_GL_GET_PROC_SUFFIX(BindFramebuffer, EXT); 184 GR_GL_GET_PROC_SUFFIX(FramebufferTexture2D, EXT); 185 GR_GL_GET_PROC_SUFFIX(CheckFramebufferStatus, EXT); 186 GR_GL_GET_PROC_SUFFIX(DeleteFramebuffers, EXT); 187 GR_GL_GET_PROC_SUFFIX(RenderbufferStorage, EXT); 188 GR_GL_GET_PROC_SUFFIX(GenRenderbuffers, EXT); 189 GR_GL_GET_PROC_SUFFIX(DeleteRenderbuffers, EXT); 190 GR_GL_GET_PROC_SUFFIX(FramebufferRenderbuffer, EXT); 191 GR_GL_GET_PROC_SUFFIX(BindRenderbuffer, EXT); 192 if (GrGLHasExtensionFromString("GL_EXT_framebuffer_multisample", 193 extString)) { 194 GR_GL_GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT); 195 } 196 if (GrGLHasExtensionFromString("GL_EXT_framebuffer_blit", 197 extString)) { 198 GR_GL_GET_PROC_SUFFIX(BlitFramebuffer, EXT); 199 } 200 } else { 201 // we must have FBOs 202 delete interface; 203 return NULL; 204 } 205 interface->fBindingsExported = kDesktop_GrGLBinding; 206 207 return interface; 208 } else { 209 return NULL; 210 } 211 } 212