1/*
2 * Copyright 2013 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#include "GrGLNoOpInterface.h"
9#include "SkString.h"
10#include "SkThread.h"
11
12// the OpenGLES 2.0 spec says this must be >= 128
13static const GrGLint kDefaultMaxVertexUniformVectors = 128;
14
15// the OpenGLES 2.0 spec says this must be >=16
16static const GrGLint kDefaultMaxFragmentUniformVectors = 16;
17
18// the OpenGLES 2.0 spec says this must be >= 8
19static const GrGLint kDefaultMaxVertexAttribs = 8;
20
21// the OpenGLES 2.0 spec says this must be >= 8
22static const GrGLint kDefaultMaxVaryingVectors = 8;
23
24static const char* kExtensions[] = {
25    "GL_ARB_framebuffer_object",
26    "GL_ARB_blend_func_extended",
27    "GL_ARB_timer_query",
28    "GL_ARB_draw_buffers",
29    "GL_ARB_occlusion_query",
30    "GL_EXT_blend_color",
31    "GL_EXT_stencil_wrap"
32};
33
34namespace {
35const GrGLubyte* combined_extensions_string() {
36    static SkString gExtString;
37    static SkMutex gMutex;
38    gMutex.acquire();
39    if (0 == gExtString.size()) {
40        for (size_t i = 0; i < SK_ARRAY_COUNT(kExtensions) - 1; ++i) {
41            gExtString.append(kExtensions[i]);
42            gExtString.append(" ");
43        }
44        gExtString.append(kExtensions[SK_ARRAY_COUNT(kExtensions) - 1]);
45    }
46    gMutex.release();
47    return (const GrGLubyte*) gExtString.c_str();
48}
49}
50
51GrGLvoid GR_GL_FUNCTION_TYPE noOpGLBlendColor(GrGLclampf red,
52                                              GrGLclampf green,
53                                              GrGLclampf blue,
54                                              GrGLclampf alpha) {
55}
56
57GrGLvoid GR_GL_FUNCTION_TYPE noOpGLBindFragDataLocation(GrGLuint program,
58                                                        GrGLuint colorNumber,
59                                                        const GrGLchar* name) {
60}
61
62GrGLvoid GR_GL_FUNCTION_TYPE noOpGLBlendFunc(GrGLenum sfactor,
63                                              GrGLenum dfactor) {
64}
65
66GrGLvoid GR_GL_FUNCTION_TYPE noOpGLBufferSubData(GrGLenum target,
67                                                 GrGLintptr offset,
68                                                 GrGLsizeiptr size,
69                                                 const GrGLvoid* data) {
70}
71
72GrGLvoid GR_GL_FUNCTION_TYPE noOpGLClear(GrGLbitfield mask) {
73}
74
75GrGLvoid GR_GL_FUNCTION_TYPE noOpGLClearColor(GrGLclampf red,
76                                              GrGLclampf green,
77                                              GrGLclampf blue,
78                                              GrGLclampf alpha) {
79}
80
81GrGLvoid GR_GL_FUNCTION_TYPE noOpGLClearStencil(GrGLint s) {
82}
83
84GrGLvoid GR_GL_FUNCTION_TYPE noOpGLColorMask(GrGLboolean red,
85                                             GrGLboolean green,
86                                             GrGLboolean blue,
87                                             GrGLboolean alpha) {
88}
89
90GrGLvoid GR_GL_FUNCTION_TYPE noOpGLCompileShader(GrGLuint shader) {
91}
92
93GrGLvoid GR_GL_FUNCTION_TYPE noOpGLCompressedTexImage2D(GrGLenum target,
94                                                        GrGLint level,
95                                                        GrGLenum internalformat,
96                                                        GrGLsizei width,
97                                                        GrGLsizei height,
98                                                        GrGLint border,
99                                                        GrGLsizei imageSize,
100                                                        const GrGLvoid* data) {
101}
102
103GrGLvoid GR_GL_FUNCTION_TYPE noOpGLCompressedTexSubImage2D(GrGLenum target,
104                                                           GrGLint level,
105                                                           GrGLint xoffset,
106                                                           GrGLint yoffset,
107                                                           GrGLsizei width,
108                                                           GrGLsizei height,
109                                                           GrGLenum format,
110                                                           GrGLsizei imageSize,
111                                                           const GrGLvoid* data) {
112}
113
114GrGLvoid GR_GL_FUNCTION_TYPE noOpGLCopyTexSubImage2D(GrGLenum target,
115                                                     GrGLint level,
116                                                     GrGLint xoffset,
117                                                     GrGLint yoffset,
118                                                     GrGLint x,
119                                                     GrGLint y,
120                                                     GrGLsizei width,
121                                                     GrGLsizei height) {
122}
123
124GrGLvoid GR_GL_FUNCTION_TYPE noOpGLCullFace(GrGLenum mode) {
125}
126
127GrGLvoid GR_GL_FUNCTION_TYPE noOpGLDepthMask(GrGLboolean flag) {
128}
129
130GrGLvoid GR_GL_FUNCTION_TYPE noOpGLDisable(GrGLenum cap) {
131}
132
133GrGLvoid GR_GL_FUNCTION_TYPE noOpGLDisableVertexAttribArray(GrGLuint index) {
134}
135
136GrGLvoid GR_GL_FUNCTION_TYPE noOpGLDrawArrays(GrGLenum mode,
137                                              GrGLint first,
138                                              GrGLsizei count) {
139}
140
141GrGLvoid GR_GL_FUNCTION_TYPE noOpGLDrawBuffer(GrGLenum mode) {
142}
143
144GrGLvoid GR_GL_FUNCTION_TYPE noOpGLDrawBuffers(GrGLsizei n,
145                                               const GrGLenum* bufs) {
146}
147
148GrGLvoid GR_GL_FUNCTION_TYPE noOpGLDrawElements(GrGLenum mode,
149                                                GrGLsizei count,
150                                                GrGLenum type,
151                                                const GrGLvoid* indices) {
152}
153
154GrGLvoid GR_GL_FUNCTION_TYPE noOpGLEnable(GrGLenum cap) {
155}
156
157GrGLvoid GR_GL_FUNCTION_TYPE noOpGLEnableVertexAttribArray(GrGLuint index) {
158}
159
160GrGLvoid GR_GL_FUNCTION_TYPE noOpGLEndQuery(GrGLenum target) {
161}
162
163GrGLvoid GR_GL_FUNCTION_TYPE noOpGLFinish() {
164}
165
166GrGLvoid GR_GL_FUNCTION_TYPE noOpGLFlush() {
167}
168
169GrGLvoid GR_GL_FUNCTION_TYPE noOpGLFrontFace(GrGLenum mode) {
170}
171
172GrGLvoid GR_GL_FUNCTION_TYPE noOpGLLineWidth(GrGLfloat width) {
173}
174
175GrGLvoid GR_GL_FUNCTION_TYPE noOpGLLinkProgram(GrGLuint program) {
176}
177
178GrGLvoid GR_GL_FUNCTION_TYPE noOpGLMatrixLoadf(GrGLenum, const GrGLfloat*) {
179}
180
181GrGLvoid GR_GL_FUNCTION_TYPE noOpGLMatrixLoadIdentity(GrGLenum) {
182}
183
184GrGLvoid GR_GL_FUNCTION_TYPE noOpGLQueryCounter(GrGLuint id, GrGLenum target) {
185}
186
187GrGLvoid GR_GL_FUNCTION_TYPE noOpGLReadBuffer(GrGLenum src) {
188}
189
190GrGLvoid GR_GL_FUNCTION_TYPE noOpGLScissor(GrGLint x,
191                                           GrGLint y,
192                                           GrGLsizei width,
193                                           GrGLsizei height) {
194}
195
196GrGLvoid GR_GL_FUNCTION_TYPE noOpGLShaderSource(GrGLuint shader,
197                                                GrGLsizei count,
198#if GR_GL_USE_NEW_SHADER_SOURCE_SIGNATURE
199                                                const char* const * str,
200#else
201                                                const char** str,
202#endif
203                                                const GrGLint* length) {
204}
205
206GrGLvoid GR_GL_FUNCTION_TYPE noOpGLStencilFunc(GrGLenum func, GrGLint ref, GrGLuint mask) {
207}
208
209GrGLvoid GR_GL_FUNCTION_TYPE noOpGLStencilFuncSeparate(GrGLenum face,
210                                                       GrGLenum func,
211                                                       GrGLint ref,
212                                                       GrGLuint mask) {
213}
214
215GrGLvoid GR_GL_FUNCTION_TYPE noOpGLStencilMask(GrGLuint mask) {
216}
217
218GrGLvoid GR_GL_FUNCTION_TYPE noOpGLStencilMaskSeparate(GrGLenum face, GrGLuint mask) {
219}
220
221GrGLvoid GR_GL_FUNCTION_TYPE noOpGLStencilOp(GrGLenum fail, GrGLenum zfail, GrGLenum zpass) {
222}
223
224GrGLvoid GR_GL_FUNCTION_TYPE noOpGLStencilOpSeparate(GrGLenum face,
225                                                     GrGLenum fail,
226                                                     GrGLenum zfail,
227                                                     GrGLenum zpass) {
228}
229
230GrGLvoid GR_GL_FUNCTION_TYPE noOpGLTexImage2D(GrGLenum target,
231                                              GrGLint level,
232                                              GrGLint internalformat,
233                                              GrGLsizei width,
234                                              GrGLsizei height,
235                                              GrGLint border,
236                                              GrGLenum format,
237                                              GrGLenum type,
238                                              const GrGLvoid* pixels) {
239}
240
241GrGLvoid GR_GL_FUNCTION_TYPE noOpGLTexParameteri(GrGLenum target,
242                                                 GrGLenum pname,
243                                                 GrGLint param) {
244}
245
246GrGLvoid GR_GL_FUNCTION_TYPE noOpGLTexParameteriv(GrGLenum target,
247                                                  GrGLenum pname,
248                                                  const GrGLint* params) {
249}
250
251GrGLvoid GR_GL_FUNCTION_TYPE noOpGLTexStorage2D(GrGLenum target,
252                                                GrGLsizei levels,
253                                                GrGLenum internalformat,
254                                                GrGLsizei width,
255                                                GrGLsizei height) {
256}
257
258GrGLvoid GR_GL_FUNCTION_TYPE noOpGLDiscardFramebuffer(GrGLenum target,
259                                                      GrGLsizei numAttachments,
260                                                      const GrGLenum* attachments) {
261}
262
263GrGLvoid GR_GL_FUNCTION_TYPE noOpGLTexSubImage2D(GrGLenum target,
264                                                 GrGLint level,
265                                                 GrGLint xoffset,
266                                                 GrGLint yoffset,
267                                                 GrGLsizei width,
268                                                 GrGLsizei height,
269                                                 GrGLenum format,
270                                                 GrGLenum type,
271                                                 const GrGLvoid* pixels) {
272}
273
274GrGLvoid GR_GL_FUNCTION_TYPE noOpGLUniform1f(GrGLint location, GrGLfloat v0) {
275}
276
277GrGLvoid GR_GL_FUNCTION_TYPE noOpGLUniform1i(GrGLint location, GrGLint v0) {
278}
279
280GrGLvoid GR_GL_FUNCTION_TYPE noOpGLUniform1fv(GrGLint location,
281                                              GrGLsizei count,
282                                              const GrGLfloat* v) {
283}
284
285GrGLvoid GR_GL_FUNCTION_TYPE noOpGLUniform1iv(GrGLint location,
286                                              GrGLsizei count,
287                                              const GrGLint* v) {
288}
289
290GrGLvoid GR_GL_FUNCTION_TYPE noOpGLUniform2f(GrGLint location, GrGLfloat v0, GrGLfloat v1) {
291}
292
293GrGLvoid GR_GL_FUNCTION_TYPE noOpGLUniform2i(GrGLint location, GrGLint v0, GrGLint v1) {
294}
295
296GrGLvoid GR_GL_FUNCTION_TYPE noOpGLUniform2fv(GrGLint location,
297                                              GrGLsizei count,
298                                              const GrGLfloat* v) {
299}
300
301GrGLvoid GR_GL_FUNCTION_TYPE noOpGLUniform2iv(GrGLint location,
302                                              GrGLsizei count,
303                                              const GrGLint* v) {
304}
305
306GrGLvoid GR_GL_FUNCTION_TYPE noOpGLUniform3f(GrGLint location,
307                                              GrGLfloat v0,
308                                              GrGLfloat v1,
309                                              GrGLfloat v2) {
310}
311
312GrGLvoid GR_GL_FUNCTION_TYPE noOpGLUniform3i(GrGLint location,
313                                              GrGLint v0,
314                                              GrGLint v1,
315                                              GrGLint v2) {
316}
317
318GrGLvoid GR_GL_FUNCTION_TYPE noOpGLUniform3fv(GrGLint location,
319                                              GrGLsizei count,
320                                              const GrGLfloat* v) {
321}
322
323GrGLvoid GR_GL_FUNCTION_TYPE noOpGLUniform3iv(GrGLint location,
324                                              GrGLsizei count,
325                                              const GrGLint* v) {
326}
327
328GrGLvoid GR_GL_FUNCTION_TYPE noOpGLUniform4f(GrGLint location,
329                                              GrGLfloat v0,
330                                              GrGLfloat v1,
331                                              GrGLfloat v2,
332                                              GrGLfloat v3) {
333}
334
335GrGLvoid GR_GL_FUNCTION_TYPE noOpGLUniform4i(GrGLint location,
336                                              GrGLint v0,
337                                              GrGLint v1,
338                                              GrGLint v2,
339                                              GrGLint v3) {
340}
341
342GrGLvoid GR_GL_FUNCTION_TYPE noOpGLUniform4fv(GrGLint location,
343                                              GrGLsizei count,
344                                              const GrGLfloat* v) {
345}
346
347GrGLvoid GR_GL_FUNCTION_TYPE noOpGLUniform4iv(GrGLint location,
348                                              GrGLsizei count,
349                                              const GrGLint* v) {
350}
351
352GrGLvoid GR_GL_FUNCTION_TYPE noOpGLUniformMatrix2fv(GrGLint location,
353                                                    GrGLsizei count,
354                                                    GrGLboolean transpose,
355                                                    const GrGLfloat* value) {
356}
357
358GrGLvoid GR_GL_FUNCTION_TYPE noOpGLUniformMatrix3fv(GrGLint location,
359                                                    GrGLsizei count,
360                                                    GrGLboolean transpose,
361                                                    const GrGLfloat* value) {
362}
363
364GrGLvoid GR_GL_FUNCTION_TYPE noOpGLUniformMatrix4fv(GrGLint location,
365                                                    GrGLsizei count,
366                                                    GrGLboolean transpose,
367                                                    const GrGLfloat* value) {
368}
369
370 GrGLvoid GR_GL_FUNCTION_TYPE noOpGLVertexAttrib4fv(GrGLuint indx, const GrGLfloat* values) {
371}
372
373GrGLvoid GR_GL_FUNCTION_TYPE noOpGLVertexAttribPointer(GrGLuint indx,
374                                                       GrGLint size,
375                                                       GrGLenum type,
376                                                       GrGLboolean normalized,
377                                                       GrGLsizei stride,
378                                                       const GrGLvoid* ptr) {
379}
380
381GrGLvoid GR_GL_FUNCTION_TYPE noOpGLViewport(GrGLint x,
382                                            GrGLint y,
383                                            GrGLsizei width,
384                                            GrGLsizei height) {
385}
386
387  GrGLvoid GR_GL_FUNCTION_TYPE noOpGLGetFramebufferAttachmentParameteriv(GrGLenum target,
388                                                                         GrGLenum attachment,
389                                                                         GrGLenum pname,
390                                                                         GrGLint* params) {
391}
392
393GrGLvoid GR_GL_FUNCTION_TYPE noOpGLGetRenderbufferParameteriv(GrGLenum target,
394                                                              GrGLenum pname,
395                                                              GrGLint* params) {
396}
397
398GrGLvoid GR_GL_FUNCTION_TYPE noOpGLRenderbufferStorage(GrGLenum target,
399                                                       GrGLenum internalformat,
400                                                       GrGLsizei width,
401                                                       GrGLsizei height) {
402}
403
404GrGLvoid GR_GL_FUNCTION_TYPE noOpGLRenderbufferStorageMultisample(GrGLenum target,
405                                                                  GrGLsizei samples,
406                                                                  GrGLenum internalformat,
407                                                                  GrGLsizei width,
408                                                                  GrGLsizei height) {
409}
410
411GrGLvoid GR_GL_FUNCTION_TYPE noOpGLBlitFramebuffer(GrGLint srcX0,
412                                                   GrGLint srcY0,
413                                                   GrGLint srcX1,
414                                                   GrGLint srcY1,
415                                                   GrGLint dstX0,
416                                                   GrGLint dstY0,
417                                                   GrGLint dstX1,
418                                                   GrGLint dstY1,
419                                                   GrGLbitfield mask,
420                                                   GrGLenum filter) {
421}
422
423GrGLvoid GR_GL_FUNCTION_TYPE noOpGLResolveMultisampleFramebuffer() {
424}
425
426GrGLvoid GR_GL_FUNCTION_TYPE noOpGLBindFragDataLocationIndexed(GrGLuint program,
427                                                               GrGLuint colorNumber,
428                                                               GrGLuint index,
429                                                               const GrGLchar * name) {
430}
431
432GrGLenum GR_GL_FUNCTION_TYPE noOpGLCheckFramebufferStatus(GrGLenum target) {
433
434    GrAlwaysAssert(GR_GL_FRAMEBUFFER == target);
435
436    return GR_GL_FRAMEBUFFER_COMPLETE;
437}
438
439GrGLvoid GR_GL_FUNCTION_TYPE noOpGLGenIds(GrGLsizei n, GrGLuint* ids) {
440    static int gCurrID = 1;
441    for (int i = 0; i < n; ++i) {
442        ids[i] = ++gCurrID;
443   }
444}
445
446GrGLvoid GR_GL_FUNCTION_TYPE noOpGLDeleteIds(GrGLsizei n, const GrGLuint* ids) {
447}
448
449GrGLenum GR_GL_FUNCTION_TYPE noOpGLGetError() {
450    return GR_GL_NO_ERROR;
451}
452
453GrGLvoid GR_GL_FUNCTION_TYPE noOpGLGetIntegerv(GrGLenum pname, GrGLint* params) {
454    // TODO: remove from Ganesh the #defines for gets we don't use.
455    // We would like to minimize gets overall due to performance issues
456    switch (pname) {
457        case GR_GL_CONTEXT_PROFILE_MASK:
458            *params = GR_GL_CONTEXT_COMPATIBILITY_PROFILE_BIT;
459            break;
460        case GR_GL_STENCIL_BITS:
461            *params = 8;
462            break;
463        case GR_GL_SAMPLES:
464            *params = 1;
465            break;
466        case GR_GL_FRAMEBUFFER_BINDING:
467            *params = 0;
468            break;
469        case GR_GL_VIEWPORT:
470            params[0] = 0;
471            params[1] = 0;
472            params[2] = 800;
473            params[3] = 600;
474            break;
475        case GR_GL_MAX_TEXTURE_IMAGE_UNITS:
476            *params = 8;
477            break;
478        case GR_GL_MAX_TEXTURE_COORDS:
479            *params = 8;
480            break;
481        case GR_GL_MAX_VERTEX_UNIFORM_VECTORS:
482            *params = kDefaultMaxVertexUniformVectors;
483            break;
484        case GR_GL_MAX_FRAGMENT_UNIFORM_VECTORS:
485            *params = kDefaultMaxFragmentUniformVectors;
486            break;
487        case GR_GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
488            *params = 16 * 4;
489            break;
490        case GR_GL_NUM_COMPRESSED_TEXTURE_FORMATS:
491            *params = 0;
492            break;
493        case GR_GL_COMPRESSED_TEXTURE_FORMATS:
494            break;
495        case GR_GL_MAX_TEXTURE_SIZE:
496            *params = 8192;
497            break;
498        case GR_GL_MAX_RENDERBUFFER_SIZE:
499            *params = 8192;
500            break;
501        case GR_GL_MAX_SAMPLES:
502            *params = 32;
503            break;
504        case GR_GL_MAX_VERTEX_ATTRIBS:
505            *params = kDefaultMaxVertexAttribs;
506            break;
507        case GR_GL_MAX_VARYING_VECTORS:
508            *params = kDefaultMaxVaryingVectors;
509            break;
510        case GR_GL_NUM_EXTENSIONS:
511            *params = SK_ARRAY_COUNT(kExtensions);
512            break;
513        default:
514            SkFAIL("Unexpected pname to GetIntegerv");
515   }
516}
517
518GrGLvoid GR_GL_FUNCTION_TYPE noOpGLGetInfoLog(GrGLuint program,
519                                              GrGLsizei bufsize,
520                                              GrGLsizei* length,
521                                              char* infolog) {
522    if (length) {
523        *length = 0;
524   }
525    if (bufsize > 0) {
526        *infolog = 0;
527   }
528}
529
530GrGLvoid GR_GL_FUNCTION_TYPE noOpGLGetShaderOrProgramiv(GrGLuint program,
531                                                        GrGLenum pname,
532                                                        GrGLint* params) {
533    switch (pname) {
534        case GR_GL_LINK_STATUS:  // fallthru
535        case GR_GL_COMPILE_STATUS:
536            *params = GR_GL_TRUE;
537            break;
538        case GR_GL_INFO_LOG_LENGTH:
539            *params = 0;
540            break;
541        // we don't expect any other pnames
542        default:
543            SkFAIL("Unexpected pname to GetProgramiv");
544            break;
545   }
546}
547
548namespace {
549template <typename T>
550void query_result(GrGLenum GLtarget, GrGLenum pname, T *params) {
551    switch (pname) {
552        case GR_GL_QUERY_RESULT_AVAILABLE:
553            *params = GR_GL_TRUE;
554            break;
555        case GR_GL_QUERY_RESULT:
556            *params = 0;
557            break;
558        default:
559            SkFAIL("Unexpected pname passed to GetQueryObject.");
560            break;
561   }
562}
563}
564
565GrGLvoid GR_GL_FUNCTION_TYPE noOpGLGetQueryiv(GrGLenum GLtarget,
566                                              GrGLenum pname,
567                                              GrGLint *params) {
568    switch (pname) {
569        case GR_GL_CURRENT_QUERY:
570            *params = 0;
571            break;
572        case GR_GL_QUERY_COUNTER_BITS:
573            *params = 32;
574            break;
575        default:
576            SkFAIL("Unexpected pname passed GetQueryiv.");
577   }
578}
579
580GrGLvoid GR_GL_FUNCTION_TYPE noOpGLGetQueryObjecti64v(GrGLuint id,
581                                                      GrGLenum pname,
582                                                      GrGLint64 *params) {
583    query_result(id, pname, params);
584}
585
586GrGLvoid GR_GL_FUNCTION_TYPE noOpGLGetQueryObjectiv(GrGLuint id,
587                                                    GrGLenum pname,
588                                                    GrGLint *params) {
589    query_result(id, pname, params);
590}
591
592GrGLvoid GR_GL_FUNCTION_TYPE noOpGLGetQueryObjectui64v(GrGLuint id,
593                                                       GrGLenum pname,
594                                                       GrGLuint64 *params) {
595    query_result(id, pname, params);
596}
597
598GrGLvoid GR_GL_FUNCTION_TYPE noOpGLGetQueryObjectuiv(GrGLuint id,
599                                                     GrGLenum pname,
600                                                     GrGLuint *params) {
601    query_result(id, pname, params);
602}
603
604const GrGLubyte* GR_GL_FUNCTION_TYPE noOpGLGetString(GrGLenum name) {
605    switch (name) {
606        case GR_GL_EXTENSIONS:
607            return combined_extensions_string();
608        case GR_GL_VERSION:
609            return (const GrGLubyte*)"4.0 Debug GL";
610        case GR_GL_SHADING_LANGUAGE_VERSION:
611            return (const GrGLubyte*)"4.20.8 Debug GLSL";
612        case GR_GL_VENDOR:
613            return (const GrGLubyte*)"Debug Vendor";
614        case GR_GL_RENDERER:
615            return (const GrGLubyte*)"The Debug (Non-)Renderer";
616        default:
617            SkFAIL("Unexpected name passed to GetString");
618            return NULL;
619   }
620}
621
622const GrGLubyte* GR_GL_FUNCTION_TYPE noOpGLGetStringi(GrGLenum name, GrGLuint i) {
623    switch (name) {
624        case GR_GL_EXTENSIONS:
625            if (static_cast<size_t>(i) <= SK_ARRAY_COUNT(kExtensions)) {
626                return (const GrGLubyte*) kExtensions[i];
627            } else {
628                return NULL;
629            }
630        default:
631            SkFAIL("Unexpected name passed to GetStringi");
632            return NULL;
633    }
634}
635
636GrGLvoid GR_GL_FUNCTION_TYPE noOpGLGetTexLevelParameteriv(GrGLenum target,
637                                                          GrGLint level,
638                                                          GrGLenum pname,
639                                                          GrGLint* params) {
640    // we used to use this to query stuff about externally created textures,
641    // now we just require clients to tell us everything about the texture.
642    SkFAIL("Should never query texture parameters.");
643}
644
645GrGLint GR_GL_FUNCTION_TYPE noOpGLGetUniformLocation(GrGLuint program, const char* name) {
646    static int gUniLocation = 0;
647    return ++gUniLocation;
648}
649
650GrGLvoid GR_GL_FUNCTION_TYPE noOpGLInsertEventMarker(GrGLsizei length, const char* marker) {
651}
652GrGLvoid GR_GL_FUNCTION_TYPE noOpGLPushGroupMarker(GrGLsizei length  , const char* marker) {
653}
654GrGLvoid GR_GL_FUNCTION_TYPE noOpGLPopGroupMarker() {
655}
656