174913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com/*
274913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com * Copyright 2011 Google Inc.
374913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com *
474913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
574913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com * found in the LICENSE file.
674913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com */
774913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com
874913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com
96bf38b59c9de1cd35cd091cf8766117f4e1f66a0tomhudson@google.com#include "gl/GrGLInterface.h"
1091bcc94e8710c1ec5126a31cd805a6c64bb3c39dbsalomon@google.com#include "GrGLDefines.h"
1121cbec4870660f776f470e3a5e327599b6433dd2bsalomon@google.com#include "SkTDArray.h"
128f9436161a83ea89818a486db1577e24ad33ec7bbsalomon@google.com#include "GrGLNoOpInterface.h"
13776d355147307357e47cc65d51706a4231ff95b5bsalomon#include "SkTLS.h"
148f9436161a83ea89818a486db1577e24ad33ec7bbsalomon@google.com
15776d355147307357e47cc65d51706a4231ff95b5bsalomonclass BufferObj {
16d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.compublic:
17776d355147307357e47cc65d51706a4231ff95b5bsalomon    SK_DECLARE_INST_COUNT_ROOT(BufferObj);
18776d355147307357e47cc65d51706a4231ff95b5bsalomon
19776d355147307357e47cc65d51706a4231ff95b5bsalomon    BufferObj(GrGLuint id) : fID(id), fDataPtr(NULL), fSize(0), fMapped(false) {
20d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    }
21776d355147307357e47cc65d51706a4231ff95b5bsalomon    ~BufferObj() { SkDELETE_ARRAY(fDataPtr); }
22d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
23ae6b777ba6d37b5330cdadc15ccff796fe172ca2robertphillips@google.com    void allocate(GrGLsizeiptr size, const GrGLchar* dataPtr) {
2449f085dddff10473b6ebf832a974288300224e60bsalomon        if (fDataPtr) {
25f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org            SkASSERT(0 != fSize);
26d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com            SkDELETE_ARRAY(fDataPtr);
27d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com        }
28d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
29d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com        fSize = size;
30d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com        fDataPtr = SkNEW_ARRAY(char, size);
31d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    }
32d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
33d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    GrGLuint id() const          { return fID; }
34d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    GrGLchar* dataPtr()          { return fDataPtr; }
35ae6b777ba6d37b5330cdadc15ccff796fe172ca2robertphillips@google.com    GrGLsizeiptr size() const    { return fSize; }
36d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
37d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    void setMapped(bool mapped)  { fMapped = mapped; }
38d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    bool mapped() const          { return fMapped; }
39d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
40d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.comprivate:
41d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    GrGLuint     fID;
42d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    GrGLchar*    fDataPtr;
43ae6b777ba6d37b5330cdadc15ccff796fe172ca2robertphillips@google.com    GrGLsizeiptr fSize;         // size in bytes
44d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    bool         fMapped;
45d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com};
46d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
47776d355147307357e47cc65d51706a4231ff95b5bsalomon// This class maintains a sparsely populated array of buffer pointers.
48776d355147307357e47cc65d51706a4231ff95b5bsalomonclass BufferManager {
49776d355147307357e47cc65d51706a4231ff95b5bsalomonpublic:
50776d355147307357e47cc65d51706a4231ff95b5bsalomon    SK_DECLARE_INST_COUNT_ROOT(BufferManager);
51d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
52776d355147307357e47cc65d51706a4231ff95b5bsalomon    BufferManager() : fFreeListHead(kFreeListEnd) {}
53776d355147307357e47cc65d51706a4231ff95b5bsalomon
54776d355147307357e47cc65d51706a4231ff95b5bsalomon    ~BufferManager() {
55776d355147307357e47cc65d51706a4231ff95b5bsalomon        // NULL out the entries that are really free list links rather than ptrs before deleting.
56776d355147307357e47cc65d51706a4231ff95b5bsalomon        intptr_t curr = fFreeListHead;
57776d355147307357e47cc65d51706a4231ff95b5bsalomon        while (kFreeListEnd != curr) {
58776d355147307357e47cc65d51706a4231ff95b5bsalomon            intptr_t next = reinterpret_cast<intptr_t>(fBuffers[SkToS32(curr)]);
59776d355147307357e47cc65d51706a4231ff95b5bsalomon            fBuffers[SkToS32(curr)] = NULL;
60776d355147307357e47cc65d51706a4231ff95b5bsalomon            curr = next;
61776d355147307357e47cc65d51706a4231ff95b5bsalomon        }
62d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
63776d355147307357e47cc65d51706a4231ff95b5bsalomon        fBuffers.deleteAll();
64d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    }
65d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
66776d355147307357e47cc65d51706a4231ff95b5bsalomon    BufferObj* lookUp(GrGLuint id) {
67776d355147307357e47cc65d51706a4231ff95b5bsalomon        BufferObj* buffer = fBuffers[id];
6849f085dddff10473b6ebf832a974288300224e60bsalomon        SkASSERT(buffer && buffer->id() == id);
69776d355147307357e47cc65d51706a4231ff95b5bsalomon        return buffer;
70d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    }
71d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
72776d355147307357e47cc65d51706a4231ff95b5bsalomon    BufferObj* create() {
73776d355147307357e47cc65d51706a4231ff95b5bsalomon        GrGLuint id;
74776d355147307357e47cc65d51706a4231ff95b5bsalomon        BufferObj* buffer;
75776d355147307357e47cc65d51706a4231ff95b5bsalomon
76776d355147307357e47cc65d51706a4231ff95b5bsalomon        if (kFreeListEnd == fFreeListHead) {
77776d355147307357e47cc65d51706a4231ff95b5bsalomon            // no free slots - create a new one
78776d355147307357e47cc65d51706a4231ff95b5bsalomon            id = fBuffers.count();
79776d355147307357e47cc65d51706a4231ff95b5bsalomon            buffer = SkNEW_ARGS(BufferObj, (id));
80776d355147307357e47cc65d51706a4231ff95b5bsalomon            *fBuffers.append() = buffer;
81776d355147307357e47cc65d51706a4231ff95b5bsalomon        } else {
82776d355147307357e47cc65d51706a4231ff95b5bsalomon            // grab the head of the free list and advance the head to the next free slot.
83776d355147307357e47cc65d51706a4231ff95b5bsalomon            id = static_cast<GrGLuint>(fFreeListHead);
84776d355147307357e47cc65d51706a4231ff95b5bsalomon            fFreeListHead = reinterpret_cast<intptr_t>(fBuffers[id]);
85776d355147307357e47cc65d51706a4231ff95b5bsalomon
86776d355147307357e47cc65d51706a4231ff95b5bsalomon            buffer = SkNEW_ARGS(BufferObj, (id));
87776d355147307357e47cc65d51706a4231ff95b5bsalomon            fBuffers[id] = buffer;
88776d355147307357e47cc65d51706a4231ff95b5bsalomon        }
89d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
90776d355147307357e47cc65d51706a4231ff95b5bsalomon        return buffer;
91776d355147307357e47cc65d51706a4231ff95b5bsalomon    }
92d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
93776d355147307357e47cc65d51706a4231ff95b5bsalomon    void free(BufferObj* buffer) {
94776d355147307357e47cc65d51706a4231ff95b5bsalomon        SkASSERT(fBuffers.count() > 0);
95d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
96776d355147307357e47cc65d51706a4231ff95b5bsalomon        GrGLuint id = buffer->id();
97776d355147307357e47cc65d51706a4231ff95b5bsalomon        SkDELETE(buffer);
98776d355147307357e47cc65d51706a4231ff95b5bsalomon
99776d355147307357e47cc65d51706a4231ff95b5bsalomon        fBuffers[id] = reinterpret_cast<BufferObj*>(fFreeListHead);
100776d355147307357e47cc65d51706a4231ff95b5bsalomon        fFreeListHead = id;
101776d355147307357e47cc65d51706a4231ff95b5bsalomon    }
102776d355147307357e47cc65d51706a4231ff95b5bsalomon
103776d355147307357e47cc65d51706a4231ff95b5bsalomonprivate:
104776d355147307357e47cc65d51706a4231ff95b5bsalomon    static const intptr_t kFreeListEnd = -1;
105776d355147307357e47cc65d51706a4231ff95b5bsalomon    // Index of the first entry of fBuffers in the free list. Free slots in fBuffers are indices to
106776d355147307357e47cc65d51706a4231ff95b5bsalomon    // the next free slot. The last free slot has a value of kFreeListEnd.
107776d355147307357e47cc65d51706a4231ff95b5bsalomon    intptr_t                fFreeListHead;
108776d355147307357e47cc65d51706a4231ff95b5bsalomon    SkTDArray<BufferObj*>   fBuffers;
109776d355147307357e47cc65d51706a4231ff95b5bsalomon};
110776d355147307357e47cc65d51706a4231ff95b5bsalomon
111776d355147307357e47cc65d51706a4231ff95b5bsalomon/**
112776d355147307357e47cc65d51706a4231ff95b5bsalomon * The global-to-thread state object for the null interface. All null interfaces on the
113776d355147307357e47cc65d51706a4231ff95b5bsalomon * same thread currently share one of these. This means two null contexts on the same thread
114776d355147307357e47cc65d51706a4231ff95b5bsalomon * can interfere with each other. It may make sense to more integrate this into SkNullGLContext
115776d355147307357e47cc65d51706a4231ff95b5bsalomon * and use it's makeCurrent mechanism.
116776d355147307357e47cc65d51706a4231ff95b5bsalomon */
117776d355147307357e47cc65d51706a4231ff95b5bsalomonstruct ThreadContext {
118776d355147307357e47cc65d51706a4231ff95b5bsalomonpublic:
119776d355147307357e47cc65d51706a4231ff95b5bsalomon    SK_DECLARE_INST_COUNT_ROOT(ThreadContext);
120776d355147307357e47cc65d51706a4231ff95b5bsalomon
121776d355147307357e47cc65d51706a4231ff95b5bsalomon    BufferManager   fBufferManager;
122776d355147307357e47cc65d51706a4231ff95b5bsalomon    GrGLuint        fCurrArrayBuffer;
123776d355147307357e47cc65d51706a4231ff95b5bsalomon    GrGLuint        fCurrElementArrayBuffer;
124776d355147307357e47cc65d51706a4231ff95b5bsalomon    GrGLuint        fCurrProgramID;
125776d355147307357e47cc65d51706a4231ff95b5bsalomon    GrGLuint        fCurrShaderID;
126776d355147307357e47cc65d51706a4231ff95b5bsalomon
127776d355147307357e47cc65d51706a4231ff95b5bsalomon    static ThreadContext* Get() {
128776d355147307357e47cc65d51706a4231ff95b5bsalomon        return reinterpret_cast<ThreadContext*>(SkTLS::Get(Create, Delete));
129776d355147307357e47cc65d51706a4231ff95b5bsalomon    }
130776d355147307357e47cc65d51706a4231ff95b5bsalomon
131776d355147307357e47cc65d51706a4231ff95b5bsalomon    ThreadContext()
132776d355147307357e47cc65d51706a4231ff95b5bsalomon        : fCurrArrayBuffer(0)
133776d355147307357e47cc65d51706a4231ff95b5bsalomon        , fCurrElementArrayBuffer(0)
134776d355147307357e47cc65d51706a4231ff95b5bsalomon        , fCurrProgramID(0)
135776d355147307357e47cc65d51706a4231ff95b5bsalomon        , fCurrShaderID(0) {}
136776d355147307357e47cc65d51706a4231ff95b5bsalomon
137776d355147307357e47cc65d51706a4231ff95b5bsalomonprivate:
138776d355147307357e47cc65d51706a4231ff95b5bsalomon    static void* Create() { return SkNEW(ThreadContext ); }
139776d355147307357e47cc65d51706a4231ff95b5bsalomon    static void Delete(void* context) { SkDELETE(reinterpret_cast<ThreadContext *>(context)); }
140776d355147307357e47cc65d51706a4231ff95b5bsalomon};
141776d355147307357e47cc65d51706a4231ff95b5bsalomon
142776d355147307357e47cc65d51706a4231ff95b5bsalomon// Functions not declared in GrGLBogusInterface.h (not common with the Debug GL interface).
143776d355147307357e47cc65d51706a4231ff95b5bsalomon
144776d355147307357e47cc65d51706a4231ff95b5bsalomonnamespace { // added to suppress 'no previous prototype' warning
145d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
14674913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comGrGLvoid GR_GL_FUNCTION_TYPE nullGLActiveTexture(GrGLenum texture) {}
14774913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comGrGLvoid GR_GL_FUNCTION_TYPE nullGLAttachShader(GrGLuint program, GrGLuint shader) {}
14874913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comGrGLvoid GR_GL_FUNCTION_TYPE nullGLBeginQuery(GrGLenum target, GrGLuint id) {}
14974913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindAttribLocation(GrGLuint program, GrGLuint index, const char* name) {}
15074913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindTexture(GrGLenum target, GrGLuint texture) {}
151ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.comGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindVertexArray(GrGLuint id) {}
152d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
153d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.comGrGLvoid GR_GL_FUNCTION_TYPE nullGLGenBuffers(GrGLsizei n, GrGLuint* ids) {
154776d355147307357e47cc65d51706a4231ff95b5bsalomon    ThreadContext* ctx = ThreadContext::Get();
155d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    for (int i = 0; i < n; ++i) {
156776d355147307357e47cc65d51706a4231ff95b5bsalomon        BufferObj* buffer = ctx->fBufferManager.create();
157d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com        ids[i] = buffer->id();
158d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    }
159d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com}
160d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
161cffff79a40bd7672e13b31b9801a3f3cda64875ecommit-bot@chromium.orgGrGLvoid GR_GL_FUNCTION_TYPE nullGLGenerateMipmap(GrGLenum target) {}
162cffff79a40bd7672e13b31b9801a3f3cda64875ecommit-bot@chromium.org
163a79919883e275e7a5e00afc50be10cc721f6ba1dskia.committer@gmail.comGrGLvoid GR_GL_FUNCTION_TYPE nullGLBufferData(GrGLenum target,
164a79919883e275e7a5e00afc50be10cc721f6ba1dskia.committer@gmail.com                                              GrGLsizeiptr size,
165a79919883e275e7a5e00afc50be10cc721f6ba1dskia.committer@gmail.com                                              const GrGLvoid* data,
166d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com                                              GrGLenum usage) {
167776d355147307357e47cc65d51706a4231ff95b5bsalomon    ThreadContext* ctx = ThreadContext::Get();
168d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    GrGLuint id = 0;
169d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
170d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    switch (target) {
171d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    case GR_GL_ARRAY_BUFFER:
172776d355147307357e47cc65d51706a4231ff95b5bsalomon        id = ctx->fCurrArrayBuffer;
173d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com        break;
174d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    case GR_GL_ELEMENT_ARRAY_BUFFER:
175776d355147307357e47cc65d51706a4231ff95b5bsalomon        id = ctx->fCurrElementArrayBuffer;
176d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com        break;
177d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    default:
17888cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org        SkFAIL("Unexpected target to nullGLBufferData");
179d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com        break;
180d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    }
181d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
182d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    if (id > 0) {
183776d355147307357e47cc65d51706a4231ff95b5bsalomon        BufferObj* buffer = ctx->fBufferManager.lookUp(id);
184d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com        buffer->allocate(size, (const GrGLchar*) data);
185d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    }
186d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com}
187d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
18874913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comGrGLvoid GR_GL_FUNCTION_TYPE nullGLPixelStorei(GrGLenum pname, GrGLint param) {}
18974913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comGrGLvoid GR_GL_FUNCTION_TYPE nullGLReadPixels(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, GrGLvoid* pixels) {}
19074913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comGrGLvoid GR_GL_FUNCTION_TYPE nullGLUseProgram(GrGLuint program) {}
19174913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comGrGLvoid GR_GL_FUNCTION_TYPE nullGLViewport(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height) {}
19274913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindFramebuffer(GrGLenum target, GrGLuint framebuffer) {}
19374913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindRenderbuffer(GrGLenum target, GrGLuint renderbuffer) {}
19474913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comGrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteFramebuffers(GrGLsizei n, const GrGLuint *framebuffers) {}
19574913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comGrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteRenderbuffers(GrGLsizei n, const GrGLuint *renderbuffers) {}
19674913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comGrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferRenderbuffer(GrGLenum target, GrGLenum attachment, GrGLenum renderbuffertarget, GrGLuint renderbuffer) {}
19774913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comGrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferTexture2D(GrGLenum target, GrGLenum attachment, GrGLenum textarget, GrGLuint texture, GrGLint level) {}
19874913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com
19974913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comGrGLuint GR_GL_FUNCTION_TYPE nullGLCreateProgram() {
200776d355147307357e47cc65d51706a4231ff95b5bsalomon    return ++ThreadContext::Get()->fCurrProgramID;
20174913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com}
20274913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com
20374913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comGrGLuint GR_GL_FUNCTION_TYPE nullGLCreateShader(GrGLenum type) {
204776d355147307357e47cc65d51706a4231ff95b5bsalomon    return ++ThreadContext::Get()->fCurrShaderID;
20574913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com}
20674913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com
20774913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com// same delete used for shaders and programs
20874913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comGrGLvoid GR_GL_FUNCTION_TYPE nullGLDelete(GrGLuint program) {
20974913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com}
21074913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com
21174913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindBuffer(GrGLenum target, GrGLuint buffer) {
212776d355147307357e47cc65d51706a4231ff95b5bsalomon    ThreadContext* ctx = ThreadContext::Get();
21374913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    switch (target) {
21474913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    case GR_GL_ARRAY_BUFFER:
215776d355147307357e47cc65d51706a4231ff95b5bsalomon        ctx->fCurrArrayBuffer = buffer;
21674913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com        break;
21774913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    case GR_GL_ELEMENT_ARRAY_BUFFER:
218776d355147307357e47cc65d51706a4231ff95b5bsalomon        ctx->fCurrElementArrayBuffer = buffer;
21974913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com        break;
22074913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    }
22174913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com}
22274913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com
22374913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com// deleting a bound buffer has the side effect of binding 0
22474913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comGrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteBuffers(GrGLsizei n, const GrGLuint* ids) {
225776d355147307357e47cc65d51706a4231ff95b5bsalomon    ThreadContext* ctx = ThreadContext::Get();
22674913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    for (int i = 0; i < n; ++i) {
227776d355147307357e47cc65d51706a4231ff95b5bsalomon        if (ids[i] == ctx->fCurrArrayBuffer) {
228776d355147307357e47cc65d51706a4231ff95b5bsalomon            ctx->fCurrArrayBuffer = 0;
22974913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com        }
230776d355147307357e47cc65d51706a4231ff95b5bsalomon        if (ids[i] == ctx->fCurrElementArrayBuffer) {
231776d355147307357e47cc65d51706a4231ff95b5bsalomon            ctx->fCurrElementArrayBuffer = 0;
23274913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com        }
233d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
234776d355147307357e47cc65d51706a4231ff95b5bsalomon        BufferObj* buffer = ctx->fBufferManager.lookUp(ids[i]);
235776d355147307357e47cc65d51706a4231ff95b5bsalomon        ctx->fBufferManager.free(buffer);
23674913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    }
23774913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com}
23874913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com
239160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.orgGrGLvoid* GR_GL_FUNCTION_TYPE nullGLMapBufferRange(GrGLenum target, GrGLintptr offset,
240160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org                                                   GrGLsizeiptr length, GrGLbitfield access) {
241776d355147307357e47cc65d51706a4231ff95b5bsalomon    ThreadContext* ctx = ThreadContext::Get();
242160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org    GrGLuint id = 0;
243160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org    switch (target) {
244160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org        case GR_GL_ARRAY_BUFFER:
245776d355147307357e47cc65d51706a4231ff95b5bsalomon            id = ctx->fCurrArrayBuffer;
246160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org            break;
247160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org        case GR_GL_ELEMENT_ARRAY_BUFFER:
248776d355147307357e47cc65d51706a4231ff95b5bsalomon            id = ctx->fCurrElementArrayBuffer;
249160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org            break;
250160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org    }
25153b614b567c2213dfe3835f14145ab60e265c76edjsollen@google.com
252160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org    if (id > 0) {
253160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org        // We just ignore the offset and length here.
254776d355147307357e47cc65d51706a4231ff95b5bsalomon        BufferObj* buffer = ctx->fBufferManager.lookUp(id);
255160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org        SkASSERT(!buffer->mapped());
256160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org        buffer->setMapped(true);
257160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org        return buffer->dataPtr();
258160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org    }
259160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org    return NULL;
260160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org}
261160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org
262160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.orgGrGLvoid* GR_GL_FUNCTION_TYPE nullGLMapBuffer(GrGLenum target, GrGLenum access) {
263776d355147307357e47cc65d51706a4231ff95b5bsalomon    ThreadContext* ctx = ThreadContext::Get();
264d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    GrGLuint id = 0;
26574913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    switch (target) {
26674913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com        case GR_GL_ARRAY_BUFFER:
267776d355147307357e47cc65d51706a4231ff95b5bsalomon            id = ctx->fCurrArrayBuffer;
26874913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com            break;
26974913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com        case GR_GL_ELEMENT_ARRAY_BUFFER:
270776d355147307357e47cc65d51706a4231ff95b5bsalomon            id = ctx->fCurrElementArrayBuffer;
27174913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com            break;
27274913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    }
273d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
274d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    if (id > 0) {
275776d355147307357e47cc65d51706a4231ff95b5bsalomon        BufferObj* buffer = ctx->fBufferManager.lookUp(id);
276f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org        SkASSERT(!buffer->mapped());
277d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com        buffer->setMapped(true);
278d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com        return buffer->dataPtr();
27974913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    }
280d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
281f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org    SkASSERT(false);
282d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    return NULL;            // no buffer bound to target
28374913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com}
28474913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com
285160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.orgGrGLvoid GR_GL_FUNCTION_TYPE nullGLFlushMappedBufferRange(GrGLenum target,
286160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org                                                          GrGLintptr offset,
287160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org                                                          GrGLsizeiptr length) {}
288160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org
289160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org
29074913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comGrGLboolean GR_GL_FUNCTION_TYPE nullGLUnmapBuffer(GrGLenum target) {
291776d355147307357e47cc65d51706a4231ff95b5bsalomon    ThreadContext* ctx = ThreadContext::Get();
292d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    GrGLuint id = 0;
29374913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    switch (target) {
29474913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    case GR_GL_ARRAY_BUFFER:
295776d355147307357e47cc65d51706a4231ff95b5bsalomon        id = ctx->fCurrArrayBuffer;
29674913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com        break;
29774913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    case GR_GL_ELEMENT_ARRAY_BUFFER:
298776d355147307357e47cc65d51706a4231ff95b5bsalomon        id = ctx->fCurrElementArrayBuffer;
29974913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com        break;
30074913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    }
301d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    if (id > 0) {
302776d355147307357e47cc65d51706a4231ff95b5bsalomon        BufferObj* buffer = ctx->fBufferManager.lookUp(id);
303f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org        SkASSERT(buffer->mapped());
304d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com        buffer->setMapped(false);
305d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com        return GR_GL_TRUE;
30674913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    }
307d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com
308d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    GrAlwaysAssert(false);
309d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com    return GR_GL_FALSE; // GR_GL_INVALID_OPERATION;
31074913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com}
31174913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com
31274913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comGrGLvoid GR_GL_FUNCTION_TYPE nullGLGetBufferParameteriv(GrGLenum target, GrGLenum pname, GrGLint* params) {
313776d355147307357e47cc65d51706a4231ff95b5bsalomon    ThreadContext* ctx = ThreadContext::Get();
31474913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    switch (pname) {
31574913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com        case GR_GL_BUFFER_MAPPED: {
31674913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com            *params = GR_GL_FALSE;
317d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com            GrGLuint id = 0;
31874913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com            switch (target) {
31974913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com                case GR_GL_ARRAY_BUFFER:
320776d355147307357e47cc65d51706a4231ff95b5bsalomon                    id = ctx->fCurrArrayBuffer;
32174913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com                    break;
32274913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com                case GR_GL_ELEMENT_ARRAY_BUFFER:
323776d355147307357e47cc65d51706a4231ff95b5bsalomon                    id = ctx->fCurrElementArrayBuffer;
324fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com                    break;
32574913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com            }
326d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com            if (id > 0) {
327776d355147307357e47cc65d51706a4231ff95b5bsalomon                BufferObj* buffer = ctx->fBufferManager.lookUp(id);
328d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com                if (buffer->mapped()) {
329d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com                    *params = GR_GL_TRUE;
33074913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com                }
33174913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com            }
33274913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com            break; }
33374913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com        default:
33488cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org            SkFAIL("Unexpected pname to GetBufferParamateriv");
33574913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com            break;
33674913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com    }
33774913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com};
33874913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com
339cf6285b89b8820641ffb6871d4b3275bfe783f51caryclark@google.com} // end anonymous namespace
340cf6285b89b8820641ffb6871d4b3275bfe783f51caryclark@google.com
34174913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.comconst GrGLInterface* GrGLCreateNullInterface() {
342f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    GrGLInterface* interface = SkNEW(GrGLInterface);
343f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org
344f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    interface->fStandard = kGL_GrGLStandard;
345f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org
346f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    GrGLInterface::Functions* functions = &interface->fFunctions;
347f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fActiveTexture = nullGLActiveTexture;
348f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fAttachShader = nullGLAttachShader;
349f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fBeginQuery = nullGLBeginQuery;
350f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fBindAttribLocation = nullGLBindAttribLocation;
351f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fBindBuffer = nullGLBindBuffer;
352f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fBindFragDataLocation = noOpGLBindFragDataLocation;
353f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fBindTexture = nullGLBindTexture;
354f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fBindVertexArray = nullGLBindVertexArray;
355f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fBlendColor = noOpGLBlendColor;
356f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fBlendFunc = noOpGLBlendFunc;
357f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fBufferData = nullGLBufferData;
358f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fBufferSubData = noOpGLBufferSubData;
359f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fClear = noOpGLClear;
360f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fClearColor = noOpGLClearColor;
361f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fClearStencil = noOpGLClearStencil;
362f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fColorMask = noOpGLColorMask;
363f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fCompileShader = noOpGLCompileShader;
364f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fCompressedTexImage2D = noOpGLCompressedTexImage2D;
36537d20f75320e8182f4cdbce5f3d59a339f915e05krajcevski    functions->fCompressedTexSubImage2D = noOpGLCompressedTexSubImage2D;
366f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fCopyTexSubImage2D = noOpGLCopyTexSubImage2D;
367f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fCreateProgram = nullGLCreateProgram;
368f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fCreateShader = nullGLCreateShader;
369f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fCullFace = noOpGLCullFace;
370f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fDeleteBuffers = nullGLDeleteBuffers;
371f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fDeleteProgram = nullGLDelete;
372f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fDeleteQueries = noOpGLDeleteIds;
373f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fDeleteShader = nullGLDelete;
374f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fDeleteTextures = noOpGLDeleteIds;
375f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fDeleteVertexArrays = noOpGLDeleteIds;
376f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fDepthMask = noOpGLDepthMask;
377f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fDisable = noOpGLDisable;
378f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fDisableVertexAttribArray = noOpGLDisableVertexAttribArray;
379f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fDrawArrays = noOpGLDrawArrays;
380f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fDrawBuffer = noOpGLDrawBuffer;
381f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fDrawBuffers = noOpGLDrawBuffers;
382f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fDrawElements = noOpGLDrawElements;
383f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fEnable = noOpGLEnable;
384f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fEnableVertexAttribArray = noOpGLEnableVertexAttribArray;
385f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fEndQuery = noOpGLEndQuery;
386f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fFinish = noOpGLFinish;
387f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fFlush = noOpGLFlush;
388160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org    functions->fFlushMappedBufferRange = nullGLFlushMappedBufferRange;
389f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fFrontFace = noOpGLFrontFace;
390f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGenBuffers = nullGLGenBuffers;
391f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGenerateMipmap = nullGLGenerateMipmap;
392f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGenQueries = noOpGLGenIds;
393f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGenTextures = noOpGLGenIds;
394f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGenVertexArrays = noOpGLGenIds;
395f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGetBufferParameteriv = nullGLGetBufferParameteriv;
396f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGetError = noOpGLGetError;
397f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGetIntegerv = noOpGLGetIntegerv;
398f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGetQueryObjecti64v = noOpGLGetQueryObjecti64v;
399f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGetQueryObjectiv = noOpGLGetQueryObjectiv;
400f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGetQueryObjectui64v = noOpGLGetQueryObjectui64v;
401f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGetQueryObjectuiv = noOpGLGetQueryObjectuiv;
402f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGetQueryiv = noOpGLGetQueryiv;
403f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGetProgramInfoLog = noOpGLGetInfoLog;
404f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGetProgramiv = noOpGLGetShaderOrProgramiv;
405f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGetShaderInfoLog = noOpGLGetInfoLog;
406f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGetShaderiv = noOpGLGetShaderOrProgramiv;
407f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGetString = noOpGLGetString;
408f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGetStringi = noOpGLGetStringi;
409f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGetTexLevelParameteriv = noOpGLGetTexLevelParameteriv;
410f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGetUniformLocation = noOpGLGetUniformLocation;
411f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fInsertEventMarker = noOpGLInsertEventMarker;
412f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fLineWidth = noOpGLLineWidth;
413f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fLinkProgram = noOpGLLinkProgram;
414160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org    functions->fMapBuffer = nullGLMapBuffer;
415160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org    functions->fMapBufferRange = nullGLMapBufferRange;
416f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fPixelStorei = nullGLPixelStorei;
417f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fPopGroupMarker = noOpGLPopGroupMarker;
418f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fPushGroupMarker = noOpGLPushGroupMarker;
419f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fQueryCounter = noOpGLQueryCounter;
420f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fReadBuffer = noOpGLReadBuffer;
421f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fReadPixels = nullGLReadPixels;
422f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fScissor = noOpGLScissor;
423f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fShaderSource = noOpGLShaderSource;
424f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fStencilFunc = noOpGLStencilFunc;
425f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fStencilFuncSeparate = noOpGLStencilFuncSeparate;
426f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fStencilMask = noOpGLStencilMask;
427f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fStencilMaskSeparate = noOpGLStencilMaskSeparate;
428f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fStencilOp = noOpGLStencilOp;
429f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fStencilOpSeparate = noOpGLStencilOpSeparate;
430f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fTexImage2D = noOpGLTexImage2D;
431f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fTexParameteri = noOpGLTexParameteri;
432f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fTexParameteriv = noOpGLTexParameteriv;
433f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fTexSubImage2D = noOpGLTexSubImage2D;
434f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fTexStorage2D = noOpGLTexStorage2D;
435f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fDiscardFramebuffer = noOpGLDiscardFramebuffer;
436f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fUniform1f = noOpGLUniform1f;
437f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fUniform1i = noOpGLUniform1i;
438f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fUniform1fv = noOpGLUniform1fv;
439f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fUniform1iv = noOpGLUniform1iv;
440f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fUniform2f = noOpGLUniform2f;
441f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fUniform2i = noOpGLUniform2i;
442f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fUniform2fv = noOpGLUniform2fv;
443f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fUniform2iv = noOpGLUniform2iv;
444f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fUniform3f = noOpGLUniform3f;
445f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fUniform3i = noOpGLUniform3i;
446f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fUniform3fv = noOpGLUniform3fv;
447f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fUniform3iv = noOpGLUniform3iv;
448f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fUniform4f = noOpGLUniform4f;
449f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fUniform4i = noOpGLUniform4i;
450f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fUniform4fv = noOpGLUniform4fv;
451f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fUniform4iv = noOpGLUniform4iv;
452f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fUniformMatrix2fv = noOpGLUniformMatrix2fv;
453f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fUniformMatrix3fv = noOpGLUniformMatrix3fv;
454f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fUniformMatrix4fv = noOpGLUniformMatrix4fv;
455160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org    functions->fUnmapBuffer = nullGLUnmapBuffer;
456f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fUseProgram = nullGLUseProgram;
457f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fVertexAttrib4fv = noOpGLVertexAttrib4fv;
458f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fVertexAttribPointer = noOpGLVertexAttribPointer;
459f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fViewport = nullGLViewport;
460f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fBindFramebuffer = nullGLBindFramebuffer;
461f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fBindRenderbuffer = nullGLBindRenderbuffer;
462f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fCheckFramebufferStatus = noOpGLCheckFramebufferStatus;
463f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fDeleteFramebuffers = nullGLDeleteFramebuffers;
464f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fDeleteRenderbuffers = nullGLDeleteRenderbuffers;
465f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fFramebufferRenderbuffer = nullGLFramebufferRenderbuffer;
466f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fFramebufferTexture2D = nullGLFramebufferTexture2D;
467f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGenFramebuffers = noOpGLGenIds;
468f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGenRenderbuffers = noOpGLGenIds;
469f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGetFramebufferAttachmentParameteriv = noOpGLGetFramebufferAttachmentParameteriv;
470f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fGetRenderbufferParameteriv = noOpGLGetRenderbufferParameteriv;
471f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fRenderbufferStorage = noOpGLRenderbufferStorage;
472f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fRenderbufferStorageMultisample = noOpGLRenderbufferStorageMultisample;
473f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fBlitFramebuffer = noOpGLBlitFramebuffer;
474f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fResolveMultisampleFramebuffer = noOpGLResolveMultisampleFramebuffer;
475f66967243c3732523c2035f7d6dbf65c2d20b264commit-bot@chromium.org    functions->fMatrixLoadf = noOpGLMatrixLoadf;
476f66967243c3732523c2035f7d6dbf65c2d20b264commit-bot@chromium.org    functions->fMatrixLoadIdentity = noOpGLMatrixLoadIdentity;
477f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    functions->fBindFragDataLocationIndexed = noOpGLBindFragDataLocationIndexed;
478f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org
479f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    interface->fExtensions.init(kGL_GrGLStandard, functions->fGetString, functions->fGetStringi,
480f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org                                functions->fGetIntegerv);
481f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org    return interface;
48274913722bfe5e4b6810545891958e3d8e9c63791bsalomon@google.com}
483