blob: 0a27a066ab4647f6c2eb059e785b1209bce03e3d [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
tomhudson@google.com6bf38b52012-02-14 15:11:59 +000010#include "gl/GrGLInterface.h"
tomhudson@google.comdd182cb2012-02-10 21:01:00 +000011#include "../GrTDArray.h"
bsalomon@google.com91bcc942012-05-07 17:28:41 +000012#include "GrGLDefines.h"
bsalomon@google.com74913722011-10-27 20:44:19 +000013
14GrGLvoid GR_GL_FUNCTION_TYPE nullGLActiveTexture(GrGLenum texture) {}
15GrGLvoid GR_GL_FUNCTION_TYPE nullGLAttachShader(GrGLuint program, GrGLuint shader) {}
16GrGLvoid GR_GL_FUNCTION_TYPE nullGLBeginQuery(GrGLenum target, GrGLuint id) {}
17GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindAttribLocation(GrGLuint program, GrGLuint index, const char* name) {}
18GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindTexture(GrGLenum target, GrGLuint texture) {}
19GrGLvoid GR_GL_FUNCTION_TYPE nullGLBlendColor(GrGLclampf red, GrGLclampf green, GrGLclampf blue, GrGLclampf alpha) {}
20GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindFragDataLocation(GrGLuint program, GrGLuint colorNumber, const GrGLchar* name) {}
21GrGLvoid GR_GL_FUNCTION_TYPE nullGLBlendFunc(GrGLenum sfactor, GrGLenum dfactor) {}
robertphillips@google.come7884302012-04-18 14:39:58 +000022GrGLvoid GR_GL_FUNCTION_TYPE nullGLBlendEquation(GrGLenum mode) {}
bsalomon@google.com74913722011-10-27 20:44:19 +000023GrGLvoid GR_GL_FUNCTION_TYPE nullGLBufferData(GrGLenum target, GrGLsizeiptr size, const GrGLvoid* data, GrGLenum usage) {}
24GrGLvoid GR_GL_FUNCTION_TYPE nullGLBufferSubData(GrGLenum target, GrGLintptr offset, GrGLsizeiptr size, const GrGLvoid* data) {}
25GrGLvoid GR_GL_FUNCTION_TYPE nullGLClear(GrGLbitfield mask) {}
26GrGLvoid GR_GL_FUNCTION_TYPE nullGLClearColor(GrGLclampf red, GrGLclampf green, GrGLclampf blue, GrGLclampf alpha) {}
27GrGLvoid GR_GL_FUNCTION_TYPE nullGLClearStencil(GrGLint s) {}
bsalomon@google.com74913722011-10-27 20:44:19 +000028GrGLvoid GR_GL_FUNCTION_TYPE nullGLColorMask(GrGLboolean red, GrGLboolean green, GrGLboolean blue, GrGLboolean alpha) {}
bsalomon@google.com74913722011-10-27 20:44:19 +000029GrGLvoid 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) {}
bsalomon@google.com74913722011-10-27 20:44:19 +000034GrGLvoid GR_GL_FUNCTION_TYPE nullGLDisableVertexAttribArray(GrGLuint index) {}
35GrGLvoid GR_GL_FUNCTION_TYPE nullGLDrawArrays(GrGLenum mode, GrGLint first, GrGLsizei count) {}
36GrGLvoid GR_GL_FUNCTION_TYPE nullGLDrawBuffer(GrGLenum mode) {}
37GrGLvoid GR_GL_FUNCTION_TYPE nullGLDrawBuffers(GrGLsizei n, const GrGLenum* bufs) {}
38GrGLvoid GR_GL_FUNCTION_TYPE nullGLDrawElements(GrGLenum mode, GrGLsizei count, GrGLenum type, const GrGLvoid* indices) {}
39GrGLvoid GR_GL_FUNCTION_TYPE nullGLEnable(GrGLenum cap) {}
bsalomon@google.com74913722011-10-27 20:44:19 +000040GrGLvoid GR_GL_FUNCTION_TYPE nullGLEnableVertexAttribArray(GrGLuint index) {}
41GrGLvoid GR_GL_FUNCTION_TYPE nullGLEndQuery(GrGLenum target) {}
42GrGLvoid GR_GL_FUNCTION_TYPE nullGLFinish() {}
43GrGLvoid GR_GL_FUNCTION_TYPE nullGLFlush() {}
44GrGLvoid GR_GL_FUNCTION_TYPE nullGLFrontFace(GrGLenum mode) {}
45GrGLvoid GR_GL_FUNCTION_TYPE nullGLLineWidth(GrGLfloat width) {}
46GrGLvoid GR_GL_FUNCTION_TYPE nullGLLinkProgram(GrGLuint program) {}
bsalomon@google.com74913722011-10-27 20:44:19 +000047GrGLvoid GR_GL_FUNCTION_TYPE nullGLPixelStorei(GrGLenum pname, GrGLint param) {}
bsalomon@google.com74913722011-10-27 20:44:19 +000048GrGLvoid GR_GL_FUNCTION_TYPE nullGLQueryCounter(GrGLuint id, GrGLenum target) {}
49GrGLvoid GR_GL_FUNCTION_TYPE nullGLReadBuffer(GrGLenum src) {}
50GrGLvoid GR_GL_FUNCTION_TYPE nullGLReadPixels(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, GrGLvoid* pixels) {}
51GrGLvoid GR_GL_FUNCTION_TYPE nullGLScissor(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height) {}
bsalomon@google.com74913722011-10-27 20:44:19 +000052GrGLvoid GR_GL_FUNCTION_TYPE nullGLShaderSource(GrGLuint shader, GrGLsizei count, const char** str, const GrGLint* length) {}
53GrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilFunc(GrGLenum func, GrGLint ref, GrGLuint mask) {}
54GrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilFuncSeparate(GrGLenum face, GrGLenum func, GrGLint ref, GrGLuint mask) {}
55GrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilMask(GrGLuint mask) {}
56GrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilMaskSeparate(GrGLenum face, GrGLuint mask) {}
57GrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilOp(GrGLenum fail, GrGLenum zfail, GrGLenum zpass) {}
58GrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilOpSeparate(GrGLenum face, GrGLenum fail, GrGLenum zfail, GrGLenum zpass) {}
bsalomon@google.com74913722011-10-27 20:44:19 +000059GrGLvoid GR_GL_FUNCTION_TYPE nullGLTexImage2D(GrGLenum target, GrGLint level, GrGLint internalformat, GrGLsizei width, GrGLsizei height, GrGLint border, GrGLenum format, GrGLenum type, const GrGLvoid* pixels) {}
60GrGLvoid GR_GL_FUNCTION_TYPE nullGLTexParameteri(GrGLenum target, GrGLenum pname, GrGLint param) {}
bsalomon@google.com280e99f2012-01-05 16:17:38 +000061GrGLvoid GR_GL_FUNCTION_TYPE nullGLTexStorage2D(GrGLenum target, GrGLsizei levels, GrGLenum internalformat, GrGLsizei width, GrGLsizei height) {}
bsalomon@google.com74913722011-10-27 20:44:19 +000062GrGLvoid GR_GL_FUNCTION_TYPE nullGLTexSubImage2D(GrGLenum target, GrGLint level, GrGLint xoffset, GrGLint yoffset, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, const GrGLvoid* pixels) {}
63GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform1f(GrGLint location, GrGLfloat v0) {}
64GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform1i(GrGLint location, GrGLint v0) {}
65GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform1fv(GrGLint location, GrGLsizei count, const GrGLfloat* v) {}
66GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform1iv(GrGLint location, GrGLsizei count, const GrGLint* v) {}
67GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform2f(GrGLint location, GrGLfloat v0, GrGLfloat v1) {}
68GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform2i(GrGLint location, GrGLint v0, GrGLint v1) {}
69GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform2fv(GrGLint location, GrGLsizei count, const GrGLfloat* v) {}
70GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform2iv(GrGLint location, GrGLsizei count, const GrGLint* v) {}
71GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform3f(GrGLint location, GrGLfloat v0, GrGLfloat v1, GrGLfloat v2) {}
72GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform3i(GrGLint location, GrGLint v0, GrGLint v1, GrGLint v2) {}
73GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform3fv(GrGLint location, GrGLsizei count, const GrGLfloat* v) {}
74GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform3iv(GrGLint location, GrGLsizei count, const GrGLint* v) {}
75GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform4f(GrGLint location, GrGLfloat v0, GrGLfloat v1, GrGLfloat v2, GrGLfloat v3) {}
76GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform4i(GrGLint location, GrGLint v0, GrGLint v1, GrGLint v2, GrGLint v3) {}
77GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform4fv(GrGLint location, GrGLsizei count, const GrGLfloat* v) {}
78GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform4iv(GrGLint location, GrGLsizei count, const GrGLint* v) {}
79GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniformMatrix2fv(GrGLint location, GrGLsizei count, GrGLboolean transpose, const GrGLfloat* value) {}
80GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniformMatrix3fv(GrGLint location, GrGLsizei count, GrGLboolean transpose, const GrGLfloat* value) {}
81GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniformMatrix4fv(GrGLint location, GrGLsizei count, GrGLboolean transpose, const GrGLfloat* value) {}
82GrGLvoid GR_GL_FUNCTION_TYPE nullGLUseProgram(GrGLuint program) {}
83GrGLvoid GR_GL_FUNCTION_TYPE nullGLVertexAttrib4fv(GrGLuint indx, const GrGLfloat* values) {}
84GrGLvoid 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 +000085GrGLvoid GR_GL_FUNCTION_TYPE nullGLViewport(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height) {}
86GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindFramebuffer(GrGLenum target, GrGLuint framebuffer) {}
87GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindRenderbuffer(GrGLenum target, GrGLuint renderbuffer) {}
88GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteFramebuffers(GrGLsizei n, const GrGLuint *framebuffers) {}
89GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteRenderbuffers(GrGLsizei n, const GrGLuint *renderbuffers) {}
90GrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferRenderbuffer(GrGLenum target, GrGLenum attachment, GrGLenum renderbuffertarget, GrGLuint renderbuffer) {}
91GrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferTexture2D(GrGLenum target, GrGLenum attachment, GrGLenum textarget, GrGLuint texture, GrGLint level) {}
92GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetFramebufferAttachmentParameteriv(GrGLenum target, GrGLenum attachment, GrGLenum pname, GrGLint* params) {}
93GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetRenderbufferParameteriv(GrGLenum target, GrGLenum pname, GrGLint* params) {}
94GrGLvoid GR_GL_FUNCTION_TYPE nullGLRenderbufferStorage(GrGLenum target, GrGLenum internalformat, GrGLsizei width, GrGLsizei height) {}
95GrGLvoid GR_GL_FUNCTION_TYPE nullGLRenderbufferStorageMultisample(GrGLenum target, GrGLsizei samples, GrGLenum internalformat, GrGLsizei width, GrGLsizei height) {}
96GrGLvoid 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) {}
97GrGLvoid GR_GL_FUNCTION_TYPE nullGLResolveMultisampleFramebuffer() {}
98GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindFragDataLocationIndexed(GrGLuint program, GrGLuint colorNumber, GrGLuint index, const GrGLchar * name) {}
99
100GrGLenum GR_GL_FUNCTION_TYPE nullGLCheckFramebufferStatus(GrGLenum target) {
101 return GR_GL_FRAMEBUFFER_COMPLETE;
102}
103
104GrGLuint GR_GL_FUNCTION_TYPE nullGLCreateProgram() {
105 static int gCurrID = 0;
106 return ++gCurrID;
107}
108
109GrGLuint GR_GL_FUNCTION_TYPE nullGLCreateShader(GrGLenum type) {
110 static int gCurrID = 0;
111 return ++gCurrID;
112}
113
114// same delete used for shaders and programs
115GrGLvoid GR_GL_FUNCTION_TYPE nullGLDelete(GrGLuint program) {
116}
117
118// same function used for all glGen*(GLsize i, GLuint*) functions
119GrGLvoid GR_GL_FUNCTION_TYPE nullGLGenIds(GrGLsizei n, GrGLuint* ids) {
120 static int gCurrID = 0;
121 for (int i = 0; i < n; ++i) {
122 ids[i] = ++gCurrID;
123 }
124}
125// same delete function for all glDelete*(GLsize i, const GLuint*) except buffers
126GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteIds(GrGLsizei n, const GrGLuint* ids) {}
127
128// In debug builds we do asserts that ensure we agree with GL about when a buffer
129// is mapped.
bsalomon@google.com74913722011-10-27 20:44:19 +0000130static GrTDArray<GrGLuint> gMappedBuffers;
131static GrGLuint gCurrArrayBuffer;
132static GrGLuint gCurrElementArrayBuffer;
133
134GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindBuffer(GrGLenum target, GrGLuint buffer) {
135 switch (target) {
136 case GR_GL_ARRAY_BUFFER:
137 gCurrArrayBuffer = buffer;
138 break;
139 case GR_GL_ELEMENT_ARRAY_BUFFER:
140 gCurrElementArrayBuffer = buffer;
141 break;
142 }
143}
144
145// deleting a bound buffer has the side effect of binding 0
146GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteBuffers(GrGLsizei n, const GrGLuint* ids) {
147 for (int i = 0; i < n; ++i) {
148 if (ids[i] == gCurrArrayBuffer) {
149 gCurrArrayBuffer = 0;
150 }
151 if (ids[i] == gCurrElementArrayBuffer) {
152 gCurrElementArrayBuffer = 0;
153 }
154 for (int j = 0; j < gMappedBuffers.count(); ++j) {
155 if (gMappedBuffers[j] == ids[i]) {
156 gMappedBuffers.remove(j);
157 // don't break b/c we didn't check for dupes on insert
158 --j;
159 }
160 }
161 }
162}
163
164GrGLvoid* GR_GL_FUNCTION_TYPE nullGLMapBuffer(GrGLenum target, GrGLenum access) {
165 // We just reserve 32MB of RAM for all locks and hope its big enough
166 static SkAutoMalloc gBufferData(32 * (1 << 20));
167 GrGLuint buf = 0;
168 switch (target) {
169 case GR_GL_ARRAY_BUFFER:
170 buf = gCurrArrayBuffer;
171 break;
172 case GR_GL_ELEMENT_ARRAY_BUFFER:
173 buf = gCurrElementArrayBuffer;
174 break;
175 }
176 if (buf) {
177 *gMappedBuffers.append() = buf;
178 }
179 return gBufferData.get();
180}
181
182GrGLboolean GR_GL_FUNCTION_TYPE nullGLUnmapBuffer(GrGLenum target) {
183 GrGLuint buf = 0;
184 switch (target) {
185 case GR_GL_ARRAY_BUFFER:
186 buf = gCurrArrayBuffer;
187 break;
188 case GR_GL_ELEMENT_ARRAY_BUFFER:
189 buf = gCurrElementArrayBuffer;
190 break;
191 }
192 if (buf) {
193 for (int i = 0; i < gMappedBuffers.count(); ++i) {
194 if (gMappedBuffers[i] == buf) {
195 gMappedBuffers.remove(i);
196 // don't break b/c we didn't check for dupes on insert
197 --i;
198 }
199 }
200 }
201 return GR_GL_TRUE;
202}
203
204GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetBufferParameteriv(GrGLenum target, GrGLenum pname, GrGLint* params) {
205 switch (pname) {
206 case GR_GL_BUFFER_MAPPED: {
207 *params = GR_GL_FALSE;
208 GrGLuint buf = 0;
209 switch (target) {
210 case GR_GL_ARRAY_BUFFER:
211 buf = gCurrArrayBuffer;
212 break;
213 case GR_GL_ELEMENT_ARRAY_BUFFER:
214 buf = gCurrElementArrayBuffer;
215 break;
216 }
217 if (buf) {
218 for (int i = 0; i < gMappedBuffers.count(); ++i) {
219 if (gMappedBuffers[i] == buf) {
220 *params = GR_GL_TRUE;
221 break;
222 }
223 }
224 }
225 break; }
226 default:
227 GrCrash("Unexpected pname to GetBufferParamateriv");
228 break;
229 }
230};
231
232GrGLenum GR_GL_FUNCTION_TYPE nullGLGetError() {
233 return GR_GL_NO_ERROR;
234}
235
236GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetIntegerv(GrGLenum pname, GrGLint* params) {
237 switch (pname) {
238 case GR_GL_STENCIL_BITS:
239 *params = 8;
240 break;
241 case GR_GL_SAMPLES:
242 *params = 1;
243 break;
244 case GR_GL_FRAMEBUFFER_BINDING:
245 *params = 0;
246 break;
247 case GR_GL_VIEWPORT:
248 params[0] = 0;
249 params[1] = 0;
250 params[2] = 800;
251 params[3] = 600;
252 break;
253 case GR_GL_MAX_TEXTURE_IMAGE_UNITS:
254 *params = 8;
255 break;
256 case GR_GL_MAX_FRAGMENT_UNIFORM_VECTORS:
257 *params = 16;
258 break;
259 case GR_GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
260 *params = 16 * 4;
261 break;
262 case GR_GL_NUM_COMPRESSED_TEXTURE_FORMATS:
263 *params = 0;
264 break;
265 case GR_GL_COMPRESSED_TEXTURE_FORMATS:
266 break;
267 case GR_GL_MAX_TEXTURE_SIZE:
268 *params = 8192;
269 break;
270 case GR_GL_MAX_RENDERBUFFER_SIZE:
271 *params = 8192;
272 break;
273 case GR_GL_MAX_SAMPLES:
274 *params = 32;
275 break;
276 case GR_GL_MAX_VERTEX_ATTRIBS:
277 *params = 16;
278 break;
bsalomon@google.com74913722011-10-27 20:44:19 +0000279 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;
robertphillips@google.come7884302012-04-18 14:39:58 +0000396 interface->fBlendEquation = nullGLBlendEquation;
bsalomon@google.com74913722011-10-27 20:44:19 +0000397 interface->fBufferData = nullGLBufferData;
398 interface->fBufferSubData = nullGLBufferSubData;
399 interface->fClear = nullGLClear;
400 interface->fClearColor = nullGLClearColor;
401 interface->fClearStencil = nullGLClearStencil;
bsalomon@google.com74913722011-10-27 20:44:19 +0000402 interface->fColorMask = nullGLColorMask;
bsalomon@google.com74913722011-10-27 20:44:19 +0000403 interface->fCompileShader = nullGLCompileShader;
404 interface->fCompressedTexImage2D = nullGLCompressedTexImage2D;
405 interface->fCreateProgram = nullGLCreateProgram;
406 interface->fCreateShader = nullGLCreateShader;
407 interface->fCullFace = nullGLCullFace;
408 interface->fDeleteBuffers = nullGLDeleteBuffers;
409 interface->fDeleteProgram = nullGLDelete;
410 interface->fDeleteQueries = nullGLDeleteIds;
411 interface->fDeleteShader = nullGLDelete;
412 interface->fDeleteTextures = nullGLDeleteIds;
413 interface->fDepthMask = nullGLDepthMask;
414 interface->fDisable = nullGLDisable;
bsalomon@google.com74913722011-10-27 20:44:19 +0000415 interface->fDisableVertexAttribArray = nullGLDisableVertexAttribArray;
416 interface->fDrawArrays = nullGLDrawArrays;
417 interface->fDrawBuffer = nullGLDrawBuffer;
418 interface->fDrawBuffers = nullGLDrawBuffers;
419 interface->fDrawElements = nullGLDrawElements;
420 interface->fEnable = nullGLEnable;
bsalomon@google.com74913722011-10-27 20:44:19 +0000421 interface->fEnableVertexAttribArray = nullGLEnableVertexAttribArray;
422 interface->fEndQuery = nullGLEndQuery;
423 interface->fFinish = nullGLFinish;
424 interface->fFlush = nullGLFlush;
425 interface->fFrontFace = nullGLFrontFace;
426 interface->fGenBuffers = nullGLGenIds;
427 interface->fGenQueries = nullGLGenIds;
428 interface->fGenTextures = nullGLGenIds;
429 interface->fGetBufferParameteriv = nullGLGetBufferParameteriv;
430 interface->fGetError = nullGLGetError;
431 interface->fGetIntegerv = nullGLGetIntegerv;
432 interface->fGetQueryObjecti64v = nullGLGetQueryObjecti64v;
433 interface->fGetQueryObjectiv = nullGLGetQueryObjectiv;
434 interface->fGetQueryObjectui64v = nullGLGetQueryObjectui64v;
435 interface->fGetQueryObjectuiv = nullGLGetQueryObjectuiv;
436 interface->fGetQueryiv = nullGLGetQueryiv;
437 interface->fGetProgramInfoLog = nullGLGetInfoLog;
438 interface->fGetProgramiv = nullGLGetShaderOrProgramiv;
439 interface->fGetShaderInfoLog = nullGLGetInfoLog;
440 interface->fGetShaderiv = nullGLGetShaderOrProgramiv;
441 interface->fGetString = nullGLGetString;
442 interface->fGetTexLevelParameteriv = nullGLGetTexLevelParameteriv;
443 interface->fGetUniformLocation = nullGLGetUniformLocation;
444 interface->fLineWidth = nullGLLineWidth;
445 interface->fLinkProgram = nullGLLinkProgram;
bsalomon@google.com74913722011-10-27 20:44:19 +0000446 interface->fPixelStorei = nullGLPixelStorei;
bsalomon@google.com74913722011-10-27 20:44:19 +0000447 interface->fQueryCounter = nullGLQueryCounter;
448 interface->fReadBuffer = nullGLReadBuffer;
449 interface->fReadPixels = nullGLReadPixels;
450 interface->fScissor = nullGLScissor;
bsalomon@google.com74913722011-10-27 20:44:19 +0000451 interface->fShaderSource = nullGLShaderSource;
452 interface->fStencilFunc = nullGLStencilFunc;
453 interface->fStencilFuncSeparate = nullGLStencilFuncSeparate;
454 interface->fStencilMask = nullGLStencilMask;
455 interface->fStencilMaskSeparate = nullGLStencilMaskSeparate;
456 interface->fStencilOp = nullGLStencilOp;
457 interface->fStencilOpSeparate = nullGLStencilOpSeparate;
bsalomon@google.com74913722011-10-27 20:44:19 +0000458 interface->fTexImage2D = nullGLTexImage2D;
459 interface->fTexParameteri = nullGLTexParameteri;
460 interface->fTexSubImage2D = nullGLTexSubImage2D;
bsalomon@google.com280e99f2012-01-05 16:17:38 +0000461 interface->fTexStorage2D = nullGLTexStorage2D;
bsalomon@google.com74913722011-10-27 20:44:19 +0000462 interface->fUniform1f = nullGLUniform1f;
463 interface->fUniform1i = nullGLUniform1i;
464 interface->fUniform1fv = nullGLUniform1fv;
465 interface->fUniform1iv = nullGLUniform1iv;
466 interface->fUniform2f = nullGLUniform2f;
467 interface->fUniform2i = nullGLUniform2i;
468 interface->fUniform2fv = nullGLUniform2fv;
469 interface->fUniform2iv = nullGLUniform2iv;
470 interface->fUniform3f = nullGLUniform3f;
471 interface->fUniform3i = nullGLUniform3i;
472 interface->fUniform3fv = nullGLUniform3fv;
473 interface->fUniform3iv = nullGLUniform3iv;
474 interface->fUniform4f = nullGLUniform4f;
475 interface->fUniform4i = nullGLUniform4i;
476 interface->fUniform4fv = nullGLUniform4fv;
477 interface->fUniform4iv = nullGLUniform4iv;
478 interface->fUniformMatrix2fv = nullGLUniformMatrix2fv;
479 interface->fUniformMatrix3fv = nullGLUniformMatrix3fv;
480 interface->fUniformMatrix4fv = nullGLUniformMatrix4fv;
481 interface->fUseProgram = nullGLUseProgram;
482 interface->fVertexAttrib4fv = nullGLVertexAttrib4fv;
483 interface->fVertexAttribPointer = nullGLVertexAttribPointer;
bsalomon@google.com74913722011-10-27 20:44:19 +0000484 interface->fViewport = nullGLViewport;
485 interface->fBindFramebuffer = nullGLBindFramebuffer;
486 interface->fBindRenderbuffer = nullGLBindRenderbuffer;
487 interface->fCheckFramebufferStatus = nullGLCheckFramebufferStatus;
488 interface->fDeleteFramebuffers = nullGLDeleteFramebuffers;
489 interface->fDeleteRenderbuffers = nullGLDeleteRenderbuffers;
490 interface->fFramebufferRenderbuffer = nullGLFramebufferRenderbuffer;
491 interface->fFramebufferTexture2D = nullGLFramebufferTexture2D;
492 interface->fGenFramebuffers = nullGLGenIds;
493 interface->fGenRenderbuffers = nullGLGenIds;
494 interface->fGetFramebufferAttachmentParameteriv = nullGLGetFramebufferAttachmentParameteriv;
495 interface->fGetRenderbufferParameteriv = nullGLGetRenderbufferParameteriv;
496 interface->fRenderbufferStorage = nullGLRenderbufferStorage;
497 interface->fRenderbufferStorageMultisample = nullGLRenderbufferStorageMultisample;
498 interface->fBlitFramebuffer = nullGLBlitFramebuffer;
499 interface->fResolveMultisampleFramebuffer = nullGLResolveMultisampleFramebuffer;
500 interface->fMapBuffer = nullGLMapBuffer;
501 interface->fUnmapBuffer = nullGLUnmapBuffer;
502 interface->fBindFragDataLocationIndexed = nullGLBindFragDataLocationIndexed;
503 }
504 glInterface.get()->ref();
505 return glInterface.get();
506}