180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc.
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "gl/GrGLInterface.h"
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrGLDefines.h"
11d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger#include "SkTDArray.h"
12096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "GrGLNoOpInterface.h"
13096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
14096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger// Functions not declared in GrGLBogusInterface.h (not common with the Debug GL interface).
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querunamespace { // added to suppress 'no previous prototype' warning
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerclass GrBufferObj {
1958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerpublic:
2058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    GrBufferObj(GrGLuint id) : fID(id), fDataPtr(NULL), fSize(0), fMapped(false) {
2158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
2258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    ~GrBufferObj() { SkDELETE_ARRAY(fDataPtr); }
2358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
2458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    void allocate(GrGLsizeiptr size, const GrGLchar* dataPtr) {
2558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        if (NULL != fDataPtr) {
260a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            SkASSERT(0 != fSize);
2758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            SkDELETE_ARRAY(fDataPtr);
2858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        }
2958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
3058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        fSize = size;
3158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        fDataPtr = SkNEW_ARRAY(char, size);
3258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
3358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
3458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    GrGLuint id() const          { return fID; }
3558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    GrGLchar* dataPtr()          { return fDataPtr; }
3658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    GrGLsizeiptr size() const    { return fSize; }
3758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
3858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    void setMapped(bool mapped)  { fMapped = mapped; }
3958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    bool mapped() const          { return fMapped; }
4058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
4158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerprivate:
4258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    GrGLuint     fID;
4358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    GrGLchar*    fDataPtr;
4458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    GrGLsizeiptr fSize;         // size in bytes
4558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    bool         fMapped;
4658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger};
4758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
4858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger// In debug builds we do asserts that ensure we agree with GL about when a buffer
4958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger// is mapped.
5058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic SkTDArray<GrBufferObj*> gBuffers;  // slot 0 is reserved for head of free list
5158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic GrGLuint gCurrArrayBuffer;
5258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic GrGLuint gCurrElementArrayBuffer;
5358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
5458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic GrBufferObj* look_up(GrGLuint id) {
5558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    GrBufferObj* buffer = gBuffers[id];
560a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    SkASSERT(NULL != buffer && buffer->id() == id);
5758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    return buffer;
5858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}
5958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
6058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic GrBufferObj* create_buffer() {
6158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    if (0 == gBuffers.count()) {
6258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        // slot zero is reserved for the head of the free list
6358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        *gBuffers.append() = NULL;
6458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
6558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
6658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    GrGLuint id;
6758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    GrBufferObj* buffer;
6858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
6958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    if (NULL == gBuffers[0]) {
7058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        // no free slots - create a new one
7158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        id = gBuffers.count();
7258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        buffer = SkNEW_ARGS(GrBufferObj, (id));
7358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        gBuffers.append(1, &buffer);
7458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    } else {
7558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        // recycle a slot from the free list
7658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        id = SkTCast<GrGLuint>(gBuffers[0]);
7758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        gBuffers[0] = gBuffers[id];
7858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
7958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        buffer = SkNEW_ARGS(GrBufferObj, (id));
8058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        gBuffers[id] = buffer;
8158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
8258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
8358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    return buffer;
8458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}
8558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
8658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic void delete_buffer(GrBufferObj* buffer) {
870a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    SkASSERT(gBuffers.count() > 0);
8858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
8958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    GrGLuint id = buffer->id();
9058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkDELETE(buffer);
9158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
9258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    // Add this slot to the free list
9358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    gBuffers[id] = gBuffers[0];
9458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    gBuffers[0] = SkTCast<GrBufferObj*>((const void*)(intptr_t)id);
9558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}
9658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLActiveTexture(GrGLenum texture) {}
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLAttachShader(GrGLuint program, GrGLuint shader) {}
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLBeginQuery(GrGLenum target, GrGLuint id) {}
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindAttribLocation(GrGLuint program, GrGLuint index, const char* name) {}
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindTexture(GrGLenum target, GrGLuint texture) {}
102096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindVertexArray(GrGLuint id) {}
1030a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLClientActiveTexture(GrGLenum) {}
10458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
10558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLGenBuffers(GrGLsizei n, GrGLuint* ids) {
10658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
10758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    for (int i = 0; i < n; ++i) {
10858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        GrBufferObj* buffer = create_buffer();
10958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        ids[i] = buffer->id();
11058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
11158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}
11258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
113e27eefc4844477cee5d32f51ab45ff62020cdb36Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLGenerateMipmap(GrGLenum target) {}
114e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger
11558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLBufferData(GrGLenum target,
11658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                                              GrGLsizeiptr size,
11758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                                              const GrGLvoid* data,
11858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                                              GrGLenum usage) {
11958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    GrGLuint id = 0;
12058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
12158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    switch (target) {
12258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    case GR_GL_ARRAY_BUFFER:
12358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        id = gCurrArrayBuffer;
12458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        break;
12558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    case GR_GL_ELEMENT_ARRAY_BUFFER:
12658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        id = gCurrElementArrayBuffer;
12758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        break;
12858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    default:
12958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        GrCrash("Unexpected target to nullGLBufferData");
13058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        break;
13158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
13258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
13358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    if (id > 0) {
13458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        GrBufferObj* buffer = look_up(id);
13558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        buffer->allocate(size, (const GrGLchar*) data);
13658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
13758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}
13858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLPixelStorei(GrGLenum pname, GrGLint param) {}
14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLReadPixels(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, GrGLvoid* pixels) {}
14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLUseProgram(GrGLuint program) {}
14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLViewport(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height) {}
14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindFramebuffer(GrGLenum target, GrGLuint framebuffer) {}
14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindRenderbuffer(GrGLenum target, GrGLuint renderbuffer) {}
14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteFramebuffers(GrGLsizei n, const GrGLuint *framebuffers) {}
14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteRenderbuffers(GrGLsizei n, const GrGLuint *renderbuffers) {}
14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferRenderbuffer(GrGLenum target, GrGLenum attachment, GrGLenum renderbuffertarget, GrGLuint renderbuffer) {}
14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferTexture2D(GrGLenum target, GrGLenum attachment, GrGLenum textarget, GrGLuint texture, GrGLint level) {}
14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLuint GR_GL_FUNCTION_TYPE nullGLCreateProgram() {
15158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    static GrGLuint gCurrID = 0;
15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return ++gCurrID;
15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLuint GR_GL_FUNCTION_TYPE nullGLCreateShader(GrGLenum type) {
15658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    static GrGLuint gCurrID = 0;
15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return ++gCurrID;
15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// same delete used for shaders and programs
16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLDelete(GrGLuint program) {
16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindBuffer(GrGLenum target, GrGLuint buffer) {
16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    switch (target) {
16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case GR_GL_ARRAY_BUFFER:
16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        gCurrArrayBuffer = buffer;
16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        break;
16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case GR_GL_ELEMENT_ARRAY_BUFFER:
17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        gCurrElementArrayBuffer = buffer;
17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        break;
17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
17580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// deleting a bound buffer has the side effect of binding 0
17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteBuffers(GrGLsizei n, const GrGLuint* ids) {
17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    for (int i = 0; i < n; ++i) {
17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (ids[i] == gCurrArrayBuffer) {
17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            gCurrArrayBuffer = 0;
18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (ids[i] == gCurrElementArrayBuffer) {
18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            gCurrElementArrayBuffer = 0;
18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
18458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
18558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        GrBufferObj* buffer = look_up(ids[i]);
18658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        delete_buffer(buffer);
18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid* GR_GL_FUNCTION_TYPE nullGLMapBuffer(GrGLenum target, GrGLenum access) {
19158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
19258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    GrGLuint id = 0;
19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    switch (target) {
19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case GR_GL_ARRAY_BUFFER:
19558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            id = gCurrArrayBuffer;
19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case GR_GL_ELEMENT_ARRAY_BUFFER:
19858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            id = gCurrElementArrayBuffer;
19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
20158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
20258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    if (id > 0) {
20358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        GrBufferObj* buffer = look_up(id);
2040a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        SkASSERT(!buffer->mapped());
20558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        buffer->setMapped(true);
20658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        return buffer->dataPtr();
20780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
20858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
2090a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    SkASSERT(false);
21058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    return NULL;            // no buffer bound to target
21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
21280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLboolean GR_GL_FUNCTION_TYPE nullGLUnmapBuffer(GrGLenum target) {
21458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    GrGLuint id = 0;
21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    switch (target) {
21680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case GR_GL_ARRAY_BUFFER:
21758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        id = gCurrArrayBuffer;
21880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        break;
21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    case GR_GL_ELEMENT_ARRAY_BUFFER:
22058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        id = gCurrElementArrayBuffer;
22180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        break;
22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
22358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    if (id > 0) {
22458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        GrBufferObj* buffer = look_up(id);
2250a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        SkASSERT(buffer->mapped());
22658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        buffer->setMapped(false);
22758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        return GR_GL_TRUE;
22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
22958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
23058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    GrAlwaysAssert(false);
23158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    return GR_GL_FALSE; // GR_GL_INVALID_OPERATION;
23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
23380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
23480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLGetBufferParameteriv(GrGLenum target, GrGLenum pname, GrGLint* params) {
23580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    switch (pname) {
23680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case GR_GL_BUFFER_MAPPED: {
23780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            *params = GR_GL_FALSE;
23858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            GrGLuint id = 0;
23980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            switch (target) {
24080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                case GR_GL_ARRAY_BUFFER:
24158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                    id = gCurrArrayBuffer;
24280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                    break;
24380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                case GR_GL_ELEMENT_ARRAY_BUFFER:
24458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                    id = gCurrElementArrayBuffer;
24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                    break;
24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            }
24758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            if (id > 0) {
24858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                GrBufferObj* buffer = look_up(id);
24958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                if (buffer->mapped()) {
25058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                    *params = GR_GL_TRUE;
25180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                }
25280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            }
25380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break; }
25480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        default:
25580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            GrCrash("Unexpected pname to GetBufferParamateriv");
25680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
25780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
25880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
25980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
26080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} // end anonymous namespace
26180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
26280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst GrGLInterface* GrGLCreateNullInterface() {
26380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // The gl functions are not context-specific so we create one global
26480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // interface
26580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    static SkAutoTUnref<GrGLInterface> glInterface;
26680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (!glInterface.get()) {
26780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        GrGLInterface* interface = SkNEW(GrGLInterface);
26880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        glInterface.reset(interface);
26980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fBindingsExported = kDesktop_GrGLBinding;
27080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fActiveTexture = nullGLActiveTexture;
27180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fAttachShader = nullGLAttachShader;
27280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fBeginQuery = nullGLBeginQuery;
27380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fBindAttribLocation = nullGLBindAttribLocation;
27480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fBindBuffer = nullGLBindBuffer;
275096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fBindFragDataLocation = noOpGLBindFragDataLocation;
27680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fBindTexture = nullGLBindTexture;
277096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fBindVertexArray = nullGLBindVertexArray;
278096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fBlendColor = noOpGLBlendColor;
279096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fBlendFunc = noOpGLBlendFunc;
28080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fBufferData = nullGLBufferData;
281096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fBufferSubData = noOpGLBufferSubData;
282096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fClear = noOpGLClear;
283096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fClearColor = noOpGLClearColor;
284096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fClearStencil = noOpGLClearStencil;
2850a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        interface->fClientActiveTexture = nullGLClientActiveTexture;
286096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fColorMask = noOpGLColorMask;
287096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fCompileShader = noOpGLCompileShader;
288096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fCompressedTexImage2D = noOpGLCompressedTexImage2D;
2897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        interface->fCopyTexSubImage2D = noOpGLCopyTexSubImage2D;
29080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fCreateProgram = nullGLCreateProgram;
29180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fCreateShader = nullGLCreateShader;
292096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fCullFace = noOpGLCullFace;
29380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fDeleteBuffers = nullGLDeleteBuffers;
29480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fDeleteProgram = nullGLDelete;
295096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fDeleteQueries = noOpGLDeleteIds;
29680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fDeleteShader = nullGLDelete;
297096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fDeleteTextures = noOpGLDeleteIds;
298096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fDeleteVertexArrays = noOpGLDeleteIds;
299096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fDepthMask = noOpGLDepthMask;
300096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fDisable = noOpGLDisable;
3010a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        interface->fDisableClientState = noOpGLDisableClientState;
302096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fDisableVertexAttribArray = noOpGLDisableVertexAttribArray;
303096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fDrawArrays = noOpGLDrawArrays;
304096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fDrawBuffer = noOpGLDrawBuffer;
305096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fDrawBuffers = noOpGLDrawBuffers;
306096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fDrawElements = noOpGLDrawElements;
307096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fEnable = noOpGLEnable;
3080a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        interface->fEnableClientState = noOpGLEnableClientState;
309096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fEnableVertexAttribArray = noOpGLEnableVertexAttribArray;
310096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fEndQuery = noOpGLEndQuery;
311096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fFinish = noOpGLFinish;
312096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fFlush = noOpGLFlush;
313096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fFrontFace = noOpGLFrontFace;
31458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        interface->fGenBuffers = nullGLGenBuffers;
315e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger        interface->fGenerateMipmap = nullGLGenerateMipmap;
316096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fGenQueries = noOpGLGenIds;
317096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fGenTextures = noOpGLGenIds;
318096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fGenVertexArrays = noOpGLGenIds;
31980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fGetBufferParameteriv = nullGLGetBufferParameteriv;
320096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fGetError = noOpGLGetError;
321096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fGetIntegerv = noOpGLGetIntegerv;
322096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fGetQueryObjecti64v = noOpGLGetQueryObjecti64v;
323096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fGetQueryObjectiv = noOpGLGetQueryObjectiv;
324096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fGetQueryObjectui64v = noOpGLGetQueryObjectui64v;
325096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fGetQueryObjectuiv = noOpGLGetQueryObjectuiv;
326096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fGetQueryiv = noOpGLGetQueryiv;
327096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fGetProgramInfoLog = noOpGLGetInfoLog;
328096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fGetProgramiv = noOpGLGetShaderOrProgramiv;
329096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fGetShaderInfoLog = noOpGLGetInfoLog;
330096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fGetShaderiv = noOpGLGetShaderOrProgramiv;
331096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fGetString = noOpGLGetString;
332096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fGetStringi = noOpGLGetStringi;
333096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fGetTexLevelParameteriv = noOpGLGetTexLevelParameteriv;
334096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fGetUniformLocation = noOpGLGetUniformLocation;
3350a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        interface->fLoadIdentity = noOpGLLoadIdentity;
3360a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        interface->fLoadMatrixf = noOpGLLoadMatrixf;
337096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fLineWidth = noOpGLLineWidth;
338096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fLinkProgram = noOpGLLinkProgram;
3390a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        interface->fMatrixMode = noOpGLMatrixMode;
34080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fPixelStorei = nullGLPixelStorei;
341096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fQueryCounter = noOpGLQueryCounter;
342096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fReadBuffer = noOpGLReadBuffer;
34380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fReadPixels = nullGLReadPixels;
344096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fScissor = noOpGLScissor;
345096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fShaderSource = noOpGLShaderSource;
346096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fStencilFunc = noOpGLStencilFunc;
347096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fStencilFuncSeparate = noOpGLStencilFuncSeparate;
348096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fStencilMask = noOpGLStencilMask;
349096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fStencilMaskSeparate = noOpGLStencilMaskSeparate;
350096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fStencilOp = noOpGLStencilOp;
351096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fStencilOpSeparate = noOpGLStencilOpSeparate;
3520a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        interface->fTexGenf = noOpGLTexGenf;
3530a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        interface->fTexGenfv = noOpGLTexGenfv;
3540a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        interface->fTexGeni = noOpGLTexGeni;
355096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fTexImage2D = noOpGLTexImage2D;
356096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fTexParameteri = noOpGLTexParameteri;
357096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fTexParameteriv = noOpGLTexParameteriv;
358096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fTexSubImage2D = noOpGLTexSubImage2D;
359096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fTexStorage2D = noOpGLTexStorage2D;
3607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        interface->fDiscardFramebuffer = noOpGLDiscardFramebuffer;
361096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fUniform1f = noOpGLUniform1f;
362096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fUniform1i = noOpGLUniform1i;
363096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fUniform1fv = noOpGLUniform1fv;
364096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fUniform1iv = noOpGLUniform1iv;
365096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fUniform2f = noOpGLUniform2f;
366096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fUniform2i = noOpGLUniform2i;
367096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fUniform2fv = noOpGLUniform2fv;
368096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fUniform2iv = noOpGLUniform2iv;
369096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fUniform3f = noOpGLUniform3f;
370096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fUniform3i = noOpGLUniform3i;
371096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fUniform3fv = noOpGLUniform3fv;
372096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fUniform3iv = noOpGLUniform3iv;
373096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fUniform4f = noOpGLUniform4f;
374096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fUniform4i = noOpGLUniform4i;
375096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fUniform4fv = noOpGLUniform4fv;
376096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fUniform4iv = noOpGLUniform4iv;
377096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fUniformMatrix2fv = noOpGLUniformMatrix2fv;
378096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fUniformMatrix3fv = noOpGLUniformMatrix3fv;
379096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fUniformMatrix4fv = noOpGLUniformMatrix4fv;
38080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fUseProgram = nullGLUseProgram;
381096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fVertexAttrib4fv = noOpGLVertexAttrib4fv;
382096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fVertexAttribPointer = noOpGLVertexAttribPointer;
3830a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        interface->fVertexPointer = noOpGLVertexPointer;
38480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fViewport = nullGLViewport;
38580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fBindFramebuffer = nullGLBindFramebuffer;
38680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fBindRenderbuffer = nullGLBindRenderbuffer;
387096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fCheckFramebufferStatus = noOpGLCheckFramebufferStatus;
38880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fDeleteFramebuffers = nullGLDeleteFramebuffers;
38980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fDeleteRenderbuffers = nullGLDeleteRenderbuffers;
39080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fFramebufferRenderbuffer = nullGLFramebufferRenderbuffer;
39180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fFramebufferTexture2D = nullGLFramebufferTexture2D;
392096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fGenFramebuffers = noOpGLGenIds;
393096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fGenRenderbuffers = noOpGLGenIds;
394096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fGetFramebufferAttachmentParameteriv = noOpGLGetFramebufferAttachmentParameteriv;
395096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fGetRenderbufferParameteriv = noOpGLGetRenderbufferParameteriv;
396096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fRenderbufferStorage = noOpGLRenderbufferStorage;
397096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fRenderbufferStorageMultisample = noOpGLRenderbufferStorageMultisample;
398096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fBlitFramebuffer = noOpGLBlitFramebuffer;
399096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fResolveMultisampleFramebuffer = noOpGLResolveMultisampleFramebuffer;
40080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fMapBuffer = nullGLMapBuffer;
40180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        interface->fUnmapBuffer = nullGLUnmapBuffer;
402096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        interface->fBindFragDataLocationIndexed = noOpGLBindFragDataLocationIndexed;
40380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
40480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    glInterface.get()->ref();
40580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return glInterface.get();
40680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
407