Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

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