Home | History | Annotate | Download | only in android
      1 
      2 /*
      3  * Copyright 2014 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 #include "gl/GrGLInterface.h"
      9 #include "gl/GrGLAssembleInterface.h"
     10 #include "gl/GrGLUtil.h"
     11 
     12 #include <EGL/egl.h>
     13 #include <GLES2/gl2.h>
     14 
     15 static GrGLFuncPtr android_get_gl_proc(void* ctx, const char name[]) {
     16     SkASSERT(NULL == ctx);
     17     // Some older drivers on Android have busted eglGetProcAdddress Functions that
     18     // will return the wrong pointer for built in GLES2 functions. This set of functions
     19     // was generated on a Xoom by finding mismatches between the function pulled in via gl2.h and
     20     // the address returned by eglGetProcAddress.
     21     if (0 == strcmp("glActiveTexture", name)) {
     22         return (GrGLFuncPtr) glActiveTexture;
     23     } else if (0 == strcmp("glAttachShader", name)) {
     24         return (GrGLFuncPtr) glAttachShader;
     25     } else if (0 == strcmp("glBindAttribLocation", name)) {
     26         return (GrGLFuncPtr) glBindAttribLocation;
     27     } else if (0 == strcmp("glBindBuffer", name)) {
     28         return (GrGLFuncPtr) glBindBuffer;
     29     } else if (0 == strcmp("glBindTexture", name)) {
     30         return (GrGLFuncPtr) glBindTexture;
     31     } else if (0 == strcmp("glBlendColor", name)) {
     32         return (GrGLFuncPtr) glBlendColor;
     33     } else if (0 == strcmp("glBlendFunc", name)) {
     34         return (GrGLFuncPtr) glBlendFunc;
     35     } else if (0 == strcmp("glBufferData", name)) {
     36         return (GrGLFuncPtr) glBufferData;
     37     } else if (0 == strcmp("glBufferSubData", name)) {
     38         return (GrGLFuncPtr) glBufferSubData;
     39     } else if (0 == strcmp("glClear", name)) {
     40         return (GrGLFuncPtr) glClear;
     41     } else if (0 == strcmp("glClearColor", name)) {
     42         return (GrGLFuncPtr) glClearColor;
     43     } else if (0 == strcmp("glClearStencil", name)) {
     44         return (GrGLFuncPtr) glClearStencil;
     45     } else if (0 == strcmp("glColorMask", name)) {
     46         return (GrGLFuncPtr) glColorMask;
     47     } else if (0 == strcmp("glCompileShader", name)) {
     48         return (GrGLFuncPtr) glCompileShader;
     49     } else if (0 == strcmp("glCompressedTexImage2D", name)) {
     50         return (GrGLFuncPtr) glCompressedTexImage2D;
     51     } else if (0 == strcmp("glCompressedTexSubImage2D", name)) {
     52         return (GrGLFuncPtr) glCompressedTexSubImage2D;
     53     } else if (0 == strcmp("glCopyTexSubImage2D", name)) {
     54         return (GrGLFuncPtr) glCopyTexSubImage2D;
     55     } else if (0 == strcmp("glCreateProgram", name)) {
     56         return (GrGLFuncPtr) glCreateProgram;
     57     } else if (0 == strcmp("glCreateShader", name)) {
     58         return (GrGLFuncPtr) glCreateShader;
     59     } else if (0 == strcmp("glCullFace", name)) {
     60         return (GrGLFuncPtr) glCullFace;
     61     } else if (0 == strcmp("glDeleteBuffers", name)) {
     62         return (GrGLFuncPtr) glDeleteBuffers;
     63     } else if (0 == strcmp("glDeleteProgram", name)) {
     64         return (GrGLFuncPtr) glDeleteProgram;
     65     } else if (0 == strcmp("glDeleteShader", name)) {
     66         return (GrGLFuncPtr) glDeleteShader;
     67     } else if (0 == strcmp("glDeleteTextures", name)) {
     68         return (GrGLFuncPtr) glDeleteTextures;
     69     } else if (0 == strcmp("glDepthMask", name)) {
     70         return (GrGLFuncPtr) glDepthMask;
     71     } else if (0 == strcmp("glDisable", name)) {
     72         return (GrGLFuncPtr) glDisable;
     73     } else if (0 == strcmp("glDisableVertexAttribArray", name)) {
     74         return (GrGLFuncPtr) glDisableVertexAttribArray;
     75     } else if (0 == strcmp("glDrawArrays", name)) {
     76         return (GrGLFuncPtr) glDrawArrays;
     77     } else if (0 == strcmp("glDrawElements", name)) {
     78         return (GrGLFuncPtr) glDrawElements;
     79     } else if (0 == strcmp("glEnable", name)) {
     80         return (GrGLFuncPtr) glEnable;
     81     } else if (0 == strcmp("glEnableVertexAttribArray", name)) {
     82         return (GrGLFuncPtr) glEnableVertexAttribArray;
     83     } else if (0 == strcmp("glFinish", name)) {
     84         return (GrGLFuncPtr) glFinish;
     85     } else if (0 == strcmp("glFlush", name)) {
     86         return (GrGLFuncPtr) glFlush;
     87     } else if (0 == strcmp("glFrontFace", name)) {
     88         return (GrGLFuncPtr) glFrontFace;
     89     } else if (0 == strcmp("glGenBuffers", name)) {
     90         return (GrGLFuncPtr) glGenBuffers;
     91     } else if (0 == strcmp("glGenerateMipmap", name)) {
     92         return (GrGLFuncPtr) glGenerateMipmap;
     93     } else if (0 == strcmp("glGenTextures", name)) {
     94         return (GrGLFuncPtr) glGenTextures;
     95     } else if (0 == strcmp("glGetBufferParameteriv", name)) {
     96         return (GrGLFuncPtr) glGetBufferParameteriv;
     97     } else if (0 == strcmp("glGetError", name)) {
     98         return (GrGLFuncPtr) glGetError;
     99     } else if (0 == strcmp("glGetIntegerv", name)) {
    100         return (GrGLFuncPtr) glGetIntegerv;
    101     } else if (0 == strcmp("glGetProgramInfoLog", name)) {
    102         return (GrGLFuncPtr) glGetProgramInfoLog;
    103     } else if (0 == strcmp("glGetProgramiv", name)) {
    104         return (GrGLFuncPtr) glGetProgramiv;
    105     } else if (0 == strcmp("glGetShaderInfoLog", name)) {
    106         return (GrGLFuncPtr) glGetShaderInfoLog;
    107     } else if (0 == strcmp("glGetShaderiv", name)) {
    108         return (GrGLFuncPtr) glGetShaderiv;
    109     } else if (0 == strcmp("glGetString", name)) {
    110         return (GrGLFuncPtr) glGetString;
    111     } else if (0 == strcmp("glGetUniformLocation", name)) {
    112         return (GrGLFuncPtr) glGetUniformLocation;
    113     } else if (0 == strcmp("glLineWidth", name)) {
    114         return (GrGLFuncPtr) glLineWidth;
    115     } else if (0 == strcmp("glLinkProgram", name)) {
    116         return (GrGLFuncPtr) glLinkProgram;
    117     } else if (0 == strcmp("glPixelStorei", name)) {
    118         return (GrGLFuncPtr) glPixelStorei;
    119     } else if (0 == strcmp("glReadPixels", name)) {
    120         return (GrGLFuncPtr) glReadPixels;
    121     } else if (0 == strcmp("glScissor", name)) {
    122         return (GrGLFuncPtr) glScissor;
    123     } else if (0 == strcmp("glShaderSource", name)) {
    124         return (GrGLFuncPtr) glShaderSource;
    125     } else if (0 == strcmp("glStencilFunc", name)) {
    126         return (GrGLFuncPtr) glStencilFunc;
    127     } else if (0 == strcmp("glStencilFuncSeparate", name)) {
    128         return (GrGLFuncPtr) glStencilFuncSeparate;
    129     } else if (0 == strcmp("glStencilMask", name)) {
    130         return (GrGLFuncPtr) glStencilMask;
    131     } else if (0 == strcmp("glStencilMaskSeparate", name)) {
    132         return (GrGLFuncPtr) glStencilMaskSeparate;
    133     } else if (0 == strcmp("glStencilOp", name)) {
    134         return (GrGLFuncPtr) glStencilOp;
    135     } else if (0 == strcmp("glStencilOpSeparate", name)) {
    136         return (GrGLFuncPtr) glStencilOpSeparate;
    137     } else if (0 == strcmp("glTexImage2D", name)) {
    138         return (GrGLFuncPtr) glTexImage2D;
    139     } else if (0 == strcmp("glTexParameteri", name)) {
    140         return (GrGLFuncPtr) glTexParameteri;
    141     } else if (0 == strcmp("glTexParameteriv", name)) {
    142         return (GrGLFuncPtr) glTexParameteriv;
    143     } else if (0 == strcmp("glTexSubImage2D", name)) {
    144         return (GrGLFuncPtr) glTexSubImage2D;
    145     } else if (0 == strcmp("glUniform1f", name)) {
    146         return (GrGLFuncPtr) glUniform1f;
    147     } else if (0 == strcmp("glUniform1i", name)) {
    148         return (GrGLFuncPtr) glUniform1i;
    149     } else if (0 == strcmp("glUniform1fv", name)) {
    150         return (GrGLFuncPtr) glUniform1fv;
    151     } else if (0 == strcmp("glUniform1iv", name)) {
    152         return (GrGLFuncPtr) glUniform1iv;
    153     } else if (0 == strcmp("glUniform2f", name)) {
    154         return (GrGLFuncPtr) glUniform2f;
    155     } else if (0 == strcmp("glUniform2i", name)) {
    156         return (GrGLFuncPtr) glUniform2i;
    157     } else if (0 == strcmp("glUniform2fv", name)) {
    158         return (GrGLFuncPtr) glUniform2fv;
    159     } else if (0 == strcmp("glUniform2iv", name)) {
    160         return (GrGLFuncPtr) glUniform2iv;
    161     } else if (0 == strcmp("glUniform3f", name)) {
    162         return (GrGLFuncPtr) glUniform3f;
    163     } else if (0 == strcmp("glUniform3i", name)) {
    164         return (GrGLFuncPtr) glUniform3i;
    165     } else if (0 == strcmp("glUniform3fv", name)) {
    166         return (GrGLFuncPtr) glUniform3fv;
    167     } else if (0 == strcmp("glUniform3iv", name)) {
    168         return (GrGLFuncPtr) glUniform3iv;
    169     } else if (0 == strcmp("glUniform4f", name)) {
    170         return (GrGLFuncPtr) glUniform4f;
    171     } else if (0 == strcmp("glUniform4i", name)) {
    172         return (GrGLFuncPtr) glUniform4i;
    173     } else if (0 == strcmp("glUniform4fv", name)) {
    174         return (GrGLFuncPtr) glUniform4fv;
    175     } else if (0 == strcmp("glUniform4iv", name)) {
    176         return (GrGLFuncPtr) glUniform4iv;
    177     } else if (0 == strcmp("glUniformMatrix2fv", name)) {
    178         return (GrGLFuncPtr) glUniformMatrix2fv;
    179     } else if (0 == strcmp("glUniformMatrix3fv", name)) {
    180         return (GrGLFuncPtr) glUniformMatrix3fv;
    181     } else if (0 == strcmp("glUniformMatrix4fv", name)) {
    182         return (GrGLFuncPtr) glUniformMatrix4fv;
    183     } else if (0 == strcmp("glUseProgram", name)) {
    184         return (GrGLFuncPtr) glUseProgram;
    185     } else if (0 == strcmp("glVertexAttrib4fv", name)) {
    186         return (GrGLFuncPtr) glVertexAttrib4fv;
    187     } else if (0 == strcmp("glVertexAttribPointer", name)) {
    188         return (GrGLFuncPtr) glVertexAttribPointer;
    189     } else if (0 == strcmp("glViewport", name)) {
    190         return (GrGLFuncPtr) glViewport;
    191     } else if (0 == strcmp("glBindFramebuffer", name)) {
    192         return (GrGLFuncPtr) glBindFramebuffer;
    193     } else if (0 == strcmp("glBindRenderbuffer", name)) {
    194         return (GrGLFuncPtr) glBindRenderbuffer;
    195     } else if (0 == strcmp("glCheckFramebufferStatus", name)) {
    196         return (GrGLFuncPtr) glCheckFramebufferStatus;
    197     } else if (0 == strcmp("glDeleteFramebuffers", name)) {
    198         return (GrGLFuncPtr) glDeleteFramebuffers;
    199     } else if (0 == strcmp("glDeleteRenderbuffers", name)) {
    200         return (GrGLFuncPtr) glDeleteRenderbuffers;
    201     } else if (0 == strcmp("glFramebufferRenderbuffer", name)) {
    202         return (GrGLFuncPtr) glFramebufferRenderbuffer;
    203     } else if (0 == strcmp("glFramebufferTexture2D", name)) {
    204         return (GrGLFuncPtr) glFramebufferTexture2D;
    205     } else if (0 == strcmp("glGenFramebuffers", name)) {
    206         return (GrGLFuncPtr) glGenFramebuffers;
    207     } else if (0 == strcmp("glGenRenderbuffers", name)) {
    208         return (GrGLFuncPtr) glGenRenderbuffers;
    209     } else if (0 == strcmp("glGetFramebufferAttachmentParameteriv", name)) {
    210         return (GrGLFuncPtr) glGetFramebufferAttachmentParameteriv;
    211     } else if (0 == strcmp("glGetRenderbufferParameteriv", name)) {
    212         return (GrGLFuncPtr) glGetRenderbufferParameteriv;
    213     } else if (0 == strcmp("glRenderbufferStorage", name)) {
    214         return (GrGLFuncPtr) glRenderbufferStorage;
    215     } else if (0 == strcmp("glActiveTexture", name)) {
    216         return (GrGLFuncPtr) glActiveTexture;
    217     } else if (0 == strcmp("glAttachShader", name)) {
    218         return (GrGLFuncPtr) glAttachShader;
    219     } else if (0 == strcmp("glBindAttribLocation", name)) {
    220         return (GrGLFuncPtr) glBindAttribLocation;
    221     } else if (0 == strcmp("glBindBuffer", name)) {
    222         return (GrGLFuncPtr) glBindBuffer;
    223     } else if (0 == strcmp("glBindTexture", name)) {
    224         return (GrGLFuncPtr) glBindTexture;
    225     } else if (0 == strcmp("glBlendColor", name)) {
    226         return (GrGLFuncPtr) glBlendColor;
    227     } else if (0 == strcmp("glBlendFunc", name)) {
    228         return (GrGLFuncPtr) glBlendFunc;
    229     } else if (0 == strcmp("glBufferData", name)) {
    230         return (GrGLFuncPtr) glBufferData;
    231     } else if (0 == strcmp("glBufferSubData", name)) {
    232         return (GrGLFuncPtr) glBufferSubData;
    233     } else if (0 == strcmp("glClear", name)) {
    234         return (GrGLFuncPtr) glClear;
    235     } else if (0 == strcmp("glClearColor", name)) {
    236         return (GrGLFuncPtr) glClearColor;
    237     } else if (0 == strcmp("glClearStencil", name)) {
    238         return (GrGLFuncPtr) glClearStencil;
    239     } else if (0 == strcmp("glColorMask", name)) {
    240         return (GrGLFuncPtr) glColorMask;
    241     } else if (0 == strcmp("glCompileShader", name)) {
    242         return (GrGLFuncPtr) glCompileShader;
    243     } else if (0 == strcmp("glCompressedTexImage2D", name)) {
    244         return (GrGLFuncPtr) glCompressedTexImage2D;
    245     } else if (0 == strcmp("glCompressedTexSubImage2D", name)) {
    246         return (GrGLFuncPtr) glCompressedTexSubImage2D;
    247     } else if (0 == strcmp("glCopyTexSubImage2D", name)) {
    248         return (GrGLFuncPtr) glCopyTexSubImage2D;
    249     } else if (0 == strcmp("glCreateProgram", name)) {
    250         return (GrGLFuncPtr) glCreateProgram;
    251     } else if (0 == strcmp("glCreateShader", name)) {
    252         return (GrGLFuncPtr) glCreateShader;
    253     } else if (0 == strcmp("glCullFace", name)) {
    254         return (GrGLFuncPtr) glCullFace;
    255     } else if (0 == strcmp("glDeleteBuffers", name)) {
    256         return (GrGLFuncPtr) glDeleteBuffers;
    257     } else if (0 == strcmp("glDeleteProgram", name)) {
    258         return (GrGLFuncPtr) glDeleteProgram;
    259     } else if (0 == strcmp("glDeleteShader", name)) {
    260         return (GrGLFuncPtr) glDeleteShader;
    261     } else if (0 == strcmp("glDeleteTextures", name)) {
    262         return (GrGLFuncPtr) glDeleteTextures;
    263     } else if (0 == strcmp("glDepthMask", name)) {
    264         return (GrGLFuncPtr) glDepthMask;
    265     } else if (0 == strcmp("glDisable", name)) {
    266         return (GrGLFuncPtr) glDisable;
    267     } else if (0 == strcmp("glDisableVertexAttribArray", name)) {
    268         return (GrGLFuncPtr) glDisableVertexAttribArray;
    269     } else if (0 == strcmp("glDrawArrays", name)) {
    270         return (GrGLFuncPtr) glDrawArrays;
    271     } else if (0 == strcmp("glDrawElements", name)) {
    272         return (GrGLFuncPtr) glDrawElements;
    273     } else if (0 == strcmp("glEnable", name)) {
    274         return (GrGLFuncPtr) glEnable;
    275     } else if (0 == strcmp("glEnableVertexAttribArray", name)) {
    276         return (GrGLFuncPtr) glEnableVertexAttribArray;
    277     } else if (0 == strcmp("glFinish", name)) {
    278         return (GrGLFuncPtr) glFinish;
    279     } else if (0 == strcmp("glFlush", name)) {
    280         return (GrGLFuncPtr) glFlush;
    281     } else if (0 == strcmp("glFrontFace", name)) {
    282         return (GrGLFuncPtr) glFrontFace;
    283     } else if (0 == strcmp("glGenBuffers", name)) {
    284         return (GrGLFuncPtr) glGenBuffers;
    285     } else if (0 == strcmp("glGenerateMipmap", name)) {
    286         return (GrGLFuncPtr) glGenerateMipmap;
    287     } else if (0 == strcmp("glGenTextures", name)) {
    288         return (GrGLFuncPtr) glGenTextures;
    289     } else if (0 == strcmp("glGetBufferParameteriv", name)) {
    290         return (GrGLFuncPtr) glGetBufferParameteriv;
    291     } else if (0 == strcmp("glGetError", name)) {
    292         return (GrGLFuncPtr) glGetError;
    293     } else if (0 == strcmp("glGetIntegerv", name)) {
    294         return (GrGLFuncPtr) glGetIntegerv;
    295     } else if (0 == strcmp("glGetProgramInfoLog", name)) {
    296         return (GrGLFuncPtr) glGetProgramInfoLog;
    297     } else if (0 == strcmp("glGetProgramiv", name)) {
    298         return (GrGLFuncPtr) glGetProgramiv;
    299     } else if (0 == strcmp("glGetShaderInfoLog", name)) {
    300         return (GrGLFuncPtr) glGetShaderInfoLog;
    301     } else if (0 == strcmp("glGetShaderiv", name)) {
    302         return (GrGLFuncPtr) glGetShaderiv;
    303     } else if (0 == strcmp("glGetString", name)) {
    304         return (GrGLFuncPtr) glGetString;
    305     } else if (0 == strcmp("glGetUniformLocation", name)) {
    306         return (GrGLFuncPtr) glGetUniformLocation;
    307     } else if (0 == strcmp("glLineWidth", name)) {
    308         return (GrGLFuncPtr) glLineWidth;
    309     } else if (0 == strcmp("glLinkProgram", name)) {
    310         return (GrGLFuncPtr) glLinkProgram;
    311     } else if (0 == strcmp("glPixelStorei", name)) {
    312         return (GrGLFuncPtr) glPixelStorei;
    313     } else if (0 == strcmp("glReadPixels", name)) {
    314         return (GrGLFuncPtr) glReadPixels;
    315     } else if (0 == strcmp("glScissor", name)) {
    316         return (GrGLFuncPtr) glScissor;
    317     } else if (0 == strcmp("glShaderSource", name)) {
    318         return (GrGLFuncPtr) glShaderSource;
    319     } else if (0 == strcmp("glStencilFunc", name)) {
    320         return (GrGLFuncPtr) glStencilFunc;
    321     } else if (0 == strcmp("glStencilFuncSeparate", name)) {
    322         return (GrGLFuncPtr) glStencilFuncSeparate;
    323     } else if (0 == strcmp("glStencilMask", name)) {
    324         return (GrGLFuncPtr) glStencilMask;
    325     } else if (0 == strcmp("glStencilMaskSeparate", name)) {
    326         return (GrGLFuncPtr) glStencilMaskSeparate;
    327     } else if (0 == strcmp("glStencilOp", name)) {
    328         return (GrGLFuncPtr) glStencilOp;
    329     } else if (0 == strcmp("glStencilOpSeparate", name)) {
    330         return (GrGLFuncPtr) glStencilOpSeparate;
    331     } else if (0 == strcmp("glTexImage2D", name)) {
    332         return (GrGLFuncPtr) glTexImage2D;
    333     } else if (0 == strcmp("glTexParameteri", name)) {
    334         return (GrGLFuncPtr) glTexParameteri;
    335     } else if (0 == strcmp("glTexParameteriv", name)) {
    336         return (GrGLFuncPtr) glTexParameteriv;
    337     } else if (0 == strcmp("glTexSubImage2D", name)) {
    338         return (GrGLFuncPtr) glTexSubImage2D;
    339     } else if (0 == strcmp("glUniform1f", name)) {
    340         return (GrGLFuncPtr) glUniform1f;
    341     } else if (0 == strcmp("glUniform1i", name)) {
    342         return (GrGLFuncPtr) glUniform1i;
    343     } else if (0 == strcmp("glUniform1fv", name)) {
    344         return (GrGLFuncPtr) glUniform1fv;
    345     } else if (0 == strcmp("glUniform1iv", name)) {
    346         return (GrGLFuncPtr) glUniform1iv;
    347     } else if (0 == strcmp("glUniform2f", name)) {
    348         return (GrGLFuncPtr) glUniform2f;
    349     } else if (0 == strcmp("glUniform2i", name)) {
    350         return (GrGLFuncPtr) glUniform2i;
    351     } else if (0 == strcmp("glUniform2fv", name)) {
    352         return (GrGLFuncPtr) glUniform2fv;
    353     } else if (0 == strcmp("glUniform2iv", name)) {
    354         return (GrGLFuncPtr) glUniform2iv;
    355     } else if (0 == strcmp("glUniform3f", name)) {
    356         return (GrGLFuncPtr) glUniform3f;
    357     } else if (0 == strcmp("glUniform3i", name)) {
    358         return (GrGLFuncPtr) glUniform3i;
    359     } else if (0 == strcmp("glUniform3fv", name)) {
    360         return (GrGLFuncPtr) glUniform3fv;
    361     } else if (0 == strcmp("glUniform3iv", name)) {
    362         return (GrGLFuncPtr) glUniform3iv;
    363     } else if (0 == strcmp("glUniform4f", name)) {
    364         return (GrGLFuncPtr) glUniform4f;
    365     } else if (0 == strcmp("glUniform4i", name)) {
    366         return (GrGLFuncPtr) glUniform4i;
    367     } else if (0 == strcmp("glUniform4fv", name)) {
    368         return (GrGLFuncPtr) glUniform4fv;
    369     } else if (0 == strcmp("glUniform4iv", name)) {
    370         return (GrGLFuncPtr) glUniform4iv;
    371     } else if (0 == strcmp("glUniformMatrix2fv", name)) {
    372         return (GrGLFuncPtr) glUniformMatrix2fv;
    373     } else if (0 == strcmp("glUniformMatrix3fv", name)) {
    374         return (GrGLFuncPtr) glUniformMatrix3fv;
    375     } else if (0 == strcmp("glUniformMatrix4fv", name)) {
    376         return (GrGLFuncPtr) glUniformMatrix4fv;
    377     } else if (0 == strcmp("glUseProgram", name)) {
    378         return (GrGLFuncPtr) glUseProgram;
    379     } else if (0 == strcmp("glVertexAttrib4fv", name)) {
    380         return (GrGLFuncPtr) glVertexAttrib4fv;
    381     } else if (0 == strcmp("glVertexAttribPointer", name)) {
    382         return (GrGLFuncPtr) glVertexAttribPointer;
    383     } else if (0 == strcmp("glViewport", name)) {
    384         return (GrGLFuncPtr) glViewport;
    385     } else if (0 == strcmp("glBindFramebuffer", name)) {
    386         return (GrGLFuncPtr) glBindFramebuffer;
    387     } else if (0 == strcmp("glBindRenderbuffer", name)) {
    388         return (GrGLFuncPtr) glBindRenderbuffer;
    389     } else if (0 == strcmp("glCheckFramebufferStatus", name)) {
    390         return (GrGLFuncPtr) glCheckFramebufferStatus;
    391     } else if (0 == strcmp("glDeleteFramebuffers", name)) {
    392         return (GrGLFuncPtr) glDeleteFramebuffers;
    393     } else if (0 == strcmp("glDeleteRenderbuffers", name)) {
    394         return (GrGLFuncPtr) glDeleteRenderbuffers;
    395     } else if (0 == strcmp("glFramebufferRenderbuffer", name)) {
    396         return (GrGLFuncPtr) glFramebufferRenderbuffer;
    397     } else if (0 == strcmp("glFramebufferTexture2D", name)) {
    398         return (GrGLFuncPtr) glFramebufferTexture2D;
    399     } else if (0 == strcmp("glGenFramebuffers", name)) {
    400         return (GrGLFuncPtr) glGenFramebuffers;
    401     } else if (0 == strcmp("glGenRenderbuffers", name)) {
    402         return (GrGLFuncPtr) glGenRenderbuffers;
    403     } else if (0 == strcmp("glGetFramebufferAttachmentParameteriv", name)) {
    404         return (GrGLFuncPtr) glGetFramebufferAttachmentParameteriv;
    405     } else if (0 == strcmp("glGetRenderbufferParameteriv", name)) {
    406         return (GrGLFuncPtr) glGetRenderbufferParameteriv;
    407     } else if (0 == strcmp("glRenderbufferStorage", name)) {
    408         return (GrGLFuncPtr) glRenderbufferStorage;
    409     }
    410     return eglGetProcAddress(name);
    411 }
    412 
    413 const GrGLInterface* GrGLCreateNativeInterface() {
    414     return GrGLAssembleInterface(NULL, android_get_gl_proc);
    415 }
    416