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