1// This file specifies which functions should be attached to GrGLInterface 2// for a given standard (OpenGL, OpenGL ES, etc). It allows specifing 3// how and when to attach them (e.g. only if an extension is present). 4// It is used for both the assemble and validate step. 5// 6// Currently it assumes the minimum versions: 7// - GL: 2.0 8// - GLES: 2.0 9// - WebGL: [WIP] 1.0 10// 11// http://web.eecs.umich.edu/~sugih/courses/eecs487/common/notes/APITables.xml 12// is a handy reference comparing GL and GLES API 13[ 14 { 15 "GL": [{"ext": "<core>"}], 16 "GLES": [{"ext": "<core>"}], 17 "WebGL": [{"ext": "<core>"}], 18 19 "functions": [ 20 "ActiveTexture", "AttachShader", "BindAttribLocation", "BindBuffer", 21 "BindTexture", "BlendColor", "BlendEquation", "BlendFunc", 22 "BufferData", "BufferSubData", "Clear", "ClearColor", 23 "ClearStencil", "ColorMask", "CompileShader", "CompressedTexImage2D", 24 "CompressedTexSubImage2D", "CopyTexSubImage2D", "CreateProgram", "CreateShader", 25 "CullFace", "DeleteBuffers", "DeleteProgram", 26 "DeleteShader", "DeleteTextures", "DepthMask", "Disable", 27 "DisableVertexAttribArray", "DrawArrays", "DrawElements", "Enable", 28 "EnableVertexAttribArray", "Finish", "Flush", 29 "FrontFace", "GenBuffers", 30 "GenTextures", "GetBufferParameteriv", "GetError", 31 "GetIntegerv", "GetProgramInfoLog", 32 "GetProgramiv", "GetShaderInfoLog", 33 "GetShaderiv", "GetString", 34 "GetUniformLocation", "IsTexture", "LineWidth", "LinkProgram", "PixelStorei", 35 "ReadPixels", "Scissor", "ShaderSource", "StencilFunc", 36 "StencilFuncSeparate", "StencilMask", "StencilMaskSeparate", "StencilOp", 37 "StencilOpSeparate", "TexImage2D", "TexParameterf", "TexParameterfv", "TexParameteri", 38 "TexParameteriv", "TexSubImage2D", "Uniform1f", "Uniform1fv", "Uniform1i", "Uniform1iv", 39 "Uniform2f", "Uniform2fv", "Uniform2i", "Uniform2iv", "Uniform3f", "Uniform3fv", "Uniform3i", 40 "Uniform3iv", "Uniform4f", "Uniform4fv", "Uniform4i", "Uniform4iv", "UniformMatrix2fv", 41 "UniformMatrix3fv", "UniformMatrix4fv", "UseProgram", "VertexAttrib1f", 42 "VertexAttrib2fv", "VertexAttrib3fv", "VertexAttrib4fv", "VertexAttribPointer", 43 "Viewport", 44 ], 45 }, 46 { // GL exclusive core functions 47 "GL": [{"ext": "<core>"}], 48 "GLES": null, 49 50 "functions": [ 51 "DrawBuffer", "PolygonMode", 52 ], 53 }, 54 { 55 "GL": [{"min_version": [3, 0], "ext": "<core>"}], 56 "GLES": [{"min_version": [3, 0], "ext": "<core>"}], 57 "WebGL": [{"min_version": [2, 0], "ext": "<core>"}], 58 59 "functions": [ 60 "GetStringi", 61 ] 62 }, 63 64 { 65 "GL": [{"ext": "<core>"}], 66 "GLES": [{"min_version": [3, 0], "ext": "<core>"}, 67 {/* else if */ "ext": "GL_OES_vertex_array_object"}], 68 "WebGL": [{"min_version": [2, 0], "ext": "<core>"}, 69 {/* else if */ "ext": "GL_OES_vertex_array_object"}, 70 {/* else if */ "ext": "OES_vertex_array_object"}], 71 72 // WebGL uses createVertexArray instead of genVertexArrays, but Emscripten 73 // creates an alias called genVertexArray which papers over this difference. 74 "functions": [ 75 "BindVertexArray", "DeleteVertexArrays", "GenVertexArrays", 76 ], 77 }, 78 79 { 80 "GL": [{"min_version": [3, 0], "ext": "<core>"}], 81 "GLES": [{"min_version": [3, 0], "ext": "GL_EXT_blend_func_extended"}], 82 "WebGL": null, 83 84 "functions": [ 85 "BindFragDataLocation", 86 ], 87 }, 88 { 89 "GL": [{"min_version": [3, 3], "ext": "<core>"}, 90 {/* else if */ "ext": "GL_ARB_blend_func_extended"}], 91 "GLES": [{"min_version": [3, 0], "ext": "GL_EXT_blend_func_extended"}], 92 "WebGL": null, 93 94 "functions": [ 95 "BindFragDataLocationIndexed", 96 ], 97 }, 98 99 { 100 "GL": [{"ext": "GL_KHR_blend_equation_advanced"}, 101 {"ext": "GL_NV_blend_equation_advanced"}], 102 "GLES": [{"ext": "GL_KHR_blend_equation_advanced"}, 103 {"ext": "GL_NV_blend_equation_advanced"}], 104 "WebGL": null, 105 106 "functions": [ 107 "BlendBarrier", 108 ], 109 }, 110 111 { 112 "GL": [{"min_version": [4, 4], "ext": "<core>"}, 113 {/* else if */ "ext": "GL_ARB_clear_texture"}], 114 "GLES": [{"ext": "GL_EXT_clear_texture", "suffix": "EXT"}], 115 "WebGL": null, 116 117 "functions": [ 118 "ClearTexImage", "ClearTexSubImage", 119 ], 120 // https://bugs.chromium.org/p/skia/issues/detail?id=8913 121 "optional": [ 122 "ClearTexImage", "ClearTexSubImage", 123 ] 124 }, 125 126 { 127 "GL": [{"min_version": [3, 1], "ext": "<core>"}, 128 {/* else if */ "ext": "GL_ARB_draw_instanced"}, 129 {/* else if */ "ext": "GL_EXT_draw_instanced"}], 130 "GLES": [{"min_version": [3, 0], "ext": "<core>"}, 131 {/* else if */ "ext": "GL_EXT_draw_instanced"}], 132 "WebGL": [{"min_version": [2, 0], "ext": "<core>"}], 133 134 "functions": [ 135 "DrawArraysInstanced", "DrawElementsInstanced", 136 ] 137 }, 138 { // ES 3.0 has glDrawBuffers but not glDrawBuffer 139 "GL": [{"ext": "<core>"}], 140 "GLES": [{"min_version": [3, 0], "ext": "<core>"}], 141 "WebGL": [{"min_version": [2, 0], "ext": "<core>"}], 142 143 "functions": [ 144 "DrawBuffers", "ReadBuffer", 145 ] 146 }, 147 148 { 149 "GL": [{"min_version": [4, 0], "ext": "<core>"}, 150 {/* else if */ "ext": "GL_ARB_draw_indirect"}], 151 "GLES": [{"min_version": [3, 1], "ext": "<core>"}], 152 "WebGL": null, 153 154 "functions": [ 155 "DrawArraysIndirect", "DrawElementsIndirect", 156 ] 157 }, 158 159 { // glDrawRangeElements was added to ES in 3.0. 160 "GL": [{"ext": "<core>"}], 161 "GLES": [{"min_version": [3, 0], "ext": "<core>"}], 162 "WebGL": [{"min_version": [2, 0], "ext": "<core>"}], 163 164 "functions": [ 165 "DrawRangeElements", 166 ] 167 }, 168 169 { 170 "GL": [{"min_version": [3, 2], "ext": "<core>"}, 171 {/* else if */ "ext": "GL_ARB_texture_multisample"}], 172 "GLES": [{"min_version": [3, 1], "ext": "<core>"}], 173 "WebGL": null, 174 175 "functions": [ 176 "GetMultisamplefv", 177 ] 178 }, 179 180 // glGetTexLevelParameteriv was added to ES in 3.1. 181 { 182 "GL": [{"ext": "<core>"}], 183 "GLES": [{"min_version": [3, 1], "ext": "<core>"}], 184 "WebGL": null, 185 186 "functions": [ 187 "GetTexLevelParameteriv", 188 ] 189 }, 190 191 { 192 "GL": [{"min_version": [4, 3], "ext": "<core>"}, 193 {/* else if */ "ext": "GL_ARB_multi_draw_indirect"}], 194 "GLES": [{"ext": "GL_EXT_multi_draw_indirect"}], 195 "WebGL": null, 196 197 "functions": [ 198 "MultiDrawArraysIndirect", "MultiDrawElementsIndirect", 199 ] 200 }, 201 202 { 203 "GL": [{"min_version": [3, 1], "ext": "<core>"}], 204 "GLES": [{"min_version": [3, 2], "ext": "<core>"}, 205 {/* else if */ "ext": "GL_OES_texture_buffer"}, 206 {/* else if */ "ext": "GL_EXT_texture_buffer"}], 207 "WebGL": null, 208 209 "functions": [ 210 "TexBuffer", 211 ] 212 }, 213 { 214 "GL": [{"min_version": [4, 3], "ext": "<core>"}], 215 "GLES": [{"min_version": [3, 2], "ext": "<core>"}, 216 {/* else if */ "ext": "GL_OES_texture_buffer"}, 217 {/* else if */ "ext": "GL_EXT_texture_buffer"}], 218 "WebGL": null, 219 220 "functions": [ 221 "TexBufferRange", 222 ] 223 }, 224 225 // GL_EXT_texture_storage is part of desktop 4.2 226 // There is a desktop ARB extension and an ES+desktop EXT extension 227 { 228 "GL": [{"min_version": [4, 2], "ext": "<core>"}, 229 {/* else if */ "ext": "GL_ARB_texture_storage"}, 230 {/* else if */ "ext": "GL_EXT_texture_storage"}], 231 "GLES": [{"min_version": [3, 0], "ext": "<core>"}, 232 {/* else if */ "ext": "GL_EXT_texture_storage"}], 233 "WebGL": [{"min_version": [2, 0], "ext": "<core>"}], 234 235 "functions": [ 236 "TexStorage2D", 237 ] 238 }, 239 240 // glTextureBarrier is part of desktop 4.5. There are also ARB and NV extensions. 241 { 242 "GL": [{"min_version": [4, 5], "ext": "<core>"}, 243 {/* else if */ "ext": "GL_ARB_texture_barrier"}, 244 {/* else if */ "ext": "GL_NV_texture_barrier"}], 245 "GLES": [{"ext": "GL_NV_texture_barrier"}], 246 "WebGL": null, 247 248 "functions": [ 249 "TextureBarrier", 250 ] 251 }, 252 253 { 254 "GL": null, // Not supported 255 "GLES": [{"ext": "GL_EXT_discard_framebuffer"}], 256 "WebGL": null, 257 258 "functions": [ 259 "DiscardFramebuffer", 260 ] 261 }, 262 263 { 264 "GL": [{"min_version": [3, 2], "ext": "<core>"}, 265 {/* else if */ "ext": "GL_ARB_instanced_arrays"}], 266 "GLES": [{"min_version": [3, 0], "ext": "<core>"}, 267 {/* else if */ "ext": "GL_EXT_instanced_arrays"}], 268 "WebGL": null, 269 270 "functions": [ 271 "VertexAttribDivisor", 272 ] 273 }, 274 { 275 "GL": [{"min_version": [3, 0], "ext": "<core>"}], 276 "GLES": [{"min_version": [3, 0], "ext": "<core>"}], 277 "WebGL": [{"min_version": [2, 0], "ext": "<core>"}], 278 279 "functions": [ 280 "VertexAttribIPointer", 281 ] 282 }, 283 284 // FrameBuffer Object (FBO) related calls 285 { 286 "GL": [{"min_version": [3, 0], "ext": "<core>"}, 287 {/* else if */ "ext": "GL_ARB_framebuffer_object"}, 288 {/* else if */ "ext": "GL_EXT_framebuffer_object"}], 289 "GLES": [{"ext": "<core>"}], // These are all in ES 2.0 and above 290 "WebGL": [{"ext": "<core>"}], 291 292 "functions": [ 293 "BindFramebuffer", "BindRenderbuffer", "CheckFramebufferStatus", 294 "DeleteFramebuffers", "DeleteRenderbuffers", "FramebufferRenderbuffer", 295 "FramebufferTexture2D", "GenFramebuffers", "GenRenderbuffers", "GenerateMipmap", 296 "GetFramebufferAttachmentParameteriv", "GetRenderbufferParameteriv", 297 "RenderbufferStorage", 298 ], 299 }, 300 { 301 "GL": [{"min_version": [3, 0], "ext": "<core>"}, 302 {/* else if */ "ext": "GL_ARB_framebuffer_object"}, 303 {/* else if */ "ext": "GL_EXT_framebuffer_blit"}], 304 "GLES": [{"min_version": [3, 0], "ext": "<core>"}, 305 {/* else if */ "ext": "GL_CHROMIUM_framebuffer_multisample"}, 306 {/* else if */ "ext": "GL_ANGLE_framebuffer_blit"}], 307 // WebGL 2.0 might have support for blitFramebuffer and related functions. 308 309 "functions": [ 310 "BlitFramebuffer", 311 ], 312 }, 313 { 314 "GL": [{"min_version": [3, 0], "ext": "<core>"}, 315 {/* else if */ "ext": "GL_ARB_framebuffer_object"}, 316 {/* else if */ "ext": "GL_EXT_framebuffer_multisample"}], 317 "GLES": [{"min_version": [3, 0], "ext": "<core>"}, 318 {/* else if */ "ext": "GL_CHROMIUM_framebuffer_multisample"}, 319 {/* else if */ "ext": "GL_ANGLE_framebuffer_multisample"}], 320 "WebGL": [{"min_version": [2, 0], "ext": "<core>"}], 321 322 "functions": [ 323 "RenderbufferStorageMultisample", 324 ], 325 }, 326 327 { 328 "GL": null, 329 "GLES": [{"ext": "GL_CHROMIUM_map_sub"}], 330 "WebGL": null, 331 332 "functions": [ 333 "MapBufferSubData", "MapTexSubImage2D", "UnmapBufferSubData", 334 "UnmapTexSubImage2D" 335 ], 336 }, 337 338 { 339 "GL": null, 340 "GLES": [{"ext": "GL_EXT_multisampled_render_to_texture"}, 341 {"ext": "GL_IMG_multisampled_render_to_texture"}], 342 "WebGL": null, 343 344 "functions": [ 345 "FramebufferTexture2DMultisample", 346 ], 347 }, 348 { 349 "GL": null, 350 "GLES": [{"ext": "GL_EXT_multisampled_render_to_texture"}], 351 "WebGL": null, 352 353 "hardcode_functions" : [ 354 { 355 "ptr_name": "fRenderbufferStorageMultisampleES2EXT", 356 "cast_name": "GrGLRenderbufferStorageMultisampleFn", 357 "get_name": "glRenderbufferStorageMultisampleEXT", 358 } 359 ] 360 }, 361 { 362 "GL": null, 363 "GLES": [{"ext": "GL_IMG_multisampled_render_to_texture"}], 364 "WebGL": null, 365 366 "hardcode_functions" : [ 367 { 368 "ptr_name": "fRenderbufferStorageMultisampleES2EXT", 369 "cast_name": "GrGLRenderbufferStorageMultisampleFn", 370 "get_name": "glRenderbufferStorageMultisampleIMG", 371 } 372 ] 373 }, 374 { 375 "GL": null, 376 "GLES": [{"ext": "GL_APPLE_framebuffer_multisample"}], 377 "WebGL": null, 378 379 "functions" : ["ResolveMultisampleFramebuffer"], 380 "hardcode_functions" : [ 381 { 382 "ptr_name": "fRenderbufferStorageMultisampleES2APPLE", 383 "cast_name": "GrGLRenderbufferStorageMultisampleFn", 384 "get_name": "glRenderbufferStorageMultisampleAPPLE", 385 } 386 ] 387 }, 388 389 // There are several APIs for buffer mapping: 390 // ES2 + GL_OES_mapbuffer: MapBufferOES and UnmapBufferOES 391 // ES2 + GL_EXT_map_buffer_range: Adds MapBufferRangeEXT and FlushMappedBufferRangeEXT 392 // ES3: MapBufferRange, FlushMappedBufferRange, and UnmapBuffer are core (so no suffix). 393 // 394 // MapBuffer is not part of ES3, but implementations may still report the OES versions of 395 // MapBuffer and UnmapBuffer, per the older GL_OES_mapbuffer extension. Some implementations 396 // let us mix the newer MapBufferRange with the older UnmapBufferOES, but we've hit others that 397 // don't permit it. Note that in GrGLBuffer, we choose which API to use based on version and 398 // extensions. This code is written so that we never mix OES and non-OES functions. 399 { 400 "GL": [{"ext": "<core>"}], 401 "GLES": [{"ext": "GL_OES_mapbuffer"}], 402 "WebGL": null, 403 404 "functions": [ 405 "MapBuffer", 406 ], 407 }, 408 { 409 "GL": [{"ext": "<core>"}], 410 "GLES": [{"min_version": [3, 0], "ext": "<core>"}, 411 {/* else if */ "ext": "GL_OES_mapbuffer"}], 412 "WebGL": null, // explicitly removed https://www.khronos.org/registry/webgl/specs/2.0/#5.14 413 414 "functions": [ 415 "UnmapBuffer", 416 ], 417 }, 418 { 419 "GL": [{"min_version": [3, 0], "ext": "<core>"}, 420 {/* else if */ "ext": "GL_ARB_map_buffer_range"}], 421 "GLES": [{"min_version": [3, 0], "ext": "<core>"}, 422 {/* else if */ "ext": "GL_EXT_map_buffer_range"}], 423 "WebGL": null, // explicitly removed https://www.khronos.org/registry/webgl/specs/2.0/#5.14 424 425 "functions": [ 426 // These functions are added to the 3.0 version of both GLES and GL. 427 "MapBufferRange", "FlushMappedBufferRange", 428 ], 429 }, 430 431 { 432 "GL": [{"ext": "GL_EXT_debug_marker"}], 433 "GLES": [{"ext": "GL_EXT_debug_marker"}], 434 "WebGL": null, 435 436 "functions": [ 437 "InsertEventMarker", "PushGroupMarker", "PopGroupMarker" 438 ], 439 }, 440 441 { 442 "GL": [{"min_version": [4, 3], "ext": "<core>"}, 443 {/* else if */ "ext": "GL_ARB_program_interface_query"}], 444 "GLES": [{"min_version": [3, 1], "ext": "<core>"}], 445 "WebGL": null, 446 447 "functions": [ 448 "GetProgramResourceLocation", 449 ], 450 }, 451 452 { // It appears that the GL_NV_path_rendering sometimes provides these 453 // functions under the "EXT" extension instead of "NV". 454 "GL": [{"ext": "GL_NV_path_rendering", "suffix": "EXT"}], 455 456 "GLES": [{"ext": "GL_CHROMIUM_path_rendering"}, 457 {"ext": "GL_NV_path_rendering", "suffix": "EXT"}], 458 "WebGL": null, 459 460 "functions": [ 461 "MatrixLoadIdentity", "MatrixLoadf" 462 ], 463 }, 464 { 465 "GL": [{"ext": "GL_NV_path_rendering"}], 466 "GLES": [{"ext": "GL_CHROMIUM_path_rendering"}, 467 {"ext": "GL_NV_path_rendering"}], 468 "WebGL": null, 469 470 "functions": [ 471 "CoverFillPath", "CoverFillPathInstanced", "CoverStrokePath", 472 "CoverStrokePathInstanced", "DeletePaths", "GenPaths", 473 "IsPath", "PathCommands", "PathParameterf", "PathParameteri", 474 "PathStencilFunc", "ProgramPathFragmentInputGen", "StencilFillPath", 475 "StencilFillPathInstanced", "StencilStrokePath", "StencilStrokePathInstanced", 476 "StencilThenCoverFillPath", "StencilThenCoverFillPathInstanced", 477 "StencilThenCoverStrokePath", "StencilThenCoverStrokePathInstanced", 478 ], 479 // List of functions that Skia uses, but which have been added since the initial release 480 // of NV_path_rendering driver. We do not want to fail interface validation due to 481 // missing features, we will just not use the extension. 482 // If one updates this list, then update GrGLCaps::hasPathRenderingSupport too. 483 "optional": [ 484 "ProgramPathFragmentInputGen", "StencilThenCoverFillPath", 485 "StencilThenCoverFillPathInstanced", "StencilThenCoverStrokePath", 486 "StencilThenCoverStrokePathInstanced", 487 ], 488 }, 489 { 490 "GL": null, 491 "GLES": [{"ext": "GL_CHROMIUM_path_rendering"}], 492 "WebGL": null, 493 494 "functions": [ 495 "BindFragmentInputLocation", 496 ], 497 }, 498 { 499 "GL": [{"ext": "GL_NV_framebuffer_mixed_samples"}], 500 "GLES": [{"ext": "GL_CHROMIUM_framebuffer_mixed_samples"}, 501 {"ext": "GL_NV_framebuffer_mixed_samples"}], 502 "WebGL": null, 503 504 "functions": [ 505 "CoverageModulation", 506 ], 507 }, 508 509 { 510 "GL": [{"min_version": [4, 3], "ext": "<core>"}, 511 {/* else if */ "ext": "GL_KHR_debug", "suffix": ""}], 512 "GLES": [{"ext": "GL_KHR_debug"}], 513 "WebGL": null, 514 515 // In OpenGL (but not ES), KHR_debug defines these methods to have no suffix. 516 "functions": [ 517 "DebugMessageControl", "DebugMessageInsert", "DebugMessageCallback", 518 "GetDebugMessageLog", "PushDebugGroup", "PopDebugGroup", "ObjectLabel", 519 ], 520 }, 521 522 { 523 "GL": null, 524 "GLES": [{"ext": "GL_CHROMIUM_bind_uniform_location"}], 525 "WebGL": null, 526 527 "functions": [ 528 "BindUniformLocation", 529 ], 530 }, 531 532 { 533 "GL": [{"ext": "GL_EXT_window_rectangles"}], 534 "GLES": [{"ext": "GL_EXT_window_rectangles"}], 535 "WebGL": null, 536 537 "functions": [ 538 "WindowRectangles", 539 ], 540 }, 541 542 { 543 "GL": [{"min_version": [3, 2], "ext": "<core>"}, 544 {/* else if */ "ext": "GL_ARB_sync"}], 545 "GLES": [{"min_version": [3, 0], "ext": "<core>"}, 546 {/* else if */ "ext": "GL_APPLE_sync"}], 547 "WebGL": [{"min_version": [2, 0], "ext": "<core>"}], 548 549 "functions": [ 550 "ClientWaitSync", "DeleteSync", "FenceSync", 551 "IsSync", "WaitSync" 552 ], 553 }, 554 555 { // getInternalformativ was added in GL 4.2, ES 3.0, and with 556 // extension ARB_internalformat_query 557 "GL": [{"min_version": [4, 2], "ext": "<core>"}, 558 {/* else if */ "ext": "GL_ARB_internalformat_query"}], 559 "GLES": [{"min_version": [3, 0], "ext": "<core>"}], 560 "WebGL": null, 561 562 "functions": [ 563 "GetInternalformativ" 564 ], 565 }, 566 567 // GetProgramBinary and ProgramBinary are available with an ES2 extension... 568 { 569 "GL": [{"min_version": [4, 1], "ext": "<core>"}], 570 "GLES": [{"min_version": [3, 0], "ext": "<core>"}, 571 {/* else if */ "ext": "GL_OES_get_program_binary"}], 572 "WebGL": null, // explicitly not supported in WebGL 2.0 573 574 "functions": [ 575 "GetProgramBinary", "ProgramBinary", 576 ], 577 }, 578 579 // ... but the related ProgramParameteri is only in ES3 580 { 581 "GL": [{"min_version": [4, 1], "ext": "<core>"}], 582 "GLES": [{"min_version": [3, 0], "ext": "<core>"}], 583 "WebGL": null, // explicitly not supported in WebGL 2.0 584 585 "functions": [ 586 "ProgramParameteri", 587 ], 588 }, 589 590 { 591 "GL": [{"min_version": [3, 2], "ext": "<core>"}, 592 {/* else if */ "ext": "GL_ARB_sampler_objects"}], 593 "GLES": [{"min_version": [3, 0], "ext": "<core>"}], 594 "WebGL": [{"min_version": [2, 0], "ext": "<core>"}], 595 596 "functions": [ 597 "BindSampler", "DeleteSamplers", "GenSamplers", 598 "SamplerParameteri", "SamplerParameteriv", 599 ], 600 }, 601 602 { 603 "GL": [{"ext": "<core>"}], 604 "GLES": null, // not in ES 605 "WebGL": null, 606 607 "functions": [ 608 "GetQueryObjectiv", 609 ], 610 }, 611 { 612 "GL": [{"ext": "<core>"}], 613 "GLES": [{"min_version": [3, 0], "ext": "<core>"}, 614 {/* else if */ "ext": "GL_EXT_occlusion_query_boolean"}], 615 "WebGL": null, 616 617 // We only use these in our test tools 618 "test_functions": [ 619 "GenQueries", "DeleteQueries", "BeginQuery", "EndQuery", 620 "GetQueryObjectuiv", "GetQueryiv", 621 ] 622 }, 623 { 624 "GL": [{"min_version": [3, 3], "ext": "<core>"}, 625 {/* else if */ "ext": "GL_ARB_timer_query"}, 626 {/* else if */ "ext": "GL_EXT_timer_query"}], 627 "GLES": null, 628 "WebGL": null, 629 630 "functions": [ 631 "GetQueryObjecti64v", "GetQueryObjectui64v", 632 ], 633 }, 634 { 635 "GL": [{"min_version": [3, 3], "ext": "<core>"}, 636 {/* else if */ "ext": "GL_ARB_timer_query"}], 637 "GLES": null, 638 "WebGL": null, 639 640 "functions": [ 641 "QueryCounter", 642 ], 643 }, 644 645 { 646 "GL": [{"min_version": [4, 3], "ext": "<core>"}, 647 {/* else if */ "ext": "GL_ARB_invalidate_subdata"}], 648 "GLES": null, 649 "WebGL": null, 650 651 "functions": [ 652 "InvalidateBufferData", "InvalidateBufferSubData", "InvalidateTexImage", 653 "InvalidateTexSubImage", 654 ], 655 }, 656 { // ES 3.0 adds the framebuffer functions but not the others. 657 "GL": [{"min_version": [4, 3], "ext": "<core>"}, 658 {/* else if */ "ext": "GL_ARB_invalidate_subdata"}], 659 "GLES": [{"min_version": [3, 0], "ext": "<core>"}], 660 "WebGL": [{"min_version": [2, 0], "ext": "<core>"}], 661 662 "functions": [ 663 "InvalidateFramebuffer", "InvalidateSubFramebuffer", 664 ], 665 }, 666 667 { 668 "GL": [{"min_version": [4, 3], "ext": "<core>"}, 669 {/* else if */ "ext": "GL_ARB_ES2_compatibility"}], 670 "GLES": [{"ext": "<core>"}], 671 "WebGL": [{"ext": "<core>"}], 672 673 "functions": [ 674 "GetShaderPrecisionFormat", 675 ], 676 }, 677 678] 679