• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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