• 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// 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