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