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