Home | History | Annotate | Download | only in gl
      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 "../GrTDArray.h"
     12 
     13 GrGLvoid GR_GL_FUNCTION_TYPE nullGLActiveTexture(GrGLenum texture) {}
     14 GrGLvoid GR_GL_FUNCTION_TYPE nullGLAttachShader(GrGLuint program, GrGLuint shader) {}
     15 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBeginQuery(GrGLenum target, GrGLuint id) {}
     16 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindAttribLocation(GrGLuint program, GrGLuint index, const char* name) {}
     17 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindTexture(GrGLenum target, GrGLuint texture) {}
     18 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBlendColor(GrGLclampf red, GrGLclampf green, GrGLclampf blue, GrGLclampf alpha) {}
     19 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindFragDataLocation(GrGLuint program, GrGLuint colorNumber, const GrGLchar* name) {}
     20 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBlendFunc(GrGLenum sfactor, GrGLenum dfactor) {}
     21 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBufferData(GrGLenum target, GrGLsizeiptr size, const GrGLvoid* data, GrGLenum usage) {}
     22 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBufferSubData(GrGLenum target, GrGLintptr offset, GrGLsizeiptr size, const GrGLvoid* data) {}
     23 GrGLvoid GR_GL_FUNCTION_TYPE nullGLClear(GrGLbitfield mask) {}
     24 GrGLvoid GR_GL_FUNCTION_TYPE nullGLClearColor(GrGLclampf red, GrGLclampf green, GrGLclampf blue, GrGLclampf alpha) {}
     25 GrGLvoid GR_GL_FUNCTION_TYPE nullGLClearStencil(GrGLint s) {}
     26 GrGLvoid GR_GL_FUNCTION_TYPE nullGLColorMask(GrGLboolean red, GrGLboolean green, GrGLboolean blue, GrGLboolean alpha) {}
     27 GrGLvoid GR_GL_FUNCTION_TYPE nullGLCompileShader(GrGLuint shader) {}
     28 GrGLvoid GR_GL_FUNCTION_TYPE nullGLCompressedTexImage2D(GrGLenum target, GrGLint level, GrGLenum internalformat, GrGLsizei width, GrGLsizei height, GrGLint border, GrGLsizei imageSize, const GrGLvoid* data) {}
     29 GrGLvoid GR_GL_FUNCTION_TYPE nullGLCullFace(GrGLenum mode) {}
     30 GrGLvoid GR_GL_FUNCTION_TYPE nullGLDepthMask(GrGLboolean flag) {}
     31 GrGLvoid GR_GL_FUNCTION_TYPE nullGLDisable(GrGLenum cap) {}
     32 GrGLvoid GR_GL_FUNCTION_TYPE nullGLDisableVertexAttribArray(GrGLuint index) {}
     33 GrGLvoid GR_GL_FUNCTION_TYPE nullGLDrawArrays(GrGLenum mode, GrGLint first, GrGLsizei count) {}
     34 GrGLvoid GR_GL_FUNCTION_TYPE nullGLDrawBuffer(GrGLenum mode) {}
     35 GrGLvoid GR_GL_FUNCTION_TYPE nullGLDrawBuffers(GrGLsizei n, const GrGLenum* bufs) {}
     36 GrGLvoid GR_GL_FUNCTION_TYPE nullGLDrawElements(GrGLenum mode, GrGLsizei count, GrGLenum type, const GrGLvoid* indices) {}
     37 GrGLvoid GR_GL_FUNCTION_TYPE nullGLEnable(GrGLenum cap) {}
     38 GrGLvoid GR_GL_FUNCTION_TYPE nullGLEnableVertexAttribArray(GrGLuint index) {}
     39 GrGLvoid GR_GL_FUNCTION_TYPE nullGLEndQuery(GrGLenum target) {}
     40 GrGLvoid GR_GL_FUNCTION_TYPE nullGLFinish() {}
     41 GrGLvoid GR_GL_FUNCTION_TYPE nullGLFlush() {}
     42 GrGLvoid GR_GL_FUNCTION_TYPE nullGLFrontFace(GrGLenum mode) {}
     43 GrGLvoid GR_GL_FUNCTION_TYPE nullGLLineWidth(GrGLfloat width) {}
     44 GrGLvoid GR_GL_FUNCTION_TYPE nullGLLinkProgram(GrGLuint program) {}
     45 GrGLvoid GR_GL_FUNCTION_TYPE nullGLPixelStorei(GrGLenum pname, GrGLint param) {}
     46 GrGLvoid GR_GL_FUNCTION_TYPE nullGLQueryCounter(GrGLuint id, GrGLenum target) {}
     47 GrGLvoid GR_GL_FUNCTION_TYPE nullGLReadBuffer(GrGLenum src) {}
     48 GrGLvoid GR_GL_FUNCTION_TYPE nullGLReadPixels(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, GrGLvoid* pixels) {}
     49 GrGLvoid GR_GL_FUNCTION_TYPE nullGLScissor(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height) {}
     50 GrGLvoid GR_GL_FUNCTION_TYPE nullGLShaderSource(GrGLuint shader, GrGLsizei count, const char** str, const GrGLint* length) {}
     51 GrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilFunc(GrGLenum func, GrGLint ref, GrGLuint mask) {}
     52 GrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilFuncSeparate(GrGLenum face, GrGLenum func, GrGLint ref, GrGLuint mask) {}
     53 GrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilMask(GrGLuint mask) {}
     54 GrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilMaskSeparate(GrGLenum face, GrGLuint mask) {}
     55 GrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilOp(GrGLenum fail, GrGLenum zfail, GrGLenum zpass) {}
     56 GrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilOpSeparate(GrGLenum face, GrGLenum fail, GrGLenum zfail, GrGLenum zpass) {}
     57 GrGLvoid GR_GL_FUNCTION_TYPE nullGLTexImage2D(GrGLenum target, GrGLint level, GrGLint internalformat, GrGLsizei width, GrGLsizei height, GrGLint border, GrGLenum format, GrGLenum type, const GrGLvoid* pixels) {}
     58 GrGLvoid GR_GL_FUNCTION_TYPE nullGLTexParameteri(GrGLenum target, GrGLenum pname, GrGLint param) {}
     59 GrGLvoid GR_GL_FUNCTION_TYPE nullGLTexStorage2D(GrGLenum target, GrGLsizei levels, GrGLenum internalformat, GrGLsizei width, GrGLsizei height) {}
     60 GrGLvoid GR_GL_FUNCTION_TYPE nullGLTexSubImage2D(GrGLenum target, GrGLint level, GrGLint xoffset, GrGLint yoffset, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, const GrGLvoid* pixels) {}
     61 GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform1f(GrGLint location, GrGLfloat v0) {}
     62 GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform1i(GrGLint location, GrGLint v0) {}
     63 GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform1fv(GrGLint location, GrGLsizei count, const GrGLfloat* v) {}
     64 GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform1iv(GrGLint location, GrGLsizei count, const GrGLint* v) {}
     65 GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform2f(GrGLint location, GrGLfloat v0, GrGLfloat v1) {}
     66 GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform2i(GrGLint location, GrGLint v0, GrGLint v1) {}
     67 GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform2fv(GrGLint location, GrGLsizei count, const GrGLfloat* v) {}
     68 GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform2iv(GrGLint location, GrGLsizei count, const GrGLint* v) {}
     69 GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform3f(GrGLint location, GrGLfloat v0, GrGLfloat v1, GrGLfloat v2) {}
     70 GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform3i(GrGLint location, GrGLint v0, GrGLint v1, GrGLint v2) {}
     71 GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform3fv(GrGLint location, GrGLsizei count, const GrGLfloat* v) {}
     72 GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform3iv(GrGLint location, GrGLsizei count, const GrGLint* v) {}
     73 GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform4f(GrGLint location, GrGLfloat v0, GrGLfloat v1, GrGLfloat v2, GrGLfloat v3) {}
     74 GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform4i(GrGLint location, GrGLint v0, GrGLint v1, GrGLint v2, GrGLint v3) {}
     75 GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform4fv(GrGLint location, GrGLsizei count, const GrGLfloat* v) {}
     76 GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform4iv(GrGLint location, GrGLsizei count, const GrGLint* v) {}
     77 GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniformMatrix2fv(GrGLint location, GrGLsizei count, GrGLboolean transpose, const GrGLfloat* value) {}
     78 GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniformMatrix3fv(GrGLint location, GrGLsizei count, GrGLboolean transpose, const GrGLfloat* value) {}
     79 GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniformMatrix4fv(GrGLint location, GrGLsizei count, GrGLboolean transpose, const GrGLfloat* value) {}
     80 GrGLvoid GR_GL_FUNCTION_TYPE nullGLUseProgram(GrGLuint program) {}
     81 GrGLvoid GR_GL_FUNCTION_TYPE nullGLVertexAttrib4fv(GrGLuint indx, const GrGLfloat* values) {}
     82 GrGLvoid GR_GL_FUNCTION_TYPE nullGLVertexAttribPointer(GrGLuint indx, GrGLint size, GrGLenum type, GrGLboolean normalized, GrGLsizei stride, const GrGLvoid* ptr) {}
     83 GrGLvoid GR_GL_FUNCTION_TYPE nullGLViewport(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height) {}
     84 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindFramebuffer(GrGLenum target, GrGLuint framebuffer) {}
     85 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindRenderbuffer(GrGLenum target, GrGLuint renderbuffer) {}
     86 GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteFramebuffers(GrGLsizei n, const GrGLuint *framebuffers) {}
     87 GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteRenderbuffers(GrGLsizei n, const GrGLuint *renderbuffers) {}
     88 GrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferRenderbuffer(GrGLenum target, GrGLenum attachment, GrGLenum renderbuffertarget, GrGLuint renderbuffer) {}
     89 GrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferTexture2D(GrGLenum target, GrGLenum attachment, GrGLenum textarget, GrGLuint texture, GrGLint level) {}
     90 GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetFramebufferAttachmentParameteriv(GrGLenum target, GrGLenum attachment, GrGLenum pname, GrGLint* params) {}
     91 GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetRenderbufferParameteriv(GrGLenum target, GrGLenum pname, GrGLint* params) {}
     92 GrGLvoid GR_GL_FUNCTION_TYPE nullGLRenderbufferStorage(GrGLenum target, GrGLenum internalformat, GrGLsizei width, GrGLsizei height) {}
     93 GrGLvoid GR_GL_FUNCTION_TYPE nullGLRenderbufferStorageMultisample(GrGLenum target, GrGLsizei samples, GrGLenum internalformat, GrGLsizei width, GrGLsizei height) {}
     94 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBlitFramebuffer(GrGLint srcX0, GrGLint srcY0, GrGLint srcX1, GrGLint srcY1, GrGLint dstX0, GrGLint dstY0, GrGLint dstX1, GrGLint dstY1, GrGLbitfield mask, GrGLenum filter) {}
     95 GrGLvoid GR_GL_FUNCTION_TYPE nullGLResolveMultisampleFramebuffer() {}
     96 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindFragDataLocationIndexed(GrGLuint program, GrGLuint colorNumber, GrGLuint index, const GrGLchar * name) {}
     97 
     98 GrGLenum GR_GL_FUNCTION_TYPE nullGLCheckFramebufferStatus(GrGLenum target) {
     99     return GR_GL_FRAMEBUFFER_COMPLETE;
    100 }
    101 
    102 GrGLuint GR_GL_FUNCTION_TYPE nullGLCreateProgram() {
    103     static int gCurrID = 0;
    104     return ++gCurrID;
    105 }
    106 
    107 GrGLuint GR_GL_FUNCTION_TYPE nullGLCreateShader(GrGLenum type) {
    108     static int gCurrID = 0;
    109     return ++gCurrID;
    110 }
    111 
    112 // same delete used for shaders and programs
    113 GrGLvoid GR_GL_FUNCTION_TYPE nullGLDelete(GrGLuint program) {
    114 }
    115 
    116 // same function used for all glGen*(GLsize i, GLuint*) functions
    117 GrGLvoid GR_GL_FUNCTION_TYPE nullGLGenIds(GrGLsizei n, GrGLuint* ids) {
    118     static int gCurrID = 0;
    119     for (int i = 0; i < n; ++i) {
    120         ids[i] = ++gCurrID;
    121     }
    122 }
    123 // same delete function for all glDelete*(GLsize i, const GLuint*) except buffers
    124 GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteIds(GrGLsizei n, const GrGLuint* ids) {}
    125 
    126 // In debug builds we do asserts that ensure we agree with GL about when a buffer
    127 // is mapped.
    128 static GrTDArray<GrGLuint> gMappedBuffers;
    129 static GrGLuint gCurrArrayBuffer;
    130 static GrGLuint gCurrElementArrayBuffer;
    131 
    132 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindBuffer(GrGLenum target, GrGLuint buffer) {
    133     switch (target) {
    134     case GR_GL_ARRAY_BUFFER:
    135         gCurrArrayBuffer = buffer;
    136         break;
    137     case GR_GL_ELEMENT_ARRAY_BUFFER:
    138         gCurrElementArrayBuffer = buffer;
    139         break;
    140     }
    141 }
    142 
    143 // deleting a bound buffer has the side effect of binding 0
    144 GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteBuffers(GrGLsizei n, const GrGLuint* ids) {
    145     for (int i = 0; i < n; ++i) {
    146         if (ids[i] == gCurrArrayBuffer) {
    147             gCurrArrayBuffer = 0;
    148         }
    149         if (ids[i] == gCurrElementArrayBuffer) {
    150             gCurrElementArrayBuffer = 0;
    151         }
    152         for (int j = 0; j < gMappedBuffers.count(); ++j) {
    153             if (gMappedBuffers[j] == ids[i]) {
    154                 gMappedBuffers.remove(j);
    155                 // don't break b/c we didn't check for dupes on insert
    156                 --j;
    157             }
    158         }
    159     }
    160 }
    161 
    162 GrGLvoid* GR_GL_FUNCTION_TYPE nullGLMapBuffer(GrGLenum target, GrGLenum access) {
    163     // We just reserve 32MB of RAM for all locks and hope its big enough
    164     static SkAutoMalloc gBufferData(32 * (1 << 20));
    165     GrGLuint buf = 0;
    166     switch (target) {
    167         case GR_GL_ARRAY_BUFFER:
    168             buf = gCurrArrayBuffer;
    169             break;
    170         case GR_GL_ELEMENT_ARRAY_BUFFER:
    171             buf = gCurrElementArrayBuffer;
    172             break;
    173     }
    174     if (buf) {
    175         *gMappedBuffers.append() = buf;
    176     }
    177     return gBufferData.get();
    178 }
    179 
    180 GrGLboolean GR_GL_FUNCTION_TYPE nullGLUnmapBuffer(GrGLenum target) {
    181     GrGLuint buf = 0;
    182     switch (target) {
    183     case GR_GL_ARRAY_BUFFER:
    184         buf = gCurrArrayBuffer;
    185         break;
    186     case GR_GL_ELEMENT_ARRAY_BUFFER:
    187         buf = gCurrElementArrayBuffer;
    188         break;
    189     }
    190     if (buf) {
    191         for (int i = 0; i < gMappedBuffers.count(); ++i) {
    192             if (gMappedBuffers[i] == buf) {
    193                 gMappedBuffers.remove(i);
    194                 // don't break b/c we didn't check for dupes on insert
    195                 --i;
    196             }
    197         }
    198     }
    199     return GR_GL_TRUE;
    200 }
    201 
    202 GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetBufferParameteriv(GrGLenum target, GrGLenum pname, GrGLint* params) {
    203     switch (pname) {
    204         case GR_GL_BUFFER_MAPPED: {
    205             *params = GR_GL_FALSE;
    206             GrGLuint buf = 0;
    207             switch (target) {
    208                 case GR_GL_ARRAY_BUFFER:
    209                     buf = gCurrArrayBuffer;
    210                     break;
    211                 case GR_GL_ELEMENT_ARRAY_BUFFER:
    212                     buf = gCurrElementArrayBuffer;
    213                     break;
    214             }
    215             if (buf) {
    216                 for (int i = 0; i < gMappedBuffers.count(); ++i) {
    217                     if (gMappedBuffers[i] == buf) {
    218                         *params = GR_GL_TRUE;
    219                         break;
    220                     }
    221                 }
    222             }
    223             break; }
    224         default:
    225             GrCrash("Unexpected pname to GetBufferParamateriv");
    226             break;
    227     }
    228 };
    229 
    230 GrGLenum GR_GL_FUNCTION_TYPE nullGLGetError() {
    231     return GR_GL_NO_ERROR;
    232 }
    233 
    234 GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetIntegerv(GrGLenum pname, GrGLint* params) {
    235     switch (pname) {
    236         case GR_GL_STENCIL_BITS:
    237             *params = 8;
    238             break;
    239         case GR_GL_SAMPLES:
    240             *params = 1;
    241             break;
    242         case GR_GL_FRAMEBUFFER_BINDING:
    243             *params = 0;
    244             break;
    245         case GR_GL_VIEWPORT:
    246             params[0] = 0;
    247             params[1] = 0;
    248             params[2] = 800;
    249             params[3] = 600;
    250             break;
    251         case GR_GL_MAX_TEXTURE_IMAGE_UNITS:
    252             *params = 8;
    253             break;
    254         case GR_GL_MAX_FRAGMENT_UNIFORM_VECTORS:
    255             *params = 16;
    256             break;
    257         case GR_GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
    258             *params = 16 * 4;
    259             break;
    260         case GR_GL_NUM_COMPRESSED_TEXTURE_FORMATS:
    261             *params = 0;
    262             break;
    263         case GR_GL_COMPRESSED_TEXTURE_FORMATS:
    264             break;
    265         case GR_GL_MAX_TEXTURE_SIZE:
    266             *params = 8192;
    267             break;
    268         case GR_GL_MAX_RENDERBUFFER_SIZE:
    269             *params = 8192;
    270             break;
    271         case GR_GL_MAX_SAMPLES:
    272             *params = 32;
    273             break;
    274         case GR_GL_MAX_VERTEX_ATTRIBS:
    275             *params = 16;
    276             break;
    277         case GR_GL_MAX_TEXTURE_UNITS:
    278             *params = 8;
    279             break;
    280         default:
    281             GrCrash("Unexpected pname to GetIntegerv");
    282     }
    283 }
    284 // used for both the program and shader info logs
    285 GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetInfoLog(GrGLuint program, GrGLsizei bufsize, GrGLsizei* length, char* infolog) {
    286     if (length) {
    287         *length = 0;
    288     }
    289     if (bufsize > 0) {
    290         *infolog = 0;
    291     }
    292 }
    293 
    294 // used for both the program and shader params
    295 GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetShaderOrProgramiv(GrGLuint program, GrGLenum pname, GrGLint* params) {
    296     switch (pname) {
    297         case GR_GL_LINK_STATUS:  // fallthru
    298         case GR_GL_COMPILE_STATUS:
    299             *params = GR_GL_TRUE;
    300             break;
    301         case GR_GL_INFO_LOG_LENGTH:
    302             *params = 0;
    303             break;
    304         // we don't expect any other pnames
    305         default:
    306             GrCrash("Unexpected pname to GetProgramiv");
    307             break;
    308     }
    309 }
    310 
    311 namespace {
    312 template <typename T>
    313 void query_result(GrGLenum GLtarget, GrGLenum pname, T *params) {
    314     switch (pname) {
    315         case GR_GL_QUERY_RESULT_AVAILABLE:
    316             *params = GR_GL_TRUE;
    317             break;
    318         case GR_GL_QUERY_RESULT:
    319             *params = 0;
    320             break;
    321         default:
    322             GrCrash("Unexpected pname passed to GetQueryObject.");
    323             break;
    324     }
    325 }
    326 }
    327 
    328 // Queries on the null GL just don't do anything at all. We could potentially make
    329 // the timers work.
    330 GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetQueryiv(GrGLenum GLtarget, GrGLenum pname, GrGLint *params) {
    331     switch (pname) {
    332         case GR_GL_CURRENT_QUERY:
    333             *params = 0;
    334             break;
    335         case GR_GL_QUERY_COUNTER_BITS:
    336             *params = 32;
    337             break;
    338         default:
    339             GrCrash("Unexpected pname passed GetQueryiv.");
    340     }
    341 }
    342 GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetQueryObjecti64v(GrGLuint id, GrGLenum pname, GrGLint64 *params) {
    343     query_result(id, pname, params);
    344 }
    345 GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetQueryObjectiv(GrGLuint id, GrGLenum pname, GrGLint *params) {
    346     query_result(id, pname, params);
    347 }
    348 GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetQueryObjectui64v(GrGLuint id, GrGLenum pname, GrGLuint64 *params) {
    349     query_result(id, pname, params);
    350 }
    351 GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetQueryObjectuiv(GrGLuint id, GrGLenum pname, GrGLuint *params) {
    352     query_result(id, pname, params);
    353 }
    354 
    355 const GrGLubyte* GR_GL_FUNCTION_TYPE nullGLGetString(GrGLenum name) {
    356     switch (name) {
    357         case GR_GL_EXTENSIONS:
    358             return (const GrGLubyte*)"GL_ARB_framebuffer_object GL_ARB_blend_func_extended GL_ARB_timer_query GL_ARB_draw_buffers GL_ARB_occlusion_query GL_EXT_blend_color GL_EXT_stencil_wrap";
    359         case GR_GL_VERSION:
    360             return (const GrGLubyte*)"4.0 Null GL";
    361         case GR_GL_SHADING_LANGUAGE_VERSION:
    362             return (const GrGLubyte*)"4.20.8 Null GLSL";
    363         default:
    364             GrCrash("Unexpected name to GetString");
    365             return NULL;
    366     }
    367 }
    368 
    369 // we used to use this to query stuff about externally created textures, now we just
    370 // require clients to tell us everything about the texture.
    371 GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetTexLevelParameteriv(GrGLenum target, GrGLint level, GrGLenum pname, GrGLint* params) {
    372     GrCrash("Should never query texture parameters.");
    373 }
    374 
    375 GrGLint GR_GL_FUNCTION_TYPE nullGLGetUniformLocation(GrGLuint program, const char* name) {
    376     static int gUniLocation = 0;
    377     return ++gUniLocation;
    378 }
    379 
    380 const GrGLInterface* GrGLCreateNullInterface() {
    381     // The gl functions are not context-specific so we create one global
    382     // interface
    383     static SkAutoTUnref<GrGLInterface> glInterface;
    384     if (!glInterface.get()) {
    385         GrGLInterface* interface = new GrGLInterface;
    386         glInterface.reset(interface);
    387         interface->fBindingsExported = kDesktop_GrGLBinding;
    388         interface->fActiveTexture = nullGLActiveTexture;
    389         interface->fAttachShader = nullGLAttachShader;
    390         interface->fBeginQuery = nullGLBeginQuery;
    391         interface->fBindAttribLocation = nullGLBindAttribLocation;
    392         interface->fBindBuffer = nullGLBindBuffer;
    393         interface->fBindFragDataLocation = nullGLBindFragDataLocation;
    394         interface->fBindTexture = nullGLBindTexture;
    395         interface->fBlendColor = nullGLBlendColor;
    396         interface->fBlendFunc = nullGLBlendFunc;
    397         interface->fBufferData = nullGLBufferData;
    398         interface->fBufferSubData = nullGLBufferSubData;
    399         interface->fClear = nullGLClear;
    400         interface->fClearColor = nullGLClearColor;
    401         interface->fClearStencil = nullGLClearStencil;
    402         interface->fColorMask = nullGLColorMask;
    403         interface->fCompileShader = nullGLCompileShader;
    404         interface->fCompressedTexImage2D = nullGLCompressedTexImage2D;
    405         interface->fCreateProgram = nullGLCreateProgram;
    406         interface->fCreateShader = nullGLCreateShader;
    407         interface->fCullFace = nullGLCullFace;
    408         interface->fDeleteBuffers = nullGLDeleteBuffers;
    409         interface->fDeleteProgram = nullGLDelete;
    410         interface->fDeleteQueries = nullGLDeleteIds;
    411         interface->fDeleteShader = nullGLDelete;
    412         interface->fDeleteTextures = nullGLDeleteIds;
    413         interface->fDepthMask = nullGLDepthMask;
    414         interface->fDisable = nullGLDisable;
    415         interface->fDisableVertexAttribArray = nullGLDisableVertexAttribArray;
    416         interface->fDrawArrays = nullGLDrawArrays;
    417         interface->fDrawBuffer = nullGLDrawBuffer;
    418         interface->fDrawBuffers = nullGLDrawBuffers;
    419         interface->fDrawElements = nullGLDrawElements;
    420         interface->fEnable = nullGLEnable;
    421         interface->fEnableVertexAttribArray = nullGLEnableVertexAttribArray;
    422         interface->fEndQuery = nullGLEndQuery;
    423         interface->fFinish = nullGLFinish;
    424         interface->fFlush = nullGLFlush;
    425         interface->fFrontFace = nullGLFrontFace;
    426         interface->fGenBuffers = nullGLGenIds;
    427         interface->fGenQueries = nullGLGenIds;
    428         interface->fGenTextures = nullGLGenIds;
    429         interface->fGetBufferParameteriv = nullGLGetBufferParameteriv;
    430         interface->fGetError = nullGLGetError;
    431         interface->fGetIntegerv = nullGLGetIntegerv;
    432         interface->fGetQueryObjecti64v = nullGLGetQueryObjecti64v;
    433         interface->fGetQueryObjectiv = nullGLGetQueryObjectiv;
    434         interface->fGetQueryObjectui64v = nullGLGetQueryObjectui64v;
    435         interface->fGetQueryObjectuiv = nullGLGetQueryObjectuiv;
    436         interface->fGetQueryiv = nullGLGetQueryiv;
    437         interface->fGetProgramInfoLog = nullGLGetInfoLog;
    438         interface->fGetProgramiv = nullGLGetShaderOrProgramiv;
    439         interface->fGetShaderInfoLog = nullGLGetInfoLog;
    440         interface->fGetShaderiv = nullGLGetShaderOrProgramiv;
    441         interface->fGetString = nullGLGetString;
    442         interface->fGetTexLevelParameteriv = nullGLGetTexLevelParameteriv;
    443         interface->fGetUniformLocation = nullGLGetUniformLocation;
    444         interface->fLineWidth = nullGLLineWidth;
    445         interface->fLinkProgram = nullGLLinkProgram;
    446         interface->fPixelStorei = nullGLPixelStorei;
    447         interface->fQueryCounter = nullGLQueryCounter;
    448         interface->fReadBuffer = nullGLReadBuffer;
    449         interface->fReadPixels = nullGLReadPixels;
    450         interface->fScissor = nullGLScissor;
    451         interface->fShaderSource = nullGLShaderSource;
    452         interface->fStencilFunc = nullGLStencilFunc;
    453         interface->fStencilFuncSeparate = nullGLStencilFuncSeparate;
    454         interface->fStencilMask = nullGLStencilMask;
    455         interface->fStencilMaskSeparate = nullGLStencilMaskSeparate;
    456         interface->fStencilOp = nullGLStencilOp;
    457         interface->fStencilOpSeparate = nullGLStencilOpSeparate;
    458         interface->fTexImage2D = nullGLTexImage2D;
    459         interface->fTexParameteri = nullGLTexParameteri;
    460         interface->fTexSubImage2D = nullGLTexSubImage2D;
    461         interface->fTexStorage2D = nullGLTexStorage2D;
    462         interface->fUniform1f = nullGLUniform1f;
    463         interface->fUniform1i = nullGLUniform1i;
    464         interface->fUniform1fv = nullGLUniform1fv;
    465         interface->fUniform1iv = nullGLUniform1iv;
    466         interface->fUniform2f = nullGLUniform2f;
    467         interface->fUniform2i = nullGLUniform2i;
    468         interface->fUniform2fv = nullGLUniform2fv;
    469         interface->fUniform2iv = nullGLUniform2iv;
    470         interface->fUniform3f = nullGLUniform3f;
    471         interface->fUniform3i = nullGLUniform3i;
    472         interface->fUniform3fv = nullGLUniform3fv;
    473         interface->fUniform3iv = nullGLUniform3iv;
    474         interface->fUniform4f = nullGLUniform4f;
    475         interface->fUniform4i = nullGLUniform4i;
    476         interface->fUniform4fv = nullGLUniform4fv;
    477         interface->fUniform4iv = nullGLUniform4iv;
    478         interface->fUniformMatrix2fv = nullGLUniformMatrix2fv;
    479         interface->fUniformMatrix3fv = nullGLUniformMatrix3fv;
    480         interface->fUniformMatrix4fv = nullGLUniformMatrix4fv;
    481         interface->fUseProgram = nullGLUseProgram;
    482         interface->fVertexAttrib4fv = nullGLVertexAttrib4fv;
    483         interface->fVertexAttribPointer = nullGLVertexAttribPointer;
    484         interface->fViewport = nullGLViewport;
    485         interface->fBindFramebuffer = nullGLBindFramebuffer;
    486         interface->fBindRenderbuffer = nullGLBindRenderbuffer;
    487         interface->fCheckFramebufferStatus = nullGLCheckFramebufferStatus;
    488         interface->fDeleteFramebuffers = nullGLDeleteFramebuffers;
    489         interface->fDeleteRenderbuffers = nullGLDeleteRenderbuffers;
    490         interface->fFramebufferRenderbuffer = nullGLFramebufferRenderbuffer;
    491         interface->fFramebufferTexture2D = nullGLFramebufferTexture2D;
    492         interface->fGenFramebuffers = nullGLGenIds;
    493         interface->fGenRenderbuffers = nullGLGenIds;
    494         interface->fGetFramebufferAttachmentParameteriv = nullGLGetFramebufferAttachmentParameteriv;
    495         interface->fGetRenderbufferParameteriv = nullGLGetRenderbufferParameteriv;
    496         interface->fRenderbufferStorage = nullGLRenderbufferStorage;
    497         interface->fRenderbufferStorageMultisample = nullGLRenderbufferStorageMultisample;
    498         interface->fBlitFramebuffer = nullGLBlitFramebuffer;
    499         interface->fResolveMultisampleFramebuffer = nullGLResolveMultisampleFramebuffer;
    500         interface->fMapBuffer = nullGLMapBuffer;
    501         interface->fUnmapBuffer = nullGLUnmapBuffer;
    502         interface->fBindFragDataLocationIndexed = nullGLBindFragDataLocationIndexed;
    503     }
    504     glInterface.get()->ref();
    505     return glInterface.get();
    506 }
    507