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