GrGLCreateNullInterface.cpp revision ecd84842b3f65918eb040c53391172b6413fd7ad
1/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8
9#include "gl/GrGLInterface.h"
10#include "GrGLDefines.h"
11#include "SkTDArray.h"
12#include "GrGLNoOpInterface.h"
13
14// Functions not declared in GrGLBogusInterface.h (not common with the Debug GL interface).
15
16namespace { // added to suppress 'no previous prototype' warning
17
18GrGLvoid GR_GL_FUNCTION_TYPE nullGLActiveTexture(GrGLenum texture) {}
19GrGLvoid GR_GL_FUNCTION_TYPE nullGLAttachShader(GrGLuint program, GrGLuint shader) {}
20GrGLvoid GR_GL_FUNCTION_TYPE nullGLBeginQuery(GrGLenum target, GrGLuint id) {}
21GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindAttribLocation(GrGLuint program, GrGLuint index, const char* name) {}
22GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindTexture(GrGLenum target, GrGLuint texture) {}
23GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindVertexArray(GrGLuint id) {}
24GrGLvoid GR_GL_FUNCTION_TYPE nullGLBufferData(GrGLenum target, GrGLsizeiptr size, const GrGLvoid* data, GrGLenum usage) {}
25GrGLvoid GR_GL_FUNCTION_TYPE nullGLPixelStorei(GrGLenum pname, GrGLint param) {}
26GrGLvoid GR_GL_FUNCTION_TYPE nullGLReadPixels(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, GrGLvoid* pixels) {}
27GrGLvoid GR_GL_FUNCTION_TYPE nullGLUseProgram(GrGLuint program) {}
28GrGLvoid GR_GL_FUNCTION_TYPE nullGLViewport(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height) {}
29GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindFramebuffer(GrGLenum target, GrGLuint framebuffer) {}
30GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindRenderbuffer(GrGLenum target, GrGLuint renderbuffer) {}
31GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteFramebuffers(GrGLsizei n, const GrGLuint *framebuffers) {}
32GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteRenderbuffers(GrGLsizei n, const GrGLuint *renderbuffers) {}
33GrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferRenderbuffer(GrGLenum target, GrGLenum attachment, GrGLenum renderbuffertarget, GrGLuint renderbuffer) {}
34GrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferTexture2D(GrGLenum target, GrGLenum attachment, GrGLenum textarget, GrGLuint texture, GrGLint level) {}
35
36GrGLuint GR_GL_FUNCTION_TYPE nullGLCreateProgram() {
37    static int gCurrID = 0;
38    return ++gCurrID;
39}
40
41GrGLuint GR_GL_FUNCTION_TYPE nullGLCreateShader(GrGLenum type) {
42    static int gCurrID = 0;
43    return ++gCurrID;
44}
45
46// same delete used for shaders and programs
47GrGLvoid GR_GL_FUNCTION_TYPE nullGLDelete(GrGLuint program) {
48}
49
50// In debug builds we do asserts that ensure we agree with GL about when a buffer
51// is mapped.
52static SkTDArray<GrGLuint> gMappedBuffers;
53static GrGLuint gCurrArrayBuffer;
54static GrGLuint gCurrElementArrayBuffer;
55
56GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindBuffer(GrGLenum target, GrGLuint buffer) {
57    switch (target) {
58    case GR_GL_ARRAY_BUFFER:
59        gCurrArrayBuffer = buffer;
60        break;
61    case GR_GL_ELEMENT_ARRAY_BUFFER:
62        gCurrElementArrayBuffer = buffer;
63        break;
64    }
65}
66
67// deleting a bound buffer has the side effect of binding 0
68GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteBuffers(GrGLsizei n, const GrGLuint* ids) {
69    for (int i = 0; i < n; ++i) {
70        if (ids[i] == gCurrArrayBuffer) {
71            gCurrArrayBuffer = 0;
72        }
73        if (ids[i] == gCurrElementArrayBuffer) {
74            gCurrElementArrayBuffer = 0;
75        }
76        for (int j = 0; j < gMappedBuffers.count(); ++j) {
77            if (gMappedBuffers[j] == ids[i]) {
78                gMappedBuffers.remove(j);
79                // don't break b/c we didn't check for dupes on insert
80                --j;
81            }
82        }
83    }
84}
85
86GrGLvoid* GR_GL_FUNCTION_TYPE nullGLMapBuffer(GrGLenum target, GrGLenum access) {
87    // We just reserve 32MB of RAM for all locks and hope its big enough
88    static SkAutoMalloc gBufferData(32 * (1 << 20));
89    GrGLuint buf = 0;
90    switch (target) {
91        case GR_GL_ARRAY_BUFFER:
92            buf = gCurrArrayBuffer;
93            break;
94        case GR_GL_ELEMENT_ARRAY_BUFFER:
95            buf = gCurrElementArrayBuffer;
96            break;
97    }
98    if (buf) {
99        *gMappedBuffers.append() = buf;
100    }
101    return gBufferData.get();
102}
103
104GrGLboolean GR_GL_FUNCTION_TYPE nullGLUnmapBuffer(GrGLenum target) {
105    GrGLuint buf = 0;
106    switch (target) {
107    case GR_GL_ARRAY_BUFFER:
108        buf = gCurrArrayBuffer;
109        break;
110    case GR_GL_ELEMENT_ARRAY_BUFFER:
111        buf = gCurrElementArrayBuffer;
112        break;
113    }
114    if (buf) {
115        for (int i = 0; i < gMappedBuffers.count(); ++i) {
116            if (gMappedBuffers[i] == buf) {
117                gMappedBuffers.remove(i);
118                // don't break b/c we didn't check for dupes on insert
119                --i;
120            }
121        }
122    }
123    return GR_GL_TRUE;
124}
125
126GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetBufferParameteriv(GrGLenum target, GrGLenum pname, GrGLint* params) {
127    switch (pname) {
128        case GR_GL_BUFFER_MAPPED: {
129            *params = GR_GL_FALSE;
130            GrGLuint buf = 0;
131            switch (target) {
132                case GR_GL_ARRAY_BUFFER:
133                    buf = gCurrArrayBuffer;
134                    break;
135                case GR_GL_ELEMENT_ARRAY_BUFFER:
136                    buf = gCurrElementArrayBuffer;
137                    break;
138            }
139            if (buf) {
140                for (int i = 0; i < gMappedBuffers.count(); ++i) {
141                    if (gMappedBuffers[i] == buf) {
142                        *params = GR_GL_TRUE;
143                        break;
144                    }
145                }
146            }
147            break; }
148        default:
149            GrCrash("Unexpected pname to GetBufferParamateriv");
150            break;
151    }
152};
153
154} // end anonymous namespace
155
156const GrGLInterface* GrGLCreateNullInterface() {
157    // The gl functions are not context-specific so we create one global
158    // interface
159    static SkAutoTUnref<GrGLInterface> glInterface;
160    if (!glInterface.get()) {
161        GrGLInterface* interface = SkNEW(GrGLInterface);
162        glInterface.reset(interface);
163        interface->fBindingsExported = kDesktop_GrGLBinding;
164        interface->fActiveTexture = nullGLActiveTexture;
165        interface->fAttachShader = nullGLAttachShader;
166        interface->fBeginQuery = nullGLBeginQuery;
167        interface->fBindAttribLocation = nullGLBindAttribLocation;
168        interface->fBindBuffer = nullGLBindBuffer;
169        interface->fBindFragDataLocation = noOpGLBindFragDataLocation;
170        interface->fBindTexture = nullGLBindTexture;
171        interface->fBindVertexArray = nullGLBindVertexArray;
172        interface->fBlendColor = noOpGLBlendColor;
173        interface->fBlendFunc = noOpGLBlendFunc;
174        interface->fBufferData = nullGLBufferData;
175        interface->fBufferSubData = noOpGLBufferSubData;
176        interface->fClear = noOpGLClear;
177        interface->fClearColor = noOpGLClearColor;
178        interface->fClearStencil = noOpGLClearStencil;
179        interface->fColorMask = noOpGLColorMask;
180        interface->fCompileShader = noOpGLCompileShader;
181        interface->fCompressedTexImage2D = noOpGLCompressedTexImage2D;
182        interface->fCreateProgram = nullGLCreateProgram;
183        interface->fCreateShader = nullGLCreateShader;
184        interface->fCullFace = noOpGLCullFace;
185        interface->fDeleteBuffers = nullGLDeleteBuffers;
186        interface->fDeleteProgram = nullGLDelete;
187        interface->fDeleteQueries = noOpGLDeleteIds;
188        interface->fDeleteShader = nullGLDelete;
189        interface->fDeleteTextures = noOpGLDeleteIds;
190        interface->fDeleteVertexArrays = noOpGLDeleteIds;
191        interface->fDepthMask = noOpGLDepthMask;
192        interface->fDisable = noOpGLDisable;
193        interface->fDisableVertexAttribArray = noOpGLDisableVertexAttribArray;
194        interface->fDrawArrays = noOpGLDrawArrays;
195        interface->fDrawBuffer = noOpGLDrawBuffer;
196        interface->fDrawBuffers = noOpGLDrawBuffers;
197        interface->fDrawElements = noOpGLDrawElements;
198        interface->fEnable = noOpGLEnable;
199        interface->fEnableVertexAttribArray = noOpGLEnableVertexAttribArray;
200        interface->fEndQuery = noOpGLEndQuery;
201        interface->fFinish = noOpGLFinish;
202        interface->fFlush = noOpGLFlush;
203        interface->fFrontFace = noOpGLFrontFace;
204        interface->fGenBuffers = noOpGLGenIds;
205        interface->fGenQueries = noOpGLGenIds;
206        interface->fGenTextures = noOpGLGenIds;
207        interface->fGenVertexArrays = noOpGLGenIds;
208        interface->fGetBufferParameteriv = nullGLGetBufferParameteriv;
209        interface->fGetError = noOpGLGetError;
210        interface->fGetIntegerv = noOpGLGetIntegerv;
211        interface->fGetQueryObjecti64v = noOpGLGetQueryObjecti64v;
212        interface->fGetQueryObjectiv = noOpGLGetQueryObjectiv;
213        interface->fGetQueryObjectui64v = noOpGLGetQueryObjectui64v;
214        interface->fGetQueryObjectuiv = noOpGLGetQueryObjectuiv;
215        interface->fGetQueryiv = noOpGLGetQueryiv;
216        interface->fGetProgramInfoLog = noOpGLGetInfoLog;
217        interface->fGetProgramiv = noOpGLGetShaderOrProgramiv;
218        interface->fGetShaderInfoLog = noOpGLGetInfoLog;
219        interface->fGetShaderiv = noOpGLGetShaderOrProgramiv;
220        interface->fGetString = noOpGLGetString;
221        interface->fGetStringi = noOpGLGetStringi;
222        interface->fGetTexLevelParameteriv = noOpGLGetTexLevelParameteriv;
223        interface->fGetUniformLocation = noOpGLGetUniformLocation;
224        interface->fLineWidth = noOpGLLineWidth;
225        interface->fLinkProgram = noOpGLLinkProgram;
226        interface->fPixelStorei = nullGLPixelStorei;
227        interface->fQueryCounter = noOpGLQueryCounter;
228        interface->fReadBuffer = noOpGLReadBuffer;
229        interface->fReadPixels = nullGLReadPixels;
230        interface->fScissor = noOpGLScissor;
231        interface->fShaderSource = noOpGLShaderSource;
232        interface->fStencilFunc = noOpGLStencilFunc;
233        interface->fStencilFuncSeparate = noOpGLStencilFuncSeparate;
234        interface->fStencilMask = noOpGLStencilMask;
235        interface->fStencilMaskSeparate = noOpGLStencilMaskSeparate;
236        interface->fStencilOp = noOpGLStencilOp;
237        interface->fStencilOpSeparate = noOpGLStencilOpSeparate;
238        interface->fTexImage2D = noOpGLTexImage2D;
239        interface->fTexParameteri = noOpGLTexParameteri;
240        interface->fTexParameteriv = noOpGLTexParameteriv;
241        interface->fTexSubImage2D = noOpGLTexSubImage2D;
242        interface->fTexStorage2D = noOpGLTexStorage2D;
243        interface->fUniform1f = noOpGLUniform1f;
244        interface->fUniform1i = noOpGLUniform1i;
245        interface->fUniform1fv = noOpGLUniform1fv;
246        interface->fUniform1iv = noOpGLUniform1iv;
247        interface->fUniform2f = noOpGLUniform2f;
248        interface->fUniform2i = noOpGLUniform2i;
249        interface->fUniform2fv = noOpGLUniform2fv;
250        interface->fUniform2iv = noOpGLUniform2iv;
251        interface->fUniform3f = noOpGLUniform3f;
252        interface->fUniform3i = noOpGLUniform3i;
253        interface->fUniform3fv = noOpGLUniform3fv;
254        interface->fUniform3iv = noOpGLUniform3iv;
255        interface->fUniform4f = noOpGLUniform4f;
256        interface->fUniform4i = noOpGLUniform4i;
257        interface->fUniform4fv = noOpGLUniform4fv;
258        interface->fUniform4iv = noOpGLUniform4iv;
259        interface->fUniformMatrix2fv = noOpGLUniformMatrix2fv;
260        interface->fUniformMatrix3fv = noOpGLUniformMatrix3fv;
261        interface->fUniformMatrix4fv = noOpGLUniformMatrix4fv;
262        interface->fUseProgram = nullGLUseProgram;
263        interface->fVertexAttrib4fv = noOpGLVertexAttrib4fv;
264        interface->fVertexAttribPointer = noOpGLVertexAttribPointer;
265        interface->fViewport = nullGLViewport;
266        interface->fBindFramebuffer = nullGLBindFramebuffer;
267        interface->fBindRenderbuffer = nullGLBindRenderbuffer;
268        interface->fCheckFramebufferStatus = noOpGLCheckFramebufferStatus;
269        interface->fDeleteFramebuffers = nullGLDeleteFramebuffers;
270        interface->fDeleteRenderbuffers = nullGLDeleteRenderbuffers;
271        interface->fFramebufferRenderbuffer = nullGLFramebufferRenderbuffer;
272        interface->fFramebufferTexture2D = nullGLFramebufferTexture2D;
273        interface->fGenFramebuffers = noOpGLGenIds;
274        interface->fGenRenderbuffers = noOpGLGenIds;
275        interface->fGetFramebufferAttachmentParameteriv = noOpGLGetFramebufferAttachmentParameteriv;
276        interface->fGetRenderbufferParameteriv = noOpGLGetRenderbufferParameteriv;
277        interface->fRenderbufferStorage = noOpGLRenderbufferStorage;
278        interface->fRenderbufferStorageMultisample = noOpGLRenderbufferStorageMultisample;
279        interface->fBlitFramebuffer = noOpGLBlitFramebuffer;
280        interface->fResolveMultisampleFramebuffer = noOpGLResolveMultisampleFramebuffer;
281        interface->fMapBuffer = nullGLMapBuffer;
282        interface->fUnmapBuffer = nullGLUnmapBuffer;
283        interface->fBindFragDataLocationIndexed = noOpGLBindFragDataLocationIndexed;
284    }
285    glInterface.get()->ref();
286    return glInterface.get();
287}
288