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