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 "GetFloatv", "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": [{"min_version": [3, 1], "ext": "<core>"}, 515 {/* else if */ "ext": "GL_ARB_copy_buffer"}], 516 "GLES": [{"min_version": [3, 0], "ext": "<core>"}, 517 {/* else if */ "ext": "GL_NV_copy_buffer"}], 518 "WebGL": [{"min_version": [2, 0], "ext": "<core>"},], 519 520 "functions": ["CopyBufferSubData",], 521 }, 522 523 { 524 "GL": [{"min_version": [4, 3], "ext": "<core>"}, 525 {/* else if */ "ext": "GL_KHR_debug", "suffix": ""}], 526 "GLES": [{"ext": "GL_KHR_debug"}], 527 "WebGL": null, 528 529 // In OpenGL (but not ES), KHR_debug defines these methods to have no suffix. 530 "functions": [ 531 "DebugMessageControl", "DebugMessageInsert", "DebugMessageCallback", 532 "GetDebugMessageLog", "PushDebugGroup", "PopDebugGroup", "ObjectLabel", 533 ], 534 }, 535 536 { 537 "GL": null, 538 "GLES": [{"ext": "GL_CHROMIUM_bind_uniform_location"}], 539 "WebGL": null, 540 541 "functions": [ 542 "BindUniformLocation", 543 ], 544 }, 545 546 { 547 "GL": [{"ext": "GL_EXT_window_rectangles"}], 548 "GLES": [{"ext": "GL_EXT_window_rectangles"}], 549 "WebGL": null, 550 551 "functions": [ 552 "WindowRectangles", 553 ], 554 }, 555 556 { 557 "GL": [{"min_version": [3, 2], "ext": "<core>"}, 558 {/* else if */ "ext": "GL_ARB_sync"}], 559 "GLES": [{"min_version": [3, 0], "ext": "<core>"}, 560 {/* else if */ "ext": "GL_APPLE_sync"}], 561 "WebGL": [{"min_version": [2, 0], "ext": "<core>"}], 562 563 "functions": [ 564 "ClientWaitSync", "DeleteSync", "FenceSync", 565 "IsSync", "WaitSync" 566 ], 567 }, 568 569 { // getInternalformativ was added in GL 4.2, ES 3.0, and with 570 // extension ARB_internalformat_query 571 "GL": [{"min_version": [4, 2], "ext": "<core>"}, 572 {/* else if */ "ext": "GL_ARB_internalformat_query"}], 573 "GLES": [{"min_version": [3, 0], "ext": "<core>"}], 574 "WebGL": null, 575 576 "functions": [ 577 "GetInternalformativ" 578 ], 579 }, 580 581 // GetProgramBinary and ProgramBinary are available with an ES2 extension... 582 { 583 "GL": [{"min_version": [4, 1], "ext": "<core>"}], 584 "GLES": [{"min_version": [3, 0], "ext": "<core>"}, 585 {/* else if */ "ext": "GL_OES_get_program_binary"}], 586 "WebGL": null, // explicitly not supported in WebGL 2.0 587 588 "functions": [ 589 "GetProgramBinary", "ProgramBinary", 590 ], 591 }, 592 593 // ... but the related ProgramParameteri is only in ES3 594 { 595 "GL": [{"min_version": [4, 1], "ext": "<core>"}], 596 "GLES": [{"min_version": [3, 0], "ext": "<core>"}], 597 "WebGL": null, // explicitly not supported in WebGL 2.0 598 599 "functions": [ 600 "ProgramParameteri", 601 ], 602 }, 603 604 { 605 "GL": [{"min_version": [3, 2], "ext": "<core>"}, 606 {/* else if */ "ext": "GL_ARB_sampler_objects"}], 607 "GLES": [{"min_version": [3, 0], "ext": "<core>"}], 608 "WebGL": [{"min_version": [2, 0], "ext": "<core>"}], 609 610 "functions": [ 611 "BindSampler", "DeleteSamplers", "GenSamplers", 612 "SamplerParameterf", "SamplerParameteri", "SamplerParameteriv", 613 ], 614 }, 615 616 { 617 "GL": [{"ext": "<core>"}], 618 "GLES": [{"min_version": [3, 0], "ext": "<core>"}, 619 {/* else if */ "ext": "GL_EXT_disjoint_timer_query"}], 620 "WebGL": [{"min_version": [2, 0], "ext": "<core>"}, 621 {/* else if */ "ext": "GL_EXT_disjoint_timer_query"}, 622 {/* else if */ "ext": "EXT_disjoint_timer_query"}], 623 "functions": [ 624 "GenQueries", "DeleteQueries", "BeginQuery", "EndQuery", 625 "GetQueryObjectuiv", "GetQueryiv", 626 ] 627 }, 628 { 629 "GL": [{"min_version": [3, 3], "ext": "<core>"}, 630 {/* else if */ "ext": "GL_ARB_timer_query"}], 631 "GLES": [{"ext": "GL_EXT_disjoint_timer_query"}], 632 "WebGL": [{"ext": "GL_EXT_disjoint_timer_query"}, 633 {/* else if */ "ext": "EXT_disjoint_timer_query"}, 634 {/* else if */ "ext": "GL_EXT_disjoint_timer_query_webgl2"}, 635 {/* else if */ "ext": "EXT_disjoint_timer_query_webgl2"}], 636 637 "functions": [ 638 "QueryCounter", 639 ], 640 }, 641 642 { 643 "GL": [{"min_version": [3, 3], "ext": "<core>"}, 644 {/* else if */ "ext": "GL_ARB_timer_query"}, 645 {/* else if */ "ext": "GL_EXT_timer_query"}], 646 "GLES": [{"ext": "GL_EXT_disjoint_timer_query"},], 647 "WebGL": [{"ext": "GL_EXT_disjoint_timer_query"}, 648 {/* else if */ "ext": "EXT_disjoint_timer_query"}, 649 {/* else if */ "ext": "GL_EXT_disjoint_timer_query_webgl2"}, 650 {/* else if */ "ext": "EXT_disjoint_timer_query_webgl2"}], 651 "functions": [ 652 "GetQueryObjecti64v", "GetQueryObjectui64v", 653 ], 654 }, 655 656 { 657 "GL": [{"min_version": [4, 3], "ext": "<core>"}, 658 {/* else if */ "ext": "GL_ARB_invalidate_subdata"}], 659 "GLES": [{"ext": "GL_ARB_invalidate_subdata"}], 660 "WebGL": null, 661 662 "functions": [ 663 "InvalidateBufferData", "InvalidateBufferSubData", "InvalidateTexImage", 664 "InvalidateTexSubImage", 665 ], 666 }, 667 { // ES 3.0 adds the framebuffer functions but not the others. 668 "GL": [{"min_version": [4, 3], "ext": "<core>"}, 669 {/* else if */ "ext": "GL_ARB_invalidate_subdata"}], 670 "GLES": [{"min_version": [3, 0], "ext": "<core>"}, 671 {/* else if */ "ext": "GL_ARB_invalidate_subdata"}], 672 "WebGL": [{"min_version": [2, 0], "ext": "<core>"}], 673 674 "functions": [ 675 "InvalidateFramebuffer", "InvalidateSubFramebuffer", 676 ], 677 }, 678 679 { 680 "GL": [{"min_version": [4, 3], "ext": "<core>"}, 681 {/* else if */ "ext": "GL_ARB_ES2_compatibility"}], 682 "GLES": [{"ext": "<core>"}], 683 "WebGL": [{"ext": "<core>"}], 684 685 "functions": [ 686 "GetShaderPrecisionFormat", 687 ], 688 }, 689 690 { 691 "GL": [{"ext": "GL_NV_fence"}], 692 "GLES": [{"ext": "GL_NV_fence"}], 693 "WebGL": null, 694 695 "functions": [ 696 "DeleteFences", "FinishFence", "GenFences", "SetFence", "TestFence", 697 ], 698 } 699] 700