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