Update rive-cpp to 2.0 version
[platform/core/uifw/rive-tizen.git] / submodule / skia / tools / gpu / gl / interface / interface.json5
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":    [{"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       "SamplerParameterf", "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 ]