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
44#include "GL/gl.h"
45#include "GL/glext.h"
46#include "util/compiler.h"
47#include "main/api_exec.h"
48#include "main/context.h"
49#include "main/remap.h"
50#include "main/vtxfmt.h"
51#include "glapi/glapi.h"
52#include "drivers/common/driverfuncs.h"
53
54#include "swrast/swrast.h"
55#include "vbo/vbo.h"
56#include "tnl/tnl.h"
57#include "swrast_setup/swrast_setup.h"
58
59#ifndef GLAPIENTRYP
60#define GLAPIENTRYP GL_APIENTRYP
61#endif
62
63#include "main/dispatch.h"
64
65struct function {
66   const char *name;
67   unsigned int Version;
68   int offset;
69};
70
71extern const struct function common_desktop_functions_possible[];
72extern const struct function gl_compatibility_functions_possible[];
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[];
77extern const struct function gles31_functions_possible[];
78
79class DispatchSanity_test : public ::testing::Test {
80public:
81   virtual void SetUp();
82   virtual void TearDown();
83   void SetUpCtx(gl_api api, unsigned int version);
84   void TearDownCtx();
85
86   struct gl_config visual;
87   struct dd_function_table driver_functions;
88   struct gl_context share_list;
89   struct gl_context ctx;
90   _glapi_proc *nop_table;
91};
92
93void
94DispatchSanity_test::SetUp()
95{
96   memset(&visual, 0, sizeof(visual));
97   memset(&driver_functions, 0, sizeof(driver_functions));
98   memset(&share_list, 0, sizeof(share_list));
99   memset(&ctx, 0, sizeof(ctx));
100
101   _mesa_init_driver_functions(&driver_functions);
102
103   const unsigned size = _glapi_get_dispatch_table_size();
104   nop_table = (_glapi_proc *) _mesa_new_nop_table(size);
105}
106
107void
108DispatchSanity_test::TearDown()
109{
110   free(nop_table);
111}
112
113void
114DispatchSanity_test::SetUpCtx(gl_api api, unsigned int version)
115{
116   _mesa_initialize_context(&ctx,
117                            api,
118                            &visual,
119                            NULL, // share_list
120                            &driver_functions);
121   _vbo_CreateContext(&ctx, false);
122
123   _mesa_override_extensions(&ctx);
124   ctx.Version = version;
125
126   _mesa_initialize_dispatch_tables(&ctx);
127   _mesa_initialize_vbo_vtxfmt(&ctx);
128}
129
130void
131DispatchSanity_test::TearDownCtx()
132{
133   _vbo_DestroyContext(&ctx);
134   _mesa_free_context_data(&ctx, false);
135}
136
137static const char *
138offset_to_proc_name_safe(unsigned offset)
139{
140   const char *name = _glapi_get_proc_name(offset);
141   return name ? name : "???";
142}
143
144/* Scan through the dispatch table and check that all the functions in
145 * _glapi_proc *table exist.
146 */
147static void
148validate_functions(struct gl_context *ctx, const struct function *function_table,
149                   const _glapi_proc *nop_table)
150{
151   _glapi_proc *table = (_glapi_proc *) ctx->Exec;
152
153   for (unsigned i = 0; function_table[i].name != NULL; i++) {
154      /* The context version is >= the GL version where the function was
155       * introduced. Therefore, the function cannot be set to the nop
156       * function.
157       */
158      const bool cant_be_nop = ctx->Version >= function_table[i].Version;
159
160      const int offset = (function_table[i].offset != -1)
161         ? function_table[i].offset
162         : _glapi_get_proc_offset(function_table[i].name);
163
164      ASSERT_NE(-1, offset)
165         << "Function: " << function_table[i].name;
166      ASSERT_EQ(offset,
167                _glapi_get_proc_offset(function_table[i].name))
168         << "Function: " << function_table[i].name;
169      if (cant_be_nop) {
170         EXPECT_NE(nop_table[offset], table[offset])
171            << "Function: " << function_table[i].name
172            << " at offset " << offset;
173      }
174
175      table[offset] = nop_table[offset];
176   }
177}
178
179/* Scan through the table and ensure that there is nothing except
180 * nop functions (as set by validate_functions().
181 */
182static void
183validate_nops(struct gl_context *ctx, const _glapi_proc *nop_table)
184{
185   _glapi_proc *table = (_glapi_proc *) ctx->Exec;
186
187   const unsigned size = _glapi_get_dispatch_table_size();
188   for (unsigned i = 0; i < size; i++) {
189      EXPECT_EQ(nop_table[i], table[i])
190         << "i = " << i << " (" << offset_to_proc_name_safe(i) << ")";
191   }
192}
193
194TEST_F(DispatchSanity_test, GL31_CORE)
195{
196   SetUpCtx(API_OPENGL_CORE, 31);
197   validate_functions(&ctx, common_desktop_functions_possible, nop_table);
198   validate_functions(&ctx, gl_core_functions_possible, nop_table);
199   validate_nops(&ctx, nop_table);
200   TearDownCtx();
201}
202
203TEST_F(DispatchSanity_test, GL30)
204{
205   SetUpCtx(API_OPENGL_COMPAT, 30);
206   validate_functions(&ctx, common_desktop_functions_possible, nop_table);
207   validate_functions(&ctx, gl_compatibility_functions_possible, nop_table);
208   validate_nops(&ctx, nop_table);
209   TearDownCtx();
210}
211
212TEST_F(DispatchSanity_test, GLES11)
213{
214   SetUpCtx(API_OPENGLES, 11);
215   validate_functions(&ctx, gles11_functions_possible, nop_table);
216   validate_nops(&ctx, nop_table);
217   TearDownCtx();
218}
219
220TEST_F(DispatchSanity_test, GLES2)
221{
222   SetUpCtx(API_OPENGLES2, 20);
223   validate_functions(&ctx, gles2_functions_possible, nop_table);
224   validate_nops(&ctx, nop_table);
225   TearDownCtx();
226}
227
228TEST_F(DispatchSanity_test, GLES3)
229{
230   SetUpCtx(API_OPENGLES2, 30);
231   validate_functions(&ctx, gles2_functions_possible, nop_table);
232   validate_functions(&ctx, gles3_functions_possible, nop_table);
233   validate_nops(&ctx, nop_table);
234   TearDownCtx();
235}
236
237TEST_F(DispatchSanity_test, GLES31)
238{
239   SetUpCtx(API_OPENGLES2, 31);
240   validate_functions(&ctx, gles2_functions_possible, nop_table);
241   validate_functions(&ctx, gles3_functions_possible, nop_table);
242   validate_functions(&ctx, gles31_functions_possible, nop_table);
243   validate_nops(&ctx, nop_table);
244   TearDownCtx();
245}
246
247const struct function common_desktop_functions_possible[] = {
248   { "glBindRenderbufferEXT", 10, -1 },
249   { "glBindFramebufferEXT", 10, -1 },
250   { "glCullFace", 10, -1 },
251   { "glFrontFace", 10, -1 },
252   { "glHint", 10, -1 },
253   { "glLineWidth", 10, -1 },
254   { "glPointSize", 10, -1 },
255   { "glPolygonMode", 10, -1 },
256   { "glScissor", 10, -1 },
257   { "glTexParameterf", 10, -1 },
258   { "glTexParameterfv", 10, -1 },
259   { "glTexParameteri", 10, -1 },
260   { "glTexParameteriv", 10, -1 },
261   { "glTexImage1D", 10, _gloffset_TexImage1D },
262   { "glTexImage2D", 10, _gloffset_TexImage2D },
263   { "glDrawBuffer", 10, -1 },
264   { "glClear", 10, -1 },
265   { "glClearColor", 10, -1 },
266   { "glClearStencil", 10, -1 },
267   { "glClearDepth", 10, -1 },
268   { "glStencilMask", 10, -1 },
269   { "glColorMask", 10, -1 },
270   { "glDepthMask", 10, -1 },
271   { "glDisable", 10, -1 },
272   { "glEnable", 10, -1 },
273   { "glFinish", 10, -1 },
274   { "glFlush", 10, -1 },
275   { "glBlendFunc", 10, -1 },
276   { "glLogicOp", 10, -1 },
277   { "glStencilFunc", 10, -1 },
278   { "glStencilOp", 10, -1 },
279   { "glDepthFunc", 10, -1 },
280   { "glPixelStoref", 10, -1 },
281   { "glPixelStorei", 10, -1 },
282   { "glReadBuffer", 10, -1 },
283   { "glReadPixels", 10, -1 },
284   { "glGetBooleanv", 10, -1 },
285   { "glGetDoublev", 10, -1 },
286   { "glGetError", 10, -1 },
287   { "glGetFloatv", 10, -1 },
288   { "glGetIntegerv", 10, -1 },
289   { "glGetString", 10, -1 },
290   { "glGetTexImage", 10, -1 },
291   { "glGetTexParameterfv", 10, -1 },
292   { "glGetTexParameteriv", 10, -1 },
293   { "glGetTexLevelParameterfv", 10, -1 },
294   { "glGetTexLevelParameteriv", 10, -1 },
295   { "glIsEnabled", 10, -1 },
296   { "glDepthRange", 10, -1 },
297   { "glViewport", 10, -1 },
298
299   /* GL 1.1 */
300   { "glDrawArrays", 11, -1 },
301   { "glDrawElements", 11, -1 },
302   { "glGetPointerv", 11, -1 },
303   { "glPolygonOffset", 11, -1 },
304   { "glCopyTexImage1D", 11, -1 },
305   { "glCopyTexImage2D", 11, -1 },
306   { "glCopyTexSubImage1D", 11, -1 },
307   { "glCopyTexSubImage2D", 11, -1 },
308   { "glTexSubImage1D", 11, -1 },
309   { "glTexSubImage2D", 11, -1 },
310   { "glBindTexture", 11, -1 },
311   { "glDeleteTextures", 11, -1 },
312   { "glGenTextures", 11, -1 },
313   { "glIsTexture", 11, -1 },
314
315   /* GL 1.2 */
316   { "glBlendColor", 12, -1 },
317   { "glBlendEquation", 12, -1 },
318   { "glDrawRangeElements", 12, -1 },
319   { "glTexImage3D", 12, -1 },
320   { "glTexSubImage3D", 12, -1 },
321   { "glCopyTexSubImage3D", 12, -1 },
322
323   /* GL 1.3 */
324   { "glActiveTexture", 13, -1 },
325   { "glSampleCoverage", 13, -1 },
326   { "glCompressedTexImage3D", 13, -1 },
327   { "glCompressedTexImage2D", 13, -1 },
328   { "glCompressedTexImage1D", 13, -1 },
329   { "glCompressedTexSubImage3D", 13, -1 },
330   { "glCompressedTexSubImage2D", 13, -1 },
331   { "glCompressedTexSubImage1D", 13, -1 },
332   { "glGetCompressedTexImage", 13, -1 },
333
334   /* GL 1.4 */
335   { "glBlendFuncSeparate", 14, -1 },
336   { "glMultiDrawArrays", 14, -1 },
337   { "glMultiDrawElements", 14, -1 },
338   { "glPointParameterf", 14, -1 },
339   { "glPointParameterfv", 14, -1 },
340   { "glPointParameteri", 14, -1 },
341   { "glPointParameteriv", 14, -1 },
342
343   /* GL 1.5 */
344   { "glGenQueries", 15, -1 },
345   { "glDeleteQueries", 15, -1 },
346   { "glIsQuery", 15, -1 },
347   { "glBeginQuery", 15, -1 },
348   { "glEndQuery", 15, -1 },
349   { "glGetQueryiv", 15, -1 },
350   { "glGetQueryObjectiv", 15, -1 },
351   { "glGetQueryObjectuiv", 15, -1 },
352   { "glBindBuffer", 15, -1 },
353   { "glDeleteBuffers", 15, -1 },
354   { "glGenBuffers", 15, -1 },
355   { "glIsBuffer", 15, -1 },
356   { "glBufferData", 15, -1 },
357   { "glBufferSubData", 15, -1 },
358   { "glGetBufferSubData", 15, -1 },
359   { "glMapBuffer", 15, -1 },
360   { "glUnmapBuffer", 15, -1 },
361   { "glGetBufferParameteriv", 15, -1 },
362   { "glGetBufferPointerv", 15, -1 },
363
364   /* GL 2.0 */
365   { "glBlendEquationSeparate", 20, -1 },
366   { "glDrawBuffers", 20, -1 },
367   { "glStencilOpSeparate", 20, -1 },
368   { "glStencilFuncSeparate", 20, -1 },
369   { "glStencilMaskSeparate", 20, -1 },
370   { "glAttachShader", 20, -1 },
371   { "glBindAttribLocation", 20, -1 },
372   { "glCompileShader", 20, -1 },
373   { "glCreateProgram", 20, -1 },
374   { "glCreateShader", 20, -1 },
375   { "glDeleteProgram", 20, -1 },
376   { "glDeleteShader", 20, -1 },
377   { "glDetachShader", 20, -1 },
378   { "glDisableVertexAttribArray", 20, -1 },
379   { "glEnableVertexAttribArray", 20, -1 },
380   { "glGetActiveAttrib", 20, -1 },
381   { "glGetActiveUniform", 20, -1 },
382   { "glGetAttachedShaders", 20, -1 },
383   { "glGetAttribLocation", 20, -1 },
384   { "glGetProgramiv", 20, -1 },
385   { "glGetProgramInfoLog", 20, -1 },
386   { "glGetShaderiv", 20, -1 },
387   { "glGetShaderInfoLog", 20, -1 },
388   { "glGetShaderSource", 20, -1 },
389   { "glGetUniformLocation", 20, -1 },
390   { "glGetUniformfv", 20, -1 },
391   { "glGetUniformiv", 20, -1 },
392   { "glGetVertexAttribdv", 20, -1 },
393   { "glGetVertexAttribfv", 20, -1 },
394   { "glGetVertexAttribiv", 20, -1 },
395   { "glGetVertexAttribPointerv", 20, -1 },
396   { "glIsProgram", 20, -1 },
397   { "glIsShader", 20, -1 },
398   { "glLinkProgram", 20, -1 },
399   { "glShaderSource", 20, -1 },
400   { "glUseProgram", 20, -1 },
401   { "glUniform1f", 20, -1 },
402   { "glUniform2f", 20, -1 },
403   { "glUniform3f", 20, -1 },
404   { "glUniform4f", 20, -1 },
405   { "glUniform1i", 20, -1 },
406   { "glUniform2i", 20, -1 },
407   { "glUniform3i", 20, -1 },
408   { "glUniform4i", 20, -1 },
409   { "glUniform1fv", 20, -1 },
410   { "glUniform2fv", 20, -1 },
411   { "glUniform3fv", 20, -1 },
412   { "glUniform4fv", 20, -1 },
413   { "glUniform1iv", 20, -1 },
414   { "glUniform2iv", 20, -1 },
415   { "glUniform3iv", 20, -1 },
416   { "glUniform4iv", 20, -1 },
417   { "glUniformMatrix2fv", 20, -1 },
418   { "glUniformMatrix3fv", 20, -1 },
419   { "glUniformMatrix4fv", 20, -1 },
420   { "glValidateProgram", 20, -1 },
421   { "glVertexAttrib1d", 20, -1 },
422   { "glVertexAttrib1dv", 20, -1 },
423   { "glVertexAttrib1f", 20, -1 },
424   { "glVertexAttrib1fv", 20, -1 },
425   { "glVertexAttrib1s", 20, -1 },
426   { "glVertexAttrib1sv", 20, -1 },
427   { "glVertexAttrib2d", 20, -1 },
428   { "glVertexAttrib2dv", 20, -1 },
429   { "glVertexAttrib2f", 20, -1 },
430   { "glVertexAttrib2fv", 20, -1 },
431   { "glVertexAttrib2s", 20, -1 },
432   { "glVertexAttrib2sv", 20, -1 },
433   { "glVertexAttrib3d", 20, -1 },
434   { "glVertexAttrib3dv", 20, -1 },
435   { "glVertexAttrib3f", 20, -1 },
436   { "glVertexAttrib3fv", 20, -1 },
437   { "glVertexAttrib3s", 20, -1 },
438   { "glVertexAttrib3sv", 20, -1 },
439   { "glVertexAttrib4Nbv", 20, -1 },
440   { "glVertexAttrib4Niv", 20, -1 },
441   { "glVertexAttrib4Nsv", 20, -1 },
442   { "glVertexAttrib4Nub", 20, -1 },
443   { "glVertexAttrib4Nubv", 20, -1 },
444   { "glVertexAttrib4Nuiv", 20, -1 },
445   { "glVertexAttrib4Nusv", 20, -1 },
446   { "glVertexAttrib4bv", 20, -1 },
447   { "glVertexAttrib4d", 20, -1 },
448   { "glVertexAttrib4dv", 20, -1 },
449   { "glVertexAttrib4f", 20, -1 },
450   { "glVertexAttrib4fv", 20, -1 },
451   { "glVertexAttrib4iv", 20, -1 },
452   { "glVertexAttrib4s", 20, -1 },
453   { "glVertexAttrib4sv", 20, -1 },
454   { "glVertexAttrib4ubv", 20, -1 },
455   { "glVertexAttrib4uiv", 20, -1 },
456   { "glVertexAttrib4usv", 20, -1 },
457   { "glVertexAttribPointer", 20, -1 },
458
459   /* GL 2.1 */
460   { "glUniformMatrix2x3fv", 21, -1 },
461   { "glUniformMatrix3x2fv", 21, -1 },
462   { "glUniformMatrix2x4fv", 21, -1 },
463   { "glUniformMatrix4x2fv", 21, -1 },
464   { "glUniformMatrix3x4fv", 21, -1 },
465   { "glUniformMatrix4x3fv", 21, -1 },
466
467   /* GL 3.0 */
468   { "glColorMaski", 30, -1 },
469   { "glGetBooleani_v", 30, -1 },
470   { "glGetIntegeri_v", 30, -1 },
471   { "glEnablei", 30, -1 },
472   { "glDisablei", 30, -1 },
473   { "glIsEnabledi", 30, -1 },
474   { "glBeginTransformFeedback", 30, -1 },
475   { "glEndTransformFeedback", 30, -1 },
476   { "glBindBufferRange", 30, -1 },
477   { "glBindBufferBase", 30, -1 },
478   { "glTransformFeedbackVaryings", 30, -1 },
479   { "glGetTransformFeedbackVarying", 30, -1 },
480   { "glClampColor", 30, -1 },
481   { "glBeginConditionalRender", 30, -1 },
482   { "glEndConditionalRender", 30, -1 },
483   { "glVertexAttribIPointer", 30, -1 },
484   { "glGetVertexAttribIiv", 30, -1 },
485   { "glGetVertexAttribIuiv", 30, -1 },
486   { "glVertexAttribI1i", 30, -1 },
487   { "glVertexAttribI2i", 30, -1 },
488   { "glVertexAttribI3i", 30, -1 },
489   { "glVertexAttribI4i", 30, -1 },
490   { "glVertexAttribI1ui", 30, -1 },
491   { "glVertexAttribI2ui", 30, -1 },
492   { "glVertexAttribI3ui", 30, -1 },
493   { "glVertexAttribI4ui", 30, -1 },
494   { "glVertexAttribI1iv", 30, -1 },
495   { "glVertexAttribI2iv", 30, -1 },
496   { "glVertexAttribI3iv", 30, -1 },
497   { "glVertexAttribI4iv", 30, -1 },
498   { "glVertexAttribI1uiv", 30, -1 },
499   { "glVertexAttribI2uiv", 30, -1 },
500   { "glVertexAttribI3uiv", 30, -1 },
501   { "glVertexAttribI4uiv", 30, -1 },
502   { "glVertexAttribI4bv", 30, -1 },
503   { "glVertexAttribI4sv", 30, -1 },
504   { "glVertexAttribI4ubv", 30, -1 },
505   { "glVertexAttribI4usv", 30, -1 },
506   { "glGetUniformuiv", 30, -1 },
507   { "glBindFragDataLocation", 30, -1 },
508   { "glGetFragDataLocation", 30, -1 },
509   { "glUniform1ui", 30, -1 },
510   { "glUniform2ui", 30, -1 },
511   { "glUniform3ui", 30, -1 },
512   { "glUniform4ui", 30, -1 },
513   { "glUniform1uiv", 30, -1 },
514   { "glUniform2uiv", 30, -1 },
515   { "glUniform3uiv", 30, -1 },
516   { "glUniform4uiv", 30, -1 },
517   { "glTexParameterIiv", 30, -1 },
518   { "glTexParameterIuiv", 30, -1 },
519   { "glGetTexParameterIiv", 30, -1 },
520   { "glGetTexParameterIuiv", 30, -1 },
521   { "glClearBufferiv", 30, -1 },
522   { "glClearBufferuiv", 30, -1 },
523   { "glClearBufferfv", 30, -1 },
524   { "glClearBufferfi", 30, -1 },
525   { "glGetStringi", 30, -1 },
526
527   /* GL 3.1 */
528   { "glDrawArraysInstanced", 31, -1 },
529   { "glDrawElementsInstanced", 31, -1 },
530   { "glPrimitiveRestartIndex", 31, -1 },
531   { "glTexBuffer", 31, -1 },
532
533   /* GL_ARB_texture_buffer_range */
534   { "glTexBufferRange", 43, -1 },
535
536   /* GL_ARB_shader_objects */
537   { "glDeleteObjectARB", 31, -1 },
538   { "glGetHandleARB", 31, -1 },
539   { "glDetachObjectARB", 31, -1 },
540   { "glCreateShaderObjectARB", 31, -1 },
541   { "glCreateProgramObjectARB", 31, -1 },
542   { "glAttachObjectARB", 31, -1 },
543   { "glGetObjectParameterfvARB", 31, -1 },
544   { "glGetObjectParameterivARB", 31, -1 },
545   { "glGetInfoLogARB", 31, -1 },
546   { "glGetAttachedObjectsARB", 31, -1 },
547
548   /* GL_ARB_get_program_binary */
549   { "glGetProgramBinary", 30, -1 },
550   { "glProgramBinary", 30, -1 },
551   { "glProgramParameteri", 30, -1 },
552
553   /* GL_EXT_transform_feedback */
554   { "glBindBufferOffsetEXT", 31, -1 },
555
556   /* GL_IBM_multimode_draw_arrays */
557   { "glMultiModeDrawArraysIBM", 31, -1 },
558   { "glMultiModeDrawElementsIBM", 31, -1 },
559
560   /* GL_EXT_depth_bounds_test */
561   { "glDepthBoundsEXT", 31, -1 },
562
563   /* GL_apple_object_purgeable */
564   { "glObjectPurgeableAPPLE", 31, -1 },
565   { "glObjectUnpurgeableAPPLE", 31, -1 },
566   { "glGetObjectParameterivAPPLE", 31, -1 },
567
568   /* GL_ARB_instanced_arrays */
569   { "glVertexAttribDivisorARB", 31, -1 },
570   { "glVertexArrayVertexAttribDivisorEXT", 31, -1 },
571
572   /* GL_NV_texture_barrier */
573   { "glTextureBarrierNV", 31, -1 },
574
575   /* GL_EXT_texture_integer */
576   { "glClearColorIiEXT", 31, -1 },
577   { "glClearColorIuiEXT", 31, -1 },
578
579   /* GL_OES_EGL_image */
580   { "glEGLImageTargetRenderbufferStorageOES", 31, -1 },
581   { "glEGLImageTargetTexture2DOES", 31, -1 },
582
583   /* EXT_EGL_image_storage */
584   { "glEGLImageTargetTexStorageEXT", 31, -1 },
585   { "glEGLImageTargetTextureStorageEXT", 31, -1 },
586
587   /* GL_NV_copy_image */
588   { "glCopyImageSubDataNV", 31, -1 },
589
590   /* GL 3.2 */
591   { "glGetInteger64i_v", 32, -1 },
592   { "glGetBufferParameteri64v", 32, -1 },
593   { "glFramebufferTexture", 32, -1 },
594   { "glProgramParameteri", 32, -1 },
595   { "glFramebufferTextureLayer", 32, -1 },
596
597   /* GL 3.3 */
598   { "glVertexAttribDivisor", 33, -1 },
599
600   /* GL 4.0 */
601   { "glMinSampleShading", 40, -1 },
602   { "glPatchParameteri", 40, -1 },
603   { "glPatchParameterfv", 40, -1 },
604   { "glBlendEquationi", 40, -1 },
605   { "glBlendEquationSeparatei", 40, -1 },
606   { "glBlendFunci", 40, -1 },
607   { "glBlendFuncSeparatei", 40, -1 },
608
609   { "glGetSubroutineUniformLocation", 40, -1 },
610   { "glGetSubroutineIndex", 40, -1 },
611   { "glGetActiveSubroutineUniformiv", 40, -1 },
612   { "glGetActiveSubroutineUniformName", 40, -1 },
613   { "glGetActiveSubroutineName", 40, -1 },
614   { "glUniformSubroutinesuiv", 40, -1 },
615   { "glGetUniformSubroutineuiv", 40, -1 },
616   { "glGetProgramStageiv", 40, -1 },
617
618   { "glUniform1d", 40, -1 },
619   { "glUniform2d", 40, -1 },
620   { "glUniform3d", 40, -1 },
621   { "glUniform4d", 40, -1 },
622   { "glUniform1dv", 40, -1 },
623   { "glUniform2dv", 40, -1 },
624   { "glUniform3dv", 40, -1 },
625   { "glUniform4dv", 40, -1 },
626   { "glUniformMatrix2dv", 40, -1 },
627   { "glUniformMatrix3dv", 40, -1 },
628   { "glUniformMatrix4dv", 40, -1 },
629   { "glUniformMatrix2x3dv", 40, -1 },
630   { "glUniformMatrix2x4dv", 40, -1 },
631   { "glUniformMatrix3x2dv", 40, -1 },
632   { "glUniformMatrix3x4dv", 40, -1 },
633   { "glUniformMatrix4x2dv", 40, -1 },
634   { "glUniformMatrix4x3dv", 40, -1 },
635   { "glGetUniformdv", 43, -1 },
636
637   /* GL 4.1 */
638   { "glVertexAttribL1d", 41, -1 },
639   { "glVertexAttribL2d", 41, -1 },
640   { "glVertexAttribL3d", 41, -1 },
641   { "glVertexAttribL4d", 41, -1 },
642   { "glVertexAttribL1dv", 41, -1 },
643   { "glVertexAttribL2dv", 41, -1 },
644   { "glVertexAttribL3dv", 41, -1 },
645   { "glVertexAttribL4dv", 41, -1 },
646   { "glVertexAttribLPointer", 41, -1 },
647   { "glGetVertexAttribLdv", 41, -1 },
648   { "glVertexArrayVertexAttribLOffsetEXT", 41, -1 },
649
650   /* GL 4.3 */
651   { "glIsRenderbuffer", 43, -1 },
652   { "glBindRenderbuffer", 43, -1 },
653   { "glDeleteRenderbuffers", 43, -1 },
654   { "glGenRenderbuffers", 43, -1 },
655   { "glRenderbufferStorage", 43, -1 },
656   { "glGetRenderbufferParameteriv", 43, -1 },
657   { "glIsFramebuffer", 43, -1 },
658   { "glBindFramebuffer", 43, -1 },
659   { "glDeleteFramebuffers", 43, -1 },
660   { "glGenFramebuffers", 43, -1 },
661   { "glCheckFramebufferStatus", 43, -1 },
662   { "glFramebufferTexture1D", 43, -1 },
663   { "glFramebufferTexture2D", 43, -1 },
664   { "glFramebufferTexture3D", 43, -1 },
665   { "glFramebufferRenderbuffer", 43, -1 },
666   { "glGetFramebufferAttachmentParameteriv", 43, -1 },
667   { "glGenerateMipmap", 43, -1 },
668   { "glBlitFramebuffer", 43, -1 },
669   { "glRenderbufferStorageMultisample", 43, -1 },
670   { "glFramebufferTextureLayer", 43, -1 },
671   { "glMapBufferRange", 43, -1 },
672   { "glFlushMappedBufferRange", 43, -1 },
673   { "glBindVertexArray", 43, -1 },
674   { "glDeleteVertexArrays", 43, -1 },
675   { "glGenVertexArrays", 43, -1 },
676   { "glIsVertexArray", 43, -1 },
677   { "glGetUniformIndices", 43, -1 },
678   { "glGetActiveUniformsiv", 43, -1 },
679   { "glGetActiveUniformName", 43, -1 },
680   { "glGetUniformBlockIndex", 43, -1 },
681   { "glGetActiveUniformBlockiv", 43, -1 },
682   { "glGetActiveUniformBlockName", 43, -1 },
683   { "glUniformBlockBinding", 43, -1 },
684   { "glCopyBufferSubData", 43, -1 },
685   { "glDrawElementsBaseVertex", 43, -1 },
686   { "glDrawRangeElementsBaseVertex", 43, -1 },
687   { "glDrawElementsInstancedBaseVertex", 43, -1 },
688   { "glMultiDrawElementsBaseVertex", 43, -1 },
689   { "glProvokingVertex", 43, -1 },
690   { "glFenceSync", 43, -1 },
691   { "glIsSync", 43, -1 },
692   { "glDeleteSync", 43, -1 },
693   { "glClientWaitSync", 43, -1 },
694   { "glWaitSync", 43, -1 },
695   { "glGetInteger64v", 43, -1 },
696   { "glGetSynciv", 43, -1 },
697   { "glTexImage2DMultisample", 43, -1 },
698   { "glTexImage3DMultisample", 43, -1 },
699   { "glGetMultisamplefv", 43, -1 },
700   { "glSampleMaski", 43, -1 },
701   { "glBlendEquationiARB", 43, -1 },
702   { "glBlendEquationSeparateiARB", 43, -1 },
703   { "glBlendFunciARB", 43, -1 },
704   { "glBlendFuncSeparateiARB", 43, -1 },
705   { "glMinSampleShadingARB", 43, -1 },                 // XXX: Add to xml
706   { "glBindFragDataLocationIndexed", 43, -1 },
707   { "glGetFragDataIndex", 43, -1 },
708   { "glGenSamplers", 43, -1 },
709   { "glDeleteSamplers", 43, -1 },
710   { "glIsSampler", 43, -1 },
711   { "glBindSampler", 43, -1 },
712   { "glSamplerParameteri", 43, -1 },
713   { "glSamplerParameteriv", 43, -1 },
714   { "glSamplerParameterf", 43, -1 },
715   { "glSamplerParameterfv", 43, -1 },
716   { "glSamplerParameterIiv", 43, -1 },
717   { "glSamplerParameterIuiv", 43, -1 },
718   { "glGetSamplerParameteriv", 43, -1 },
719   { "glGetSamplerParameterIiv", 43, -1 },
720   { "glGetSamplerParameterfv", 43, -1 },
721   { "glGetSamplerParameterIuiv", 43, -1 },
722   { "glQueryCounter", 43, -1 },
723   { "glGetQueryObjecti64v", 43, -1 },
724   { "glGetQueryObjectui64v", 43, -1 },
725   { "glVertexP2ui", 43, -1 },
726   { "glVertexP2uiv", 43, -1 },
727   { "glVertexP3ui", 43, -1 },
728   { "glVertexP3uiv", 43, -1 },
729   { "glVertexP4ui", 43, -1 },
730   { "glVertexP4uiv", 43, -1 },
731   { "glTexCoordP1ui", 43, -1 },
732   { "glTexCoordP1uiv", 43, -1 },
733   { "glTexCoordP2ui", 43, -1 },
734   { "glTexCoordP2uiv", 43, -1 },
735   { "glTexCoordP3ui", 43, -1 },
736   { "glTexCoordP3uiv", 43, -1 },
737   { "glTexCoordP4ui", 43, -1 },
738   { "glTexCoordP4uiv", 43, -1 },
739   { "glMultiTexCoordP1ui", 43, -1 },
740   { "glMultiTexCoordP1uiv", 43, -1 },
741   { "glMultiTexCoordP2ui", 43, -1 },
742   { "glMultiTexCoordP2uiv", 43, -1 },
743   { "glMultiTexCoordP3ui", 43, -1 },
744   { "glMultiTexCoordP3uiv", 43, -1 },
745   { "glMultiTexCoordP4ui", 43, -1 },
746   { "glMultiTexCoordP4uiv", 43, -1 },
747   { "glNormalP3ui", 43, -1 },
748   { "glNormalP3uiv", 43, -1 },
749   { "glColorP3ui", 43, -1 },
750   { "glColorP3uiv", 43, -1 },
751   { "glColorP4ui", 43, -1 },
752   { "glColorP4uiv", 43, -1 },
753   { "glSecondaryColorP3ui", 43, -1 },
754   { "glSecondaryColorP3uiv", 43, -1 },
755   { "glVertexAttribP1ui", 43, -1 },
756   { "glVertexAttribP1uiv", 43, -1 },
757   { "glVertexAttribP2ui", 43, -1 },
758   { "glVertexAttribP2uiv", 43, -1 },
759   { "glVertexAttribP3ui", 43, -1 },
760   { "glVertexAttribP3uiv", 43, -1 },
761   { "glVertexAttribP4ui", 43, -1 },
762   { "glVertexAttribP4uiv", 43, -1 },
763   { "glDrawArraysIndirect", 43, -1 },
764   { "glDrawElementsIndirect", 43, -1 },
765   { "glBindTransformFeedback", 43, -1 },
766   { "glDeleteTransformFeedbacks", 43, -1 },
767   { "glGenTransformFeedbacks", 43, -1 },
768   { "glIsTransformFeedback", 43, -1 },
769   { "glPauseTransformFeedback", 43, -1 },
770   { "glResumeTransformFeedback", 43, -1 },
771   { "glDrawTransformFeedback", 43, -1 },
772   { "glDrawTransformFeedbackStream", 43, -1 },
773   { "glBeginQueryIndexed", 43, -1 },
774   { "glEndQueryIndexed", 43, -1 },
775   { "glGetQueryIndexediv", 43, -1 },
776   { "glReleaseShaderCompiler", 43, -1 },
777   { "glShaderBinary", 43, -1 },
778   { "glGetShaderPrecisionFormat", 43, -1 },
779   { "glDepthRangef", 43, -1 },
780   { "glClearDepthf", 43, -1 },
781   { "glGetProgramBinary", 43, -1 },
782   { "glProgramBinary", 43, -1 },
783   { "glProgramParameteri", 43, -1 },
784   { "glUseProgramStages", 43, -1 },
785   { "glActiveShaderProgram", 43, -1 },
786   { "glCreateShaderProgramv", 43, -1 },
787   { "glBindProgramPipeline", 43, -1 },
788   { "glDeleteProgramPipelines", 43, -1 },
789   { "glGenProgramPipelines", 43, -1 },
790   { "glIsProgramPipeline", 43, -1 },
791   { "glGetProgramPipelineiv", 43, -1 },
792   { "glProgramUniform1d", 43, -1 },
793   { "glProgramUniform1dv", 43, -1 },
794   { "glProgramUniform1i", 43, -1 },
795   { "glProgramUniform1iv", 43, -1 },
796   { "glProgramUniform1f", 43, -1 },
797   { "glProgramUniform1fv", 43, -1 },
798   { "glProgramUniform1ui", 43, -1 },
799   { "glProgramUniform1uiv", 43, -1 },
800   { "glProgramUniform2i", 43, -1 },
801   { "glProgramUniform2iv", 43, -1 },
802   { "glProgramUniform2f", 43, -1 },
803   { "glProgramUniform2fv", 43, -1 },
804   { "glProgramUniform2d", 40, -1 },
805   { "glProgramUniform2dv", 40, -1 },
806   { "glProgramUniform2ui", 43, -1 },
807   { "glProgramUniform2uiv", 43, -1 },
808   { "glProgramUniform3i", 43, -1 },
809   { "glProgramUniform3iv", 43, -1 },
810   { "glProgramUniform3f", 43, -1 },
811   { "glProgramUniform3fv", 43, -1 },
812   { "glProgramUniform3d", 40, -1 },
813   { "glProgramUniform3dv", 40, -1 },
814   { "glProgramUniform3ui", 43, -1 },
815   { "glProgramUniform3uiv", 43, -1 },
816   { "glProgramUniform4i", 43, -1 },
817   { "glProgramUniform4iv", 43, -1 },
818   { "glProgramUniform4d", 43, -1 },
819   { "glProgramUniform4dv", 43, -1 },
820   { "glProgramUniform4f", 43, -1 },
821   { "glProgramUniform4fv", 43, -1 },
822   { "glProgramUniform4ui", 43, -1 },
823   { "glProgramUniform4uiv", 43, -1 },
824   { "glProgramUniformMatrix2dv", 43, -1 },
825   { "glProgramUniformMatrix2fv", 43, -1 },
826   { "glProgramUniformMatrix3dv", 43, -1 },
827   { "glProgramUniformMatrix3fv", 43, -1 },
828   { "glProgramUniformMatrix4dv", 43, -1 },
829   { "glProgramUniformMatrix4fv", 43, -1 },
830   { "glProgramUniformMatrix2x3dv", 43, -1 },
831   { "glProgramUniformMatrix2x3fv", 43, -1 },
832   { "glProgramUniformMatrix3x2dv", 43, -1 },
833   { "glProgramUniformMatrix3x2fv", 43, -1 },
834   { "glProgramUniformMatrix2x4dv", 43, -1 },
835   { "glProgramUniformMatrix2x4fv", 43, -1 },
836   { "glProgramUniformMatrix4x2dv", 43, -1 },
837   { "glProgramUniformMatrix4x2fv", 43, -1 },
838   { "glProgramUniformMatrix3x4dv", 43, -1 },
839   { "glProgramUniformMatrix3x4fv", 43, -1 },
840   { "glProgramUniformMatrix4x3dv", 43, -1 },
841   { "glProgramUniformMatrix4x3fv", 43, -1 },
842   { "glValidateProgramPipeline", 43, -1 },
843   { "glGetProgramPipelineInfoLog", 43, -1 },
844   { "glGetFloati_v", 43, -1 },
845   { "glGetDoublei_v", 43, -1 },
846// { "glCreateSyncFromCLeventARB", 43, -1 },            // XXX: Add to xml
847   { "glGetGraphicsResetStatusARB", 43, -1 },
848   { "glGetnMapdvARB", 43, -1 },
849   { "glGetnMapfvARB", 43, -1 },
850   { "glGetnMapivARB", 43, -1 },
851   { "glGetnPixelMapfvARB", 43, -1 },
852   { "glGetnPixelMapuivARB", 43, -1 },
853   { "glGetnPixelMapusvARB", 43, -1 },
854   { "glGetnPolygonStippleARB", 43, -1 },
855   { "glGetnColorTableARB", 43, -1 },
856   { "glGetnConvolutionFilterARB", 43, -1 },
857   { "glGetnSeparableFilterARB", 43, -1 },
858   { "glGetnHistogramARB", 43, -1 },
859   { "glGetnMinmaxARB", 43, -1 },
860   { "glGetnTexImageARB", 43, -1 },
861   { "glReadnPixelsARB", 43, -1 },
862   { "glGetnCompressedTexImageARB", 43, -1 },
863   { "glGetnUniformfvARB", 43, -1 },
864   { "glGetnUniformivARB", 43, -1 },
865   { "glGetnUniformuivARB", 43, -1 },
866   { "glGetnUniformdvARB", 43, -1 },
867   { "glDrawArraysInstancedBaseInstance", 43, -1 },
868   { "glDrawElementsInstancedBaseInstance", 43, -1 },
869   { "glDrawElementsInstancedBaseVertexBaseInstance", 43, -1 },
870   { "glDrawTransformFeedbackInstanced", 43, -1 },
871   { "glDrawTransformFeedbackStreamInstanced", 43, -1 },
872// { "glGetInternalformativ", 43, -1 },                 // XXX: Add to xml
873   { "glGetActiveAtomicCounterBufferiv", 43, -1 },
874   { "glBindImageTexture", 43, -1 },
875   { "glMemoryBarrier", 43, -1 },
876   { "glTexStorage1D", 43, -1 },
877   { "glTexStorage2D", 43, -1 },
878   { "glTexStorage3D", 43, -1 },
879   { "glTextureStorage1DEXT", 43, -1 },
880   { "glTextureStorage2DEXT", 43, -1 },
881   { "glTextureStorage3DEXT", 43, -1 },
882   { "glClearBufferData", 43, -1 },
883   { "glClearBufferSubData", 43, -1 },
884   { "glClearNamedBufferDataEXT", 43, -1 },
885   { "glClearNamedBufferSubDataEXT", 43, -1 },
886   { "glCopyImageSubData", 43, -1 },
887   { "glTextureView", 43, -1 },
888   { "glBindVertexBuffer", 43, -1 },
889   { "glVertexAttribFormat", 43, -1 },
890   { "glVertexAttribIFormat", 43, -1 },
891   { "glVertexAttribLFormat", 43, -1 },
892   { "glVertexAttribBinding", 43, -1 },
893   { "glVertexBindingDivisor", 43, -1 },
894   { "glVertexArrayBindVertexBufferEXT", 43, -1 },
895   { "glVertexArrayVertexAttribFormatEXT", 43, -1 },
896   { "glVertexArrayVertexAttribIFormatEXT", 43, -1 },
897   { "glVertexArrayVertexAttribLFormatEXT", 43, -1 },
898   { "glVertexArrayVertexAttribBindingEXT", 43, -1 },
899   { "glVertexArrayVertexBindingDivisorEXT", 43, -1 },
900   { "glFramebufferParameteri", 43, -1 },
901   { "glGetFramebufferParameteriv", 43, -1 },
902   { "glNamedFramebufferParameteriEXT", 43, -1 },
903   { "glGetNamedFramebufferParameterivEXT", 43, -1 },
904// { "glGetInternalformati64v", 43, -1 },               // XXX: Add to xml
905   { "glInvalidateTexSubImage", 43, -1 },
906   { "glInvalidateTexImage", 43, -1 },
907   { "glInvalidateBufferSubData", 43, -1 },
908   { "glInvalidateBufferData", 43, -1 },
909   { "glInvalidateFramebuffer", 43, -1 },
910   { "glInvalidateSubFramebuffer", 43, -1 },
911   { "glMultiDrawArraysIndirect", 43, -1 },
912   { "glMultiDrawElementsIndirect", 43, -1 },
913   { "glGetProgramInterfaceiv", 43, -1 },
914   { "glGetProgramResourceIndex", 43, -1 },
915   { "glGetProgramResourceName", 43, -1 },
916   { "glGetProgramResourceiv", 43, -1 },
917   { "glGetProgramResourceLocation", 43, -1 },
918   { "glGetProgramResourceLocationIndex", 43, -1 },
919   { "glShaderStorageBlockBinding", 43, -1 },
920   { "glTextureBufferRangeEXT", 43, -1 },
921   { "glTexStorage2DMultisample", 43, -1 },
922   { "glTexStorage3DMultisample", 43, -1 },
923   { "glTextureStorage2DMultisampleEXT", 43, -1 },
924   { "glTextureStorage3DMultisampleEXT", 43, -1 },
925
926   { "glViewportArrayv", 43, -1 },
927   { "glViewportIndexedf", 43, -1 },
928   { "glViewportIndexedfv", 43, -1 },
929   { "glScissorArrayv", 43, -1 },
930   { "glScissorIndexed", 43, -1 },
931   { "glScissorIndexedv", 43, -1 },
932   { "glDepthRangeArrayv", 43, -1 },
933   { "glDepthRangeIndexed", 43, -1 },
934
935/* GL 4.4 */
936   /* GL_NV_alpha_to_coverage_dither_control */
937   { "glAlphaToCoverageDitherControlNV", 44, -1 },
938
939/* GL 4.5 */
940   /* aliased versions checked above */
941   //{ "glGetGraphicsResetStatus", 45, -1 },
942   //{ "glReadnPixels", 45, -1 },
943   //{ "glGetnUniformfv", 45, -1 },
944   //{ "glGetnUniformiv", 45, -1 },
945   //{ "glGetnUniformuiv", 45, -1 },
946   { "glMemoryBarrierByRegion", 45, -1 },
947
948   /* GL_ARB_direct_state_access */
949   { "glCreateTransformFeedbacks", 45, -1 },
950   { "glTransformFeedbackBufferBase", 45, -1 },
951   { "glTransformFeedbackBufferRange", 45, -1 },
952   { "glGetTransformFeedbackiv", 45, -1 },
953   { "glGetTransformFeedbacki_v", 45, -1 },
954   { "glGetTransformFeedbacki64_v", 45, -1 },
955   { "glCreateBuffers", 45, -1 },
956   { "glNamedBufferStorage", 45, -1 },
957   { "glNamedBufferData", 45, -1 },
958   { "glNamedBufferSubData", 45, -1 },
959   { "glCopyNamedBufferSubData", 45, -1 },
960   { "glClearNamedBufferData", 45, -1 },
961   { "glClearNamedBufferSubData", 45, -1 },
962   { "glMapNamedBuffer", 45, -1 },
963   { "glMapNamedBufferRange", 45, -1 },
964   { "glFlushMappedNamedBufferRange", 45, -1 },
965   { "glGetNamedBufferParameteriv", 45, -1 },
966   { "glGetNamedBufferParameteri64v", 45, -1 },
967   { "glGetNamedBufferPointerv", 45, -1 },
968   { "glGetNamedBufferSubData", 45, -1 },
969   { "glCreateFramebuffers", 45, -1 },
970   { "glNamedFramebufferRenderbuffer", 45, -1 },
971   { "glNamedFramebufferParameteri", 45, -1 },
972   { "glNamedFramebufferTexture", 45, -1 },
973   { "glNamedFramebufferTextureLayer", 45, -1 },
974   { "glNamedFramebufferDrawBuffer", 45, -1 },
975   { "glNamedFramebufferDrawBuffers", 45, -1 },
976   { "glNamedFramebufferReadBuffer", 45, -1 },
977   { "glInvalidateNamedFramebufferSubData", 45, -1 },
978   { "glInvalidateNamedFramebufferData", 45, -1 },
979   { "glClearNamedFramebufferiv", 45, -1 },
980   { "glClearNamedFramebufferuiv", 45, -1 },
981   { "glClearNamedFramebufferfv", 45, -1 },
982   { "glClearNamedFramebufferfi", 45, -1 },
983   { "glBlitNamedFramebuffer", 45, -1 },
984   { "glCheckNamedFramebufferStatus", 45, -1 },
985   { "glGetNamedFramebufferParameteriv", 45, -1 },
986   { "glGetNamedFramebufferAttachmentParameteriv", 45, -1 },
987   { "glCreateRenderbuffers", 45, -1 },
988   { "glNamedRenderbufferStorage", 45, -1 },
989   { "glNamedRenderbufferStorageMultisample", 45, -1 },
990   { "glGetNamedRenderbufferParameteriv", 45, -1 },
991   { "glCreateTextures", 45, -1 },
992   { "glTextureStorage1D", 45, -1 },
993   { "glTextureStorage2D", 45, -1 },
994   { "glTextureStorage3D", 45, -1 },
995   { "glTextureSubImage1D", 45, -1 },
996   { "glTextureSubImage2D", 45, -1 },
997   { "glTextureSubImage3D", 45, -1 },
998   { "glBindTextureUnit", 45, -1 },
999   { "glTextureParameterf", 45, -1 },
1000   { "glTextureParameterfv", 45, -1 },
1001   { "glTextureParameteri", 45, -1 },
1002   { "glTextureParameterIiv", 45, -1 },
1003   { "glTextureParameterIuiv", 45, -1 },
1004   { "glTextureParameteriv", 45, -1 },
1005   { "glGetTextureLevelParameterfv", 45, -1 },
1006   { "glGetTextureLevelParameteriv", 45, -1 },
1007   { "glGetTextureParameterfv", 45, -1 },
1008   { "glGetTextureParameterIiv", 45, -1 },
1009   { "glGetTextureParameterIuiv", 45, -1 },
1010   { "glGetTextureParameteriv", 45, -1 },
1011   { "glCopyTextureSubImage1D", 45, -1 },
1012   { "glCopyTextureSubImage2D", 45, -1 },
1013   { "glCopyTextureSubImage3D", 45, -1 },
1014   { "glGetTextureImage", 45, -1 },
1015   { "glGetCompressedTextureImage", 45, -1 },
1016   { "glCompressedTextureSubImage1D", 45, -1 },
1017   { "glCompressedTextureSubImage2D", 45, -1 },
1018   { "glCompressedTextureSubImage3D", 45, -1 },
1019   { "glGenerateTextureMipmap", 45, -1 },
1020   { "glTextureStorage2DMultisample", 45, -1 },
1021   { "glTextureStorage3DMultisample", 45, -1 },
1022   { "glTextureBuffer", 45, -1 },
1023   { "glTextureBufferRange", 45, -1 },
1024   { "glCreateVertexArrays", 45, -1 },
1025   { "glDisableVertexArrayAttrib", 45, -1 },
1026   { "glEnableVertexArrayAttrib", 45, -1 },
1027   { "glVertexArrayElementBuffer", 45, -1 },
1028   { "glVertexArrayVertexBuffer", 45, -1 },
1029   { "glVertexArrayVertexBuffers", 45, -1 },
1030   { "glVertexArrayAttribFormat", 45, -1 },
1031   { "glVertexArrayAttribIFormat", 45, -1 },
1032   { "glVertexArrayAttribLFormat", 45, -1 },
1033   { "glVertexArrayAttribBinding", 45, -1 },
1034   { "glVertexArrayBindingDivisor", 45, -1 },
1035   { "glGetVertexArrayiv", 45, -1 },
1036   { "glGetVertexArrayIndexediv", 45, -1 },
1037   { "glGetVertexArrayIndexed64iv", 45, -1 },
1038   { "glCreateSamplers", 45, -1 },
1039   { "glCreateProgramPipelines", 45, -1 },
1040   { "glCreateQueries", 45, -1 },
1041   { "glGetQueryBufferObjectiv", 45, -1 },
1042   { "glGetQueryBufferObjectuiv", 45, -1 },
1043   { "glGetQueryBufferObjecti64v", 45, -1 },
1044   { "glGetQueryBufferObjectui64v", 45, -1 },
1045
1046   /* GL_EXT_direct_state_access - GL 1.0 */
1047   { "glMatrixLoadfEXT", 10, -1 },
1048   { "glMatrixLoaddEXT", 10, -1 },
1049   { "glMatrixMultfEXT", 10, -1 },
1050   { "glMatrixMultdEXT", 10, -1 },
1051   { "glMatrixLoadIdentityEXT", 10, -1 },
1052   { "glMatrixRotatefEXT", 10, -1 },
1053   { "glMatrixRotatedEXT", 10, -1 },
1054   { "glMatrixScalefEXT", 10, -1 },
1055   { "glMatrixScaledEXT", 10, -1 },
1056   { "glMatrixTranslatefEXT", 10, -1 },
1057   { "glMatrixTranslatedEXT", 10, -1 },
1058   { "glMatrixOrthoEXT", 10, -1 },
1059   { "glMatrixFrustumEXT", 10, -1 },
1060   { "glMatrixPushEXT", 10, -1 },
1061   { "glMatrixPopEXT", 10, -1 },
1062   /* GL_EXT_direct_state_access - GL 1.1 */
1063   { "glClientAttribDefaultEXT", 11, -1 },
1064   { "glPushClientAttribDefaultEXT", 11, -1 },
1065   { "glTextureParameteriEXT", 11, -1 },
1066   { "glTextureParameterivEXT", 11, -1 },
1067   { "glTextureParameterfEXT", 11, -1 },
1068   { "glTextureParameterfvEXT", 11, -1 },
1069   { "glTextureImage1DEXT", 11, -1 },
1070   { "glTextureImage2DEXT", 11, -1 },
1071   { "glTextureSubImage1DEXT", 11, -1 },
1072   { "glTextureSubImage2DEXT", 11, -1 },
1073   { "glCopyTextureImage1DEXT", 11, -1 },
1074   { "glCopyTextureImage2DEXT", 11, -1 },
1075   { "glCopyTextureSubImage1DEXT", 11, -1 },
1076   { "glCopyTextureSubImage2DEXT", 11, -1 },
1077   { "glGetTextureImageEXT", 11, -1 },
1078   { "glGetTextureParameterfvEXT", 11, -1 },
1079   { "glGetTextureParameterivEXT", 11, -1 },
1080   { "glGetTextureLevelParameterfvEXT", 11, -1 },
1081   { "glGetTextureLevelParameterivEXT", 11, -1 },
1082   /* GL_EXT_direct_state_access - GL 1.2 */
1083   { "glTextureImage3DEXT", 12, -1 },
1084   { "glTextureSubImage3DEXT", 12, -1 },
1085   { "glCopyTextureSubImage3DEXT", 12, -1 },
1086   /* GL_EXT_direct_state_access - GL 1.2.1 */
1087   { "glBindMultiTextureEXT", 12, -1 },
1088   { "glMultiTexCoordPointerEXT", 12, -1 },
1089   { "glMultiTexEnvfEXT", 12, -1 },
1090   { "glMultiTexEnvfvEXT", 12, -1 },
1091   { "glMultiTexEnviEXT", 12, -1 },
1092   { "glMultiTexEnvivEXT", 12, -1 },
1093   { "glMultiTexGendEXT", 12, -1 },
1094   { "glMultiTexGendvEXT", 12, -1 },
1095   { "glMultiTexGenfEXT", 12, -1 },
1096   { "glMultiTexGenfvEXT", 12, -1 },
1097   { "glMultiTexGeniEXT", 12, -1 },
1098   { "glMultiTexGenivEXT", 12, -1 },
1099   { "glGetMultiTexEnvfvEXT", 12, -1 },
1100   { "glGetMultiTexEnvivEXT", 12, -1 },
1101   { "glGetMultiTexGendvEXT", 12, -1 },
1102   { "glGetMultiTexGenfvEXT", 12, -1 },
1103   { "glGetMultiTexGenivEXT", 12, -1 },
1104   { "glMultiTexParameterfEXT", 12, -1 },
1105   { "glMultiTexParameterfvEXT", 12, -1 },
1106   { "glMultiTexParameteriEXT", 12, -1 },
1107   { "glMultiTexParameterivEXT", 12, -1 },
1108   { "glMultiTexImage1DEXT", 12, -1 },
1109   { "glMultiTexImage2DEXT", 12, -1 },
1110   { "glMultiTexSubImage1DEXT", 12, -1 },
1111   { "glMultiTexSubImage2DEXT", 12, -1 },
1112   { "glCopyMultiTexImage1DEXT", 12, -1 },
1113   { "glCopyMultiTexImage2DEXT", 12, -1 },
1114   { "glCopyMultiTexSubImage1DEXT", 12, -1 },
1115   { "glCopyMultiTexSubImage2DEXT", 12, -1 },
1116   { "glGetMultiTexImageEXT", 12, -1 },
1117   { "glGetMultiTexParameterfvEXT", 12, -1 },
1118   { "glGetMultiTexParameterivEXT", 12, -1 },
1119   { "glGetMultiTexLevelParameterfvEXT", 12, -1 },
1120   { "glGetMultiTexLevelParameterivEXT", 12, -1 },
1121   { "glMultiTexImage3DEXT", 12, -1 },
1122   { "glMultiTexSubImage3DEXT", 12, -1 },
1123   { "glCopyMultiTexSubImage3DEXT", 12, -1 },
1124   { "glEnableClientStateIndexedEXT", 12, -1 },
1125   { "glDisableClientStateIndexedEXT", 12, -1 },
1126   { "glGetPointerIndexedvEXT", 12, -1 },
1127   /* GL_EXT_direct_state_access - ARB_vertex_program */
1128   { "glNamedProgramStringEXT", 10, -1 },
1129   { "glNamedProgramLocalParameter4dEXT", 10, -1 },
1130   { "glNamedProgramLocalParameter4dvEXT", 10, -1 },
1131   { "glNamedProgramLocalParameter4fEXT", 10, -1 },
1132   { "glNamedProgramLocalParameter4fvEXT", 10, -1 },
1133   { "glGetNamedProgramLocalParameterdvEXT", 10, -1 },
1134   { "glGetNamedProgramLocalParameterfvEXT", 10, -1 },
1135   { "glGetNamedProgramivEXT", 10, -1 },
1136   { "glGetNamedProgramStringEXT", 10, -1 },
1137   /* GL_EXT_direct_state_access - GL 1.3 */
1138   { "glCompressedTextureImage1DEXT", 13, -1 },
1139   { "glCompressedTextureImage2DEXT", 13, -1 },
1140   { "glCompressedTextureImage3DEXT", 13, -1 },
1141   { "glCompressedTextureSubImage1DEXT", 13, -1 },
1142   { "glCompressedTextureSubImage2DEXT", 13, -1 },
1143   { "glCompressedTextureSubImage3DEXT", 13, -1 },
1144   { "glGetCompressedTextureImageEXT", 13, -1 },
1145   { "glCompressedMultiTexImage1DEXT", 13, -1 },
1146   { "glCompressedMultiTexImage2DEXT", 13, -1 },
1147   { "glCompressedMultiTexImage3DEXT", 13, -1 },
1148   { "glCompressedMultiTexSubImage1DEXT", 13, -1 },
1149   { "glCompressedMultiTexSubImage2DEXT", 13, -1 },
1150   { "glCompressedMultiTexSubImage3DEXT", 13, -1 },
1151   { "glGetCompressedMultiTexImageEXT", 13, -1 },
1152   { "glMatrixLoadTransposefEXT", 13, -1 },
1153   { "glMatrixLoadTransposedEXT", 13, -1 },
1154   { "glMatrixMultTransposefEXT", 13, -1 },
1155   { "glMatrixMultTransposedEXT", 13, -1 },
1156   /* GL_EXT_direct_state_access - GL 1.5 */
1157   { "glNamedBufferDataEXT", 15, -1 },
1158   { "glNamedBufferSubDataEXT", 15, -1 },
1159   { "glMapNamedBufferEXT", 15, -1 },
1160   { "glUnmapNamedBufferEXT", 15, -1 },
1161   { "glGetNamedBufferParameterivEXT", 15, -1 },
1162   { "glGetNamedBufferPointervEXT", 15, -1 },
1163   { "glGetNamedBufferSubDataEXT", 15, -1 },
1164   /* GL_EXT_direct_state_access - GL 2.0 */
1165   /* Added glProgramUniform*EXT functions are aliases */
1166   /* GL_EXT_direct_state_access - GL 2.1 */
1167   /* Added glProgramUniformMAtrix*EXT functions are aliases */
1168   /* GL_EXT_direct_state_access - EXT_texture_buffer_object */
1169   { "glTextureBufferEXT", 10, -1 },
1170   { "glMultiTexBufferEXT", 10, -1 },
1171   /* GL_EXT_direct_state_access - EXT_texture_integer */
1172   { "glTextureParameterIivEXT", 10, -1 },
1173   { "glTextureParameterIuivEXT", 10, -1 },
1174   { "glGetTextureParameterIivEXT", 10, -1 },
1175   { "glGetTextureParameterIuivEXT", 10, -1 },
1176   { "glMultiTexParameterIivEXT", 10, -1 },
1177   { "glMultiTexParameterIuivEXT", 10, -1 },
1178   { "glGetMultiTexParameterIivEXT", 10, -1 },
1179   { "glGetMultiTexParameterIuivEXT", 10, -1 },
1180   /* GL_EXT_direct_state_access - EXT_gpu_shader4 */
1181   /* Added glProgramUniform*u*EXT functions are aliases */
1182   /* GL_EXT_direct_state_access - EXT_gpu_program_parameters */
1183   { "glNamedProgramLocalParameters4fvEXT", 10, -1 },
1184   /* GL_EXT_direct_state_access - GL 3.0 */
1185   { "glNamedRenderbufferStorageEXT", 30, -1 },
1186   { "glGetNamedRenderbufferParameterivEXT", 30, -1 },
1187   { "glNamedRenderbufferStorageMultisampleEXT", 30, -1 },
1188   { "glCheckNamedFramebufferStatusEXT", 30, -1 },
1189   { "glNamedFramebufferTexture1DEXT", 30, -1 },
1190   { "glNamedFramebufferTexture2DEXT", 30, -1 },
1191   { "glNamedFramebufferTexture3DEXT", 30, -1 },
1192   { "glNamedFramebufferRenderbufferEXT", 30, -1 },
1193   { "glGetNamedFramebufferAttachmentParameterivEXT", 30, -1 },
1194   { "glGenerateTextureMipmapEXT", 30, -1 },
1195   { "glGenerateMultiTexMipmapEXT", 30, -1 },
1196   { "glFramebufferDrawBufferEXT", 30, -1 },
1197   { "glFramebufferDrawBuffersEXT", 30, -1 },
1198   { "glFramebufferReadBufferEXT", 30, -1 },
1199   { "glGetFramebufferParameterivEXT", 30, -1 },
1200   { "glNamedCopyBufferSubDataEXT", 30, -1 },
1201   { "glVertexArrayVertexOffsetEXT", 30, -1 },
1202   { "glVertexArrayColorOffsetEXT", 30, -1 },
1203   { "glVertexArrayEdgeFlagOffsetEXT", 30, -1 },
1204   { "glVertexArrayIndexOffsetEXT", 30, -1 },
1205   { "glVertexArrayNormalOffsetEXT", 30, -1 },
1206   { "glVertexArrayTexCoordOffsetEXT", 30, -1 },
1207   { "glVertexArrayMultiTexCoordOffsetEXT", 30, -1 },
1208   { "glVertexArrayFogCoordOffsetEXT", 30, -1 },
1209   { "glVertexArraySecondaryColorOffsetEXT", 30, -1 },
1210   { "glVertexArrayVertexAttribOffsetEXT", 30, -1 },
1211   { "glVertexArrayVertexAttribIOffsetEXT", 30, -1 },
1212   { "glEnableVertexArrayEXT", 30, -1 },
1213   { "glDisableVertexArrayEXT", 30, -1 },
1214   { "glEnableVertexArrayAttribEXT", 30, -1 },
1215   { "glDisableVertexArrayAttribEXT", 30, -1 },
1216   { "glGetVertexArrayIntegervEXT", 30, -1 },
1217   { "glGetVertexArrayPointervEXT", 30, -1 },
1218   { "glGetVertexArrayIntegeri_vEXT", 30, -1 },
1219   { "glGetVertexArrayPointeri_vEXT", 30, -1 },
1220   { "glMapNamedBufferRangeEXT", 30, -1 },
1221   { "glFlushMappedNamedBufferRangeEXT", 30, -1 },
1222
1223   /* GL_ARB_internalformat_query */
1224   { "glGetInternalformativ", 30, -1 },
1225
1226   /* GL_ARB_internalformat_query */
1227   { "glGetInternalformati64v", 30, -1 },
1228
1229   /* GL_ARB_multi_bind */
1230   { "glBindBuffersBase", 44, -1 },
1231   { "glBindBuffersRange", 44, -1 },
1232   { "glBindTextures", 44, -1 },
1233   { "glBindSamplers", 44, -1 },
1234   { "glBindImageTextures", 44, -1 },
1235   { "glBindVertexBuffers", 44, -1 },
1236
1237   /* GL_ARB_shading_language_include */
1238   { "glNamedStringARB", 20, -1 },
1239   { "glDeleteNamedStringARB", 20, -1 },
1240   { "glCompileShaderIncludeARB", 20, -1 },
1241   { "glIsNamedStringARB", 20, -1 },
1242   { "glGetNamedStringARB", 20, -1 },
1243   { "glGetNamedStringivARB", 20, -1 },
1244
1245   /* GL_KHR_debug/GL_ARB_debug_output */
1246   { "glPushDebugGroup", 11, -1 },
1247   { "glPopDebugGroup", 11, -1 },
1248   { "glDebugMessageCallback", 11, -1 },
1249   { "glDebugMessageControl", 11, -1 },
1250   { "glDebugMessageInsert", 11, -1 },
1251   { "glGetDebugMessageLog", 11, -1 },
1252   { "glGetObjectLabel", 11, -1 },
1253   { "glGetObjectPtrLabel", 11, -1 },
1254   { "glObjectLabel", 11, -1 },
1255   { "glObjectPtrLabel", 11, -1 },
1256   /* aliased versions checked above */
1257   //{ "glDebugMessageControlARB", 11, -1 },
1258   //{ "glDebugMessageInsertARB", 11, -1 },
1259   //{ "glDebugMessageCallbackARB", 11, -1 },
1260   //{ "glGetDebugMessageLogARB", 11, -1 },
1261
1262   /* GL_AMD_performance_monitor */
1263   { "glGetPerfMonitorGroupsAMD", 11, -1 },
1264   { "glGetPerfMonitorCountersAMD", 11, -1 },
1265   { "glGetPerfMonitorGroupStringAMD", 11, -1 },
1266   { "glGetPerfMonitorCounterStringAMD", 11, -1 },
1267   { "glGetPerfMonitorCounterInfoAMD", 11, -1 },
1268   { "glGenPerfMonitorsAMD", 11, -1 },
1269   { "glDeletePerfMonitorsAMD", 11, -1 },
1270   { "glSelectPerfMonitorCountersAMD", 11, -1 },
1271   { "glBeginPerfMonitorAMD", 11, -1 },
1272   { "glEndPerfMonitorAMD", 11, -1 },
1273   { "glGetPerfMonitorCounterDataAMD", 11, -1 },
1274
1275   /* GL_INTEL_performance_query */
1276   { "glGetFirstPerfQueryIdINTEL", 30, -1 },
1277   { "glGetNextPerfQueryIdINTEL", 30, -1 },
1278   { "glGetPerfQueryIdByNameINTEL", 30, -1 },
1279   { "glGetPerfQueryInfoINTEL", 30, -1 },
1280   { "glGetPerfCounterInfoINTEL", 30, -1 },
1281   { "glCreatePerfQueryINTEL", 30, -1 },
1282   { "glDeletePerfQueryINTEL", 30, -1 },
1283   { "glBeginPerfQueryINTEL", 30, -1 },
1284   { "glEndPerfQueryINTEL", 30, -1 },
1285   { "glGetPerfQueryDataINTEL", 30, -1 },
1286
1287   /* GL_NV_vdpau_interop */
1288   { "glVDPAUInitNV", 11, -1 },
1289   { "glVDPAUFiniNV", 11, -1 },
1290   { "glVDPAURegisterVideoSurfaceNV", 11, -1 },
1291   { "glVDPAURegisterOutputSurfaceNV", 11, -1 },
1292   { "glVDPAUIsSurfaceNV", 11, -1 },
1293   { "glVDPAUUnregisterSurfaceNV", 11, -1 },
1294   { "glVDPAUGetSurfaceivNV", 11, -1 },
1295   { "glVDPAUSurfaceAccessNV", 11, -1 },
1296   { "glVDPAUMapSurfacesNV", 11, -1 },
1297   { "glVDPAUUnmapSurfacesNV", 11, -1 },
1298
1299   /* GL_ARB_buffer_storage */
1300   { "glBufferStorage", 43, -1 },
1301   { "glNamedBufferStorageEXT", 43, -1 },
1302
1303   /* GL_ARB_clear_texture */
1304   { "glClearTexImage", 13, -1 },
1305   { "glClearTexSubImage", 13, -1 },
1306
1307   /* GL_ARB_clip_control */
1308   { "glClipControl", 45, -1 },
1309
1310   /* GL_ARB_compute_shader */
1311   { "glDispatchCompute", 43, -1 },
1312   { "glDispatchComputeIndirect", 43, -1 },
1313
1314   /* GL_ARB_compute_variable_group_size */
1315   { "glDispatchComputeGroupSizeARB", 43, -1 },
1316
1317   /* GL_EXT_polygon_offset_clamp */
1318   { "glPolygonOffsetClampEXT", 11, -1 },
1319
1320   /* GL_ARB_get_texture_sub_image */
1321   { "glGetTextureSubImage", 20, -1 },
1322   { "glGetCompressedTextureSubImage", 20, -1 },
1323
1324   /* GL_GREMEDY_string_marker */
1325   { "glStringMarkerGREMEDY", 15, -1 },
1326
1327   /* GL_EXT_window_rectangles */
1328   { "glWindowRectanglesEXT", 30, -1 },
1329
1330   /* GL_KHR_blend_equation_advanced */
1331   { "glBlendBarrierKHR", 20, -1 },
1332
1333   /* GL_ARB_sparse_buffer */
1334   { "glBufferPageCommitmentARB", 43, -1 },
1335   { "glNamedBufferPageCommitmentARB", 43, -1 },
1336   { "glNamedBufferPageCommitmentEXT", 43, -1 },
1337
1338   /* GL_ARB_bindless_texture */
1339   { "glGetTextureHandleARB", 40, -1 },
1340   { "glGetTextureSamplerHandleARB", 40, -1 },
1341   { "glMakeTextureHandleResidentARB", 40, -1 },
1342   { "glMakeTextureHandleNonResidentARB", 40, -1 },
1343   { "glIsTextureHandleResidentARB", 40, -1 },
1344   { "glGetImageHandleARB", 40, -1 },
1345   { "glMakeImageHandleResidentARB", 40, -1 },
1346   { "glMakeImageHandleNonResidentARB", 40, -1 },
1347   { "glIsImageHandleResidentARB", 40, -1 },
1348   { "glUniformHandleui64ARB", 40, -1 },
1349   { "glUniformHandleui64vARB", 40, -1 },
1350   { "glProgramUniformHandleui64ARB", 40, -1 },
1351   { "glProgramUniformHandleui64vARB", 40, -1 },
1352   { "glVertexAttribL1ui64ARB", 40, -1 },
1353   { "glVertexAttribL1ui64vARB", 40, -1 },
1354   { "glGetVertexAttribLui64vARB", 40, -1 },
1355
1356   /* GL_EXT_external_objects */
1357   { "glGetUnsignedBytevEXT", 45, -1 },
1358   { "glGetUnsignedBytei_vEXT", 45, -1 },
1359   { "glDeleteMemoryObjectsEXT", 45, -1 },
1360   { "glIsMemoryObjectEXT", 45, -1 },
1361   { "glCreateMemoryObjectsEXT", 45, -1 },
1362   { "glMemoryObjectParameterivEXT", 45, -1 },
1363   { "glGetMemoryObjectParameterivEXT", 45, -1 },
1364   { "glTexStorageMem2DEXT", 45, -1 },
1365   { "glTexStorageMem2DMultisampleEXT", 45, -1 },
1366   { "glTexStorageMem3DEXT", 45, -1 },
1367   { "glTexStorageMem3DMultisampleEXT", 45, -1 },
1368   { "glBufferStorageMemEXT", 45, -1 },
1369   { "glTextureStorageMem2DEXT", 45, -1 },
1370   { "glTextureStorageMem2DMultisampleEXT", 45, -1 },
1371   { "glTextureStorageMem3DEXT", 45, -1 },
1372   { "glTextureStorageMem3DMultisampleEXT", 45, -1 },
1373   { "glNamedBufferStorageMemEXT", 45, -1 },
1374   { "glTexStorageMem1DEXT", 45, -1 },
1375   { "glTextureStorageMem1DEXT", 45, -1 },
1376   { "glGenSemaphoresEXT", 45, -1 },
1377   { "glDeleteSemaphoresEXT", 45, -1 },
1378   { "glIsSemaphoreEXT", 45, -1 },
1379   { "glSemaphoreParameterui64vEXT", 45, -1 },
1380   { "glGetSemaphoreParameterui64vEXT", 45, -1 },
1381   { "glWaitSemaphoreEXT", 45, -1 },
1382   { "glSignalSemaphoreEXT", 45, -1 },
1383
1384   /* GL_EXT_external_objects_fd */
1385   { "glImportMemoryFdEXT", 45, -1 },
1386   { "glImportSemaphoreFdEXT", 45, -1 },
1387
1388   /* GL_ARB_gl_spirv */
1389   { "glSpecializeShaderARB", 45, -1 },
1390
1391   /* GL_EXT_shader_framebuffer_fetch_non_coherent */
1392   { "glFramebufferFetchBarrierEXT", 20, -1 },
1393
1394   /* GL_NV_conservative_raster */
1395   { "glSubpixelPrecisionBiasNV", 10, -1 },
1396
1397   /* GL_NV_conservative_raster_dilate */
1398   { "glConservativeRasterParameterfNV", 10, -1 },
1399
1400   /* GL_NV_conservative_raster_pre_snap_triangles */
1401   { "glConservativeRasterParameteriNV", 10, -1 },
1402
1403   /* GL_ARB_sample_locations */
1404   { "glFramebufferSampleLocationsfvARB", 30, -1 },
1405   { "glNamedFramebufferSampleLocationsfvARB", 30, -1 },
1406   { "glEvaluateDepthValuesARB", 30, -1 },
1407
1408   /* GL_ARB_indirect_parameters */
1409   { "glMultiDrawArraysIndirectCountARB", 11, -1 },
1410   { "glMultiDrawElementsIndirectCountARB", 11, -1 },
1411
1412   /* GL_AMD_framebuffer_multisample_advanced */
1413   { "glRenderbufferStorageMultisampleAdvancedAMD", 11, -1 },
1414   { "glNamedRenderbufferStorageMultisampleAdvancedAMD", 11, -1 },
1415
1416   { "glMaxShaderCompilerThreadsKHR", 11, -1 },
1417
1418   /* GL_EXT_shader_image_load_store */
1419   { "glBindImageTextureEXT", 30, -1 },
1420
1421   /* GL_MESA_framebuffer_flip_y */
1422   { "glFramebufferParameteriMESA", 43, -1 },
1423   { "glGetFramebufferParameterivMESA", 43, -1 },
1424
1425   /* GL_ARB_gpu_shader_int64 */
1426   { "glUniform1i64ARB", 40, -1 },
1427   { "glUniform2i64ARB", 40, -1 },
1428   { "glUniform3i64ARB", 40, -1 },
1429   { "glUniform4i64ARB", 40, -1 },
1430   { "glUniform1ui64ARB", 40, -1 },
1431   { "glUniform2ui64ARB", 40, -1 },
1432   { "glUniform3ui64ARB", 40, -1 },
1433   { "glUniform4ui64ARB", 40, -1 },
1434   { "glUniform1i64vARB", 40, -1 },
1435   { "glUniform2i64vARB", 40, -1 },
1436   { "glUniform3i64vARB", 40, -1 },
1437   { "glUniform4i64vARB", 40, -1 },
1438   { "glUniform1ui64vARB", 40, -1 },
1439   { "glUniform2ui64vARB", 40, -1 },
1440   { "glUniform3ui64vARB", 40, -1 },
1441   { "glUniform4ui64vARB", 40, -1 },
1442   { "glGetUniformi64vARB", 40, -1 },
1443   { "glGetUniformui64vARB", 40, -1 },
1444   { "glGetnUniformi64vARB", 40, -1 },
1445   { "glGetnUniformui64vARB", 40, -1 },
1446   { "glProgramUniform1i64ARB", 40, -1 },
1447   { "glProgramUniform2i64ARB", 40, -1 },
1448   { "glProgramUniform3i64ARB", 40, -1 },
1449   { "glProgramUniform4i64ARB", 40, -1 },
1450   { "glProgramUniform1ui64ARB", 40, -1 },
1451   { "glProgramUniform2ui64ARB", 40, -1 },
1452   { "glProgramUniform3ui64ARB", 40, -1 },
1453   { "glProgramUniform4ui64ARB", 40, -1 },
1454   { "glProgramUniform1i64vARB", 40, -1 },
1455   { "glProgramUniform2i64vARB", 40, -1 },
1456   { "glProgramUniform3i64vARB", 40, -1 },
1457   { "glProgramUniform4i64vARB", 40, -1 },
1458   { "glProgramUniform1ui64vARB", 40, -1 },
1459   { "glProgramUniform2ui64vARB", 40, -1 },
1460   { "glProgramUniform3ui64vARB", 40, -1 },
1461   { "glProgramUniform4ui64vARB", 40, -1 },
1462
1463   /* GL_NV_viewport_swizzle */
1464   { "glViewportSwizzleNV", 11, -1 },
1465
1466   /* ARB_ES3_2_compatibility */
1467   { "glPrimitiveBoundingBoxARB", 45, -1 },
1468
1469   { "glInternalBufferSubDataCopyMESA", 11, -1 },
1470   { "glInternalSetError", 20, -1 },
1471
1472   { NULL, 0, -1 }
1473};
1474
1475const struct function gl_compatibility_functions_possible[] = {
1476   { "glNewList", 10, _gloffset_NewList },
1477   { "glEndList", 10, _gloffset_EndList },
1478   { "glCallList", 10, _gloffset_CallList },
1479   { "glCallLists", 10, _gloffset_CallLists },
1480   { "glDeleteLists", 10, _gloffset_DeleteLists },
1481   { "glGenLists", 10, _gloffset_GenLists },
1482   { "glListBase", 10, _gloffset_ListBase },
1483   { "glBegin", 10, _gloffset_Begin },
1484   { "glBitmap", 10, _gloffset_Bitmap },
1485   { "glColor3b", 10, _gloffset_Color3b },
1486   { "glColor3bv", 10, _gloffset_Color3bv },
1487   { "glColor3d", 10, _gloffset_Color3d },
1488   { "glColor3dv", 10, _gloffset_Color3dv },
1489   { "glColor3f", 10, _gloffset_Color3f },
1490   { "glColor3fv", 10, _gloffset_Color3fv },
1491   { "glColor3i", 10, _gloffset_Color3i },
1492   { "glColor3iv", 10, _gloffset_Color3iv },
1493   { "glColor3s", 10, _gloffset_Color3s },
1494   { "glColor3sv", 10, _gloffset_Color3sv },
1495   { "glColor3ub", 10, _gloffset_Color3ub },
1496   { "glColor3ubv", 10, _gloffset_Color3ubv },
1497   { "glColor3ui", 10, _gloffset_Color3ui },
1498   { "glColor3uiv", 10, _gloffset_Color3uiv },
1499   { "glColor3us", 10, _gloffset_Color3us },
1500   { "glColor3usv", 10, _gloffset_Color3usv },
1501   { "glColor4b", 10, _gloffset_Color4b },
1502   { "glColor4bv", 10, _gloffset_Color4bv },
1503   { "glColor4d", 10, _gloffset_Color4d },
1504   { "glColor4dv", 10, _gloffset_Color4dv },
1505   { "glColor4f", 10, _gloffset_Color4f },
1506   { "glColor4fv", 10, _gloffset_Color4fv },
1507   { "glColor4i", 10, _gloffset_Color4i },
1508   { "glColor4iv", 10, _gloffset_Color4iv },
1509   { "glColor4s", 10, _gloffset_Color4s },
1510   { "glColor4sv", 10, _gloffset_Color4sv },
1511   { "glColor4ub", 10, _gloffset_Color4ub },
1512   { "glColor4ubv", 10, _gloffset_Color4ubv },
1513   { "glColor4ui", 10, _gloffset_Color4ui },
1514   { "glColor4uiv", 10, _gloffset_Color4uiv },
1515   { "glColor4us", 10, _gloffset_Color4us },
1516   { "glColor4usv", 10, _gloffset_Color4usv },
1517   { "glEdgeFlag", 10, _gloffset_EdgeFlag },
1518   { "glEdgeFlagv", 10, _gloffset_EdgeFlagv },
1519   { "glEnd", 10, _gloffset_End },
1520   { "glIndexd", 10, _gloffset_Indexd },
1521   { "glIndexdv", 10, _gloffset_Indexdv },
1522   { "glIndexf", 10, _gloffset_Indexf },
1523   { "glIndexfv", 10, _gloffset_Indexfv },
1524   { "glIndexi", 10, _gloffset_Indexi },
1525   { "glIndexiv", 10, _gloffset_Indexiv },
1526   { "glIndexs", 10, _gloffset_Indexs },
1527   { "glIndexsv", 10, _gloffset_Indexsv },
1528   { "glNormal3b", 10, _gloffset_Normal3b },
1529   { "glNormal3bv", 10, _gloffset_Normal3bv },
1530   { "glNormal3d", 10, _gloffset_Normal3d },
1531   { "glNormal3dv", 10, _gloffset_Normal3dv },
1532   { "glNormal3f", 10, _gloffset_Normal3f },
1533   { "glNormal3fv", 10, _gloffset_Normal3fv },
1534   { "glNormal3i", 10, _gloffset_Normal3i },
1535   { "glNormal3iv", 10, _gloffset_Normal3iv },
1536   { "glNormal3s", 10, _gloffset_Normal3s },
1537   { "glNormal3sv", 10, _gloffset_Normal3sv },
1538   { "glRasterPos2d", 10, _gloffset_RasterPos2d },
1539   { "glRasterPos2dv", 10, _gloffset_RasterPos2dv },
1540   { "glRasterPos2f", 10, _gloffset_RasterPos2f },
1541   { "glRasterPos2fv", 10, _gloffset_RasterPos2fv },
1542   { "glRasterPos2i", 10, _gloffset_RasterPos2i },
1543   { "glRasterPos2iv", 10, _gloffset_RasterPos2iv },
1544   { "glRasterPos2s", 10, _gloffset_RasterPos2s },
1545   { "glRasterPos2sv", 10, _gloffset_RasterPos2sv },
1546   { "glRasterPos3d", 10, _gloffset_RasterPos3d },
1547   { "glRasterPos3dv", 10, _gloffset_RasterPos3dv },
1548   { "glRasterPos3f", 10, _gloffset_RasterPos3f },
1549   { "glRasterPos3fv", 10, _gloffset_RasterPos3fv },
1550   { "glRasterPos3i", 10, _gloffset_RasterPos3i },
1551   { "glRasterPos3iv", 10, _gloffset_RasterPos3iv },
1552   { "glRasterPos3s", 10, _gloffset_RasterPos3s },
1553   { "glRasterPos3sv", 10, _gloffset_RasterPos3sv },
1554   { "glRasterPos4d", 10, _gloffset_RasterPos4d },
1555   { "glRasterPos4dv", 10, _gloffset_RasterPos4dv },
1556   { "glRasterPos4f", 10, _gloffset_RasterPos4f },
1557   { "glRasterPos4fv", 10, _gloffset_RasterPos4fv },
1558   { "glRasterPos4i", 10, _gloffset_RasterPos4i },
1559   { "glRasterPos4iv", 10, _gloffset_RasterPos4iv },
1560   { "glRasterPos4s", 10, _gloffset_RasterPos4s },
1561   { "glRasterPos4sv", 10, _gloffset_RasterPos4sv },
1562   { "glRectd", 10, _gloffset_Rectd },
1563   { "glRectdv", 10, _gloffset_Rectdv },
1564   { "glRectf", 10, _gloffset_Rectf },
1565   { "glRectfv", 10, _gloffset_Rectfv },
1566   { "glRecti", 10, _gloffset_Recti },
1567   { "glRectiv", 10, _gloffset_Rectiv },
1568   { "glRects", 10, _gloffset_Rects },
1569   { "glRectsv", 10, _gloffset_Rectsv },
1570   { "glTexCoord1d", 10, _gloffset_TexCoord1d },
1571   { "glTexCoord1dv", 10, _gloffset_TexCoord1dv },
1572   { "glTexCoord1f", 10, _gloffset_TexCoord1f },
1573   { "glTexCoord1fv", 10, _gloffset_TexCoord1fv },
1574   { "glTexCoord1i", 10, _gloffset_TexCoord1i },
1575   { "glTexCoord1iv", 10, _gloffset_TexCoord1iv },
1576   { "glTexCoord1s", 10, _gloffset_TexCoord1s },
1577   { "glTexCoord1sv", 10, _gloffset_TexCoord1sv },
1578   { "glTexCoord2d", 10, _gloffset_TexCoord2d },
1579   { "glTexCoord2dv", 10, _gloffset_TexCoord2dv },
1580   { "glTexCoord2f", 10, _gloffset_TexCoord2f },
1581   { "glTexCoord2fv", 10, _gloffset_TexCoord2fv },
1582   { "glTexCoord2i", 10, _gloffset_TexCoord2i },
1583   { "glTexCoord2iv", 10, _gloffset_TexCoord2iv },
1584   { "glTexCoord2s", 10, _gloffset_TexCoord2s },
1585   { "glTexCoord2sv", 10, _gloffset_TexCoord2sv },
1586   { "glTexCoord3d", 10, _gloffset_TexCoord3d },
1587   { "glTexCoord3dv", 10, _gloffset_TexCoord3dv },
1588   { "glTexCoord3f", 10, _gloffset_TexCoord3f },
1589   { "glTexCoord3fv", 10, _gloffset_TexCoord3fv },
1590   { "glTexCoord3i", 10, _gloffset_TexCoord3i },
1591   { "glTexCoord3iv", 10, _gloffset_TexCoord3iv },
1592   { "glTexCoord3s", 10, _gloffset_TexCoord3s },
1593   { "glTexCoord3sv", 10, _gloffset_TexCoord3sv },
1594   { "glTexCoord4d", 10, _gloffset_TexCoord4d },
1595   { "glTexCoord4dv", 10, _gloffset_TexCoord4dv },
1596   { "glTexCoord4f", 10, _gloffset_TexCoord4f },
1597   { "glTexCoord4fv", 10, _gloffset_TexCoord4fv },
1598   { "glTexCoord4i", 10, _gloffset_TexCoord4i },
1599   { "glTexCoord4iv", 10, _gloffset_TexCoord4iv },
1600   { "glTexCoord4s", 10, _gloffset_TexCoord4s },
1601   { "glTexCoord4sv", 10, _gloffset_TexCoord4sv },
1602   { "glVertex2d", 10, _gloffset_Vertex2d },
1603   { "glVertex2dv", 10, _gloffset_Vertex2dv },
1604   { "glVertex2f", 10, _gloffset_Vertex2f },
1605   { "glVertex2fv", 10, _gloffset_Vertex2fv },
1606   { "glVertex2i", 10, _gloffset_Vertex2i },
1607   { "glVertex2iv", 10, _gloffset_Vertex2iv },
1608   { "glVertex2s", 10, _gloffset_Vertex2s },
1609   { "glVertex2sv", 10, _gloffset_Vertex2sv },
1610   { "glVertex3d", 10, _gloffset_Vertex3d },
1611   { "glVertex3dv", 10, _gloffset_Vertex3dv },
1612   { "glVertex3f", 10, _gloffset_Vertex3f },
1613   { "glVertex3fv", 10, _gloffset_Vertex3fv },
1614   { "glVertex3i", 10, _gloffset_Vertex3i },
1615   { "glVertex3iv", 10, _gloffset_Vertex3iv },
1616   { "glVertex3s", 10, _gloffset_Vertex3s },
1617   { "glVertex3sv", 10, _gloffset_Vertex3sv },
1618   { "glVertex4d", 10, _gloffset_Vertex4d },
1619   { "glVertex4dv", 10, _gloffset_Vertex4dv },
1620   { "glVertex4f", 10, _gloffset_Vertex4f },
1621   { "glVertex4fv", 10, _gloffset_Vertex4fv },
1622   { "glVertex4i", 10, _gloffset_Vertex4i },
1623   { "glVertex4iv", 10, _gloffset_Vertex4iv },
1624   { "glVertex4s", 10, _gloffset_Vertex4s },
1625   { "glVertex4sv", 10, _gloffset_Vertex4sv },
1626   { "glClipPlane", 10, _gloffset_ClipPlane },
1627   { "glColorMaterial", 10, _gloffset_ColorMaterial },
1628   { "glFogf", 10, _gloffset_Fogf },
1629   { "glFogfv", 10, _gloffset_Fogfv },
1630   { "glFogi", 10, _gloffset_Fogi },
1631   { "glFogiv", 10, _gloffset_Fogiv },
1632   { "glLightf", 10, _gloffset_Lightf },
1633   { "glLightfv", 10, _gloffset_Lightfv },
1634   { "glLighti", 10, _gloffset_Lighti },
1635   { "glLightiv", 10, _gloffset_Lightiv },
1636   { "glLightModelf", 10, _gloffset_LightModelf },
1637   { "glLightModelfv", 10, _gloffset_LightModelfv },
1638   { "glLightModeli", 10, _gloffset_LightModeli },
1639   { "glLightModeliv", 10, _gloffset_LightModeliv },
1640   { "glLineStipple", 10, _gloffset_LineStipple },
1641   { "glMaterialf", 10, _gloffset_Materialf },
1642   { "glMaterialfv", 10, _gloffset_Materialfv },
1643   { "glMateriali", 10, _gloffset_Materiali },
1644   { "glMaterialiv", 10, _gloffset_Materialiv },
1645   { "glPolygonStipple", 10, _gloffset_PolygonStipple },
1646   { "glShadeModel", 10, _gloffset_ShadeModel },
1647   { "glTexEnvf", 10, _gloffset_TexEnvf },
1648   { "glTexEnvfv", 10, _gloffset_TexEnvfv },
1649   { "glTexEnvi", 10, _gloffset_TexEnvi },
1650   { "glTexEnviv", 10, _gloffset_TexEnviv },
1651   { "glTexGend", 10, _gloffset_TexGend },
1652   { "glTexGendv", 10, _gloffset_TexGendv },
1653   { "glTexGenf", 10, _gloffset_TexGenf },
1654   { "glTexGenfv", 10, _gloffset_TexGenfv },
1655   { "glTexGeni", 10, _gloffset_TexGeni },
1656   { "glTexGeniv", 10, _gloffset_TexGeniv },
1657   { "glFeedbackBuffer", 10, _gloffset_FeedbackBuffer },
1658   { "glSelectBuffer", 10, _gloffset_SelectBuffer },
1659   { "glRenderMode", 10, _gloffset_RenderMode },
1660   { "glInitNames", 10, _gloffset_InitNames },
1661   { "glLoadName", 10, _gloffset_LoadName },
1662   { "glPassThrough", 10, _gloffset_PassThrough },
1663   { "glPopName", 10, _gloffset_PopName },
1664   { "glPushName", 10, _gloffset_PushName },
1665   { "glClearAccum", 10, _gloffset_ClearAccum },
1666   { "glClearIndex", 10, _gloffset_ClearIndex },
1667   { "glIndexMask", 10, _gloffset_IndexMask },
1668   { "glAccum", 10, _gloffset_Accum },
1669   { "glPopAttrib", 10, _gloffset_PopAttrib },
1670   { "glPushAttrib", 10, _gloffset_PushAttrib },
1671   { "glMap1d", 10, _gloffset_Map1d },
1672   { "glMap1f", 10, _gloffset_Map1f },
1673   { "glMap2d", 10, _gloffset_Map2d },
1674   { "glMap2f", 10, _gloffset_Map2f },
1675   { "glMapGrid1d", 10, _gloffset_MapGrid1d },
1676   { "glMapGrid1f", 10, _gloffset_MapGrid1f },
1677   { "glMapGrid2d", 10, _gloffset_MapGrid2d },
1678   { "glMapGrid2f", 10, _gloffset_MapGrid2f },
1679   { "glEvalCoord1d", 10, _gloffset_EvalCoord1d },
1680   { "glEvalCoord1dv", 10, _gloffset_EvalCoord1dv },
1681   { "glEvalCoord1f", 10, _gloffset_EvalCoord1f },
1682   { "glEvalCoord1fv", 10, _gloffset_EvalCoord1fv },
1683   { "glEvalCoord2d", 10, _gloffset_EvalCoord2d },
1684   { "glEvalCoord2dv", 10, _gloffset_EvalCoord2dv },
1685   { "glEvalCoord2f", 10, _gloffset_EvalCoord2f },
1686   { "glEvalCoord2fv", 10, _gloffset_EvalCoord2fv },
1687   { "glEvalMesh1", 10, _gloffset_EvalMesh1 },
1688   { "glEvalPoint1", 10, _gloffset_EvalPoint1 },
1689   { "glEvalMesh2", 10, _gloffset_EvalMesh2 },
1690   { "glEvalPoint2", 10, _gloffset_EvalPoint2 },
1691   { "glAlphaFunc", 10, _gloffset_AlphaFunc },
1692   { "glPixelZoom", 10, _gloffset_PixelZoom },
1693   { "glPixelTransferf", 10, _gloffset_PixelTransferf },
1694   { "glPixelTransferi", 10, _gloffset_PixelTransferi },
1695   { "glPixelMapfv", 10, _gloffset_PixelMapfv },
1696   { "glPixelMapuiv", 10, _gloffset_PixelMapuiv },
1697   { "glPixelMapusv", 10, _gloffset_PixelMapusv },
1698   { "glCopyPixels", 10, _gloffset_CopyPixels },
1699   { "glDrawPixels", 10, _gloffset_DrawPixels },
1700   { "glGetClipPlane", 10, _gloffset_GetClipPlane },
1701   { "glGetLightfv", 10, _gloffset_GetLightfv },
1702   { "glGetLightiv", 10, _gloffset_GetLightiv },
1703   { "glGetMapdv", 10, _gloffset_GetMapdv },
1704   { "glGetMapfv", 10, _gloffset_GetMapfv },
1705   { "glGetMapiv", 10, _gloffset_GetMapiv },
1706   { "glGetMaterialfv", 10, _gloffset_GetMaterialfv },
1707   { "glGetMaterialiv", 10, _gloffset_GetMaterialiv },
1708   { "glGetPixelMapfv", 10, _gloffset_GetPixelMapfv },
1709   { "glGetPixelMapuiv", 10, _gloffset_GetPixelMapuiv },
1710   { "glGetPixelMapusv", 10, _gloffset_GetPixelMapusv },
1711   { "glGetPolygonStipple", 10, _gloffset_GetPolygonStipple },
1712   { "glGetTexEnvfv", 10, _gloffset_GetTexEnvfv },
1713   { "glGetTexEnviv", 10, _gloffset_GetTexEnviv },
1714   { "glGetTexGendv", 10, _gloffset_GetTexGendv },
1715   { "glGetTexGenfv", 10, _gloffset_GetTexGenfv },
1716   { "glGetTexGeniv", 10, _gloffset_GetTexGeniv },
1717   { "glIsList", 10, _gloffset_IsList },
1718   { "glFrustum", 10, _gloffset_Frustum },
1719   { "glLoadIdentity", 10, _gloffset_LoadIdentity },
1720   { "glLoadMatrixf", 10, _gloffset_LoadMatrixf },
1721   { "glLoadMatrixd", 10, _gloffset_LoadMatrixd },
1722   { "glMatrixMode", 10, _gloffset_MatrixMode },
1723   { "glMultMatrixf", 10, _gloffset_MultMatrixf },
1724   { "glMultMatrixd", 10, _gloffset_MultMatrixd },
1725   { "glOrtho", 10, _gloffset_Ortho },
1726   { "glPopMatrix", 10, _gloffset_PopMatrix },
1727   { "glPushMatrix", 10, _gloffset_PushMatrix },
1728   { "glRotated", 10, _gloffset_Rotated },
1729   { "glRotatef", 10, _gloffset_Rotatef },
1730   { "glScaled", 10, _gloffset_Scaled },
1731   { "glScalef", 10, _gloffset_Scalef },
1732   { "glTranslated", 10, _gloffset_Translated },
1733   { "glTranslatef", 10, _gloffset_Translatef },
1734   { "glArrayElement", 10, _gloffset_ArrayElement },
1735   { "glColorPointer", 10, _gloffset_ColorPointer },
1736   { "glDisableClientState", 10, _gloffset_DisableClientState },
1737   { "glEdgeFlagPointer", 10, _gloffset_EdgeFlagPointer },
1738   { "glEnableClientState", 10, _gloffset_EnableClientState },
1739   { "glIndexPointer", 10, _gloffset_IndexPointer },
1740   { "glInterleavedArrays", 10, _gloffset_InterleavedArrays },
1741   { "glNormalPointer", 10, _gloffset_NormalPointer },
1742   { "glTexCoordPointer", 10, _gloffset_TexCoordPointer },
1743   { "glVertexPointer", 10, _gloffset_VertexPointer },
1744   { "glAreTexturesResident", 10, _gloffset_AreTexturesResident },
1745   { "glPrioritizeTextures", 10, _gloffset_PrioritizeTextures },
1746   { "glIndexub", 10, _gloffset_Indexub },
1747   { "glIndexubv", 10, _gloffset_Indexubv },
1748   { "glPopClientAttrib", 10, _gloffset_PopClientAttrib },
1749   { "glPushClientAttrib", 10, _gloffset_PushClientAttrib },
1750   { "glColorTable", 10, _gloffset_ColorTable },
1751   { "glColorTableParameterfv", 10, _gloffset_ColorTableParameterfv },
1752   { "glColorTableParameteriv", 10, _gloffset_ColorTableParameteriv },
1753   { "glCopyColorTable", 10, _gloffset_CopyColorTable },
1754   { "glGetColorTable", 10, _gloffset_GetColorTable },
1755   { "glGetColorTableParameterfv", 10, _gloffset_GetColorTableParameterfv },
1756   { "glGetColorTableParameteriv", 10, _gloffset_GetColorTableParameteriv },
1757   { "glColorSubTable", 10, _gloffset_ColorSubTable },
1758   { "glCopyColorSubTable", 10, _gloffset_CopyColorSubTable },
1759   { "glConvolutionFilter1D", 10, _gloffset_ConvolutionFilter1D },
1760   { "glConvolutionFilter2D", 10, _gloffset_ConvolutionFilter2D },
1761   { "glConvolutionParameterf", 10, _gloffset_ConvolutionParameterf },
1762   { "glConvolutionParameterfv", 10, _gloffset_ConvolutionParameterfv },
1763   { "glConvolutionParameteri", 10, _gloffset_ConvolutionParameteri },
1764   { "glConvolutionParameteriv", 10, _gloffset_ConvolutionParameteriv },
1765   { "glCopyConvolutionFilter1D", 10, _gloffset_CopyConvolutionFilter1D },
1766   { "glCopyConvolutionFilter2D", 10, _gloffset_CopyConvolutionFilter2D },
1767   { "glGetConvolutionFilter", 10, _gloffset_GetConvolutionFilter },
1768   { "glGetConvolutionParameterfv", 10, _gloffset_GetConvolutionParameterfv },
1769   { "glGetConvolutionParameteriv", 10, _gloffset_GetConvolutionParameteriv },
1770   { "glGetSeparableFilter", 10, _gloffset_GetSeparableFilter },
1771   { "glSeparableFilter2D", 10, _gloffset_SeparableFilter2D },
1772   { "glGetHistogram", 10, _gloffset_GetHistogram },
1773   { "glGetHistogramParameterfv", 10, _gloffset_GetHistogramParameterfv },
1774   { "glGetHistogramParameteriv", 10, _gloffset_GetHistogramParameteriv },
1775   { "glGetMinmax", 10, _gloffset_GetMinmax },
1776   { "glGetMinmaxParameterfv", 10, _gloffset_GetMinmaxParameterfv },
1777   { "glGetMinmaxParameteriv", 10, _gloffset_GetMinmaxParameteriv },
1778   { "glHistogram", 10, _gloffset_Histogram },
1779   { "glMinmax", 10, _gloffset_Minmax },
1780   { "glResetHistogram", 10, _gloffset_ResetHistogram },
1781   { "glResetMinmax", 10, _gloffset_ResetMinmax },
1782   { "glClientActiveTexture", 10, _gloffset_ClientActiveTexture },
1783   { "glMultiTexCoord1d", 10, _gloffset_MultiTexCoord1d },
1784   { "glMultiTexCoord1dv", 10, _gloffset_MultiTexCoord1dv },
1785   { "glMultiTexCoord1f", 10, _gloffset_MultiTexCoord1fARB },
1786   { "glMultiTexCoord1fv", 10, _gloffset_MultiTexCoord1fvARB },
1787   { "glMultiTexCoord1i", 10, _gloffset_MultiTexCoord1i },
1788   { "glMultiTexCoord1iv", 10, _gloffset_MultiTexCoord1iv },
1789   { "glMultiTexCoord1s", 10, _gloffset_MultiTexCoord1s },
1790   { "glMultiTexCoord1sv", 10, _gloffset_MultiTexCoord1sv },
1791   { "glMultiTexCoord2d", 10, _gloffset_MultiTexCoord2d },
1792   { "glMultiTexCoord2dv", 10, _gloffset_MultiTexCoord2dv },
1793   { "glMultiTexCoord2f", 10, _gloffset_MultiTexCoord2fARB },
1794   { "glMultiTexCoord2fv", 10, _gloffset_MultiTexCoord2fvARB },
1795   { "glMultiTexCoord2i", 10, _gloffset_MultiTexCoord2i },
1796   { "glMultiTexCoord2iv", 10, _gloffset_MultiTexCoord2iv },
1797   { "glMultiTexCoord2s", 10, _gloffset_MultiTexCoord2s },
1798   { "glMultiTexCoord2sv", 10, _gloffset_MultiTexCoord2sv },
1799   { "glMultiTexCoord3d", 10, _gloffset_MultiTexCoord3d },
1800   { "glMultiTexCoord3dv", 10, _gloffset_MultiTexCoord3dv },
1801   { "glMultiTexCoord3f", 10, _gloffset_MultiTexCoord3fARB },
1802   { "glMultiTexCoord3fv", 10, _gloffset_MultiTexCoord3fvARB },
1803   { "glMultiTexCoord3i", 10, _gloffset_MultiTexCoord3i },
1804   { "glMultiTexCoord3iv", 10, _gloffset_MultiTexCoord3iv },
1805   { "glMultiTexCoord3s", 10, _gloffset_MultiTexCoord3s },
1806   { "glMultiTexCoord3sv", 10, _gloffset_MultiTexCoord3sv },
1807   { "glMultiTexCoord4d", 10, _gloffset_MultiTexCoord4d },
1808   { "glMultiTexCoord4dv", 10, _gloffset_MultiTexCoord4dv },
1809   { "glMultiTexCoord4f", 10, _gloffset_MultiTexCoord4fARB },
1810   { "glMultiTexCoord4fv", 10, _gloffset_MultiTexCoord4fvARB },
1811   { "glMultiTexCoord4i", 10, _gloffset_MultiTexCoord4i },
1812   { "glMultiTexCoord4iv", 10, _gloffset_MultiTexCoord4iv },
1813   { "glMultiTexCoord4s", 10, _gloffset_MultiTexCoord4s },
1814   { "glMultiTexCoord4sv", 10, _gloffset_MultiTexCoord4sv },
1815   { "glLoadTransposeMatrixf", 10, -1 },
1816   { "glLoadTransposeMatrixd", 10, -1 },
1817   { "glMultTransposeMatrixf", 10, -1 },
1818   { "glMultTransposeMatrixd", 10, -1 },
1819   { "glFogCoordf", 10, -1 },
1820   { "glFogCoordfv", 10, -1 },
1821   { "glFogCoordd", 10, -1 },
1822   { "glFogCoorddv", 10, -1 },
1823   { "glFogCoordPointer", 10, -1 },
1824   { "glSecondaryColor3b", 10, -1 },
1825   { "glSecondaryColor3bv", 10, -1 },
1826   { "glSecondaryColor3d", 10, -1 },
1827   { "glSecondaryColor3dv", 10, -1 },
1828   { "glSecondaryColor3f", 10, -1 },
1829   { "glSecondaryColor3fv", 10, -1 },
1830   { "glSecondaryColor3i", 10, -1 },
1831   { "glSecondaryColor3iv", 10, -1 },
1832   { "glSecondaryColor3s", 10, -1 },
1833   { "glSecondaryColor3sv", 10, -1 },
1834   { "glSecondaryColor3ub", 10, -1 },
1835   { "glSecondaryColor3ubv", 10, -1 },
1836   { "glSecondaryColor3ui", 10, -1 },
1837   { "glSecondaryColor3uiv", 10, -1 },
1838   { "glSecondaryColor3us", 10, -1 },
1839   { "glSecondaryColor3usv", 10, -1 },
1840   { "glSecondaryColorPointer", 10, -1 },
1841   { "glWindowPos2d", 10, -1 },
1842   { "glWindowPos2dv", 10, -1 },
1843   { "glWindowPos2f", 10, -1 },
1844   { "glWindowPos2fv", 10, -1 },
1845   { "glWindowPos2i", 10, -1 },
1846   { "glWindowPos2iv", 10, -1 },
1847   { "glWindowPos2s", 10, -1 },
1848   { "glWindowPos2sv", 10, -1 },
1849   { "glWindowPos3d", 10, -1 },
1850   { "glWindowPos3dv", 10, -1 },
1851   { "glWindowPos3f", 10, -1 },
1852   { "glWindowPos3fv", 10, -1 },
1853   { "glWindowPos3i", 10, -1 },
1854   { "glWindowPos3iv", 10, -1 },
1855   { "glWindowPos3s", 10, -1 },
1856   { "glWindowPos3sv", 10, -1 },
1857   { "glProgramStringARB", 10, -1 },
1858   { "glProgramEnvParameter4dARB", 10, -1 },
1859   { "glProgramEnvParameter4dvARB", 10, -1 },
1860   { "glProgramEnvParameter4fARB", 10, -1 },
1861   { "glProgramEnvParameter4fvARB", 10, -1 },
1862   { "glProgramLocalParameter4dARB", 10, -1 },
1863   { "glProgramLocalParameter4dvARB", 10, -1 },
1864   { "glProgramLocalParameter4fARB", 10, -1 },
1865   { "glProgramLocalParameter4fvARB", 10, -1 },
1866   { "glGetProgramEnvParameterdvARB", 10, -1 },
1867   { "glGetProgramEnvParameterfvARB", 10, -1 },
1868   { "glGetProgramLocalParameterdvARB", 10, -1 },
1869   { "glGetProgramLocalParameterfvARB", 10, -1 },
1870   { "glGetProgramivARB", 10, -1 },
1871   { "glGetProgramStringARB", 10, -1 },
1872   { "glColorPointerEXT", 10, -1 },
1873   { "glEdgeFlagPointerEXT", 10, -1 },
1874   { "glIndexPointerEXT", 10, -1 },
1875   { "glNormalPointerEXT", 10, -1 },
1876   { "glTexCoordPointerEXT", 10, -1 },
1877   { "glVertexPointerEXT", 10, -1 },
1878   { "glLockArraysEXT", 10, -1 },
1879   { "glUnlockArraysEXT", 10, -1 },
1880   { "glWindowPos4dMESA", 10, -1 },
1881   { "glWindowPos4dvMESA", 10, -1 },
1882   { "glWindowPos4fMESA", 10, -1 },
1883   { "glWindowPos4fvMESA", 10, -1 },
1884   { "glWindowPos4iMESA", 10, -1 },
1885   { "glWindowPos4ivMESA", 10, -1 },
1886   { "glWindowPos4sMESA", 10, -1 },
1887   { "glWindowPos4svMESA", 10, -1 },
1888   { "glBindProgramNV", 10, -1 },
1889   { "glDeleteProgramsNV", 10, -1 },
1890   { "glGenProgramsNV", 10, -1 },
1891   { "glIsProgramNV", 10, -1 },
1892   { "glVertexAttrib1sNV", 10, -1 },
1893   { "glVertexAttrib1svNV", 10, -1 },
1894   { "glVertexAttrib2sNV", 10, -1 },
1895   { "glVertexAttrib2svNV", 10, -1 },
1896   { "glVertexAttrib3sNV", 10, -1 },
1897   { "glVertexAttrib3svNV", 10, -1 },
1898   { "glVertexAttrib4sNV", 10, -1 },
1899   { "glVertexAttrib4svNV", 10, -1 },
1900   { "glVertexAttrib1fNV", 10, -1 },
1901   { "glVertexAttrib1fvNV", 10, -1 },
1902   { "glVertexAttrib2fNV", 10, -1 },
1903   { "glVertexAttrib2fvNV", 10, -1 },
1904   { "glVertexAttrib3fNV", 10, -1 },
1905   { "glVertexAttrib3fvNV", 10, -1 },
1906   { "glVertexAttrib4fNV", 10, -1 },
1907   { "glVertexAttrib4fvNV", 10, -1 },
1908   { "glVertexAttrib1dNV", 10, -1 },
1909   { "glVertexAttrib1dvNV", 10, -1 },
1910   { "glVertexAttrib2dNV", 10, -1 },
1911   { "glVertexAttrib2dvNV", 10, -1 },
1912   { "glVertexAttrib3dNV", 10, -1 },
1913   { "glVertexAttrib3dvNV", 10, -1 },
1914   { "glVertexAttrib4dNV", 10, -1 },
1915   { "glVertexAttrib4dvNV", 10, -1 },
1916   { "glVertexAttrib4ubNV", 10, -1 },
1917   { "glVertexAttrib4ubvNV", 10, -1 },
1918   { "glVertexAttribs1svNV", 10, -1 },
1919   { "glVertexAttribs2svNV", 10, -1 },
1920   { "glVertexAttribs3svNV", 10, -1 },
1921   { "glVertexAttribs4svNV", 10, -1 },
1922   { "glVertexAttribs1fvNV", 10, -1 },
1923   { "glVertexAttribs2fvNV", 10, -1 },
1924   { "glVertexAttribs3fvNV", 10, -1 },
1925   { "glVertexAttribs4fvNV", 10, -1 },
1926   { "glVertexAttribs1dvNV", 10, -1 },
1927   { "glVertexAttribs2dvNV", 10, -1 },
1928   { "glVertexAttribs3dvNV", 10, -1 },
1929   { "glVertexAttribs4dvNV", 10, -1 },
1930   { "glVertexAttribs4ubvNV", 10, -1 },
1931   { "glGenFragmentShadersATI", 10, -1 },
1932   { "glBindFragmentShaderATI", 10, -1 },
1933   { "glDeleteFragmentShaderATI", 10, -1 },
1934   { "glBeginFragmentShaderATI", 10, -1 },
1935   { "glEndFragmentShaderATI", 10, -1 },
1936   { "glPassTexCoordATI", 10, -1 },
1937   { "glSampleMapATI", 10, -1 },
1938   { "glColorFragmentOp1ATI", 10, -1 },
1939   { "glColorFragmentOp2ATI", 10, -1 },
1940   { "glColorFragmentOp3ATI", 10, -1 },
1941   { "glAlphaFragmentOp1ATI", 10, -1 },
1942   { "glAlphaFragmentOp2ATI", 10, -1 },
1943   { "glAlphaFragmentOp3ATI", 10, -1 },
1944   { "glSetFragmentShaderConstantATI", 10, -1 },
1945   { "glActiveStencilFaceEXT", 10, -1 },
1946   { "glStencilFuncSeparateATI", 10, -1 },
1947   { "glProgramEnvParameters4fvEXT", 10, -1 },
1948   { "glProgramLocalParameters4fvEXT", 10, -1 },
1949   { "glPrimitiveRestartNV", 10, -1 },
1950
1951   /* GL_NV_half_float */
1952   { "glVertex2hNV", 13, -1 },
1953   { "glVertex2hvNV", 13, -1 },
1954   { "glVertex3hNV", 13, -1 },
1955   { "glVertex3hvNV", 13, -1 },
1956   { "glVertex4hNV", 13, -1 },
1957   { "glVertex4hvNV", 13, -1 },
1958   { "glNormal3hNV", 13, -1 },
1959   { "glNormal3hvNV", 13, -1 },
1960   { "glColor3hNV", 13, -1 },
1961   { "glColor3hvNV", 13, -1 },
1962   { "glColor4hNV", 13, -1 },
1963   { "glColor4hvNV", 13, -1 },
1964   { "glTexCoord1hNV", 13, -1 },
1965   { "glTexCoord1hvNV", 13, -1 },
1966   { "glTexCoord2hNV", 13, -1 },
1967   { "glTexCoord2hvNV", 13, -1 },
1968   { "glTexCoord3hNV", 13, -1 },
1969   { "glTexCoord3hvNV", 13, -1 },
1970   { "glTexCoord4hNV", 13, -1 },
1971   { "glTexCoord4hvNV", 13, -1 },
1972   { "glMultiTexCoord1hNV", 13, -1 },
1973   { "glMultiTexCoord1hvNV", 13, -1 },
1974   { "glMultiTexCoord2hNV", 13, -1 },
1975   { "glMultiTexCoord2hvNV", 13, -1 },
1976   { "glMultiTexCoord3hNV", 13, -1 },
1977   { "glMultiTexCoord3hvNV", 13, -1 },
1978   { "glMultiTexCoord4hNV", 13, -1 },
1979   { "glMultiTexCoord4hvNV", 13, -1 },
1980   { "glFogCoordhNV", 13, -1 },
1981   { "glFogCoordhvNV", 13, -1 },
1982   { "glSecondaryColor3hNV", 13, -1 },
1983   { "glSecondaryColor3hvNV", 13, -1 },
1984   { "glVertexAttrib1hNV", 13, -1 },
1985   { "glVertexAttrib1hvNV", 13, -1 },
1986   { "glVertexAttrib2hNV", 13, -1 },
1987   { "glVertexAttrib2hvNV", 13, -1 },
1988   { "glVertexAttrib3hNV", 13, -1 },
1989   { "glVertexAttrib3hvNV", 13, -1 },
1990   { "glVertexAttrib4hNV", 13, -1 },
1991   { "glVertexAttrib4hvNV", 13, -1 },
1992   { "glVertexAttribs1hvNV", 13, -1 },
1993   { "glVertexAttribs2hvNV", 13, -1 },
1994   { "glVertexAttribs3hvNV", 13, -1 },
1995   { "glVertexAttribs4hvNV", 13, -1 },
1996
1997   { NULL, 0, -1 }
1998};
1999
2000const struct function gl_core_functions_possible[] = {
2001   /* GL_ARB_gl_spirv */
2002   { "glSpecializeShaderARB", 45, -1 },
2003
2004   { NULL, 0, -1 }
2005};
2006
2007const struct function gles11_functions_possible[] = {
2008   { "glActiveTexture", 11, _gloffset_ActiveTexture },
2009   { "glAlphaFunc", 11, _gloffset_AlphaFunc },
2010   { "glAlphaFuncx", 11, -1 },
2011   { "glBindBuffer", 11, -1 },
2012   { "glBindFramebufferOES", 11, -1 },
2013   { "glBindRenderbufferOES", 11, -1 },
2014   { "glBindTexture", 11, _gloffset_BindTexture },
2015   { "glBlendEquationOES", 11, _gloffset_BlendEquation },
2016   { "glBlendEquationSeparateOES", 11, -1 },
2017   { "glBlendFunc", 11, _gloffset_BlendFunc },
2018   { "glBlendFuncSeparateOES", 11, -1 },
2019   { "glBufferData", 11, -1 },
2020   { "glBufferSubData", 11, -1 },
2021   { "glCheckFramebufferStatusOES", 11, -1 },
2022   { "glClear", 11, _gloffset_Clear },
2023   { "glClearColor", 11, _gloffset_ClearColor },
2024   { "glClearColorx", 11, -1 },
2025   { "glClearDepthf", 11, -1 },
2026   { "glClearDepthx", 11, -1 },
2027   { "glClearStencil", 11, _gloffset_ClearStencil },
2028   { "glClientActiveTexture", 11, _gloffset_ClientActiveTexture },
2029   { "glClipPlanef", 11, -1 },
2030   { "glClipPlanex", 11, -1 },
2031   { "glColor4f", 11, _gloffset_Color4f },
2032   { "glColor4ub", 11, _gloffset_Color4ub },
2033   { "glColor4x", 11, -1 },
2034   { "glColorMask", 11, _gloffset_ColorMask },
2035   { "glColorPointer", 11, _gloffset_ColorPointer },
2036   { "glCompressedTexImage2D", 11, -1 },
2037   { "glCompressedTexSubImage2D", 11, -1 },
2038   { "glCopyTexImage2D", 11, _gloffset_CopyTexImage2D },
2039   { "glCopyTexSubImage2D", 11, _gloffset_CopyTexSubImage2D },
2040   { "glCullFace", 11, _gloffset_CullFace },
2041   { "glDeleteBuffers", 11, -1 },
2042   { "glDeleteFramebuffersOES", 11, -1 },
2043   { "glDeleteRenderbuffersOES", 11, -1 },
2044   { "glDeleteTextures", 11, _gloffset_DeleteTextures },
2045   { "glDepthFunc", 11, _gloffset_DepthFunc },
2046   { "glDepthMask", 11, _gloffset_DepthMask },
2047   { "glDepthRangef", 11, -1 },
2048   { "glDepthRangex", 11, -1 },
2049   { "glDisable", 11, _gloffset_Disable },
2050   { "glDiscardFramebufferEXT", 11, -1 },
2051   { "glDisableClientState", 11, _gloffset_DisableClientState },
2052   { "glDrawArrays", 11, _gloffset_DrawArrays },
2053   { "glDrawElements", 11, _gloffset_DrawElements },
2054   { "glDrawTexfOES", 11, -1 },
2055   { "glDrawTexfvOES", 11, -1 },
2056   { "glDrawTexiOES", 11, -1 },
2057   { "glDrawTexivOES", 11, -1 },
2058   { "glDrawTexsOES", 11, -1 },
2059   { "glDrawTexsvOES", 11, -1 },
2060   { "glDrawTexxOES", 11, -1 },
2061   { "glDrawTexxvOES", 11, -1 },
2062   { "glEGLImageTargetRenderbufferStorageOES", 11, -1 },
2063   { "glEGLImageTargetTexture2DOES", 11, -1 },
2064   { "glEnable", 11, _gloffset_Enable },
2065   { "glEnableClientState", 11, _gloffset_EnableClientState },
2066   { "glFinish", 11, _gloffset_Finish },
2067   { "glFlush", 11, _gloffset_Flush },
2068   { "glFlushMappedBufferRangeEXT", 11, -1 },
2069   { "glFogf", 11, _gloffset_Fogf },
2070   { "glFogfv", 11, _gloffset_Fogfv },
2071   { "glFogx", 11, -1 },
2072   { "glFogxv", 11, -1 },
2073   { "glFramebufferRenderbufferOES", 11, -1 },
2074   { "glFramebufferTexture2DOES", 11, -1 },
2075   { "glFrontFace", 11, _gloffset_FrontFace },
2076   { "glFrustumf", 11, -1 },
2077   { "glFrustumx", 11, -1 },
2078   { "glGenBuffers", 11, -1 },
2079   { "glGenFramebuffersOES", 11, -1 },
2080   { "glGenRenderbuffersOES", 11, -1 },
2081   { "glGenTextures", 11, _gloffset_GenTextures },
2082   { "glGenerateMipmapOES", 11, -1 },
2083   { "glGetBooleanv", 11, _gloffset_GetBooleanv },
2084   { "glGetBufferParameteriv", 11, -1 },
2085   { "glGetBufferPointervOES", 11, -1 },
2086   { "glGetClipPlanef", 11, -1 },
2087   { "glGetClipPlanex", 11, -1 },
2088   { "glGetError", 11, _gloffset_GetError },
2089   { "glGetFixedv", 11, -1 },
2090   { "glGetFloatv", 11, _gloffset_GetFloatv },
2091   { "glGetFramebufferAttachmentParameterivOES", 11, -1 },
2092   { "glGetIntegerv", 11, _gloffset_GetIntegerv },
2093   { "glGetLightfv", 11, _gloffset_GetLightfv },
2094   { "glGetLightxv", 11, -1 },
2095   { "glGetMaterialfv", 11, _gloffset_GetMaterialfv },
2096   { "glGetMaterialxv", 11, -1 },
2097   // We check for the aliased -KHR version in GLES 1.1
2098// { "glGetPointerv", 11, _gloffset_GetPointerv },
2099   { "glGetRenderbufferParameterivOES", 11, -1 },
2100   { "glGetString", 11, _gloffset_GetString },
2101   { "glGetTexEnvfv", 11, _gloffset_GetTexEnvfv },
2102   { "glGetTexEnviv", 11, _gloffset_GetTexEnviv },
2103   { "glGetTexEnvxv", 11, -1 },
2104   { "glGetTexGenfvOES", 11, _gloffset_GetTexGenfv },
2105   { "glGetTexGenivOES", 11, _gloffset_GetTexGeniv },
2106   { "glGetTexGenxvOES", 11, -1 },
2107   { "glGetTexParameterfv", 11, _gloffset_GetTexParameterfv },
2108   { "glGetTexParameteriv", 11, _gloffset_GetTexParameteriv },
2109   { "glGetTexParameterxv", 11, -1 },
2110   { "glHint", 11, _gloffset_Hint },
2111   { "glIsBuffer", 11, -1 },
2112   { "glIsEnabled", 11, _gloffset_IsEnabled },
2113   { "glIsFramebufferOES", 11, -1 },
2114   { "glIsRenderbufferOES", 11, -1 },
2115   { "glIsTexture", 11, _gloffset_IsTexture },
2116   { "glLightModelf", 11, _gloffset_LightModelf },
2117   { "glLightModelfv", 11, _gloffset_LightModelfv },
2118   { "glLightModelx", 11, -1 },
2119   { "glLightModelxv", 11, -1 },
2120   { "glLightf", 11, _gloffset_Lightf },
2121   { "glLightfv", 11, _gloffset_Lightfv },
2122   { "glLightx", 11, -1 },
2123   { "glLightxv", 11, -1 },
2124   { "glLineWidth", 11, _gloffset_LineWidth },
2125   { "glLineWidthx", 11, -1 },
2126   { "glLoadIdentity", 11, _gloffset_LoadIdentity },
2127   { "glLoadMatrixf", 11, _gloffset_LoadMatrixf },
2128   { "glLoadMatrixx", 11, -1 },
2129   { "glLogicOp", 11, _gloffset_LogicOp },
2130   { "glMapBufferOES", 11, -1 },
2131   { "glMapBufferRangeEXT", 11, -1 },
2132   { "glMaterialf", 11, _gloffset_Materialf },
2133   { "glMaterialfv", 11, _gloffset_Materialfv },
2134   { "glMaterialx", 11, -1 },
2135   { "glMaterialxv", 11, -1 },
2136   { "glMatrixMode", 11, _gloffset_MatrixMode },
2137   { "glMultMatrixf", 11, _gloffset_MultMatrixf },
2138   { "glMultMatrixx", 11, -1 },
2139   { "glMultiDrawArraysEXT", 11, -1 },
2140   { "glMultiDrawElementsEXT", 11, -1 },
2141   { "glMultiTexCoord4f", 11, _gloffset_MultiTexCoord4fARB },
2142   { "glMultiTexCoord4x", 11, -1 },
2143   { "glNormal3f", 11, _gloffset_Normal3f },
2144   { "glNormal3x", 11, -1 },
2145   { "glNormalPointer", 11, _gloffset_NormalPointer },
2146   { "glOrthof", 11, -1 },
2147   { "glOrthox", 11, -1 },
2148   { "glPixelStorei", 11, _gloffset_PixelStorei },
2149   { "glPointParameterf", 11, -1 },
2150   { "glPointParameterfv", 11, -1 },
2151   { "glPointParameterx", 11, -1 },
2152   { "glPointParameterxv", 11, -1 },
2153   { "glPointSize", 11, _gloffset_PointSize },
2154   { "glPointSizePointerOES", 11, -1 },
2155   { "glPointSizex", 11, -1 },
2156   { "glPolygonOffset", 11, _gloffset_PolygonOffset },
2157   { "glPolygonOffsetx", 11, -1 },
2158   { "glPopMatrix", 11, _gloffset_PopMatrix },
2159   { "glPushMatrix", 11, _gloffset_PushMatrix },
2160   { "glQueryMatrixxOES", 11, -1 },
2161   { "glReadPixels", 11, _gloffset_ReadPixels },
2162   { "glRenderbufferStorageOES", 11, -1 },
2163   { "glRotatef", 11, _gloffset_Rotatef },
2164   { "glRotatex", 11, -1 },
2165   { "glSampleCoverage", 11, -1 },
2166   { "glSampleCoveragex", 11, -1 },
2167   { "glScalef", 11, _gloffset_Scalef },
2168   { "glScalex", 11, -1 },
2169   { "glScissor", 11, _gloffset_Scissor },
2170   { "glShadeModel", 11, _gloffset_ShadeModel },
2171   { "glStencilFunc", 11, _gloffset_StencilFunc },
2172   { "glStencilMask", 11, _gloffset_StencilMask },
2173   { "glStencilOp", 11, _gloffset_StencilOp },
2174   { "glTexCoordPointer", 11, _gloffset_TexCoordPointer },
2175   { "glTexEnvf", 11, _gloffset_TexEnvf },
2176   { "glTexEnvfv", 11, _gloffset_TexEnvfv },
2177   { "glTexEnvi", 11, _gloffset_TexEnvi },
2178   { "glTexEnviv", 11, _gloffset_TexEnviv },
2179   { "glTexEnvx", 11, -1 },
2180   { "glTexEnvxv", 11, -1 },
2181   { "glTexGenfOES", 11, _gloffset_TexGenf },
2182   { "glTexGenfvOES", 11, _gloffset_TexGenfv },
2183   { "glTexGeniOES", 11, _gloffset_TexGeni },
2184   { "glTexGenivOES", 11, _gloffset_TexGeniv },
2185   { "glTexGenxOES", 11, -1 },
2186   { "glTexGenxvOES", 11, -1 },
2187   { "glTexImage2D", 11, _gloffset_TexImage2D },
2188   { "glTexParameterf", 11, _gloffset_TexParameterf },
2189   { "glTexParameterfv", 11, _gloffset_TexParameterfv },
2190   { "glTexParameteri", 11, _gloffset_TexParameteri },
2191   { "glTexParameteriv", 11, _gloffset_TexParameteriv },
2192   { "glTexParameterx", 11, -1 },
2193   { "glTexParameterxv", 11, -1 },
2194   { "glTexSubImage2D", 11, _gloffset_TexSubImage2D },
2195   { "glTranslatef", 11, _gloffset_Translatef },
2196   { "glTranslatex", 11, -1 },
2197   { "glUnmapBufferOES", 11, -1 },
2198   { "glVertexPointer", 11, _gloffset_VertexPointer },
2199   { "glViewport", 11, _gloffset_Viewport },
2200
2201   /* GL_KHR_debug */
2202   { "glPushDebugGroupKHR", 11, -1 },
2203   { "glPopDebugGroupKHR", 11, -1 },
2204   { "glDebugMessageCallbackKHR", 11, -1 },
2205   { "glDebugMessageControlKHR", 11, -1 },
2206   { "glDebugMessageInsertKHR", 11, -1 },
2207   { "glGetDebugMessageLogKHR", 11, -1 },
2208   { "glGetObjectLabelKHR", 11, -1 },
2209   { "glGetObjectPtrLabelKHR", 11, -1 },
2210   { "glGetPointervKHR", 11, _gloffset_GetPointerv },
2211   { "glObjectLabelKHR", 11, -1 },
2212   { "glObjectPtrLabelKHR", 11, -1 },
2213
2214   /* GL_EXT_polygon_offset_clamp */
2215   { "glPolygonOffsetClampEXT", 11, -1 },
2216
2217   /* GL_NV_conservative_raster */
2218   { "glSubpixelPrecisionBiasNV", 20, -1 },
2219
2220   /* GL_NV_conservative_raster_dilate */
2221   { "glConservativeRasterParameterfNV", 20, -1 },
2222
2223   /* GL_NV_conservative_raster_pre_snap_triangles */
2224   { "glConservativeRasterParameteriNV", 20, -1 },
2225
2226   { NULL, 0, -1 }
2227};
2228
2229const struct function gles2_functions_possible[] = {
2230   { "glActiveTexture", 20, _gloffset_ActiveTexture },
2231   { "glAttachShader", 20, -1 },
2232   { "glBindAttribLocation", 20, -1 },
2233   { "glBindBuffer", 20, -1 },
2234   { "glBindFramebuffer", 20, -1 },
2235   { "glBindRenderbuffer", 20, -1 },
2236   { "glBindTexture", 20, _gloffset_BindTexture },
2237   { "glBindVertexArrayOES", 20, -1 },
2238   { "glBlendColor", 20, _gloffset_BlendColor },
2239   { "glBlendEquation", 20, _gloffset_BlendEquation },
2240   { "glBlendEquationSeparate", 20, -1 },
2241   { "glBlendFunc", 20, _gloffset_BlendFunc },
2242   { "glBlendFuncSeparate", 20, -1 },
2243   { "glBufferData", 20, -1 },
2244   { "glBufferSubData", 20, -1 },
2245   { "glCheckFramebufferStatus", 20, -1 },
2246   { "glClear", 20, _gloffset_Clear },
2247   { "glClearColor", 20, _gloffset_ClearColor },
2248   { "glClearDepthf", 20, -1 },
2249   { "glClearStencil", 20, _gloffset_ClearStencil },
2250   { "glColorMask", 20, _gloffset_ColorMask },
2251   { "glCompileShader", 20, -1 },
2252   { "glCompressedTexImage2D", 20, -1 },
2253   { "glCompressedTexImage3DOES", 20, -1 },
2254   { "glCompressedTexSubImage2D", 20, -1 },
2255   { "glCompressedTexSubImage3DOES", 20, -1 },
2256   { "glCopyTexImage2D", 20, _gloffset_CopyTexImage2D },
2257   { "glCopyTexSubImage2D", 20, _gloffset_CopyTexSubImage2D },
2258   { "glCopyTexSubImage3DOES", 20, _gloffset_CopyTexSubImage3D },
2259   { "glCreateProgram", 20, -1 },
2260   { "glCreateShader", 20, -1 },
2261   { "glCullFace", 20, _gloffset_CullFace },
2262   { "glDeleteBuffers", 20, -1 },
2263   { "glDeleteFramebuffers", 20, -1 },
2264   { "glDeleteProgram", 20, -1 },
2265   { "glDeleteRenderbuffers", 20, -1 },
2266   { "glDeleteShader", 20, -1 },
2267   { "glDeleteTextures", 20, _gloffset_DeleteTextures },
2268   { "glDeleteVertexArraysOES", 20, -1 },
2269   { "glDepthFunc", 20, _gloffset_DepthFunc },
2270   { "glDepthMask", 20, _gloffset_DepthMask },
2271   { "glDepthRangef", 20, -1 },
2272   { "glDetachShader", 20, -1 },
2273   { "glDisable", 20, _gloffset_Disable },
2274   { "glDiscardFramebufferEXT", 20, -1 },
2275   { "glDisableVertexAttribArray", 20, -1 },
2276   { "glDrawArrays", 20, _gloffset_DrawArrays },
2277   { "glDrawBuffersNV", 20, -1 },
2278   { "glDrawElements", 20, _gloffset_DrawElements },
2279   { "glDrawElementsBaseVertex", 20, -1 },
2280   { "glEGLImageTargetRenderbufferStorageOES", 20, -1 },
2281   { "glEGLImageTargetTexture2DOES", 20, -1 },
2282   { "glEnable", 20, _gloffset_Enable },
2283   { "glEnableVertexAttribArray", 20, -1 },
2284   { "glFinish", 20, _gloffset_Finish },
2285   { "glFlush", 20, _gloffset_Flush },
2286   { "glFlushMappedBufferRangeEXT", 20, -1 },
2287   { "glFramebufferRenderbuffer", 20, -1 },
2288   { "glFramebufferTexture2D", 20, -1 },
2289   { "glFramebufferTexture3DOES", 20, -1 },
2290   { "glFrontFace", 20, _gloffset_FrontFace },
2291   { "glGenBuffers", 20, -1 },
2292   { "glGenFramebuffers", 20, -1 },
2293   { "glGenRenderbuffers", 20, -1 },
2294   { "glGenTextures", 20, _gloffset_GenTextures },
2295   { "glGenVertexArraysOES", 20, -1 },
2296   { "glGenerateMipmap", 20, -1 },
2297   { "glGetActiveAttrib", 20, -1 },
2298   { "glGetActiveUniform", 20, -1 },
2299   { "glGetAttachedShaders", 20, -1 },
2300   { "glGetAttribLocation", 20, -1 },
2301   { "glGetBooleanv", 20, _gloffset_GetBooleanv },
2302   { "glGetBufferParameteriv", 20, -1 },
2303   { "glGetBufferPointervOES", 20, -1 },
2304   { "glGetError", 20, _gloffset_GetError },
2305   { "glGetFloatv", 20, _gloffset_GetFloatv },
2306   { "glGetFramebufferAttachmentParameteriv", 20, -1 },
2307   { "glGetIntegerv", 20, _gloffset_GetIntegerv },
2308   { "glGetProgramInfoLog", 20, -1 },
2309   { "glGetProgramiv", 20, -1 },
2310   { "glGetRenderbufferParameteriv", 20, -1 },
2311   { "glGetShaderInfoLog", 20, -1 },
2312   { "glGetShaderPrecisionFormat", 20, -1 },
2313   { "glGetShaderSource", 20, -1 },
2314   { "glGetShaderiv", 20, -1 },
2315   { "glGetString", 20, _gloffset_GetString },
2316   { "glGetTexParameterfv", 20, _gloffset_GetTexParameterfv },
2317   { "glGetTexParameteriv", 20, _gloffset_GetTexParameteriv },
2318   { "glGetUniformLocation", 20, -1 },
2319   { "glGetUniformfv", 20, -1 },
2320   { "glGetUniformiv", 20, -1 },
2321   { "glGetVertexAttribPointerv", 20, -1 },
2322   { "glGetVertexAttribfv", 20, -1 },
2323   { "glGetVertexAttribiv", 20, -1 },
2324   { "glHint", 20, _gloffset_Hint },
2325   { "glIsBuffer", 20, -1 },
2326   { "glIsEnabled", 20, _gloffset_IsEnabled },
2327   { "glIsFramebuffer", 20, -1 },
2328   { "glIsProgram", 20, -1 },
2329   { "glIsRenderbuffer", 20, -1 },
2330   { "glIsShader", 20, -1 },
2331   { "glIsTexture", 20, _gloffset_IsTexture },
2332   { "glIsVertexArrayOES", 20, -1 },
2333   { "glLineWidth", 20, _gloffset_LineWidth },
2334   { "glLinkProgram", 20, -1 },
2335   { "glMapBufferOES", 20, -1 },
2336   { "glMapBufferRangeEXT", 20, -1 },
2337   { "glMultiDrawArraysEXT", 20, -1 },
2338   { "glMultiDrawElementsEXT", 20, -1 },
2339   { "glMultiDrawElementsBaseVertex", 20, -1 },
2340   { "glPixelStorei", 20, _gloffset_PixelStorei },
2341   { "glPolygonOffset", 20, _gloffset_PolygonOffset },
2342   { "glReadBufferNV", 20, _gloffset_ReadBuffer },
2343   { "glReadPixels", 20, _gloffset_ReadPixels },
2344   { "glReleaseShaderCompiler", 20, -1 },
2345   { "glRenderbufferStorage", 20, -1 },
2346   { "glSampleCoverage", 20, -1 },
2347   { "glScissor", 20, _gloffset_Scissor },
2348   { "glShaderBinary", 20, -1 },
2349   { "glShaderSource", 20, -1 },
2350   { "glStencilFunc", 20, _gloffset_StencilFunc },
2351   { "glStencilFuncSeparate", 20, -1 },
2352   { "glStencilMask", 20, _gloffset_StencilMask },
2353   { "glStencilMaskSeparate", 20, -1 },
2354   { "glStencilOp", 20, _gloffset_StencilOp },
2355   { "glStencilOpSeparate", 20, -1 },
2356   { "glTexImage2D", 20, _gloffset_TexImage2D },
2357   { "glTexImage3DOES", 20, _gloffset_TexImage3D },
2358   { "glTexParameterf", 20, _gloffset_TexParameterf },
2359   { "glTexParameterfv", 20, _gloffset_TexParameterfv },
2360   { "glTexParameteri", 20, _gloffset_TexParameteri },
2361   { "glTexParameteriv", 20, _gloffset_TexParameteriv },
2362   { "glTexSubImage2D", 20, _gloffset_TexSubImage2D },
2363   { "glTexSubImage3DOES", 20, _gloffset_TexSubImage3D },
2364   { "glUniform1f", 20, -1 },
2365   { "glUniform1fv", 20, -1 },
2366   { "glUniform1i", 20, -1 },
2367   { "glUniform1iv", 20, -1 },
2368   { "glUniform2f", 20, -1 },
2369   { "glUniform2fv", 20, -1 },
2370   { "glUniform2i", 20, -1 },
2371   { "glUniform2iv", 20, -1 },
2372   { "glUniform3f", 20, -1 },
2373   { "glUniform3fv", 20, -1 },
2374   { "glUniform3i", 20, -1 },
2375   { "glUniform3iv", 20, -1 },
2376   { "glUniform4f", 20, -1 },
2377   { "glUniform4fv", 20, -1 },
2378   { "glUniform4i", 20, -1 },
2379   { "glUniform4iv", 20, -1 },
2380   { "glUniformMatrix2fv", 20, -1 },
2381   { "glUniformMatrix3fv", 20, -1 },
2382   { "glUniformMatrix4fv", 20, -1 },
2383   { "glUnmapBufferOES", 20, -1 },
2384   { "glUseProgram", 20, -1 },
2385   { "glValidateProgram", 20, -1 },
2386   { "glVertexAttrib1f", 20, -1 },
2387   { "glVertexAttrib1fv", 20, -1 },
2388   { "glVertexAttrib2f", 20, -1 },
2389   { "glVertexAttrib2fv", 20, -1 },
2390   { "glVertexAttrib3f", 20, -1 },
2391   { "glVertexAttrib3fv", 20, -1 },
2392   { "glVertexAttrib4f", 20, -1 },
2393   { "glVertexAttrib4fv", 20, -1 },
2394   { "glVertexAttribPointer", 20, -1 },
2395   { "glViewport", 20, _gloffset_Viewport },
2396
2397   /* GL_OES_get_program_binary - Also part of OpenGL ES 3.0. */
2398   { "glGetProgramBinaryOES", 20, -1 },
2399   { "glProgramBinaryOES", 20, -1 },
2400
2401   /* GL_EXT_separate_shader_objects - Also part of OpenGL ES 3.1. */
2402   { "glProgramParameteriEXT", 20, -1 },
2403   { "glUseProgramStagesEXT", 20, -1 },
2404   { "glActiveShaderProgramEXT", 20, -1 },
2405   { "glCreateShaderProgramvEXT", 20, -1 },
2406   { "glBindProgramPipelineEXT", 20, -1 },
2407   { "glDeleteProgramPipelinesEXT", 20, -1 },
2408   { "glGenProgramPipelinesEXT", 20, -1 },
2409   { "glIsProgramPipelineEXT", 20, -1 },
2410   { "glGetProgramPipelineivEXT", 20, -1 },
2411   { "glProgramUniform1iEXT", 20, -1 },
2412   { "glProgramUniform1ivEXT", 20, -1 },
2413   { "glProgramUniform1fEXT", 20, -1 },
2414   { "glProgramUniform1fvEXT", 20, -1 },
2415   { "glProgramUniform2iEXT", 20, -1 },
2416   { "glProgramUniform2ivEXT", 20, -1 },
2417   { "glProgramUniform2fEXT", 20, -1 },
2418   { "glProgramUniform2fvEXT", 20, -1 },
2419   { "glProgramUniform3iEXT", 20, -1 },
2420   { "glProgramUniform3ivEXT", 20, -1 },
2421   { "glProgramUniform3fEXT", 20, -1 },
2422   { "glProgramUniform3fvEXT", 20, -1 },
2423   { "glProgramUniform4iEXT", 20, -1 },
2424   { "glProgramUniform4ivEXT", 20, -1 },
2425   { "glProgramUniform4fEXT", 20, -1 },
2426   { "glProgramUniform4fvEXT", 20, -1 },
2427   { "glProgramUniformMatrix2fvEXT", 20, -1 },
2428   { "glProgramUniformMatrix3fvEXT", 20, -1 },
2429   { "glProgramUniformMatrix4fvEXT", 20, -1 },
2430   { "glProgramUniformMatrix2x3fvEXT", 20, -1 },
2431   { "glProgramUniformMatrix3x2fvEXT", 20, -1 },
2432   { "glProgramUniformMatrix2x4fvEXT", 20, -1 },
2433   { "glProgramUniformMatrix4x2fvEXT", 20, -1 },
2434   { "glProgramUniformMatrix3x4fvEXT", 20, -1 },
2435   { "glProgramUniformMatrix4x3fvEXT", 20, -1 },
2436   { "glValidateProgramPipelineEXT", 20, -1 },
2437   { "glGetProgramPipelineInfoLogEXT", 20, -1 },
2438
2439   /* GL_AMD_performance_monitor */
2440   { "glGetPerfMonitorGroupsAMD", 20, -1 },
2441   { "glGetPerfMonitorCountersAMD", 20, -1 },
2442   { "glGetPerfMonitorGroupStringAMD", 20, -1 },
2443   { "glGetPerfMonitorCounterStringAMD", 20, -1 },
2444   { "glGetPerfMonitorCounterInfoAMD", 20, -1 },
2445   { "glGenPerfMonitorsAMD", 20, -1 },
2446   { "glDeletePerfMonitorsAMD", 20, -1 },
2447   { "glSelectPerfMonitorCountersAMD", 20, -1 },
2448   { "glBeginPerfMonitorAMD", 20, -1 },
2449   { "glEndPerfMonitorAMD", 20, -1 },
2450   { "glGetPerfMonitorCounterDataAMD", 20, -1 },
2451
2452   /* GL_INTEL_performance_query */
2453   { "glGetFirstPerfQueryIdINTEL", 20, -1 },
2454   { "glGetNextPerfQueryIdINTEL", 20, -1 },
2455   { "glGetPerfQueryIdByNameINTEL", 20, -1 },
2456   { "glGetPerfQueryInfoINTEL", 20, -1 },
2457   { "glGetPerfCounterInfoINTEL", 20, -1 },
2458   { "glCreatePerfQueryINTEL", 20, -1 },
2459   { "glDeletePerfQueryINTEL", 20, -1 },
2460   { "glBeginPerfQueryINTEL", 20, -1 },
2461   { "glEndPerfQueryINTEL", 20, -1 },
2462   { "glGetPerfQueryDataINTEL", 20, -1 },
2463
2464   /* GL_KHR_debug */
2465   { "glPushDebugGroupKHR", 20, -1 },
2466   { "glPopDebugGroupKHR", 20, -1 },
2467   { "glDebugMessageCallbackKHR", 20, -1 },
2468   { "glDebugMessageControlKHR", 20, -1 },
2469   { "glDebugMessageInsertKHR", 20, -1 },
2470   { "glGetDebugMessageLogKHR", 20, -1 },
2471   { "glGetObjectLabelKHR", 20, -1 },
2472   { "glGetObjectPtrLabelKHR", 20, -1 },
2473   { "glGetPointervKHR", 20, -1 },
2474   { "glObjectLabelKHR", 20, -1 },
2475   { "glObjectPtrLabelKHR", 20, -1 },
2476
2477   /* GL_EXT_polygon_offset_clamp */
2478   { "glPolygonOffsetClampEXT", 11, -1 },
2479
2480   /* GL_KHR_robustness */
2481   { "glGetGraphicsResetStatusKHR", 20, -1 },
2482   { "glReadnPixelsKHR", 20, -1 },
2483   { "glGetnUniformfvKHR", 20, -1 },
2484   { "glGetnUniformivKHR", 20, -1 },
2485   { "glGetnUniformuivKHR", 20, -1 },
2486
2487   /* GL_KHR_blend_equation_advanced */
2488   { "glBlendBarrierKHR", 20, -1 },
2489
2490   /* GL_EXT_occlusion_query_boolean */
2491   { "glGenQueriesEXT", 20, -1 },
2492   { "glDeleteQueriesEXT", 20, -1 },
2493   { "glIsQueryEXT", 20, -1 },
2494   { "glBeginQueryEXT", 20, -1 },
2495   { "glEndQueryEXT", 20, -1 },
2496   { "glGetQueryivEXT", 20, -1 },
2497   { "glGetQueryObjectivEXT", 20, -1 },
2498   { "glGetQueryObjectuivEXT", 20, -1 },
2499
2500   /* GL_EXT_clear_texture */
2501   { "glClearTexImageEXT", 31, -1 },
2502   { "glClearTexSubImageEXT", 31, -1 },
2503
2504   /* GL_EXT_clip_control */
2505   { "glClipControlEXT", 20, -1 },
2506
2507   /* GL_EXT_disjoint_timer_query */
2508   { "glGetQueryObjecti64vEXT", 20, -1 },
2509   { "glGetQueryObjectui64vEXT", 20, -1 },
2510   { "glQueryCounterEXT", 20, -1 },
2511   { "glGetInteger64vEXT", 20, -1 },
2512
2513   /* GL_EXT_shader_framebuffer_fetch_non_coherent */
2514   { "glFramebufferFetchBarrierEXT", 20, -1 },
2515
2516   /* GL_NV_conditional_render */
2517   { "glBeginConditionalRenderNV", 20, -1 },
2518   { "glEndConditionalRenderNV", 20, -1 },
2519
2520   /* GL_NV_conservative_raster */
2521   { "glSubpixelPrecisionBiasNV", 20, -1 },
2522
2523   /* GL_NV_conservative_raster_dilate */
2524   { "glConservativeRasterParameterfNV", 20, -1 },
2525
2526   /* GL_NV_conservative_raster_pre_snap_triangles */
2527   { "glConservativeRasterParameteriNV", 20, -1 },
2528
2529   /* GL_EXT_multisampled_render_to_texture */
2530   { "glRenderbufferStorageMultisampleEXT", 20, -1 },
2531   { "glFramebufferTexture2DMultisampleEXT", 20, -1 },
2532
2533   /* GL_KHR_parallel_shader_compile */
2534   { "glMaxShaderCompilerThreadsKHR", 20, -1 },
2535
2536   { "glInternalBufferSubDataCopyMESA", 20, -1 },
2537   { "glInternalSetError", 20, -1 },
2538
2539   { NULL, 0, -1 }
2540};
2541
2542const struct function gles3_functions_possible[] = {
2543   // We check for the aliased -EXT version in GLES 2
2544   // { "glBeginQuery", 30, -1 },
2545   { "glBeginTransformFeedback", 30, -1 },
2546   { "glBindBufferBase", 30, -1 },
2547   { "glBindBufferRange", 30, -1 },
2548   { "glBindSampler", 30, -1 },
2549   { "glBindTransformFeedback", 30, -1 },
2550   // We check for the aliased -OES version in GLES 2
2551   // { "glBindVertexArray", 30, -1 },
2552   { "glBlitFramebuffer", 30, -1 },
2553   { "glClearBufferfi", 30, -1 },
2554   { "glClearBufferfv", 30, -1 },
2555   { "glClearBufferiv", 30, -1 },
2556   { "glClearBufferuiv", 30, -1 },
2557   { "glClientWaitSync", 30, -1 },
2558   // We check for the aliased -OES version in GLES 2
2559   // { "glCompressedTexImage3D", 30, -1 },
2560   // We check for the aliased -OES version in GLES 2
2561   // { "glCompressedTexSubImage3D", 30, -1 },
2562   { "glCopyBufferSubData", 30, -1 },
2563   // We check for the aliased -OES version in GLES 2
2564   // { "glCopyTexSubImage3D", 30, -1 },
2565   // We check for the aliased -EXT version in GLES 2
2566   // { "glDeleteQueries", 30, -1 },
2567   { "glDeleteSamplers", 30, -1 },
2568   { "glDeleteSync", 30, -1 },
2569   { "glDeleteTransformFeedbacks", 30, -1 },
2570   // We check for the aliased -OES version in GLES 2
2571   // { "glDeleteVertexArrays", 30, -1 },
2572   { "glDrawArraysInstanced", 30, -1 },
2573   // We check for the aliased -NV version in GLES 2
2574   // { "glDrawBuffers", 30, -1 },
2575   { "glDrawElementsInstanced", 30, -1 },
2576   { "glDrawRangeElements", 30, -1 },
2577   { "glDrawRangeElementsBaseVertex", 30, -1 },
2578   // We check for the aliased -EXT version in GLES 2
2579   // { "glEndQuery", 30, -1 },
2580   { "glEndTransformFeedback", 30, -1 },
2581   { "glFenceSync", 30, -1 },
2582   // We check for the aliased -EXT version in GLES 2
2583   // { "glFlushMappedBufferRange", 30, -1 },
2584   { "glFramebufferTextureLayer", 30, -1 },
2585   // We check for the aliased -EXT version in GLES 2
2586   // { "glGenQueries", 30, -1 },
2587   { "glGenSamplers", 30, -1 },
2588   { "glGenTransformFeedbacks", 30, -1 },
2589   // We check for the aliased -OES version in GLES 2
2590   // { "glGenVertexArrays", 30, -1 },
2591   { "glGetActiveUniformBlockiv", 30, -1 },
2592   { "glGetActiveUniformBlockName", 30, -1 },
2593   { "glGetActiveUniformsiv", 30, -1 },
2594   { "glGetBufferParameteri64v", 30, -1 },
2595   // We check for the aliased -OES version in GLES 2
2596   // { "glGetBufferPointerv", 30, -1 },
2597   { "glGetFragDataLocation", 30, -1 },
2598   { "glGetInteger64i_v", 30, -1 },
2599   // We check for the aliased -EXT version in GLES 2
2600   //{ "glGetInteger64v", 30, -1 },
2601   { "glGetIntegeri_v", 30, -1 },
2602   { "glGetInternalformativ", 30, -1 },
2603   { "glGetInternalformati64v", 30, -1 },
2604   // glGetProgramBinary aliases glGetProgramBinaryOES in GLES 2
2605   // We check for the aliased -EXT version in GLES 2
2606   // { "glGetQueryiv", 30, -1 },
2607   // We check for the aliased -EXT version in GLES 2
2608   // { "glGetQueryObjectuiv", 30, -1 },
2609   { "glGetSamplerParameterfv", 30, -1 },
2610   { "glGetSamplerParameteriv", 30, -1 },
2611   { "glGetStringi", 30, -1 },
2612   { "glGetSynciv", 30, -1 },
2613   { "glGetTransformFeedbackVarying", 30, -1 },
2614   { "glGetUniformBlockIndex", 30, -1 },
2615   { "glGetUniformIndices", 30, -1 },
2616   { "glGetUniformuiv", 30, -1 },
2617   { "glGetVertexAttribIiv", 30, -1 },
2618   { "glGetVertexAttribIuiv", 30, -1 },
2619   { "glInvalidateFramebuffer", 30, -1 },
2620   { "glInvalidateSubFramebuffer", 30, -1 },
2621   // We check for the aliased -EXT version in GLES 2
2622   // { "glIsQuery", 30, -1 },
2623   { "glIsSampler", 30, -1 },
2624   { "glIsSync", 30, -1 },
2625   { "glIsTransformFeedback", 30, -1 },
2626   // We check for the aliased -OES version in GLES 2
2627   // { "glIsVertexArray", 30, -1 },
2628   // We check for the aliased -EXT version in GLES 2
2629   // { "glMapBufferRange", 30, -1 },
2630   { "glPauseTransformFeedback", 30, -1 },
2631   // glProgramBinary aliases glProgramBinaryOES in GLES 2
2632   // glProgramParameteri aliases glProgramParameteriEXT in GLES 2
2633   // We check for the aliased -NV version in GLES 2
2634   // { "glReadBuffer", 30, -1 },
2635   // glRenderbufferStorageMultisample aliases glRenderbufferStorageMultisampleEXT in GLES 2
2636   { "glResumeTransformFeedback", 30, -1 },
2637   { "glSamplerParameterf", 30, -1 },
2638   { "glSamplerParameterfv", 30, -1 },
2639   { "glSamplerParameteri", 30, -1 },
2640   { "glSamplerParameteriv", 30, -1 },
2641   // We check for the aliased -OES version in GLES 2
2642   // { "glTexImage3D", 30, -1 },
2643   { "glTexStorage2D", 30, -1 },
2644   { "glTexStorage3D", 30, -1 },
2645   // We check for the aliased -OES version in GLES 2
2646   // { "glTexSubImage3D", 30, -1 },
2647   { "glTransformFeedbackVaryings", 30, -1 },
2648   { "glUniform1ui", 30, -1 },
2649   { "glUniform1uiv", 30, -1 },
2650   { "glUniform2ui", 30, -1 },
2651   { "glUniform2uiv", 30, -1 },
2652   { "glUniform3ui", 30, -1 },
2653   { "glUniform3uiv", 30, -1 },
2654   { "glUniform4ui", 30, -1 },
2655   { "glUniform4uiv", 30, -1 },
2656   { "glUniformBlockBinding", 30, -1 },
2657   { "glUniformMatrix2x3fv", 30, -1 },
2658   { "glUniformMatrix2x4fv", 30, -1 },
2659   { "glUniformMatrix3x2fv", 30, -1 },
2660   { "glUniformMatrix3x4fv", 30, -1 },
2661   { "glUniformMatrix4x2fv", 30, -1 },
2662   { "glUniformMatrix4x3fv", 30, -1 },
2663   // We check for the aliased -OES version in GLES 2
2664   // { "glUnmapBuffer", 30, -1 },
2665   { "glVertexAttribDivisor", 30, -1 },
2666   { "glVertexAttribI4i", 30, -1 },
2667   { "glVertexAttribI4iv", 30, -1 },
2668   { "glVertexAttribI4ui", 30, -1 },
2669   { "glVertexAttribI4uiv", 30, -1 },
2670   { "glVertexAttribIPointer", 30, -1 },
2671   { "glWaitSync", 30, -1 },
2672
2673   /* GL_EXT_separate_shader_objects - Also part of OpenGL ES 3.1. */
2674   { "glProgramUniform1uiEXT", 30, -1 },
2675   { "glProgramUniform1uivEXT", 30, -1 },
2676   { "glProgramUniform2uiEXT", 30, -1 },
2677   { "glProgramUniform2uivEXT", 30, -1 },
2678   { "glProgramUniform3uiEXT", 30, -1 },
2679   { "glProgramUniform3uivEXT", 30, -1 },
2680   { "glProgramUniform4uiEXT", 30, -1 },
2681   { "glProgramUniform4uivEXT", 30, -1 },
2682
2683   /* GL_EXT_blend_func_extended */
2684   { "glBindFragDataLocationIndexedEXT", 30, -1 },
2685   { "glGetFragDataIndexEXT", 30, -1 },
2686   { "glBindFragDataLocationEXT", 30, -1 },
2687
2688   /* GL_OES_texture_border_clamp */
2689   { "glTexParameterIivOES", 30, -1 },
2690   { "glTexParameterIuivOES", 30, -1 },
2691   { "glGetTexParameterIivOES", 30, -1 },
2692   { "glGetTexParameterIuivOES", 30, -1 },
2693   { "glSamplerParameterIivOES", 30, -1 },
2694   { "glSamplerParameterIuivOES", 30, -1 },
2695   { "glGetSamplerParameterIivOES", 30, -1 },
2696   { "glGetSamplerParameterIuivOES", 30, -1 },
2697
2698   /* GL_OES_texture_buffer */
2699   { "glTexBufferOES", 31, -1 },
2700   { "glTexBufferRangeOES", 31, -1 },
2701
2702   /* GL_OES_sample_shading */
2703   { "glMinSampleShadingOES", 30, -1 },
2704
2705   /* GL_OES_copy_image */
2706   { "glCopyImageSubDataOES", 30, -1 },
2707
2708   /* GL_OES_draw_buffers_indexed */
2709   { "glBlendFunciOES", 30, -1 },
2710   { "glBlendFuncSeparateiOES", 30, -1 },
2711   { "glBlendEquationiOES", 30, -1 },
2712   { "glBlendEquationSeparateiOES", 30, -1 },
2713   { "glColorMaskiOES", 30, -1 },
2714   { "glEnableiOES", 30, -1 },
2715   { "glDisableiOES", 30, -1 },
2716   { "glIsEnablediOES", 30, -1 },
2717
2718   /* GL_EXT_base_instance */
2719   { "glDrawArraysInstancedBaseInstanceEXT", 30, -1 },
2720   { "glDrawElementsInstancedBaseInstanceEXT", 30, -1 },
2721   { "glDrawElementsInstancedBaseVertexBaseInstanceEXT", 30, -1 },
2722
2723   /* GL_EXT_window_rectangles */
2724   { "glWindowRectanglesEXT", 30, -1 },
2725
2726   /* GL_AMD_framebuffer_multisample_advanced */
2727   { "glRenderbufferStorageMultisampleAdvancedAMD", 11, -1 },
2728   { "glNamedRenderbufferStorageMultisampleAdvancedAMD", 11, -1 },
2729
2730   /* GL_MESA_framebuffer_flip_y */
2731   { "glFramebufferParameteriMESA", 30, -1 },
2732   { "glGetFramebufferParameterivMESA", 30, -1 },
2733
2734   /* EXT_EGL_image_storage */
2735   { "glEGLImageTargetTexStorageEXT", 30, -1 },
2736
2737   { "glDrawElementsInstancedBaseVertex", 30, -1 },
2738
2739   { NULL, 0, -1 }
2740};
2741
2742const struct function gles31_functions_possible[] = {
2743   { "glDispatchCompute", 31, -1 },
2744   { "glDispatchComputeIndirect", 31, -1 },
2745   { "glDrawArraysIndirect", 31, -1 },
2746   { "glDrawElementsIndirect", 31, -1 },
2747
2748   { "glFramebufferParameteri", 31, -1 },
2749   { "glGetFramebufferParameteriv", 31, -1 },
2750
2751   { "glGetProgramInterfaceiv", 31, -1 },
2752   { "glGetProgramResourceIndex", 31, -1 },
2753   { "glGetProgramResourceName", 31, -1 },
2754   { "glGetProgramResourceiv", 31, -1 },
2755   { "glGetProgramResourceLocation", 31, -1 },
2756
2757   // We check for the aliased EXT versions in GLES 2
2758   // { "glUseProgramStages", 31, -1 },
2759   // { "glActiveShaderProgram", 31, -1 },
2760   // { "glCreateShaderProgramv", 31, -1 },
2761   // { "glBindProgramPipeline", 31, -1 },
2762   // { "glDeleteProgramPipelines", 31, -1 },
2763   // { "glGenProgramPipelines", 31, -1 },
2764   // { "glIsProgramPipeline", 31, -1 },
2765   // { "glGetProgramPipelineiv", 31, -1 },
2766   // { "glProgramUniform1i", 31, -1 },
2767   // { "glProgramUniform2i", 31, -1 },
2768   // { "glProgramUniform3i", 31, -1 },
2769   // { "glProgramUniform4i", 31, -1 },
2770   // { "glProgramUniform1f", 31, -1 },
2771   // { "glProgramUniform2f", 31, -1 },
2772   // { "glProgramUniform3f", 31, -1 },
2773   // { "glProgramUniform4f", 31, -1 },
2774   // { "glProgramUniform1iv", 31, -1 },
2775   // { "glProgramUniform2iv", 31, -1 },
2776   // { "glProgramUniform3iv", 31, -1 },
2777   // { "glProgramUniform4iv", 31, -1 },
2778   // { "glProgramUniform1fv", 31, -1 },
2779   // { "glProgramUniform2fv", 31, -1 },
2780   // { "glProgramUniform3fv", 31, -1 },
2781   // { "glProgramUniform4fv", 31, -1 },
2782   // { "glProgramUniformMatrix2fv", 31, -1 },
2783   // { "glProgramUniformMatrix3fv", 31, -1 },
2784   // { "glProgramUniformMatrix4fv", 31, -1 },
2785   // { "glProgramUniformMatrix2x3fv", 31, -1 },
2786   // { "glProgramUniformMatrix3x2fv", 31, -1 },
2787   // { "glProgramUniformMatrix2x4fv", 31, -1 },
2788   // { "glProgramUniformMatrix4x2fv", 31, -1 },
2789   // { "glProgramUniformMatrix3x4fv", 31, -1 },
2790   // { "glProgramUniformMatrix4x3fv", 31, -1 },
2791   // { "glValidateProgramPipeline", 31, -1 },
2792   // { "glGetProgramPipelineInfoLog", 31, -1 },
2793
2794   // We check for the aliased EXT versions in GLES 3
2795   // { "glProgramUniform1ui", 31, -1 },
2796   // { "glProgramUniform2ui", 31, -1 },
2797   // { "glProgramUniform3ui", 31, -1 },
2798   // { "glProgramUniform4ui", 31, -1 },
2799   // { "glProgramUniform1uiv", 31, -1 },
2800   // { "glProgramUniform2uiv", 31, -1 },
2801   // { "glProgramUniform3uiv", 31, -1 },
2802   // { "glProgramUniform4uiv", 31, -1 },
2803
2804   { "glBindImageTexture", 31, -1 },
2805   { "glGetBooleani_v", 31, -1 },
2806   { "glMemoryBarrier", 31, -1 },
2807
2808   { "glMemoryBarrierByRegion", 31, -1 },
2809
2810   { "glTexStorage2DMultisample", 31, -1 },
2811   { "glGetMultisamplefv", 31, -1 },
2812   { "glSampleMaski", 31, -1 },
2813   { "glGetTexLevelParameteriv", 31, -1 },
2814   { "glGetTexLevelParameterfv", 31, -1 },
2815   { "glBindVertexBuffer", 31, -1 },
2816   { "glVertexAttribFormat", 31, -1 },
2817   { "glVertexAttribIFormat", 31, -1 },
2818   { "glVertexAttribBinding", 31, -1 },
2819   { "glVertexBindingDivisor", 31, -1 },
2820
2821   /* GL_OES_texture_storage_multisample_2d_array */
2822   { "glTexStorage3DMultisampleOES", 31, -1 },
2823
2824   /* GL_OES_texture_view */
2825   { "glTextureViewOES", 31, -1 },
2826
2827   /* GL_EXT_buffer_storage */
2828   { "glBufferStorageEXT", 31, -1 },
2829
2830   /* GL_EXT_blend_func_extended */
2831   { "glGetProgramResourceLocationIndexEXT", 31, -1 },
2832
2833   /* GL_OES_geometry_shader */
2834   { "glFramebufferTextureOES", 31, -1},
2835
2836   /* GL_EXT_geometry_shader */
2837   // We check for the aliased OES version above
2838   // { "glFramebufferTextureEXT", 31, -1},
2839
2840   /* GL_OES_tessellation_shader */
2841   { "glPatchParameteriOES", 31, -1 },
2842
2843   /* GL_OES_primitive_bound_box */
2844   { "glPrimitiveBoundingBoxOES", 31, -1 },
2845
2846   /* GL_OES_viewport_array */
2847   { "glViewportArrayvOES", 31, -1 },
2848   { "glViewportIndexedfOES", 31, -1 },
2849   { "glViewportIndexedfvOES", 31, -1 },
2850   { "glScissorArrayvOES", 31, -1 },
2851   { "glScissorIndexedOES", 31, -1 },
2852   { "glScissorIndexedvOES", 31, -1 },
2853   { "glDepthRangeArrayfvOES", 31, -1 },
2854   { "glDepthRangeIndexedfOES", 31, -1 },
2855   { "glGetFloati_vOES", 31, -1 },
2856
2857   /* GL_ARB_sample_locations */
2858   { "glFramebufferSampleLocationsfvARB", 31, -1 },
2859   { "glNamedFramebufferSampleLocationsfvARB", 31, -1 },
2860   { "glEvaluateDepthValuesARB", 31, -1 },
2861
2862   /* GL_NV_viewport_swizzle */
2863   { "glViewportSwizzleNV", 31, -1 },
2864
2865   { NULL, 0, -1 },
2866 };
2867