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