dispatch_sanity.cpp revision 848b8605
1/*
2 * Copyright © 2012 Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
22 */
23
24/**
25 * \name dispatch_sanity.cpp
26 *
27 * Verify that only set of functions that should be available in a particular
28 * API are available in that API.
29 *
30 * The list of expected functions originally came from the functions set by
31 * api_exec_es2.c.  This file no longer exists in Mesa (but api_exec_es1.c was
32 * still generated at the time this test was written).  It was the generated
33 * file that configured the dispatch table for ES2 contexts.  This test
34 * verifies that all of the functions set by the old api_exec_es2.c (with the
35 * recent addition of VAO functions) are set in the dispatch table and
36 * everything else is a NOP.
37 *
38 * When adding extensions that add new functions, this test will need to be
39 * modified to expect dispatch functions for the new extension functions.
40 */
41
42#include <gtest/gtest.h>
43
44extern "C" {
45#include "GL/gl.h"
46#include "GL/glext.h"
47#include "main/compiler.h"
48#include "main/api_exec.h"
49#include "main/context.h"
50#include "main/remap.h"
51#include "main/vtxfmt.h"
52#include "glapi/glapi.h"
53#include "drivers/common/driverfuncs.h"
54
55#include "swrast/swrast.h"
56#include "vbo/vbo.h"
57#include "tnl/tnl.h"
58#include "swrast_setup/swrast_setup.h"
59
60#ifndef GLAPIENTRYP
61#define GLAPIENTRYP GL_APIENTRYP
62#endif
63
64#include "main/dispatch.h"
65}
66
67struct function {
68   const char *name;
69   unsigned int Version;
70   int offset;
71};
72
73extern const struct function gl_core_functions_possible[];
74extern const struct function gles11_functions_possible[];
75extern const struct function gles2_functions_possible[];
76extern const struct function gles3_functions_possible[];
77
78class DispatchSanity_test : public ::testing::Test {
79public:
80   virtual void SetUp();
81   void SetUpCtx(gl_api api, unsigned int version);
82
83   struct gl_config visual;
84   struct dd_function_table driver_functions;
85   struct gl_context share_list;
86   struct gl_context ctx;
87};
88
89void
90DispatchSanity_test::SetUp()
91{
92   memset(&visual, 0, sizeof(visual));
93   memset(&driver_functions, 0, sizeof(driver_functions));
94   memset(&share_list, 0, sizeof(share_list));
95   memset(&ctx, 0, sizeof(ctx));
96
97   _mesa_init_driver_functions(&driver_functions);
98}
99
100void
101DispatchSanity_test::SetUpCtx(gl_api api, unsigned int version)
102{
103   _mesa_initialize_context(&ctx,
104                            api,
105                            &visual,
106                            NULL, // share_list
107                            &driver_functions);
108   _vbo_CreateContext(&ctx);
109
110   ctx.Version = version;
111
112   _mesa_initialize_dispatch_tables(&ctx);
113   _mesa_initialize_vbo_vtxfmt(&ctx);
114}
115
116static const char *
117offset_to_proc_name_safe(unsigned offset)
118{
119   const char *name = _glapi_get_proc_name(offset);
120   return name ? name : "???";
121}
122
123/* Scan through the dispatch table and check that all the functions in
124 * _glapi_proc *table exist. When found, set their pointers in the table
125 * to _mesa_generic_nop.  */
126static void
127validate_functions(struct gl_context *ctx, const struct function *function_table)
128{
129   _glapi_proc *table = (_glapi_proc *) ctx->Exec;
130
131   for (unsigned i = 0; function_table[i].name != NULL; i++) {
132      /* The context version is >= the GL version where the
133         function was introduced. Therefore, the function cannot
134         be set to the nop function.
135       */
136      bool cant_be_nop = ctx->Version >= function_table[i].Version;
137
138      const int offset = (function_table[i].offset != -1)
139         ? function_table[i].offset
140         : _glapi_get_proc_offset(function_table[i].name);
141
142      ASSERT_NE(-1, offset)
143         << "Function: " << function_table[i].name;
144      ASSERT_EQ(offset,
145                _glapi_get_proc_offset(function_table[i].name))
146         << "Function: " << function_table[i].name;
147      if (cant_be_nop) {
148         EXPECT_NE((_glapi_proc) _mesa_generic_nop, table[offset])
149            << "Function: " << function_table[i].name
150            << " at offset " << offset;
151      }
152
153      table[offset] = (_glapi_proc) _mesa_generic_nop;
154   }
155}
156
157/* Scan through the table and ensure that there is nothing except
158 * _mesa_generic_nop (as set by validate_functions().  */
159static void
160validate_nops(struct gl_context *ctx)
161{
162   _glapi_proc *table = (_glapi_proc *) ctx->Exec;
163
164   const unsigned size = _glapi_get_dispatch_table_size();
165   for (unsigned i = 0; i < size; i++) {
166      EXPECT_EQ((_glapi_proc) _mesa_generic_nop, table[i])
167         << "i = " << i << " (" << offset_to_proc_name_safe(i) << ")";
168   }
169}
170
171TEST_F(DispatchSanity_test, GL31_CORE)
172{
173   SetUpCtx(API_OPENGL_CORE, 31);
174   validate_functions(&ctx, gl_core_functions_possible);
175   validate_nops(&ctx);
176}
177
178TEST_F(DispatchSanity_test, GLES11)
179{
180   SetUpCtx(API_OPENGLES, 11);
181   validate_functions(&ctx, gles11_functions_possible);
182   validate_nops(&ctx);
183}
184
185TEST_F(DispatchSanity_test, GLES2)
186{
187   SetUpCtx(API_OPENGLES2, 20);
188   validate_functions(&ctx, gles2_functions_possible);
189   validate_nops(&ctx);
190}
191
192TEST_F(DispatchSanity_test, GLES3)
193{
194   SetUpCtx(API_OPENGLES2, 30);
195   validate_functions(&ctx, gles2_functions_possible);
196   validate_functions(&ctx, gles3_functions_possible);
197   validate_nops(&ctx);
198}
199
200const struct function gl_core_functions_possible[] = {
201   { "glCullFace", 10, -1 },
202   { "glFrontFace", 10, -1 },
203   { "glHint", 10, -1 },
204   { "glLineWidth", 10, -1 },
205   { "glPointSize", 10, -1 },
206   { "glPolygonMode", 10, -1 },
207   { "glScissor", 10, -1 },
208   { "glTexParameterf", 10, -1 },
209   { "glTexParameterfv", 10, -1 },
210   { "glTexParameteri", 10, -1 },
211   { "glTexParameteriv", 10, -1 },
212   { "glTexImage1D", 10, -1 },
213   { "glTexImage2D", 10, -1 },
214   { "glDrawBuffer", 10, -1 },
215   { "glClear", 10, -1 },
216   { "glClearColor", 10, -1 },
217   { "glClearStencil", 10, -1 },
218   { "glClearDepth", 10, -1 },
219   { "glStencilMask", 10, -1 },
220   { "glColorMask", 10, -1 },
221   { "glDepthMask", 10, -1 },
222   { "glDisable", 10, -1 },
223   { "glEnable", 10, -1 },
224   { "glFinish", 10, -1 },
225   { "glFlush", 10, -1 },
226   { "glBlendFunc", 10, -1 },
227   { "glLogicOp", 10, -1 },
228   { "glStencilFunc", 10, -1 },
229   { "glStencilOp", 10, -1 },
230   { "glDepthFunc", 10, -1 },
231   { "glPixelStoref", 10, -1 },
232   { "glPixelStorei", 10, -1 },
233   { "glReadBuffer", 10, -1 },
234   { "glReadPixels", 10, -1 },
235   { "glGetBooleanv", 10, -1 },
236   { "glGetDoublev", 10, -1 },
237   { "glGetError", 10, -1 },
238   { "glGetFloatv", 10, -1 },
239   { "glGetIntegerv", 10, -1 },
240   { "glGetString", 10, -1 },
241   { "glGetTexImage", 10, -1 },
242   { "glGetTexParameterfv", 10, -1 },
243   { "glGetTexParameteriv", 10, -1 },
244   { "glGetTexLevelParameterfv", 10, -1 },
245   { "glGetTexLevelParameteriv", 10, -1 },
246   { "glIsEnabled", 10, -1 },
247   { "glDepthRange", 10, -1 },
248   { "glViewport", 10, -1 },
249
250   /* GL 1.1 */
251   { "glDrawArrays", 11, -1 },
252   { "glDrawElements", 11, -1 },
253   { "glGetPointerv", 11, -1 },
254   { "glPolygonOffset", 11, -1 },
255   { "glCopyTexImage1D", 11, -1 },
256   { "glCopyTexImage2D", 11, -1 },
257   { "glCopyTexSubImage1D", 11, -1 },
258   { "glCopyTexSubImage2D", 11, -1 },
259   { "glTexSubImage1D", 11, -1 },
260   { "glTexSubImage2D", 11, -1 },
261   { "glBindTexture", 11, -1 },
262   { "glDeleteTextures", 11, -1 },
263   { "glGenTextures", 11, -1 },
264   { "glIsTexture", 11, -1 },
265
266   /* GL 1.2 */
267   { "glBlendColor", 12, -1 },
268   { "glBlendEquation", 12, -1 },
269   { "glDrawRangeElements", 12, -1 },
270   { "glTexImage3D", 12, -1 },
271   { "glTexSubImage3D", 12, -1 },
272   { "glCopyTexSubImage3D", 12, -1 },
273
274   /* GL 1.3 */
275   { "glActiveTexture", 13, -1 },
276   { "glSampleCoverage", 13, -1 },
277   { "glCompressedTexImage3D", 13, -1 },
278   { "glCompressedTexImage2D", 13, -1 },
279   { "glCompressedTexImage1D", 13, -1 },
280   { "glCompressedTexSubImage3D", 13, -1 },
281   { "glCompressedTexSubImage2D", 13, -1 },
282   { "glCompressedTexSubImage1D", 13, -1 },
283   { "glGetCompressedTexImage", 13, -1 },
284
285   /* GL 1.4 */
286   { "glBlendFuncSeparate", 14, -1 },
287   { "glMultiDrawArrays", 14, -1 },
288   { "glMultiDrawElements", 14, -1 },
289   { "glPointParameterf", 14, -1 },
290   { "glPointParameterfv", 14, -1 },
291   { "glPointParameteri", 14, -1 },
292   { "glPointParameteriv", 14, -1 },
293
294   /* GL 1.5 */
295   { "glGenQueries", 15, -1 },
296   { "glDeleteQueries", 15, -1 },
297   { "glIsQuery", 15, -1 },
298   { "glBeginQuery", 15, -1 },
299   { "glEndQuery", 15, -1 },
300   { "glGetQueryiv", 15, -1 },
301   { "glGetQueryObjectiv", 15, -1 },
302   { "glGetQueryObjectuiv", 15, -1 },
303   { "glBindBuffer", 15, -1 },
304   { "glDeleteBuffers", 15, -1 },
305   { "glGenBuffers", 15, -1 },
306   { "glIsBuffer", 15, -1 },
307   { "glBufferData", 15, -1 },
308   { "glBufferSubData", 15, -1 },
309   { "glGetBufferSubData", 15, -1 },
310   { "glMapBuffer", 15, -1 },
311   { "glUnmapBuffer", 15, -1 },
312   { "glGetBufferParameteriv", 15, -1 },
313   { "glGetBufferPointerv", 15, -1 },
314
315   /* GL 2.0 */
316   { "glBlendEquationSeparate", 20, -1 },
317   { "glDrawBuffers", 20, -1 },
318   { "glStencilOpSeparate", 20, -1 },
319   { "glStencilFuncSeparate", 20, -1 },
320   { "glStencilMaskSeparate", 20, -1 },
321   { "glAttachShader", 20, -1 },
322   { "glBindAttribLocation", 20, -1 },
323   { "glCompileShader", 20, -1 },
324   { "glCreateProgram", 20, -1 },
325   { "glCreateShader", 20, -1 },
326   { "glDeleteProgram", 20, -1 },
327   { "glDeleteShader", 20, -1 },
328   { "glDetachShader", 20, -1 },
329   { "glDisableVertexAttribArray", 20, -1 },
330   { "glEnableVertexAttribArray", 20, -1 },
331   { "glGetActiveAttrib", 20, -1 },
332   { "glGetActiveUniform", 20, -1 },
333   { "glGetAttachedShaders", 20, -1 },
334   { "glGetAttribLocation", 20, -1 },
335   { "glGetProgramiv", 20, -1 },
336   { "glGetProgramInfoLog", 20, -1 },
337   { "glGetShaderiv", 20, -1 },
338   { "glGetShaderInfoLog", 20, -1 },
339   { "glGetShaderSource", 20, -1 },
340   { "glGetUniformLocation", 20, -1 },
341   { "glGetUniformfv", 20, -1 },
342   { "glGetUniformiv", 20, -1 },
343   { "glGetVertexAttribdv", 20, -1 },
344   { "glGetVertexAttribfv", 20, -1 },
345   { "glGetVertexAttribiv", 20, -1 },
346   { "glGetVertexAttribPointerv", 20, -1 },
347   { "glIsProgram", 20, -1 },
348   { "glIsShader", 20, -1 },
349   { "glLinkProgram", 20, -1 },
350   { "glShaderSource", 20, -1 },
351   { "glUseProgram", 20, -1 },
352   { "glUniform1f", 20, -1 },
353   { "glUniform2f", 20, -1 },
354   { "glUniform3f", 20, -1 },
355   { "glUniform4f", 20, -1 },
356   { "glUniform1i", 20, -1 },
357   { "glUniform2i", 20, -1 },
358   { "glUniform3i", 20, -1 },
359   { "glUniform4i", 20, -1 },
360   { "glUniform1fv", 20, -1 },
361   { "glUniform2fv", 20, -1 },
362   { "glUniform3fv", 20, -1 },
363   { "glUniform4fv", 20, -1 },
364   { "glUniform1iv", 20, -1 },
365   { "glUniform2iv", 20, -1 },
366   { "glUniform3iv", 20, -1 },
367   { "glUniform4iv", 20, -1 },
368   { "glUniformMatrix2fv", 20, -1 },
369   { "glUniformMatrix3fv", 20, -1 },
370   { "glUniformMatrix4fv", 20, -1 },
371   { "glValidateProgram", 20, -1 },
372   { "glVertexAttrib1d", 20, -1 },
373   { "glVertexAttrib1dv", 20, -1 },
374   { "glVertexAttrib1f", 20, -1 },
375   { "glVertexAttrib1fv", 20, -1 },
376   { "glVertexAttrib1s", 20, -1 },
377   { "glVertexAttrib1sv", 20, -1 },
378   { "glVertexAttrib2d", 20, -1 },
379   { "glVertexAttrib2dv", 20, -1 },
380   { "glVertexAttrib2f", 20, -1 },
381   { "glVertexAttrib2fv", 20, -1 },
382   { "glVertexAttrib2s", 20, -1 },
383   { "glVertexAttrib2sv", 20, -1 },
384   { "glVertexAttrib3d", 20, -1 },
385   { "glVertexAttrib3dv", 20, -1 },
386   { "glVertexAttrib3f", 20, -1 },
387   { "glVertexAttrib3fv", 20, -1 },
388   { "glVertexAttrib3s", 20, -1 },
389   { "glVertexAttrib3sv", 20, -1 },
390   { "glVertexAttrib4Nbv", 20, -1 },
391   { "glVertexAttrib4Niv", 20, -1 },
392   { "glVertexAttrib4Nsv", 20, -1 },
393   { "glVertexAttrib4Nub", 20, -1 },
394   { "glVertexAttrib4Nubv", 20, -1 },
395   { "glVertexAttrib4Nuiv", 20, -1 },
396   { "glVertexAttrib4Nusv", 20, -1 },
397   { "glVertexAttrib4bv", 20, -1 },
398   { "glVertexAttrib4d", 20, -1 },
399   { "glVertexAttrib4dv", 20, -1 },
400   { "glVertexAttrib4f", 20, -1 },
401   { "glVertexAttrib4fv", 20, -1 },
402   { "glVertexAttrib4iv", 20, -1 },
403   { "glVertexAttrib4s", 20, -1 },
404   { "glVertexAttrib4sv", 20, -1 },
405   { "glVertexAttrib4ubv", 20, -1 },
406   { "glVertexAttrib4uiv", 20, -1 },
407   { "glVertexAttrib4usv", 20, -1 },
408   { "glVertexAttribPointer", 20, -1 },
409
410   /* GL 2.1 */
411   { "glUniformMatrix2x3fv", 21, -1 },
412   { "glUniformMatrix3x2fv", 21, -1 },
413   { "glUniformMatrix2x4fv", 21, -1 },
414   { "glUniformMatrix4x2fv", 21, -1 },
415   { "glUniformMatrix3x4fv", 21, -1 },
416   { "glUniformMatrix4x3fv", 21, -1 },
417
418   /* GL 3.0 */
419   { "glColorMaski", 30, -1 },
420   { "glGetBooleani_v", 30, -1 },
421   { "glGetIntegeri_v", 30, -1 },
422   { "glEnablei", 30, -1 },
423   { "glDisablei", 30, -1 },
424   { "glIsEnabledi", 30, -1 },
425   { "glBeginTransformFeedback", 30, -1 },
426   { "glEndTransformFeedback", 30, -1 },
427   { "glBindBufferRange", 30, -1 },
428   { "glBindBufferBase", 30, -1 },
429   { "glTransformFeedbackVaryings", 30, -1 },
430   { "glGetTransformFeedbackVarying", 30, -1 },
431   { "glClampColor", 30, -1 },
432   { "glBeginConditionalRender", 30, -1 },
433   { "glEndConditionalRender", 30, -1 },
434   { "glVertexAttribIPointer", 30, -1 },
435   { "glGetVertexAttribIiv", 30, -1 },
436   { "glGetVertexAttribIuiv", 30, -1 },
437   { "glVertexAttribI1i", 30, -1 },
438   { "glVertexAttribI2i", 30, -1 },
439   { "glVertexAttribI3i", 30, -1 },
440   { "glVertexAttribI4i", 30, -1 },
441   { "glVertexAttribI1ui", 30, -1 },
442   { "glVertexAttribI2ui", 30, -1 },
443   { "glVertexAttribI3ui", 30, -1 },
444   { "glVertexAttribI4ui", 30, -1 },
445   { "glVertexAttribI1iv", 30, -1 },
446   { "glVertexAttribI2iv", 30, -1 },
447   { "glVertexAttribI3iv", 30, -1 },
448   { "glVertexAttribI4iv", 30, -1 },
449   { "glVertexAttribI1uiv", 30, -1 },
450   { "glVertexAttribI2uiv", 30, -1 },
451   { "glVertexAttribI3uiv", 30, -1 },
452   { "glVertexAttribI4uiv", 30, -1 },
453   { "glVertexAttribI4bv", 30, -1 },
454   { "glVertexAttribI4sv", 30, -1 },
455   { "glVertexAttribI4ubv", 30, -1 },
456   { "glVertexAttribI4usv", 30, -1 },
457   { "glGetUniformuiv", 30, -1 },
458   { "glBindFragDataLocation", 30, -1 },
459   { "glGetFragDataLocation", 30, -1 },
460   { "glUniform1ui", 30, -1 },
461   { "glUniform2ui", 30, -1 },
462   { "glUniform3ui", 30, -1 },
463   { "glUniform4ui", 30, -1 },
464   { "glUniform1uiv", 30, -1 },
465   { "glUniform2uiv", 30, -1 },
466   { "glUniform3uiv", 30, -1 },
467   { "glUniform4uiv", 30, -1 },
468   { "glTexParameterIiv", 30, -1 },
469   { "glTexParameterIuiv", 30, -1 },
470   { "glGetTexParameterIiv", 30, -1 },
471   { "glGetTexParameterIuiv", 30, -1 },
472   { "glClearBufferiv", 30, -1 },
473   { "glClearBufferuiv", 30, -1 },
474   { "glClearBufferfv", 30, -1 },
475   { "glClearBufferfi", 30, -1 },
476   { "glGetStringi", 30, -1 },
477
478   /* GL 3.1 */
479   { "glDrawArraysInstanced", 31, -1 },
480   { "glDrawElementsInstanced", 31, -1 },
481   { "glTexBuffer", 31, -1 },
482   { "glPrimitiveRestartIndex", 31, -1 },
483
484   /* GL_ARB_shader_objects */
485   { "glDeleteObjectARB", 31, -1 },
486   { "glGetHandleARB", 31, -1 },
487   { "glDetachObjectARB", 31, -1 },
488   { "glCreateShaderObjectARB", 31, -1 },
489   { "glCreateProgramObjectARB", 31, -1 },
490   { "glAttachObjectARB", 31, -1 },
491   { "glGetObjectParameterfvARB", 31, -1 },
492   { "glGetObjectParameterivARB", 31, -1 },
493   { "glGetInfoLogARB", 31, -1 },
494   { "glGetAttachedObjectsARB", 31, -1 },
495
496   /* GL_ARB_get_program_binary */
497   { "glGetProgramBinary", 30, -1 },
498   { "glProgramBinary", 30, -1 },
499   { "glProgramParameteri", 30, -1 },
500
501   /* GL_EXT_transform_feedback */
502   { "glBindBufferOffsetEXT", 31, -1 },
503
504   /* GL_IBM_multimode_draw_arrays */
505   { "glMultiModeDrawArraysIBM", 31, -1 },
506   { "glMultiModeDrawElementsIBM", 31, -1 },
507
508   /* GL_EXT_depth_bounds_test */
509   { "glDepthBoundsEXT", 31, -1 },
510
511   /* GL_apple_object_purgeable */
512   { "glObjectPurgeableAPPLE", 31, -1 },
513   { "glObjectUnpurgeableAPPLE", 31, -1 },
514   { "glGetObjectParameterivAPPLE", 31, -1 },
515
516   /* GL_ARB_instanced_arrays */
517   { "glVertexAttribDivisorARB", 31, -1 },
518
519   /* GL_NV_texture_barrier */
520   { "glTextureBarrierNV", 31, -1 },
521
522   /* GL_EXT_texture_integer */
523   { "glClearColorIiEXT", 31, -1 },
524   { "glClearColorIuiEXT", 31, -1 },
525
526   /* GL_OES_EGL_image */
527   { "glEGLImageTargetRenderbufferStorageOES", 31, -1 },
528   { "glEGLImageTargetTexture2DOES", 31, -1 },
529
530   /* GL 3.2 */
531   { "glGetInteger64i_v", 32, -1 },
532   { "glGetBufferParameteri64v", 32, -1 },
533   { "glFramebufferTexture", 32, -1 },
534
535   /* GL_ARB_geometry_shader4 */
536   { "glProgramParameteriARB", 32, -1 },
537   { "glFramebufferTextureARB", 32, -1 },
538   { "glFramebufferTextureLayerARB", 32, -1 },
539   { "glFramebufferTextureFaceARB", 32, -1 },
540
541   /* GL 3.3 */
542   { "glVertexAttribDivisor", 33, -1 },
543
544   /* GL 4.0 */
545   { "glMinSampleShading", 40, -1 },
546   { "glBlendEquationi", 40, -1 },
547   { "glBlendEquationSeparatei", 40, -1 },
548   { "glBlendFunci", 40, -1 },
549   { "glBlendFuncSeparatei", 40, -1 },
550
551   /* GL 4.3 */
552   { "glIsRenderbuffer", 43, -1 },
553   { "glBindRenderbuffer", 43, -1 },
554   { "glDeleteRenderbuffers", 43, -1 },
555   { "glGenRenderbuffers", 43, -1 },
556   { "glRenderbufferStorage", 43, -1 },
557   { "glGetRenderbufferParameteriv", 43, -1 },
558   { "glIsFramebuffer", 43, -1 },
559   { "glBindFramebuffer", 43, -1 },
560   { "glDeleteFramebuffers", 43, -1 },
561   { "glGenFramebuffers", 43, -1 },
562   { "glCheckFramebufferStatus", 43, -1 },
563   { "glFramebufferTexture1D", 43, -1 },
564   { "glFramebufferTexture2D", 43, -1 },
565   { "glFramebufferTexture3D", 43, -1 },
566   { "glFramebufferRenderbuffer", 43, -1 },
567   { "glGetFramebufferAttachmentParameteriv", 43, -1 },
568   { "glGenerateMipmap", 43, -1 },
569   { "glBlitFramebuffer", 43, -1 },
570   { "glRenderbufferStorageMultisample", 43, -1 },
571   { "glFramebufferTextureLayer", 43, -1 },
572   { "glMapBufferRange", 43, -1 },
573   { "glFlushMappedBufferRange", 43, -1 },
574   { "glBindVertexArray", 43, -1 },
575   { "glDeleteVertexArrays", 43, -1 },
576   { "glGenVertexArrays", 43, -1 },
577   { "glIsVertexArray", 43, -1 },
578   { "glGetUniformIndices", 43, -1 },
579   { "glGetActiveUniformsiv", 43, -1 },
580   { "glGetActiveUniformName", 43, -1 },
581   { "glGetUniformBlockIndex", 43, -1 },
582   { "glGetActiveUniformBlockiv", 43, -1 },
583   { "glGetActiveUniformBlockName", 43, -1 },
584   { "glUniformBlockBinding", 43, -1 },
585   { "glCopyBufferSubData", 43, -1 },
586   { "glDrawElementsBaseVertex", 43, -1 },
587   { "glDrawRangeElementsBaseVertex", 43, -1 },
588   { "glDrawElementsInstancedBaseVertex", 43, -1 },
589   { "glMultiDrawElementsBaseVertex", 43, -1 },
590   { "glProvokingVertex", 43, -1 },
591   { "glFenceSync", 43, -1 },
592   { "glIsSync", 43, -1 },
593   { "glDeleteSync", 43, -1 },
594   { "glClientWaitSync", 43, -1 },
595   { "glWaitSync", 43, -1 },
596   { "glGetInteger64v", 43, -1 },
597   { "glGetSynciv", 43, -1 },
598   { "glTexImage2DMultisample", 43, -1 },
599   { "glTexImage3DMultisample", 43, -1 },
600   { "glGetMultisamplefv", 43, -1 },
601   { "glSampleMaski", 43, -1 },
602   { "glBlendEquationiARB", 43, -1 },
603   { "glBlendEquationSeparateiARB", 43, -1 },
604   { "glBlendFunciARB", 43, -1 },
605   { "glBlendFuncSeparateiARB", 43, -1 },
606   { "glMinSampleShadingARB", 43, -1 },                 // XXX: Add to xml
607// { "glNamedStringARB", 43, -1 },                      // XXX: Add to xml
608// { "glDeleteNamedStringARB", 43, -1 },                // XXX: Add to xml
609// { "glCompileShaderIncludeARB", 43, -1 },             // XXX: Add to xml
610// { "glIsNamedStringARB", 43, -1 },                    // XXX: Add to xml
611// { "glGetNamedStringARB", 43, -1 },                   // XXX: Add to xml
612// { "glGetNamedStringivARB", 43, -1 },                 // XXX: Add to xml
613   { "glBindFragDataLocationIndexed", 43, -1 },
614   { "glGetFragDataIndex", 43, -1 },
615   { "glGenSamplers", 43, -1 },
616   { "glDeleteSamplers", 43, -1 },
617   { "glIsSampler", 43, -1 },
618   { "glBindSampler", 43, -1 },
619   { "glSamplerParameteri", 43, -1 },
620   { "glSamplerParameteriv", 43, -1 },
621   { "glSamplerParameterf", 43, -1 },
622   { "glSamplerParameterfv", 43, -1 },
623   { "glSamplerParameterIiv", 43, -1 },
624   { "glSamplerParameterIuiv", 43, -1 },
625   { "glGetSamplerParameteriv", 43, -1 },
626   { "glGetSamplerParameterIiv", 43, -1 },
627   { "glGetSamplerParameterfv", 43, -1 },
628   { "glGetSamplerParameterIuiv", 43, -1 },
629   { "glQueryCounter", 43, -1 },
630   { "glGetQueryObjecti64v", 43, -1 },
631   { "glGetQueryObjectui64v", 43, -1 },
632   { "glVertexP2ui", 43, -1 },
633   { "glVertexP2uiv", 43, -1 },
634   { "glVertexP3ui", 43, -1 },
635   { "glVertexP3uiv", 43, -1 },
636   { "glVertexP4ui", 43, -1 },
637   { "glVertexP4uiv", 43, -1 },
638   { "glTexCoordP1ui", 43, -1 },
639   { "glTexCoordP1uiv", 43, -1 },
640   { "glTexCoordP2ui", 43, -1 },
641   { "glTexCoordP2uiv", 43, -1 },
642   { "glTexCoordP3ui", 43, -1 },
643   { "glTexCoordP3uiv", 43, -1 },
644   { "glTexCoordP4ui", 43, -1 },
645   { "glTexCoordP4uiv", 43, -1 },
646   { "glMultiTexCoordP1ui", 43, -1 },
647   { "glMultiTexCoordP1uiv", 43, -1 },
648   { "glMultiTexCoordP2ui", 43, -1 },
649   { "glMultiTexCoordP2uiv", 43, -1 },
650   { "glMultiTexCoordP3ui", 43, -1 },
651   { "glMultiTexCoordP3uiv", 43, -1 },
652   { "glMultiTexCoordP4ui", 43, -1 },
653   { "glMultiTexCoordP4uiv", 43, -1 },
654   { "glNormalP3ui", 43, -1 },
655   { "glNormalP3uiv", 43, -1 },
656   { "glColorP3ui", 43, -1 },
657   { "glColorP3uiv", 43, -1 },
658   { "glColorP4ui", 43, -1 },
659   { "glColorP4uiv", 43, -1 },
660   { "glSecondaryColorP3ui", 43, -1 },
661   { "glSecondaryColorP3uiv", 43, -1 },
662   { "glVertexAttribP1ui", 43, -1 },
663   { "glVertexAttribP1uiv", 43, -1 },
664   { "glVertexAttribP2ui", 43, -1 },
665   { "glVertexAttribP2uiv", 43, -1 },
666   { "glVertexAttribP3ui", 43, -1 },
667   { "glVertexAttribP3uiv", 43, -1 },
668   { "glVertexAttribP4ui", 43, -1 },
669   { "glVertexAttribP4uiv", 43, -1 },
670   { "glDrawArraysIndirect", 43, -1 },
671   { "glDrawElementsIndirect", 43, -1 },
672// { "glUniform1d", 43, -1 },                           // XXX: Add to xml
673// { "glUniform2d", 43, -1 },                           // XXX: Add to xml
674// { "glUniform3d", 43, -1 },                           // XXX: Add to xml
675// { "glUniform4d", 43, -1 },                           // XXX: Add to xml
676// { "glUniform1dv", 43, -1 },                          // XXX: Add to xml
677// { "glUniform2dv", 43, -1 },                          // XXX: Add to xml
678// { "glUniform3dv", 43, -1 },                          // XXX: Add to xml
679// { "glUniform4dv", 43, -1 },                          // XXX: Add to xml
680// { "glUniformMatrix2dv", 43, -1 },                    // XXX: Add to xml
681// { "glUniformMatrix3dv", 43, -1 },                    // XXX: Add to xml
682// { "glUniformMatrix4dv", 43, -1 },                    // XXX: Add to xml
683// { "glUniformMatrix2x3dv", 43, -1 },                  // XXX: Add to xml
684// { "glUniformMatrix2x4dv", 43, -1 },                  // XXX: Add to xml
685// { "glUniformMatrix3x2dv", 43, -1 },                  // XXX: Add to xml
686// { "glUniformMatrix3x4dv", 43, -1 },                  // XXX: Add to xml
687// { "glUniformMatrix4x2dv", 43, -1 },                  // XXX: Add to xml
688// { "glUniformMatrix4x3dv", 43, -1 },                  // XXX: Add to xml
689// { "glGetUniformdv", 43, -1 },                        // XXX: Add to xml
690// { "glGetSubroutineUniformLocation", 43, -1 },        // XXX: Add to xml
691// { "glGetSubroutineIndex", 43, -1 },                  // XXX: Add to xml
692// { "glGetActiveSubroutineUniformiv", 43, -1 },        // XXX: Add to xml
693// { "glGetActiveSubroutineUniformName", 43, -1 },      // XXX: Add to xml
694// { "glGetActiveSubroutineName", 43, -1 },             // XXX: Add to xml
695// { "glUniformSubroutinesuiv", 43, -1 },               // XXX: Add to xml
696// { "glGetUniformSubroutineuiv", 43, -1 },             // XXX: Add to xml
697// { "glGetProgramStageiv", 43, -1 },                   // XXX: Add to xml
698// { "glPatchParameteri", 43, -1 },                     // XXX: Add to xml
699// { "glPatchParameterfv", 43, -1 },                    // XXX: Add to xml
700   { "glBindTransformFeedback", 43, -1 },
701   { "glDeleteTransformFeedbacks", 43, -1 },
702   { "glGenTransformFeedbacks", 43, -1 },
703   { "glIsTransformFeedback", 43, -1 },
704   { "glPauseTransformFeedback", 43, -1 },
705   { "glResumeTransformFeedback", 43, -1 },
706   { "glDrawTransformFeedback", 43, -1 },
707   { "glDrawTransformFeedbackStream", 43, -1 },
708   { "glBeginQueryIndexed", 43, -1 },
709   { "glEndQueryIndexed", 43, -1 },
710   { "glGetQueryIndexediv", 43, -1 },
711   { "glReleaseShaderCompiler", 43, -1 },
712   { "glShaderBinary", 43, -1 },
713   { "glGetShaderPrecisionFormat", 43, -1 },
714   { "glDepthRangef", 43, -1 },
715   { "glClearDepthf", 43, -1 },
716   { "glGetProgramBinary", 43, -1 },
717   { "glProgramBinary", 43, -1 },
718   { "glProgramParameteri", 43, -1 },
719   { "glUseProgramStages", 43, -1 },
720   { "glActiveShaderProgram", 43, -1 },
721   { "glCreateShaderProgramv", 43, -1 },
722   { "glBindProgramPipeline", 43, -1 },
723   { "glDeleteProgramPipelines", 43, -1 },
724   { "glGenProgramPipelines", 43, -1 },
725   { "glIsProgramPipeline", 43, -1 },
726   { "glGetProgramPipelineiv", 43, -1 },
727   { "glProgramUniform1i", 43, -1 },
728   { "glProgramUniform1iv", 43, -1 },
729   { "glProgramUniform1f", 43, -1 },
730   { "glProgramUniform1fv", 43, -1 },
731// { "glProgramUniform1d", 43, -1 },                    // XXX: Add to xml
732// { "glProgramUniform1dv", 43, -1 },                   // XXX: Add to xml
733   { "glProgramUniform1ui", 43, -1 },
734   { "glProgramUniform1uiv", 43, -1 },
735   { "glProgramUniform2i", 43, -1 },
736   { "glProgramUniform2iv", 43, -1 },
737   { "glProgramUniform2f", 43, -1 },
738   { "glProgramUniform2fv", 43, -1 },
739// { "glProgramUniform2d", 43, -1 },                    // XXX: Add to xml
740// { "glProgramUniform2dv", 43, -1 },                   // XXX: Add to xml
741   { "glProgramUniform2ui", 43, -1 },
742   { "glProgramUniform2uiv", 43, -1 },
743   { "glProgramUniform3i", 43, -1 },
744   { "glProgramUniform3iv", 43, -1 },
745   { "glProgramUniform3f", 43, -1 },
746   { "glProgramUniform3fv", 43, -1 },
747// { "glProgramUniform3d", 43, -1 },                    // XXX: Add to xml
748// { "glProgramUniform3dv", 43, -1 },                   // XXX: Add to xml
749   { "glProgramUniform3ui", 43, -1 },
750   { "glProgramUniform3uiv", 43, -1 },
751   { "glProgramUniform4i", 43, -1 },
752   { "glProgramUniform4iv", 43, -1 },
753   { "glProgramUniform4f", 43, -1 },
754   { "glProgramUniform4fv", 43, -1 },
755// { "glProgramUniform4d", 43, -1 },                    // XXX: Add to xml
756// { "glProgramUniform4dv", 43, -1 },                   // XXX: Add to xml
757   { "glProgramUniform4ui", 43, -1 },
758   { "glProgramUniform4uiv", 43, -1 },
759   { "glProgramUniformMatrix2fv", 43, -1 },
760   { "glProgramUniformMatrix3fv", 43, -1 },
761   { "glProgramUniformMatrix4fv", 43, -1 },
762// { "glProgramUniformMatrix2dv", 43, -1 },             // XXX: Add to xml
763// { "glProgramUniformMatrix3dv", 43, -1 },             // XXX: Add to xml
764// { "glProgramUniformMatrix4dv", 43, -1 },             // XXX: Add to xml
765   { "glProgramUniformMatrix2x3fv", 43, -1 },
766   { "glProgramUniformMatrix3x2fv", 43, -1 },
767   { "glProgramUniformMatrix2x4fv", 43, -1 },
768   { "glProgramUniformMatrix4x2fv", 43, -1 },
769   { "glProgramUniformMatrix3x4fv", 43, -1 },
770   { "glProgramUniformMatrix4x3fv", 43, -1 },
771// { "glProgramUniformMatrix2x3dv", 43, -1 },           // XXX: Add to xml
772// { "glProgramUniformMatrix3x2dv", 43, -1 },           // XXX: Add to xml
773// { "glProgramUniformMatrix2x4dv", 43, -1 },           // XXX: Add to xml
774// { "glProgramUniformMatrix4x2dv", 43, -1 },           // XXX: Add to xml
775// { "glProgramUniformMatrix3x4dv", 43, -1 },           // XXX: Add to xml
776// { "glProgramUniformMatrix4x3dv", 43, -1 },           // XXX: Add to xml
777   { "glValidateProgramPipeline", 43, -1 },
778   { "glGetProgramPipelineInfoLog", 43, -1 },
779// { "glVertexAttribL1d", 43, -1 },                     // XXX: Add to xml
780// { "glVertexAttribL2d", 43, -1 },                     // XXX: Add to xml
781// { "glVertexAttribL3d", 43, -1 },                     // XXX: Add to xml
782// { "glVertexAttribL4d", 43, -1 },                     // XXX: Add to xml
783// { "glVertexAttribL1dv", 43, -1 },                    // XXX: Add to xml
784// { "glVertexAttribL2dv", 43, -1 },                    // XXX: Add to xml
785// { "glVertexAttribL3dv", 43, -1 },                    // XXX: Add to xml
786// { "glVertexAttribL4dv", 43, -1 },                    // XXX: Add to xml
787// { "glVertexAttribLPointer", 43, -1 },                // XXX: Add to xml
788// { "glGetVertexAttribLdv", 43, -1 },                  // XXX: Add to xml
789   { "glViewportArrayv", 43, -1 },
790   { "glViewportIndexedf", 43, -1 },
791   { "glViewportIndexedfv", 43, -1 },
792   { "glScissorArrayv", 43, -1 },
793   { "glScissorIndexed", 43, -1 },
794   { "glScissorIndexedv", 43, -1 },
795   { "glDepthRangeArrayv", 43, -1 },
796   { "glDepthRangeIndexed", 43, -1 },
797   { "glGetFloati_v", 43, -1 },
798   { "glGetDoublei_v", 43, -1 },
799// { "glCreateSyncFromCLeventARB", 43, -1 },            // XXX: Add to xml
800   { "glGetGraphicsResetStatusARB", 43, -1 },
801   { "glGetnMapdvARB", 43, -1 },
802   { "glGetnMapfvARB", 43, -1 },
803   { "glGetnMapivARB", 43, -1 },
804   { "glGetnPixelMapfvARB", 43, -1 },
805   { "glGetnPixelMapuivARB", 43, -1 },
806   { "glGetnPixelMapusvARB", 43, -1 },
807   { "glGetnPolygonStippleARB", 43, -1 },
808   { "glGetnColorTableARB", 43, -1 },
809   { "glGetnConvolutionFilterARB", 43, -1 },
810   { "glGetnSeparableFilterARB", 43, -1 },
811   { "glGetnHistogramARB", 43, -1 },
812   { "glGetnMinmaxARB", 43, -1 },
813   { "glGetnTexImageARB", 43, -1 },
814   { "glReadnPixelsARB", 43, -1 },
815   { "glGetnCompressedTexImageARB", 43, -1 },
816   { "glGetnUniformfvARB", 43, -1 },
817   { "glGetnUniformivARB", 43, -1 },
818   { "glGetnUniformuivARB", 43, -1 },
819   { "glGetnUniformdvARB", 43, -1 },
820   { "glDrawArraysInstancedBaseInstance", 43, -1 },
821   { "glDrawElementsInstancedBaseInstance", 43, -1 },
822   { "glDrawElementsInstancedBaseVertexBaseInstance", 43, -1 },
823   { "glDrawTransformFeedbackInstanced", 43, -1 },
824   { "glDrawTransformFeedbackStreamInstanced", 43, -1 },
825// { "glGetInternalformativ", 43, -1 },                 // XXX: Add to xml
826   { "glGetActiveAtomicCounterBufferiv", 43, -1 },
827   { "glBindImageTexture", 43, -1 },
828   { "glMemoryBarrier", 43, -1 },
829   { "glTexStorage1D", 43, -1 },
830   { "glTexStorage2D", 43, -1 },
831   { "glTexStorage3D", 43, -1 },
832   { "glTextureStorage1DEXT", 43, -1 },
833   { "glTextureStorage2DEXT", 43, -1 },
834   { "glTextureStorage3DEXT", 43, -1 },
835   { "glClearBufferData", 43, -1 },
836   { "glClearBufferSubData", 43, -1 },
837// { "glClearNamedBufferDataEXT", 43, -1 },             // XXX: Add to xml
838// { "glClearNamedBufferSubDataEXT", 43, -1 },          // XXX: Add to xml
839   { "glDispatchCompute", 43, -1 },
840   { "glDispatchComputeIndirect", 43, -1 },
841   { "glCopyImageSubData", 43, -1 },
842   { "glTextureView", 43, -1 },
843   { "glBindVertexBuffer", 43, -1 },
844   { "glVertexAttribFormat", 43, -1 },
845   { "glVertexAttribIFormat", 43, -1 },
846   { "glVertexAttribLFormat", 43, -1 },
847   { "glVertexAttribBinding", 43, -1 },
848   { "glVertexBindingDivisor", 43, -1 },
849// { "glVertexArrayBindVertexBufferEXT", 43, -1 },      // XXX: Add to xml
850// { "glVertexArrayVertexAttribFormatEXT", 43, -1 },    // XXX: Add to xml
851// { "glVertexArrayVertexAttribIFormatEXT", 43, -1 },   // XXX: Add to xml
852// { "glVertexArrayVertexAttribLFormatEXT", 43, -1 },   // XXX: Add to xml
853// { "glVertexArrayVertexAttribBindingEXT", 43, -1 },   // XXX: Add to xml
854// { "glVertexArrayVertexBindingDivisorEXT", 43, -1 },  // XXX: Add to xml
855// { "glFramebufferParameteri", 43, -1 },               // XXX: Add to xml
856// { "glGetFramebufferParameteriv", 43, -1 },           // XXX: Add to xml
857// { "glNamedFramebufferParameteriEXT", 43, -1 },       // XXX: Add to xml
858// { "glGetNamedFramebufferParameterivEXT", 43, -1 },   // XXX: Add to xml
859// { "glGetInternalformati64v", 43, -1 },               // XXX: Add to xml
860   { "glInvalidateTexSubImage", 43, -1 },
861   { "glInvalidateTexImage", 43, -1 },
862   { "glInvalidateBufferSubData", 43, -1 },
863   { "glInvalidateBufferData", 43, -1 },
864   { "glInvalidateFramebuffer", 43, -1 },
865   { "glInvalidateSubFramebuffer", 43, -1 },
866   { "glMultiDrawArraysIndirect", 43, -1 },
867   { "glMultiDrawElementsIndirect", 43, -1 },
868// { "glGetProgramInterfaceiv", 43, -1 },               // XXX: Add to xml
869// { "glGetProgramResourceIndex", 43, -1 },             // XXX: Add to xml
870// { "glGetProgramResourceName", 43, -1 },              // XXX: Add to xml
871// { "glGetProgramResourceiv", 43, -1 },                // XXX: Add to xml
872// { "glGetProgramResourceLocation", 43, -1 },          // XXX: Add to xml
873// { "glGetProgramResourceLocationIndex", 43, -1 },     // XXX: Add to xml
874// { "glShaderStorageBlockBinding", 43, -1 },           // XXX: Add to xml
875   { "glTexBufferRange", 43, -1 },
876// { "glTextureBufferRangeEXT", 43, -1 },               // XXX: Add to xml
877   { "glTexStorage2DMultisample", 43, -1 },
878   { "glTexStorage3DMultisample", 43, -1 },
879// { "glTextureStorage2DMultisampleEXT", 43, -1 },      // XXX: Add to xml
880// { "glTextureStorage3DMultisampleEXT", 43, -1 },      // XXX: Add to xml
881
882   /* GL_ARB_internalformat_query */
883   { "glGetInternalformativ", 30, -1 },
884
885   /* GL_ARB_multi_bind */
886   { "glBindBuffersBase", 44, -1 },
887   { "glBindBuffersRange", 44, -1 },
888   { "glBindTextures", 44, -1 },
889   { "glBindSamplers", 44, -1 },
890   { "glBindImageTextures", 44, -1 },
891   { "glBindVertexBuffers", 44, -1 },
892
893   /* GL_KHR_debug/GL_ARB_debug_output */
894   { "glPushDebugGroup", 11, -1 },
895   { "glPopDebugGroup", 11, -1 },
896   { "glDebugMessageCallback", 11, -1 },
897   { "glDebugMessageControl", 11, -1 },
898   { "glDebugMessageInsert", 11, -1 },
899   { "glGetDebugMessageLog", 11, -1 },
900   { "glGetObjectLabel", 11, -1 },
901   { "glGetObjectPtrLabel", 11, -1 },
902   { "glObjectLabel", 11, -1 },
903   { "glObjectPtrLabel", 11, -1 },
904   /* aliased versions checked above */
905   //{ "glDebugMessageControlARB", 11, -1 },
906   //{ "glDebugMessageInsertARB", 11, -1 },
907   //{ "glDebugMessageCallbackARB", 11, -1 },
908   //{ "glGetDebugMessageLogARB", 11, -1 },
909
910   /* GL_AMD_performance_monitor */
911   { "glGetPerfMonitorGroupsAMD", 11, -1 },
912   { "glGetPerfMonitorCountersAMD", 11, -1 },
913   { "glGetPerfMonitorGroupStringAMD", 11, -1 },
914   { "glGetPerfMonitorCounterStringAMD", 11, -1 },
915   { "glGetPerfMonitorCounterInfoAMD", 11, -1 },
916   { "glGenPerfMonitorsAMD", 11, -1 },
917   { "glDeletePerfMonitorsAMD", 11, -1 },
918   { "glSelectPerfMonitorCountersAMD", 11, -1 },
919   { "glBeginPerfMonitorAMD", 11, -1 },
920   { "glEndPerfMonitorAMD", 11, -1 },
921   { "glGetPerfMonitorCounterDataAMD", 11, -1 },
922
923   /* GL_INTEL_performance_query */
924   { "glGetFirstPerfQueryIdINTEL", 30, -1 },
925   { "glGetNextPerfQueryIdINTEL", 30, -1 },
926   { "glGetPerfQueryIdByNameINTEL", 30, -1 },
927   { "glGetPerfQueryInfoINTEL", 30, -1 },
928   { "glGetPerfCounterInfoINTEL", 30, -1 },
929   { "glCreatePerfQueryINTEL", 30, -1 },
930   { "glDeletePerfQueryINTEL", 30, -1 },
931   { "glBeginPerfQueryINTEL", 30, -1 },
932   { "glEndPerfQueryINTEL", 30, -1 },
933   { "glGetPerfQueryDataINTEL", 30, -1 },
934
935   /* GL_NV_vdpau_interop */
936   { "glVDPAUInitNV", 11, -1 },
937   { "glVDPAUFiniNV", 11, -1 },
938   { "glVDPAURegisterVideoSurfaceNV", 11, -1 },
939   { "glVDPAURegisterOutputSurfaceNV", 11, -1 },
940   { "glVDPAUIsSurfaceNV", 11, -1 },
941   { "glVDPAUUnregisterSurfaceNV", 11, -1 },
942   { "glVDPAUGetSurfaceivNV", 11, -1 },
943   { "glVDPAUSurfaceAccessNV", 11, -1 },
944   { "glVDPAUMapSurfacesNV", 11, -1 },
945   { "glVDPAUUnmapSurfacesNV", 11, -1 },
946
947   /* GL_ARB_buffer_storage */
948   { "glBufferStorage", 43, -1 },
949
950   /* GL_ARB_clear_texture */
951   { "glClearTexImage", 13, -1 },
952   { "glClearTexSubImage", 13, -1 },
953
954   { NULL, 0, -1 }
955};
956
957const struct function gles11_functions_possible[] = {
958   { "glActiveTexture", 11, _gloffset_ActiveTexture },
959   { "glAlphaFunc", 11, _gloffset_AlphaFunc },
960   { "glAlphaFuncx", 11, -1 },
961   { "glBindBuffer", 11, -1 },
962   { "glBindFramebufferOES", 11, -1 },
963   { "glBindRenderbufferOES", 11, -1 },
964   { "glBindTexture", 11, _gloffset_BindTexture },
965   { "glBlendEquationOES", 11, _gloffset_BlendEquation },
966   { "glBlendEquationSeparateOES", 11, -1 },
967   { "glBlendFunc", 11, _gloffset_BlendFunc },
968   { "glBlendFuncSeparateOES", 11, -1 },
969   { "glBufferData", 11, -1 },
970   { "glBufferSubData", 11, -1 },
971   { "glCheckFramebufferStatusOES", 11, -1 },
972   { "glClear", 11, _gloffset_Clear },
973   { "glClearColor", 11, _gloffset_ClearColor },
974   { "glClearColorx", 11, -1 },
975   { "glClearDepthf", 11, -1 },
976   { "glClearDepthx", 11, -1 },
977   { "glClearStencil", 11, _gloffset_ClearStencil },
978   { "glClientActiveTexture", 11, _gloffset_ClientActiveTexture },
979   { "glClipPlanef", 11, -1 },
980   { "glClipPlanex", 11, -1 },
981   { "glColor4f", 11, _gloffset_Color4f },
982   { "glColor4ub", 11, _gloffset_Color4ub },
983   { "glColor4x", 11, -1 },
984   { "glColorMask", 11, _gloffset_ColorMask },
985   { "glColorPointer", 11, _gloffset_ColorPointer },
986   { "glCompressedTexImage2D", 11, -1 },
987   { "glCompressedTexSubImage2D", 11, -1 },
988   { "glCopyTexImage2D", 11, _gloffset_CopyTexImage2D },
989   { "glCopyTexSubImage2D", 11, _gloffset_CopyTexSubImage2D },
990   { "glCullFace", 11, _gloffset_CullFace },
991   { "glDeleteBuffers", 11, -1 },
992   { "glDeleteFramebuffersOES", 11, -1 },
993   { "glDeleteRenderbuffersOES", 11, -1 },
994   { "glDeleteTextures", 11, _gloffset_DeleteTextures },
995   { "glDepthFunc", 11, _gloffset_DepthFunc },
996   { "glDepthMask", 11, _gloffset_DepthMask },
997   { "glDepthRangef", 11, -1 },
998   { "glDepthRangex", 11, -1 },
999   { "glDisable", 11, _gloffset_Disable },
1000   { "glDiscardFramebufferEXT", 11, -1 },
1001   { "glDisableClientState", 11, _gloffset_DisableClientState },
1002   { "glDrawArrays", 11, _gloffset_DrawArrays },
1003   { "glDrawElements", 11, _gloffset_DrawElements },
1004   { "glDrawTexfOES", 11, -1 },
1005   { "glDrawTexfvOES", 11, -1 },
1006   { "glDrawTexiOES", 11, -1 },
1007   { "glDrawTexivOES", 11, -1 },
1008   { "glDrawTexsOES", 11, -1 },
1009   { "glDrawTexsvOES", 11, -1 },
1010   { "glDrawTexxOES", 11, -1 },
1011   { "glDrawTexxvOES", 11, -1 },
1012   { "glEGLImageTargetRenderbufferStorageOES", 11, -1 },
1013   { "glEGLImageTargetTexture2DOES", 11, -1 },
1014   { "glEnable", 11, _gloffset_Enable },
1015   { "glEnableClientState", 11, _gloffset_EnableClientState },
1016   { "glFinish", 11, _gloffset_Finish },
1017   { "glFlush", 11, _gloffset_Flush },
1018   { "glFlushMappedBufferRangeEXT", 11, -1 },
1019   { "glFogf", 11, _gloffset_Fogf },
1020   { "glFogfv", 11, _gloffset_Fogfv },
1021   { "glFogx", 11, -1 },
1022   { "glFogxv", 11, -1 },
1023   { "glFramebufferRenderbufferOES", 11, -1 },
1024   { "glFramebufferTexture2DOES", 11, -1 },
1025   { "glFrontFace", 11, _gloffset_FrontFace },
1026   { "glFrustumf", 11, -1 },
1027   { "glFrustumx", 11, -1 },
1028   { "glGenBuffers", 11, -1 },
1029   { "glGenFramebuffersOES", 11, -1 },
1030   { "glGenRenderbuffersOES", 11, -1 },
1031   { "glGenTextures", 11, _gloffset_GenTextures },
1032   { "glGenerateMipmapOES", 11, -1 },
1033   { "glGetBooleanv", 11, _gloffset_GetBooleanv },
1034   { "glGetBufferParameteriv", 11, -1 },
1035   { "glGetBufferPointervOES", 11, -1 },
1036   { "glGetClipPlanef", 11, -1 },
1037   { "glGetClipPlanex", 11, -1 },
1038   { "glGetError", 11, _gloffset_GetError },
1039   { "glGetFixedv", 11, -1 },
1040   { "glGetFloatv", 11, _gloffset_GetFloatv },
1041   { "glGetFramebufferAttachmentParameterivOES", 11, -1 },
1042   { "glGetIntegerv", 11, _gloffset_GetIntegerv },
1043   { "glGetLightfv", 11, _gloffset_GetLightfv },
1044   { "glGetLightxv", 11, -1 },
1045   { "glGetMaterialfv", 11, _gloffset_GetMaterialfv },
1046   { "glGetMaterialxv", 11, -1 },
1047   { "glGetPointerv", 11, _gloffset_GetPointerv },
1048   { "glGetRenderbufferParameterivOES", 11, -1 },
1049   { "glGetString", 11, _gloffset_GetString },
1050   { "glGetTexEnvfv", 11, _gloffset_GetTexEnvfv },
1051   { "glGetTexEnviv", 11, _gloffset_GetTexEnviv },
1052   { "glGetTexEnvxv", 11, -1 },
1053   { "glGetTexGenfvOES", 11, _gloffset_GetTexGenfv },
1054   { "glGetTexGenivOES", 11, _gloffset_GetTexGeniv },
1055   { "glGetTexGenxvOES", 11, -1 },
1056   { "glGetTexParameterfv", 11, _gloffset_GetTexParameterfv },
1057   { "glGetTexParameteriv", 11, _gloffset_GetTexParameteriv },
1058   { "glGetTexParameterxv", 11, -1 },
1059   { "glHint", 11, _gloffset_Hint },
1060   { "glIsBuffer", 11, -1 },
1061   { "glIsEnabled", 11, _gloffset_IsEnabled },
1062   { "glIsFramebufferOES", 11, -1 },
1063   { "glIsRenderbufferOES", 11, -1 },
1064   { "glIsTexture", 11, _gloffset_IsTexture },
1065   { "glLightModelf", 11, _gloffset_LightModelf },
1066   { "glLightModelfv", 11, _gloffset_LightModelfv },
1067   { "glLightModelx", 11, -1 },
1068   { "glLightModelxv", 11, -1 },
1069   { "glLightf", 11, _gloffset_Lightf },
1070   { "glLightfv", 11, _gloffset_Lightfv },
1071   { "glLightx", 11, -1 },
1072   { "glLightxv", 11, -1 },
1073   { "glLineWidth", 11, _gloffset_LineWidth },
1074   { "glLineWidthx", 11, -1 },
1075   { "glLoadIdentity", 11, _gloffset_LoadIdentity },
1076   { "glLoadMatrixf", 11, _gloffset_LoadMatrixf },
1077   { "glLoadMatrixx", 11, -1 },
1078   { "glLogicOp", 11, _gloffset_LogicOp },
1079   { "glMapBufferOES", 11, -1 },
1080   { "glMapBufferRangeEXT", 11, -1 },
1081   { "glMaterialf", 11, _gloffset_Materialf },
1082   { "glMaterialfv", 11, _gloffset_Materialfv },
1083   { "glMaterialx", 11, -1 },
1084   { "glMaterialxv", 11, -1 },
1085   { "glMatrixMode", 11, _gloffset_MatrixMode },
1086   { "glMultMatrixf", 11, _gloffset_MultMatrixf },
1087   { "glMultMatrixx", 11, -1 },
1088   { "glMultiDrawArraysEXT", 11, -1 },
1089   { "glMultiDrawElementsEXT", 11, -1 },
1090   { "glMultiTexCoord4f", 11, _gloffset_MultiTexCoord4fARB },
1091   { "glMultiTexCoord4x", 11, -1 },
1092   { "glNormal3f", 11, _gloffset_Normal3f },
1093   { "glNormal3x", 11, -1 },
1094   { "glNormalPointer", 11, _gloffset_NormalPointer },
1095   { "glOrthof", 11, -1 },
1096   { "glOrthox", 11, -1 },
1097   { "glPixelStorei", 11, _gloffset_PixelStorei },
1098   { "glPointParameterf", 11, -1 },
1099   { "glPointParameterfv", 11, -1 },
1100   { "glPointParameterx", 11, -1 },
1101   { "glPointParameterxv", 11, -1 },
1102   { "glPointSize", 11, _gloffset_PointSize },
1103   { "glPointSizePointerOES", 11, -1 },
1104   { "glPointSizex", 11, -1 },
1105   { "glPolygonOffset", 11, _gloffset_PolygonOffset },
1106   { "glPolygonOffsetx", 11, -1 },
1107   { "glPopMatrix", 11, _gloffset_PopMatrix },
1108   { "glPushMatrix", 11, _gloffset_PushMatrix },
1109   { "glQueryMatrixxOES", 11, -1 },
1110   { "glReadPixels", 11, _gloffset_ReadPixels },
1111   { "glRenderbufferStorageOES", 11, -1 },
1112   { "glRotatef", 11, _gloffset_Rotatef },
1113   { "glRotatex", 11, -1 },
1114   { "glSampleCoverage", 11, -1 },
1115   { "glSampleCoveragex", 11, -1 },
1116   { "glScalef", 11, _gloffset_Scalef },
1117   { "glScalex", 11, -1 },
1118   { "glScissor", 11, _gloffset_Scissor },
1119   { "glShadeModel", 11, _gloffset_ShadeModel },
1120   { "glStencilFunc", 11, _gloffset_StencilFunc },
1121   { "glStencilMask", 11, _gloffset_StencilMask },
1122   { "glStencilOp", 11, _gloffset_StencilOp },
1123   { "glTexCoordPointer", 11, _gloffset_TexCoordPointer },
1124   { "glTexEnvf", 11, _gloffset_TexEnvf },
1125   { "glTexEnvfv", 11, _gloffset_TexEnvfv },
1126   { "glTexEnvi", 11, _gloffset_TexEnvi },
1127   { "glTexEnviv", 11, _gloffset_TexEnviv },
1128   { "glTexEnvx", 11, -1 },
1129   { "glTexEnvxv", 11, -1 },
1130   { "glTexGenfOES", 11, _gloffset_TexGenf },
1131   { "glTexGenfvOES", 11, _gloffset_TexGenfv },
1132   { "glTexGeniOES", 11, _gloffset_TexGeni },
1133   { "glTexGenivOES", 11, _gloffset_TexGeniv },
1134   { "glTexGenxOES", 11, -1 },
1135   { "glTexGenxvOES", 11, -1 },
1136   { "glTexImage2D", 11, _gloffset_TexImage2D },
1137   { "glTexParameterf", 11, _gloffset_TexParameterf },
1138   { "glTexParameterfv", 11, _gloffset_TexParameterfv },
1139   { "glTexParameteri", 11, _gloffset_TexParameteri },
1140   { "glTexParameteriv", 11, _gloffset_TexParameteriv },
1141   { "glTexParameterx", 11, -1 },
1142   { "glTexParameterxv", 11, -1 },
1143   { "glTexSubImage2D", 11, _gloffset_TexSubImage2D },
1144   { "glTranslatef", 11, _gloffset_Translatef },
1145   { "glTranslatex", 11, -1 },
1146   { "glUnmapBufferOES", 11, -1 },
1147   { "glVertexPointer", 11, _gloffset_VertexPointer },
1148   { "glViewport", 11, _gloffset_Viewport },
1149   { NULL, 0, -1 }
1150};
1151
1152const struct function gles2_functions_possible[] = {
1153   { "glActiveTexture", 20, _gloffset_ActiveTexture },
1154   { "glAttachShader", 20, -1 },
1155   { "glBindAttribLocation", 20, -1 },
1156   { "glBindBuffer", 20, -1 },
1157   { "glBindFramebuffer", 20, -1 },
1158   { "glBindRenderbuffer", 20, -1 },
1159   { "glBindTexture", 20, _gloffset_BindTexture },
1160   { "glBindVertexArrayOES", 20, -1 },
1161   { "glBlendColor", 20, _gloffset_BlendColor },
1162   { "glBlendEquation", 20, _gloffset_BlendEquation },
1163   { "glBlendEquationSeparate", 20, -1 },
1164   { "glBlendFunc", 20, _gloffset_BlendFunc },
1165   { "glBlendFuncSeparate", 20, -1 },
1166   { "glBufferData", 20, -1 },
1167   { "glBufferSubData", 20, -1 },
1168   { "glCheckFramebufferStatus", 20, -1 },
1169   { "glClear", 20, _gloffset_Clear },
1170   { "glClearColor", 20, _gloffset_ClearColor },
1171   { "glClearDepthf", 20, -1 },
1172   { "glClearStencil", 20, _gloffset_ClearStencil },
1173   { "glColorMask", 20, _gloffset_ColorMask },
1174   { "glCompileShader", 20, -1 },
1175   { "glCompressedTexImage2D", 20, -1 },
1176   { "glCompressedTexImage3DOES", 20, -1 },
1177   { "glCompressedTexSubImage2D", 20, -1 },
1178   { "glCompressedTexSubImage3DOES", 20, -1 },
1179   { "glCopyTexImage2D", 20, _gloffset_CopyTexImage2D },
1180   { "glCopyTexSubImage2D", 20, _gloffset_CopyTexSubImage2D },
1181   { "glCopyTexSubImage3DOES", 20, _gloffset_CopyTexSubImage3D },
1182   { "glCreateProgram", 20, -1 },
1183   { "glCreateShader", 20, -1 },
1184   { "glCullFace", 20, _gloffset_CullFace },
1185   { "glDeleteBuffers", 20, -1 },
1186   { "glDeleteFramebuffers", 20, -1 },
1187   { "glDeleteProgram", 20, -1 },
1188   { "glDeleteRenderbuffers", 20, -1 },
1189   { "glDeleteShader", 20, -1 },
1190   { "glDeleteTextures", 20, _gloffset_DeleteTextures },
1191   { "glDeleteVertexArraysOES", 20, -1 },
1192   { "glDepthFunc", 20, _gloffset_DepthFunc },
1193   { "glDepthMask", 20, _gloffset_DepthMask },
1194   { "glDepthRangef", 20, -1 },
1195   { "glDetachShader", 20, -1 },
1196   { "glDisable", 20, _gloffset_Disable },
1197   { "glDiscardFramebufferEXT", 20, -1 },
1198   { "glDisableVertexAttribArray", 20, -1 },
1199   { "glDrawArrays", 20, _gloffset_DrawArrays },
1200   { "glDrawBuffersNV", 20, -1 },
1201   { "glDrawElements", 20, _gloffset_DrawElements },
1202   { "glEGLImageTargetRenderbufferStorageOES", 20, -1 },
1203   { "glEGLImageTargetTexture2DOES", 20, -1 },
1204   { "glEnable", 20, _gloffset_Enable },
1205   { "glEnableVertexAttribArray", 20, -1 },
1206   { "glFinish", 20, _gloffset_Finish },
1207   { "glFlush", 20, _gloffset_Flush },
1208   { "glFlushMappedBufferRangeEXT", 20, -1 },
1209   { "glFramebufferRenderbuffer", 20, -1 },
1210   { "glFramebufferTexture2D", 20, -1 },
1211   { "glFramebufferTexture3DOES", 20, -1 },
1212   { "glFrontFace", 20, _gloffset_FrontFace },
1213   { "glGenBuffers", 20, -1 },
1214   { "glGenFramebuffers", 20, -1 },
1215   { "glGenRenderbuffers", 20, -1 },
1216   { "glGenTextures", 20, _gloffset_GenTextures },
1217   { "glGenVertexArraysOES", 20, -1 },
1218   { "glGenerateMipmap", 20, -1 },
1219   { "glGetActiveAttrib", 20, -1 },
1220   { "glGetActiveUniform", 20, -1 },
1221   { "glGetAttachedShaders", 20, -1 },
1222   { "glGetAttribLocation", 20, -1 },
1223   { "glGetBooleanv", 20, _gloffset_GetBooleanv },
1224   { "glGetBufferParameteriv", 20, -1 },
1225   { "glGetBufferPointervOES", 20, -1 },
1226   { "glGetError", 20, _gloffset_GetError },
1227   { "glGetFloatv", 20, _gloffset_GetFloatv },
1228   { "glGetFramebufferAttachmentParameteriv", 20, -1 },
1229   { "glGetIntegerv", 20, _gloffset_GetIntegerv },
1230   { "glGetProgramInfoLog", 20, -1 },
1231   { "glGetProgramiv", 20, -1 },
1232   { "glGetRenderbufferParameteriv", 20, -1 },
1233   { "glGetShaderInfoLog", 20, -1 },
1234   { "glGetShaderPrecisionFormat", 20, -1 },
1235   { "glGetShaderSource", 20, -1 },
1236   { "glGetShaderiv", 20, -1 },
1237   { "glGetString", 20, _gloffset_GetString },
1238   { "glGetTexParameterfv", 20, _gloffset_GetTexParameterfv },
1239   { "glGetTexParameteriv", 20, _gloffset_GetTexParameteriv },
1240   { "glGetUniformLocation", 20, -1 },
1241   { "glGetUniformfv", 20, -1 },
1242   { "glGetUniformiv", 20, -1 },
1243   { "glGetVertexAttribPointerv", 20, -1 },
1244   { "glGetVertexAttribfv", 20, -1 },
1245   { "glGetVertexAttribiv", 20, -1 },
1246   { "glHint", 20, _gloffset_Hint },
1247   { "glIsBuffer", 20, -1 },
1248   { "glIsEnabled", 20, _gloffset_IsEnabled },
1249   { "glIsFramebuffer", 20, -1 },
1250   { "glIsProgram", 20, -1 },
1251   { "glIsRenderbuffer", 20, -1 },
1252   { "glIsShader", 20, -1 },
1253   { "glIsTexture", 20, _gloffset_IsTexture },
1254   { "glIsVertexArrayOES", 20, -1 },
1255   { "glLineWidth", 20, _gloffset_LineWidth },
1256   { "glLinkProgram", 20, -1 },
1257   { "glMapBufferOES", 20, -1 },
1258   { "glMapBufferRangeEXT", 20, -1 },
1259   { "glMultiDrawArraysEXT", 20, -1 },
1260   { "glMultiDrawElementsEXT", 20, -1 },
1261   { "glPixelStorei", 20, _gloffset_PixelStorei },
1262   { "glPolygonOffset", 20, _gloffset_PolygonOffset },
1263   { "glReadBufferNV", 20, _gloffset_ReadBuffer },
1264   { "glReadPixels", 20, _gloffset_ReadPixels },
1265   { "glReleaseShaderCompiler", 20, -1 },
1266   { "glRenderbufferStorage", 20, -1 },
1267   { "glSampleCoverage", 20, -1 },
1268   { "glScissor", 20, _gloffset_Scissor },
1269   { "glShaderBinary", 20, -1 },
1270   { "glShaderSource", 20, -1 },
1271   { "glStencilFunc", 20, _gloffset_StencilFunc },
1272   { "glStencilFuncSeparate", 20, -1 },
1273   { "glStencilMask", 20, _gloffset_StencilMask },
1274   { "glStencilMaskSeparate", 20, -1 },
1275   { "glStencilOp", 20, _gloffset_StencilOp },
1276   { "glStencilOpSeparate", 20, -1 },
1277   { "glTexImage2D", 20, _gloffset_TexImage2D },
1278   { "glTexImage3DOES", 20, _gloffset_TexImage3D },
1279   { "glTexParameterf", 20, _gloffset_TexParameterf },
1280   { "glTexParameterfv", 20, _gloffset_TexParameterfv },
1281   { "glTexParameteri", 20, _gloffset_TexParameteri },
1282   { "glTexParameteriv", 20, _gloffset_TexParameteriv },
1283   { "glTexSubImage2D", 20, _gloffset_TexSubImage2D },
1284   { "glTexSubImage3DOES", 20, _gloffset_TexSubImage3D },
1285   { "glUniform1f", 20, -1 },
1286   { "glUniform1fv", 20, -1 },
1287   { "glUniform1i", 20, -1 },
1288   { "glUniform1iv", 20, -1 },
1289   { "glUniform2f", 20, -1 },
1290   { "glUniform2fv", 20, -1 },
1291   { "glUniform2i", 20, -1 },
1292   { "glUniform2iv", 20, -1 },
1293   { "glUniform3f", 20, -1 },
1294   { "glUniform3fv", 20, -1 },
1295   { "glUniform3i", 20, -1 },
1296   { "glUniform3iv", 20, -1 },
1297   { "glUniform4f", 20, -1 },
1298   { "glUniform4fv", 20, -1 },
1299   { "glUniform4i", 20, -1 },
1300   { "glUniform4iv", 20, -1 },
1301   { "glUniformMatrix2fv", 20, -1 },
1302   { "glUniformMatrix3fv", 20, -1 },
1303   { "glUniformMatrix4fv", 20, -1 },
1304   { "glUnmapBufferOES", 20, -1 },
1305   { "glUseProgram", 20, -1 },
1306   { "glValidateProgram", 20, -1 },
1307   { "glVertexAttrib1f", 20, -1 },
1308   { "glVertexAttrib1fv", 20, -1 },
1309   { "glVertexAttrib2f", 20, -1 },
1310   { "glVertexAttrib2fv", 20, -1 },
1311   { "glVertexAttrib3f", 20, -1 },
1312   { "glVertexAttrib3fv", 20, -1 },
1313   { "glVertexAttrib4f", 20, -1 },
1314   { "glVertexAttrib4fv", 20, -1 },
1315   { "glVertexAttribPointer", 20, -1 },
1316   { "glViewport", 20, _gloffset_Viewport },
1317
1318   /* GL_OES_get_program_binary - Also part of OpenGL ES 3.0. */
1319   { "glGetProgramBinaryOES", 20, -1 },
1320   { "glProgramBinaryOES", 20, -1 },
1321
1322   /* GL_EXT_separate_shader_objects - Also part of OpenGL ES 3.1. */
1323   { "glProgramParameteriEXT", 20, -1 },
1324   { "glUseProgramStagesEXT", 20, -1 },
1325   { "glActiveShaderProgramEXT", 20, -1 },
1326   { "glCreateShaderProgramvEXT", 20, -1 },
1327   { "glBindProgramPipelineEXT", 20, -1 },
1328   { "glDeleteProgramPipelinesEXT", 20, -1 },
1329   { "glGenProgramPipelinesEXT", 20, -1 },
1330   { "glIsProgramPipelineEXT", 20, -1 },
1331   { "glGetProgramPipelineivEXT", 20, -1 },
1332   { "glProgramUniform1iEXT", 20, -1 },
1333   { "glProgramUniform1ivEXT", 20, -1 },
1334   { "glProgramUniform1fEXT", 20, -1 },
1335   { "glProgramUniform1fvEXT", 20, -1 },
1336   { "glProgramUniform2iEXT", 20, -1 },
1337   { "glProgramUniform2ivEXT", 20, -1 },
1338   { "glProgramUniform2fEXT", 20, -1 },
1339   { "glProgramUniform2fvEXT", 20, -1 },
1340   { "glProgramUniform3iEXT", 20, -1 },
1341   { "glProgramUniform3ivEXT", 20, -1 },
1342   { "glProgramUniform3fEXT", 20, -1 },
1343   { "glProgramUniform3fvEXT", 20, -1 },
1344   { "glProgramUniform4iEXT", 20, -1 },
1345   { "glProgramUniform4ivEXT", 20, -1 },
1346   { "glProgramUniform4fEXT", 20, -1 },
1347   { "glProgramUniform4fvEXT", 20, -1 },
1348   { "glProgramUniformMatrix2fvEXT", 20, -1 },
1349   { "glProgramUniformMatrix3fvEXT", 20, -1 },
1350   { "glProgramUniformMatrix4fvEXT", 20, -1 },
1351   { "glProgramUniformMatrix2x3fvEXT", 20, -1 },
1352   { "glProgramUniformMatrix3x2fvEXT", 20, -1 },
1353   { "glProgramUniformMatrix2x4fvEXT", 20, -1 },
1354   { "glProgramUniformMatrix4x2fvEXT", 20, -1 },
1355   { "glProgramUniformMatrix3x4fvEXT", 20, -1 },
1356   { "glProgramUniformMatrix4x3fvEXT", 20, -1 },
1357   { "glValidateProgramPipelineEXT", 20, -1 },
1358   { "glGetProgramPipelineInfoLogEXT", 20, -1 },
1359
1360   /* GL_INTEL_performance_query */
1361   { "glGetFirstPerfQueryIdINTEL", 20, -1 },
1362   { "glGetNextPerfQueryIdINTEL", 20, -1 },
1363   { "glGetPerfQueryIdByNameINTEL", 20, -1 },
1364   { "glGetPerfQueryInfoINTEL", 20, -1 },
1365   { "glGetPerfCounterInfoINTEL", 20, -1 },
1366   { "glCreatePerfQueryINTEL", 20, -1 },
1367   { "glDeletePerfQueryINTEL", 20, -1 },
1368   { "glBeginPerfQueryINTEL", 20, -1 },
1369   { "glEndPerfQueryINTEL", 20, -1 },
1370   { "glGetPerfQueryDataINTEL", 20, -1 },
1371
1372   { NULL, 0, -1 }
1373};
1374
1375const struct function gles3_functions_possible[] = {
1376   { "glBeginQuery", 30, -1 },
1377   { "glBeginTransformFeedback", 30, -1 },
1378   { "glBindBufferBase", 30, -1 },
1379   { "glBindBufferRange", 30, -1 },
1380   { "glBindSampler", 30, -1 },
1381   { "glBindTransformFeedback", 30, -1 },
1382   // We check for the aliased -OES version in GLES 2
1383   // { "glBindVertexArray", 30, -1 },
1384   { "glBlitFramebuffer", 30, -1 },
1385   { "glClearBufferfi", 30, -1 },
1386   { "glClearBufferfv", 30, -1 },
1387   { "glClearBufferiv", 30, -1 },
1388   { "glClearBufferuiv", 30, -1 },
1389   { "glClientWaitSync", 30, -1 },
1390   // We check for the aliased -OES version in GLES 2
1391   // { "glCompressedTexImage3D", 30, -1 },
1392   // We check for the aliased -OES version in GLES 2
1393   // { "glCompressedTexSubImage3D", 30, -1 },
1394   { "glCopyBufferSubData", 30, -1 },
1395   // We check for the aliased -OES version in GLES 2
1396   // { "glCopyTexSubImage3D", 30, -1 },
1397   { "glDeleteQueries", 30, -1 },
1398   { "glDeleteSamplers", 30, -1 },
1399   { "glDeleteSync", 30, -1 },
1400   { "glDeleteTransformFeedbacks", 30, -1 },
1401   // We check for the aliased -OES version in GLES 2
1402   // { "glDeleteVertexArrays", 30, -1 },
1403   { "glDrawArraysInstanced", 30, -1 },
1404   // We check for the aliased -NV version in GLES 2
1405   // { "glDrawBuffers", 30, -1 },
1406   { "glDrawElementsInstanced", 30, -1 },
1407   { "glDrawRangeElements", 30, -1 },
1408   { "glEndQuery", 30, -1 },
1409   { "glEndTransformFeedback", 30, -1 },
1410   { "glFenceSync", 30, -1 },
1411   // We check for the aliased -EXT version in GLES 2
1412   // { "glFlushMappedBufferRange", 30, -1 },
1413   { "glFramebufferTextureLayer", 30, -1 },
1414   { "glGenQueries", 30, -1 },
1415   { "glGenSamplers", 30, -1 },
1416   { "glGenTransformFeedbacks", 30, -1 },
1417   // We check for the aliased -OES version in GLES 2
1418   // { "glGenVertexArrays", 30, -1 },
1419   { "glGetActiveUniformBlockiv", 30, -1 },
1420   { "glGetActiveUniformBlockName", 30, -1 },
1421   { "glGetActiveUniformsiv", 30, -1 },
1422   { "glGetBufferParameteri64v", 30, -1 },
1423   // We check for the aliased -OES version in GLES 2
1424   // { "glGetBufferPointerv", 30, -1 },
1425   { "glGetFragDataLocation", 30, -1 },
1426   { "glGetInteger64i_v", 30, -1 },
1427   { "glGetInteger64v", 30, -1 },
1428   { "glGetIntegeri_v", 30, -1 },
1429   { "glGetInternalformativ", 30, -1 },
1430   // glGetProgramBinary aliases glGetProgramBinaryOES in GLES 2
1431   { "glGetQueryiv", 30, -1 },
1432   { "glGetQueryObjectuiv", 30, -1 },
1433   { "glGetSamplerParameterfv", 30, -1 },
1434   { "glGetSamplerParameteriv", 30, -1 },
1435   { "glGetStringi", 30, -1 },
1436   { "glGetSynciv", 30, -1 },
1437   { "glGetTransformFeedbackVarying", 30, -1 },
1438   { "glGetUniformBlockIndex", 30, -1 },
1439   { "glGetUniformIndices", 30, -1 },
1440   { "glGetUniformuiv", 30, -1 },
1441   { "glGetVertexAttribIiv", 30, -1 },
1442   { "glGetVertexAttribIuiv", 30, -1 },
1443   { "glInvalidateFramebuffer", 30, -1 },
1444   { "glInvalidateSubFramebuffer", 30, -1 },
1445   { "glIsQuery", 30, -1 },
1446   { "glIsSampler", 30, -1 },
1447   { "glIsSync", 30, -1 },
1448   { "glIsTransformFeedback", 30, -1 },
1449   // We check for the aliased -OES version in GLES 2
1450   // { "glIsVertexArray", 30, -1 },
1451   // We check for the aliased -EXT version in GLES 2
1452   // { "glMapBufferRange", 30, -1 },
1453   { "glPauseTransformFeedback", 30, -1 },
1454   // glProgramBinary aliases glProgramBinaryOES in GLES 2
1455   // glProgramParameteri aliases glProgramParameteriEXT in GLES 2
1456   // We check for the aliased -NV version in GLES 2
1457   // { "glReadBuffer", 30, -1 },
1458   { "glRenderbufferStorageMultisample", 30, -1 },
1459   { "glResumeTransformFeedback", 30, -1 },
1460   { "glSamplerParameterf", 30, -1 },
1461   { "glSamplerParameterfv", 30, -1 },
1462   { "glSamplerParameteri", 30, -1 },
1463   { "glSamplerParameteriv", 30, -1 },
1464   // We check for the aliased -OES version in GLES 2
1465   // { "glTexImage3D", 30, -1 },
1466   { "glTexStorage2D", 30, -1 },
1467   { "glTexStorage3D", 30, -1 },
1468   // We check for the aliased -OES version in GLES 2
1469   // { "glTexSubImage3D", 30, -1 },
1470   { "glTransformFeedbackVaryings", 30, -1 },
1471   { "glUniform1ui", 30, -1 },
1472   { "glUniform1uiv", 30, -1 },
1473   { "glUniform2ui", 30, -1 },
1474   { "glUniform2uiv", 30, -1 },
1475   { "glUniform3ui", 30, -1 },
1476   { "glUniform3uiv", 30, -1 },
1477   { "glUniform4ui", 30, -1 },
1478   { "glUniform4uiv", 30, -1 },
1479   { "glUniformBlockBinding", 30, -1 },
1480   { "glUniformMatrix2x3fv", 30, -1 },
1481   { "glUniformMatrix2x4fv", 30, -1 },
1482   { "glUniformMatrix3x2fv", 30, -1 },
1483   { "glUniformMatrix3x4fv", 30, -1 },
1484   { "glUniformMatrix4x2fv", 30, -1 },
1485   { "glUniformMatrix4x3fv", 30, -1 },
1486   // We check for the aliased -OES version in GLES 2
1487   // { "glUnmapBuffer", 30, -1 },
1488   { "glVertexAttribDivisor", 30, -1 },
1489   { "glVertexAttribI4i", 30, -1 },
1490   { "glVertexAttribI4iv", 30, -1 },
1491   { "glVertexAttribI4ui", 30, -1 },
1492   { "glVertexAttribI4uiv", 30, -1 },
1493   { "glVertexAttribIPointer", 30, -1 },
1494   { "glWaitSync", 30, -1 },
1495
1496   /* GL_EXT_separate_shader_objects - Also part of OpenGL ES 3.1. */
1497   { "glProgramUniform1uiEXT", 30, -1 },
1498   { "glProgramUniform1uivEXT", 30, -1 },
1499   { "glProgramUniform2uiEXT", 30, -1 },
1500   { "glProgramUniform2uivEXT", 30, -1 },
1501   { "glProgramUniform3uiEXT", 30, -1 },
1502   { "glProgramUniform3uivEXT", 30, -1 },
1503   { "glProgramUniform4uiEXT", 30, -1 },
1504   { "glProgramUniform4uivEXT", 30, -1 },
1505
1506   { NULL, 0, -1 }
1507};
1508