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