11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
104f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#include "gl/GrGLInterface.h"
114f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#include "../GrTDArray.h"
121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
131cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLActiveTexture(GrGLenum texture) {}
141cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLAttachShader(GrGLuint program, GrGLuint shader) {}
151cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLBeginQuery(GrGLenum target, GrGLuint id) {}
161cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindAttribLocation(GrGLuint program, GrGLuint index, const char* name) {}
171cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindTexture(GrGLenum target, GrGLuint texture) {}
181cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLBlendColor(GrGLclampf red, GrGLclampf green, GrGLclampf blue, GrGLclampf alpha) {}
191cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindFragDataLocation(GrGLuint program, GrGLuint colorNumber, const GrGLchar* name) {}
201cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLBlendFunc(GrGLenum sfactor, GrGLenum dfactor) {}
211cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLBufferData(GrGLenum target, GrGLsizeiptr size, const GrGLvoid* data, GrGLenum usage) {}
221cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLBufferSubData(GrGLenum target, GrGLintptr offset, GrGLsizeiptr size, const GrGLvoid* data) {}
231cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLClear(GrGLbitfield mask) {}
241cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLClearColor(GrGLclampf red, GrGLclampf green, GrGLclampf blue, GrGLclampf alpha) {}
251cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLClearStencil(GrGLint s) {}
261cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLColorMask(GrGLboolean red, GrGLboolean green, GrGLboolean blue, GrGLboolean alpha) {}
271cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLCompileShader(GrGLuint shader) {}
281cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLCompressedTexImage2D(GrGLenum target, GrGLint level, GrGLenum internalformat, GrGLsizei width, GrGLsizei height, GrGLint border, GrGLsizei imageSize, const GrGLvoid* data) {}
291cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLCullFace(GrGLenum mode) {}
301cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLDepthMask(GrGLboolean flag) {}
311cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLDisable(GrGLenum cap) {}
321cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLDisableVertexAttribArray(GrGLuint index) {}
331cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLDrawArrays(GrGLenum mode, GrGLint first, GrGLsizei count) {}
341cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLDrawBuffer(GrGLenum mode) {}
351cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLDrawBuffers(GrGLsizei n, const GrGLenum* bufs) {}
361cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLDrawElements(GrGLenum mode, GrGLsizei count, GrGLenum type, const GrGLvoid* indices) {}
371cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLEnable(GrGLenum cap) {}
381cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLEnableVertexAttribArray(GrGLuint index) {}
391cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLEndQuery(GrGLenum target) {}
401cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLFinish() {}
411cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLFlush() {}
421cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLFrontFace(GrGLenum mode) {}
431cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLLineWidth(GrGLfloat width) {}
441cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLLinkProgram(GrGLuint program) {}
451cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLPixelStorei(GrGLenum pname, GrGLint param) {}
461cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLQueryCounter(GrGLuint id, GrGLenum target) {}
471cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLReadBuffer(GrGLenum src) {}
481cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLReadPixels(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, GrGLvoid* pixels) {}
491cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLScissor(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height) {}
501cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLShaderSource(GrGLuint shader, GrGLsizei count, const char** str, const GrGLint* length) {}
511cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilFunc(GrGLenum func, GrGLint ref, GrGLuint mask) {}
521cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilFuncSeparate(GrGLenum face, GrGLenum func, GrGLint ref, GrGLuint mask) {}
531cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilMask(GrGLuint mask) {}
541cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilMaskSeparate(GrGLenum face, GrGLuint mask) {}
551cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilOp(GrGLenum fail, GrGLenum zfail, GrGLenum zpass) {}
561cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilOpSeparate(GrGLenum face, GrGLenum fail, GrGLenum zfail, GrGLenum zpass) {}
571cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLTexImage2D(GrGLenum target, GrGLint level, GrGLint internalformat, GrGLsizei width, GrGLsizei height, GrGLint border, GrGLenum format, GrGLenum type, const GrGLvoid* pixels) {}
581cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLTexParameteri(GrGLenum target, GrGLenum pname, GrGLint param) {}
591cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLTexStorage2D(GrGLenum target, GrGLsizei levels, GrGLenum internalformat, GrGLsizei width, GrGLsizei height) {}
601cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLTexSubImage2D(GrGLenum target, GrGLint level, GrGLint xoffset, GrGLint yoffset, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, const GrGLvoid* pixels) {}
611cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform1f(GrGLint location, GrGLfloat v0) {}
621cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform1i(GrGLint location, GrGLint v0) {}
631cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform1fv(GrGLint location, GrGLsizei count, const GrGLfloat* v) {}
641cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform1iv(GrGLint location, GrGLsizei count, const GrGLint* v) {}
651cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform2f(GrGLint location, GrGLfloat v0, GrGLfloat v1) {}
661cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform2i(GrGLint location, GrGLint v0, GrGLint v1) {}
671cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform2fv(GrGLint location, GrGLsizei count, const GrGLfloat* v) {}
681cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform2iv(GrGLint location, GrGLsizei count, const GrGLint* v) {}
691cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform3f(GrGLint location, GrGLfloat v0, GrGLfloat v1, GrGLfloat v2) {}
701cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform3i(GrGLint location, GrGLint v0, GrGLint v1, GrGLint v2) {}
711cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform3fv(GrGLint location, GrGLsizei count, const GrGLfloat* v) {}
721cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform3iv(GrGLint location, GrGLsizei count, const GrGLint* v) {}
731cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform4f(GrGLint location, GrGLfloat v0, GrGLfloat v1, GrGLfloat v2, GrGLfloat v3) {}
741cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform4i(GrGLint location, GrGLint v0, GrGLint v1, GrGLint v2, GrGLint v3) {}
751cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform4fv(GrGLint location, GrGLsizei count, const GrGLfloat* v) {}
761cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform4iv(GrGLint location, GrGLsizei count, const GrGLint* v) {}
771cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLUniformMatrix2fv(GrGLint location, GrGLsizei count, GrGLboolean transpose, const GrGLfloat* value) {}
781cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLUniformMatrix3fv(GrGLint location, GrGLsizei count, GrGLboolean transpose, const GrGLfloat* value) {}
791cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLUniformMatrix4fv(GrGLint location, GrGLsizei count, GrGLboolean transpose, const GrGLfloat* value) {}
801cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLUseProgram(GrGLuint program) {}
811cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLVertexAttrib4fv(GrGLuint indx, const GrGLfloat* values) {}
821cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLVertexAttribPointer(GrGLuint indx, GrGLint size, GrGLenum type, GrGLboolean normalized, GrGLsizei stride, const GrGLvoid* ptr) {}
831cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLViewport(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height) {}
841cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindFramebuffer(GrGLenum target, GrGLuint framebuffer) {}
851cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindRenderbuffer(GrGLenum target, GrGLuint renderbuffer) {}
861cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteFramebuffers(GrGLsizei n, const GrGLuint *framebuffers) {}
871cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteRenderbuffers(GrGLsizei n, const GrGLuint *renderbuffers) {}
881cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferRenderbuffer(GrGLenum target, GrGLenum attachment, GrGLenum renderbuffertarget, GrGLuint renderbuffer) {}
891cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferTexture2D(GrGLenum target, GrGLenum attachment, GrGLenum textarget, GrGLuint texture, GrGLint level) {}
901cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLGetFramebufferAttachmentParameteriv(GrGLenum target, GrGLenum attachment, GrGLenum pname, GrGLint* params) {}
911cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLGetRenderbufferParameteriv(GrGLenum target, GrGLenum pname, GrGLint* params) {}
921cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLRenderbufferStorage(GrGLenum target, GrGLenum internalformat, GrGLsizei width, GrGLsizei height) {}
931cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLRenderbufferStorageMultisample(GrGLenum target, GrGLsizei samples, GrGLenum internalformat, GrGLsizei width, GrGLsizei height) {}
941cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid 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) {}
951cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLResolveMultisampleFramebuffer() {}
961cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindFragDataLocationIndexed(GrGLuint program, GrGLuint colorNumber, GrGLuint index, const GrGLchar * name) {}
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
981cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLenum GR_GL_FUNCTION_TYPE nullGLCheckFramebufferStatus(GrGLenum target) {
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return GR_GL_FRAMEBUFFER_COMPLETE;
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1021cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLuint GR_GL_FUNCTION_TYPE nullGLCreateProgram() {
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static int gCurrID = 0;
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return ++gCurrID;
1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1071cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLuint GR_GL_FUNCTION_TYPE nullGLCreateShader(GrGLenum type) {
1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static int gCurrID = 0;
1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return ++gCurrID;
1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// same delete used for shaders and programs
1131cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLDelete(GrGLuint program) {
1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// same function used for all glGen*(GLsize i, GLuint*) functions
1171cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLGenIds(GrGLsizei n, GrGLuint* ids) {
1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static int gCurrID = 0;
1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (int i = 0; i < n; ++i) {
1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        ids[i] = ++gCurrID;
1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// same delete function for all glDelete*(GLsize i, const GLuint*) except buffers
1241cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteIds(GrGLsizei n, const GrGLuint* ids) {}
1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// In debug builds we do asserts that ensure we agree with GL about when a buffer
1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// is mapped.
1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GrTDArray<GrGLuint> gMappedBuffers;
1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GrGLuint gCurrArrayBuffer;
1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GrGLuint gCurrElementArrayBuffer;
1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1321cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindBuffer(GrGLenum target, GrGLuint buffer) {
1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    switch (target) {
1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    case GR_GL_ARRAY_BUFFER:
1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        gCurrArrayBuffer = buffer;
1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        break;
1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    case GR_GL_ELEMENT_ARRAY_BUFFER:
1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        gCurrElementArrayBuffer = buffer;
1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        break;
1401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// deleting a bound buffer has the side effect of binding 0
1441cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteBuffers(GrGLsizei n, const GrGLuint* ids) {
1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (int i = 0; i < n; ++i) {
1461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (ids[i] == gCurrArrayBuffer) {
1471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            gCurrArrayBuffer = 0;
1481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
1491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (ids[i] == gCurrElementArrayBuffer) {
1501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            gCurrElementArrayBuffer = 0;
1511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        for (int j = 0; j < gMappedBuffers.count(); ++j) {
1531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (gMappedBuffers[j] == ids[i]) {
1541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                gMappedBuffers.remove(j);
1551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                // don't break b/c we didn't check for dupes on insert
1561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                --j;
1571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
1581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
1591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1621cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid* GR_GL_FUNCTION_TYPE nullGLMapBuffer(GrGLenum target, GrGLenum access) {
1631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // We just reserve 32MB of RAM for all locks and hope its big enough
1641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static SkAutoMalloc gBufferData(32 * (1 << 20));
1651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLuint buf = 0;
1661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    switch (target) {
1671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_ARRAY_BUFFER:
1681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            buf = gCurrArrayBuffer;
1691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
1701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_ELEMENT_ARRAY_BUFFER:
1711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            buf = gCurrElementArrayBuffer;
1721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
1731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (buf) {
1751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        *gMappedBuffers.append() = buf;
1761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return gBufferData.get();
1781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1801cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLboolean GR_GL_FUNCTION_TYPE nullGLUnmapBuffer(GrGLenum target) {
1811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLuint buf = 0;
1821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    switch (target) {
1831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    case GR_GL_ARRAY_BUFFER:
1841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        buf = gCurrArrayBuffer;
1851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        break;
1861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    case GR_GL_ELEMENT_ARRAY_BUFFER:
1871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        buf = gCurrElementArrayBuffer;
1881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        break;
1891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (buf) {
1911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        for (int i = 0; i < gMappedBuffers.count(); ++i) {
1921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (gMappedBuffers[i] == buf) {
1931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                gMappedBuffers.remove(i);
1941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                // don't break b/c we didn't check for dupes on insert
1951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                --i;
1961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
1971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
1981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return GR_GL_TRUE;
2001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
2011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2021cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLGetBufferParameteriv(GrGLenum target, GrGLenum pname, GrGLint* params) {
2031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    switch (pname) {
2041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_BUFFER_MAPPED: {
2051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *params = GR_GL_FALSE;
2061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrGLuint buf = 0;
2071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            switch (target) {
2081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                case GR_GL_ARRAY_BUFFER:
2091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    buf = gCurrArrayBuffer;
2101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    break;
2111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                case GR_GL_ELEMENT_ARRAY_BUFFER:
2121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    buf = gCurrElementArrayBuffer;
2131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    break;
2141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
2151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (buf) {
2161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                for (int i = 0; i < gMappedBuffers.count(); ++i) {
2171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    if (gMappedBuffers[i] == buf) {
2181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        *params = GR_GL_TRUE;
2191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        break;
2201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    }
2211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                }
2221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
2231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break; }
2241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        default:
2251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrCrash("Unexpected pname to GetBufferParamateriv");
2261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
2271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
2281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
2291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2301cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLenum GR_GL_FUNCTION_TYPE nullGLGetError() {
2311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return GR_GL_NO_ERROR;
2321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
2331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2341cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLGetIntegerv(GrGLenum pname, GrGLint* params) {
2351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    switch (pname) {
2361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_STENCIL_BITS:
2371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *params = 8;
2381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
2391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_SAMPLES:
2401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *params = 1;
2411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
2421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_FRAMEBUFFER_BINDING:
2431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *params = 0;
2441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
2451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_VIEWPORT:
2461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            params[0] = 0;
2471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            params[1] = 0;
2481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            params[2] = 800;
2491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            params[3] = 600;
2501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
2511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_MAX_TEXTURE_IMAGE_UNITS:
2521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *params = 8;
2531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
2541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_MAX_FRAGMENT_UNIFORM_VECTORS:
2551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *params = 16;
2561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
2571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
2581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *params = 16 * 4;
2591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
2601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_NUM_COMPRESSED_TEXTURE_FORMATS:
2611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *params = 0;
2621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
2631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_COMPRESSED_TEXTURE_FORMATS:
2641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
2651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_MAX_TEXTURE_SIZE:
2661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *params = 8192;
2671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
2681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_MAX_RENDERBUFFER_SIZE:
2691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *params = 8192;
2701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
2711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_MAX_SAMPLES:
2721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *params = 32;
2731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
2741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_MAX_VERTEX_ATTRIBS:
2751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *params = 16;
2761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
2771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_MAX_TEXTURE_UNITS:
2781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *params = 8;
2791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
2801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        default:
2811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrCrash("Unexpected pname to GetIntegerv");
2821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
2831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
2841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// used for both the program and shader info logs
2851cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLGetInfoLog(GrGLuint program, GrGLsizei bufsize, GrGLsizei* length, char* infolog) {
2861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (length) {
2871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        *length = 0;
2881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
2891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (bufsize > 0) {
2901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        *infolog = 0;
2911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
2921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
2931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// used for both the program and shader params
2951cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLGetShaderOrProgramiv(GrGLuint program, GrGLenum pname, GrGLint* params) {
2961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    switch (pname) {
2971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_LINK_STATUS:  // fallthru
2981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_COMPILE_STATUS:
2991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *params = GR_GL_TRUE;
3001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
3011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_INFO_LOG_LENGTH:
3021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *params = 0;
3031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
3041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // we don't expect any other pnames
3051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        default:
3061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrCrash("Unexpected pname to GetProgramiv");
3071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
3081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
3091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
3101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergernamespace {
3121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergertemplate <typename T>
3131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid query_result(GrGLenum GLtarget, GrGLenum pname, T *params) {
3141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    switch (pname) {
3151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_QUERY_RESULT_AVAILABLE:
3161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *params = GR_GL_TRUE;
3171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
3181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_QUERY_RESULT:
3191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *params = 0;
3201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
3211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        default:
3221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrCrash("Unexpected pname passed to GetQueryObject.");
3231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
3241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
3251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
3261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
3271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// Queries on the null GL just don't do anything at all. We could potentially make
3291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// the timers work.
3301cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLGetQueryiv(GrGLenum GLtarget, GrGLenum pname, GrGLint *params) {
3311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    switch (pname) {
3321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_CURRENT_QUERY:
3331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *params = 0;
3341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
3351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_QUERY_COUNTER_BITS:
3361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *params = 32;
3371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
3381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        default:
3391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrCrash("Unexpected pname passed GetQueryiv.");
3401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
3411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
3421cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLGetQueryObjecti64v(GrGLuint id, GrGLenum pname, GrGLint64 *params) {
3431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    query_result(id, pname, params);
3441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
3451cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLGetQueryObjectiv(GrGLuint id, GrGLenum pname, GrGLint *params) {
3461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    query_result(id, pname, params);
3471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
3481cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLGetQueryObjectui64v(GrGLuint id, GrGLenum pname, GrGLuint64 *params) {
3491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    query_result(id, pname, params);
3501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
3511cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLGetQueryObjectuiv(GrGLuint id, GrGLenum pname, GrGLuint *params) {
3521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    query_result(id, pname, params);
3531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
3541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerconst GrGLubyte* GR_GL_FUNCTION_TYPE nullGLGetString(GrGLenum name) {
3561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    switch (name) {
3571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_EXTENSIONS:
3581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            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";
3591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_VERSION:
3601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return (const GrGLubyte*)"4.0 Null GL";
3611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GR_GL_SHADING_LANGUAGE_VERSION:
3621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return (const GrGLubyte*)"4.20.8 Null GLSL";
3631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        default:
3641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrCrash("Unexpected name to GetString");
3651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return NULL;
3661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
3671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
3681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// we used to use this to query stuff about externally created textures, now we just
3701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// require clients to tell us everything about the texture.
3711cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLGetTexLevelParameteriv(GrGLenum target, GrGLint level, GrGLenum pname, GrGLint* params) {
3721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrCrash("Should never query texture parameters.");
3731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
3741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3751cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLint GR_GL_FUNCTION_TYPE nullGLGetUniformLocation(GrGLuint program, const char* name) {
3761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static int gUniLocation = 0;
3771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return ++gUniLocation;
3781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
3791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerconst GrGLInterface* GrGLCreateNullInterface() {
3811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // The gl functions are not context-specific so we create one global
3821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // interface
3831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static SkAutoTUnref<GrGLInterface> glInterface;
3841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (!glInterface.get()) {
3851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrGLInterface* interface = new GrGLInterface;
3861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        glInterface.reset(interface);
3871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBindingsExported = kDesktop_GrGLBinding;
3881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fActiveTexture = nullGLActiveTexture;
3891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fAttachShader = nullGLAttachShader;
3901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBeginQuery = nullGLBeginQuery;
3911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBindAttribLocation = nullGLBindAttribLocation;
3921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBindBuffer = nullGLBindBuffer;
3931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBindFragDataLocation = nullGLBindFragDataLocation;
3941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBindTexture = nullGLBindTexture;
3951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBlendColor = nullGLBlendColor;
3961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBlendFunc = nullGLBlendFunc;
3971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBufferData = nullGLBufferData;
3981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBufferSubData = nullGLBufferSubData;
3991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fClear = nullGLClear;
4001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fClearColor = nullGLClearColor;
4011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fClearStencil = nullGLClearStencil;
4021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fColorMask = nullGLColorMask;
4031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fCompileShader = nullGLCompileShader;
4041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fCompressedTexImage2D = nullGLCompressedTexImage2D;
4051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fCreateProgram = nullGLCreateProgram;
4061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fCreateShader = nullGLCreateShader;
4071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fCullFace = nullGLCullFace;
4081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDeleteBuffers = nullGLDeleteBuffers;
4091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDeleteProgram = nullGLDelete;
4101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDeleteQueries = nullGLDeleteIds;
4111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDeleteShader = nullGLDelete;
4121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDeleteTextures = nullGLDeleteIds;
4131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDepthMask = nullGLDepthMask;
4141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDisable = nullGLDisable;
4151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDisableVertexAttribArray = nullGLDisableVertexAttribArray;
4161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDrawArrays = nullGLDrawArrays;
4171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDrawBuffer = nullGLDrawBuffer;
4181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDrawBuffers = nullGLDrawBuffers;
4191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDrawElements = nullGLDrawElements;
4201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fEnable = nullGLEnable;
4211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fEnableVertexAttribArray = nullGLEnableVertexAttribArray;
4221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fEndQuery = nullGLEndQuery;
4231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fFinish = nullGLFinish;
4241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fFlush = nullGLFlush;
4251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fFrontFace = nullGLFrontFace;
4261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGenBuffers = nullGLGenIds;
4271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGenQueries = nullGLGenIds;
4281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGenTextures = nullGLGenIds;
4291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetBufferParameteriv = nullGLGetBufferParameteriv;
4301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetError = nullGLGetError;
4311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetIntegerv = nullGLGetIntegerv;
4321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetQueryObjecti64v = nullGLGetQueryObjecti64v;
4331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetQueryObjectiv = nullGLGetQueryObjectiv;
4341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetQueryObjectui64v = nullGLGetQueryObjectui64v;
4351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetQueryObjectuiv = nullGLGetQueryObjectuiv;
4361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetQueryiv = nullGLGetQueryiv;
4371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetProgramInfoLog = nullGLGetInfoLog;
4381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetProgramiv = nullGLGetShaderOrProgramiv;
4391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetShaderInfoLog = nullGLGetInfoLog;
4401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetShaderiv = nullGLGetShaderOrProgramiv;
4411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetString = nullGLGetString;
4421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetTexLevelParameteriv = nullGLGetTexLevelParameteriv;
4431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetUniformLocation = nullGLGetUniformLocation;
4441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fLineWidth = nullGLLineWidth;
4451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fLinkProgram = nullGLLinkProgram;
4461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fPixelStorei = nullGLPixelStorei;
4471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fQueryCounter = nullGLQueryCounter;
4481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fReadBuffer = nullGLReadBuffer;
4491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fReadPixels = nullGLReadPixels;
4501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fScissor = nullGLScissor;
4511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fShaderSource = nullGLShaderSource;
4521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fStencilFunc = nullGLStencilFunc;
4531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fStencilFuncSeparate = nullGLStencilFuncSeparate;
4541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fStencilMask = nullGLStencilMask;
4551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fStencilMaskSeparate = nullGLStencilMaskSeparate;
4561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fStencilOp = nullGLStencilOp;
4571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fStencilOpSeparate = nullGLStencilOpSeparate;
4581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fTexImage2D = nullGLTexImage2D;
4591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fTexParameteri = nullGLTexParameteri;
4601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fTexSubImage2D = nullGLTexSubImage2D;
4611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fTexStorage2D = nullGLTexStorage2D;
4621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform1f = nullGLUniform1f;
4631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform1i = nullGLUniform1i;
4641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform1fv = nullGLUniform1fv;
4651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform1iv = nullGLUniform1iv;
4661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform2f = nullGLUniform2f;
4671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform2i = nullGLUniform2i;
4681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform2fv = nullGLUniform2fv;
4691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform2iv = nullGLUniform2iv;
4701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform3f = nullGLUniform3f;
4711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform3i = nullGLUniform3i;
4721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform3fv = nullGLUniform3fv;
4731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform3iv = nullGLUniform3iv;
4741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform4f = nullGLUniform4f;
4751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform4i = nullGLUniform4i;
4761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform4fv = nullGLUniform4fv;
4771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniform4iv = nullGLUniform4iv;
4781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniformMatrix2fv = nullGLUniformMatrix2fv;
4791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniformMatrix3fv = nullGLUniformMatrix3fv;
4801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUniformMatrix4fv = nullGLUniformMatrix4fv;
4811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUseProgram = nullGLUseProgram;
4821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fVertexAttrib4fv = nullGLVertexAttrib4fv;
4831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fVertexAttribPointer = nullGLVertexAttribPointer;
4841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fViewport = nullGLViewport;
4851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBindFramebuffer = nullGLBindFramebuffer;
4861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBindRenderbuffer = nullGLBindRenderbuffer;
4871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fCheckFramebufferStatus = nullGLCheckFramebufferStatus;
4881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDeleteFramebuffers = nullGLDeleteFramebuffers;
4891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fDeleteRenderbuffers = nullGLDeleteRenderbuffers;
4901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fFramebufferRenderbuffer = nullGLFramebufferRenderbuffer;
4911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fFramebufferTexture2D = nullGLFramebufferTexture2D;
4921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGenFramebuffers = nullGLGenIds;
4931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGenRenderbuffers = nullGLGenIds;
4941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetFramebufferAttachmentParameteriv = nullGLGetFramebufferAttachmentParameteriv;
4951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fGetRenderbufferParameteriv = nullGLGetRenderbufferParameteriv;
4961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fRenderbufferStorage = nullGLRenderbufferStorage;
4971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fRenderbufferStorageMultisample = nullGLRenderbufferStorageMultisample;
4981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBlitFramebuffer = nullGLBlitFramebuffer;
4991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fResolveMultisampleFramebuffer = nullGLResolveMultisampleFramebuffer;
5001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fMapBuffer = nullGLMapBuffer;
5011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fUnmapBuffer = nullGLUnmapBuffer;
5021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        interface->fBindFragDataLocationIndexed = nullGLBindFragDataLocationIndexed;
5031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
5041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glInterface.get()->ref();
5051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return glInterface.get();
5061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
507