• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
65 struct function {
66    const char *name;
67    unsigned int Version;
68    int offset;
69 };
70 
71 extern const struct function common_desktop_functions_possible[];
72 extern const struct function gl_compatibility_functions_possible[];
73 extern const struct function gl_core_functions_possible[];
74 extern const struct function gles11_functions_possible[];
75 extern const struct function gles2_functions_possible[];
76 extern const struct function gles3_functions_possible[];
77 extern const struct function gles31_functions_possible[];
78 
79 class DispatchSanity_test : public ::testing::Test {
80 public:
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 
93 void
SetUp()94 DispatchSanity_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 
107 void
TearDown()108 DispatchSanity_test::TearDown()
109 {
110    free(nop_table);
111 }
112 
113 void
SetUpCtx(gl_api api,unsigned int version)114 DispatchSanity_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 
130 void
TearDownCtx()131 DispatchSanity_test::TearDownCtx()
132 {
133    _vbo_DestroyContext(&ctx);
134    _mesa_free_context_data(&ctx, false);
135 }
136 
137 static const char *
offset_to_proc_name_safe(unsigned offset)138 offset_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  */
147 static void
validate_functions(struct gl_context * ctx,const struct function * function_table,const _glapi_proc * nop_table)148 validate_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  */
182 static void
validate_nops(struct gl_context * ctx,const _glapi_proc * nop_table)183 validate_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 
TEST_F(DispatchSanity_test,GL31_CORE)194 TEST_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 
TEST_F(DispatchSanity_test,GL30)203 TEST_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 
TEST_F(DispatchSanity_test,GLES11)212 TEST_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 
TEST_F(DispatchSanity_test,GLES2)220 TEST_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 
TEST_F(DispatchSanity_test,GLES3)228 TEST_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 
TEST_F(DispatchSanity_test,GLES31)237 TEST_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 
247 const 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 
1475 const 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 
2000 const struct function gl_core_functions_possible[] = {
2001    /* GL_ARB_gl_spirv */
2002    { "glSpecializeShaderARB", 45, -1 },
2003 
2004    { NULL, 0, -1 }
2005 };
2006 
2007 const 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 
2229 const 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 
2542 const 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 
2742 const 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