mesa: Enable GL_EXT_separate_shader_objects for OpenGL ES
authorIan Romanick <ian.d.romanick@intel.com>
Wed, 26 Mar 2014 20:11:44 +0000 (13:11 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 2 May 2014 14:20:10 +0000 (07:20 -0700)
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/glsl/glcpp/glcpp-parse.y
src/glsl/glsl_parser_extras.cpp
src/glsl/glsl_parser_extras.h
src/glsl/linker.cpp
src/mapi/glapi/gen/EXT_separate_shader_objects.xml
src/mesa/main/extensions.c
src/mesa/main/tests/dispatch_sanity.cpp

index 412d571e6ebca9a68fc7ea2793cd36248e028a3c..98875837cdd4c9bd0d64bfe8d93ffaf20f31312b 100644 (file)
@@ -2062,6 +2062,7 @@ _glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t versio
        /* Add pre-defined macros. */
        if (parser->is_gles) {
           add_builtin_define(parser, "GL_ES", 1);
+           add_builtin_define(parser, "GL_EXT_separate_shader_objects", 1);
 
           if (extensions != NULL) {
              if (extensions->OES_EGL_image_external)
index d7352a7d66d8c5320f65e4f31237fbb53373bc0e..1e619265c9e4f6699599b914ca2ad6c777c43a89 100644 (file)
@@ -550,6 +550,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
    EXT(AMD_shader_stencil_export,      true,  false,     ARB_shader_stencil_export),
    EXT(AMD_shader_trinary_minmax,      true,  false,     dummy_true),
    EXT(AMD_vertex_shader_layer,        true,  false,     AMD_vertex_shader_layer),
+   EXT(EXT_separate_shader_objects,    false, true,      dummy_true),
    EXT(EXT_shader_integer_mix,         true,  true,      EXT_shader_integer_mix),
    EXT(EXT_texture_array,              true,  false,     EXT_texture_array),
 };
index 725ee62ab214c4ec8b75c024ca7949d8ee970849..0416a9c7252c1fef40798147b33522004385127e 100644 (file)
@@ -140,8 +140,7 @@ struct _mesa_glsl_parse_state {
    {
       if (!this->has_separate_shader_objects()) {
          const char *const requirement = this->es_shader
-            ? "GL_EXT_separate_shader_objects (not supported by this "
-              "implementation)"
+            ? "GL_EXT_separate_shader_objects extension"
             : "GL_ARB_separate_shader_objects extension or GLSL 420";
 
          _mesa_glsl_error(locp, this, "%s explicit location requires %s",
@@ -164,7 +163,8 @@ struct _mesa_glsl_parse_state {
 
    bool has_separate_shader_objects() const
    {
-      return ARB_separate_shader_objects_enable || is_version(410, 0);
+      return ARB_separate_shader_objects_enable || is_version(410, 0)
+         || EXT_separate_shader_objects_enable;
    }
 
    void process_version_directive(YYLTYPE *locp, int version,
@@ -424,6 +424,8 @@ struct _mesa_glsl_parse_state {
    bool AMD_shader_trinary_minmax_warn;
    bool AMD_vertex_shader_layer_enable;
    bool AMD_vertex_shader_layer_warn;
+   bool EXT_separate_shader_objects_enable;
+   bool EXT_separate_shader_objects_warn;
    bool EXT_shader_integer_mix_enable;
    bool EXT_shader_integer_mix_warn;
    bool EXT_texture_array_enable;
index fbc03587765aefb1b2037cdef05239dd4e67435a..7ec1e5a34f33b25f44e6e2ffa7dcf9e4d80e7bbf 100644 (file)
@@ -2607,7 +2607,8 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
     * fragment shader) is absent. So, the extension shouldn't change the
     * behavior specified in GLSL specification.
     */
-   if (!prog->InternalSeparateShader && ctx->API == API_OPENGLES2) {
+   if (!prog->InternalSeparateShader && !prog->SeparateShader
+       && ctx->API == API_OPENGLES2) {
       if (prog->_LinkedShaders[MESA_SHADER_VERTEX] == NULL) {
         linker_error(prog, "program lacks a vertex shader\n");
       } else if (prog->_LinkedShaders[MESA_SHADER_FRAGMENT] == NULL) {
index 9079363ceefc0d4ff959785e7091670592ad8585..c6163a193b8dcb1fb4c05a9845907a6cf32fded5 100644 (file)
@@ -6,7 +6,7 @@
 <OpenGLAPI>
 <category name="GL_EXT_separate_shader_objects" number="377">
     <!-- Alias of CURRENT_PROGRAM -->
-    <enum name="ACTIVE_PROGRAM_EXT"               value="0x8B8D"/>
+<!--    <enum name="ACTIVE_PROGRAM_EXT"               value="0x8B8D"/> -->
 
     <function name="UseShaderProgramEXT" deprecated="3.1" offset="assign" exec="skip">
         <param name="type" type="GLenum"/>
         <param name="string" type="const GLchar *"/>
         <return type="GLuint"/>
     </function>
+
+
+    <enum name="ACTIVE_PROGRAM_EXT"                           value="0x8259"/>
+    <enum name="PROGRAM_PIPELINE_BINDING_EXT"                 value="0x825A"/>
+    <enum name="VERTEX_SHADER_BIT_EXT"                        value="0x00000001"/>
+    <enum name="FRAGMENT_SHADER_BIT_EXT"                      value="0x00000002"/>
+    <enum name="ALL_SHADER_BITS_EXT"                          value="0xFFFFFFFF"/>
+    <enum name="PROGRAM_SEPARABLE_EXT"                        value="0x8258"/>
+
+    <function name="UseProgramStagesEXT" alias="UseProgramStages" static_dispatch="false" es2="2.0">
+        <param name="pipeline" type="GLuint"/>
+        <param name="stages" type="GLbitfield"/>
+        <param name="program" type="GLuint"/>
+    </function>
+    <function name="ActiveShaderProgramEXT" alias="ActiveShaderProgram" static_dispatch="false" es2="2.0">
+        <param name="pipeline" type="GLuint"/>
+        <param name="program" type="GLuint"/>
+    </function>
+    <function name="CreateShaderProgramvEXT" alias="CreateShaderProgramv" static_dispatch="false" es2="2.0">
+        <param name="type" type="GLenum"/>
+        <param name="count" type="GLsizei"/>
+        <param name="strings" type="const GLchar * const *"/>
+        <return type="GLuint"/>
+    </function>
+    <function name="BindProgramPipelineEXT" alias="BindProgramPipeline" static_dispatch="false" es2="2.0">
+        <param name="pipeline" type="GLuint"/>
+    </function>
+    <function name="DeleteProgramPipelinesEXT" alias="DeleteProgramPipelines" static_dispatch="false" es2="2.0">
+        <param name="n" type="GLsizei"/>
+        <param name="pipelines" type="const GLuint *"/>
+    </function>
+    <function name="GenProgramPipelinesEXT" alias="GenProgramPipelines" static_dispatch="false" es2="2.0">
+        <param name="n" type="GLsizei"/>
+        <param name="pipelines" type="GLuint *"/>
+    </function>
+    <function name="IsProgramPipelineEXT" alias="IsProgramPipeline" static_dispatch="false" es2="2.0">
+        <param name="pipeline" type="GLuint"/>
+        <return type="GLboolean"/>
+    </function>
+    <function name="ProgramParameteriEXT" alias="ProgramParameteri" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="pname" type="GLenum"/>
+        <param name="value" type="GLint"/>
+    </function>
+    <function name="GetProgramPipelineivEXT" alias="GetProgramPipelineiv" static_dispatch="false" es2="2.0">
+        <param name="pipeline" type="GLuint"/>
+        <param name="pname" type="GLenum"/>
+        <param name="params" type="GLint *"/>
+    </function>
+    <function name="ProgramUniform1iEXT" alias="ProgramUniform1i" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="x" type="GLint"/>
+    </function>
+    <function name="ProgramUniform2iEXT" alias="ProgramUniform2i" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="x" type="GLint"/>
+        <param name="y" type="GLint"/>
+    </function>
+    <function name="ProgramUniform3iEXT" alias="ProgramUniform3i" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="x" type="GLint"/>
+        <param name="y" type="GLint"/>
+        <param name="z" type="GLint"/>
+    </function>
+    <function name="ProgramUniform4iEXT" alias="ProgramUniform4i" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="x" type="GLint"/>
+        <param name="y" type="GLint"/>
+        <param name="z" type="GLint"/>
+        <param name="w" type="GLint"/>
+    </function>
+    <function name="ProgramUniform1uiEXT" alias="ProgramUniform1ui" static_dispatch="false" es2="3.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="x" type="GLuint"/>
+    </function>
+    <function name="ProgramUniform2uiEXT" alias="ProgramUniform2ui" static_dispatch="false" es2="3.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="x" type="GLuint"/>
+        <param name="y" type="GLuint"/>
+    </function>
+    <function name="ProgramUniform3uiEXT" alias="ProgramUniform3ui" static_dispatch="false" es2="3.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="x" type="GLuint"/>
+        <param name="y" type="GLuint"/>
+        <param name="z" type="GLuint"/>
+    </function>
+    <function name="ProgramUniform4uiEXT" alias="ProgramUniform4ui" static_dispatch="false" es2="3.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="x" type="GLuint"/>
+        <param name="y" type="GLuint"/>
+        <param name="z" type="GLuint"/>
+        <param name="w" type="GLuint"/>
+    </function>
+    <function name="ProgramUniform1fEXT" alias="ProgramUniform1f" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="x" type="GLfloat"/>
+    </function>
+    <function name="ProgramUniform2fEXT" alias="ProgramUniform2f" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="x" type="GLfloat"/>
+        <param name="y" type="GLfloat"/>
+    </function>
+    <function name="ProgramUniform3fEXT" alias="ProgramUniform3f" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="x" type="GLfloat"/>
+        <param name="y" type="GLfloat"/>
+        <param name="z" type="GLfloat"/>
+    </function>
+    <function name="ProgramUniform4fEXT" alias="ProgramUniform4f" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="x" type="GLfloat"/>
+        <param name="y" type="GLfloat"/>
+        <param name="z" type="GLfloat"/>
+        <param name="w" type="GLfloat"/>
+    </function>
+    <function name="ProgramUniform1ivEXT" alias="ProgramUniform1iv" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="count" type="GLsizei"/>
+        <param name="value" type="const GLint *"/>
+    </function>
+    <function name="ProgramUniform2ivEXT" alias="ProgramUniform2iv" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="count" type="GLsizei"/>
+        <param name="value" type="const GLint *"/>
+    </function>
+    <function name="ProgramUniform3ivEXT" alias="ProgramUniform3iv" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="count" type="GLsizei"/>
+        <param name="value" type="const GLint *"/>
+    </function>
+    <function name="ProgramUniform4ivEXT" alias="ProgramUniform4iv" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="count" type="GLsizei"/>
+        <param name="value" type="const GLint *"/>
+    </function>
+    <function name="ProgramUniform1uivEXT" alias="ProgramUniform1uiv" static_dispatch="false" es2="3.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="count" type="GLsizei"/>
+        <param name="value" type="const GLuint *"/>
+    </function>
+    <function name="ProgramUniform2uivEXT" alias="ProgramUniform2uiv" static_dispatch="false" es2="3.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="count" type="GLsizei"/>
+        <param name="value" type="const GLuint *"/>
+    </function>
+    <function name="ProgramUniform3uivEXT" alias="ProgramUniform3uiv" static_dispatch="false" es2="3.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="count" type="GLsizei"/>
+        <param name="value" type="const GLuint *"/>
+    </function>
+    <function name="ProgramUniform4uivEXT" alias="ProgramUniform4uiv" static_dispatch="false" es2="3.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="count" type="GLsizei"/>
+        <param name="value" type="const GLuint *"/>
+    </function>
+    <function name="ProgramUniform1fvEXT" alias="ProgramUniform1fv" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="count" type="GLsizei"/>
+        <param name="value" type="const GLfloat *"/>
+    </function>
+    <function name="ProgramUniform2fvEXT" alias="ProgramUniform2fv" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="count" type="GLsizei"/>
+        <param name="value" type="const GLfloat *"/>
+    </function>
+    <function name="ProgramUniform3fvEXT" alias="ProgramUniform3fv" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="count" type="GLsizei"/>
+        <param name="value" type="const GLfloat *"/>
+    </function>
+    <function name="ProgramUniform4fvEXT" alias="ProgramUniform4fv" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="count" type="GLsizei"/>
+        <param name="value" type="const GLfloat *"/>
+    </function>
+    <function name="ProgramUniformMatrix2fvEXT" alias="ProgramUniformMatrix2fv" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="count" type="GLsizei"/>
+        <param name="transpose" type="GLboolean"/>
+        <param name="value" type="const GLfloat *"/>
+    </function>
+    <function name="ProgramUniformMatrix3fvEXT" alias="ProgramUniformMatrix3fv" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="count" type="GLsizei"/>
+        <param name="transpose" type="GLboolean"/>
+        <param name="value" type="const GLfloat *"/>
+    </function>
+    <function name="ProgramUniformMatrix4fvEXT" alias="ProgramUniformMatrix4fv" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="count" type="GLsizei"/>
+        <param name="transpose" type="GLboolean"/>
+        <param name="value" type="const GLfloat *"/>
+    </function>
+    <function name="ProgramUniformMatrix2x3fvEXT" alias="ProgramUniformMatrix2x3fv" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="count" type="GLsizei"/>
+        <param name="transpose" type="GLboolean"/>
+        <param name="value" type="const GLfloat *"/>
+    </function>
+    <function name="ProgramUniformMatrix3x2fvEXT" alias="ProgramUniformMatrix3x2fv" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="count" type="GLsizei"/>
+        <param name="transpose" type="GLboolean"/>
+        <param name="value" type="const GLfloat *"/>
+    </function>
+    <function name="ProgramUniformMatrix2x4fvEXT" alias="ProgramUniformMatrix2x4fv" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="count" type="GLsizei"/>
+        <param name="transpose" type="GLboolean"/>
+        <param name="value" type="const GLfloat *"/>
+    </function>
+    <function name="ProgramUniformMatrix4x2fvEXT" alias="ProgramUniformMatrix4x2fv" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="count" type="GLsizei"/>
+        <param name="transpose" type="GLboolean"/>
+        <param name="value" type="const GLfloat *"/>
+    </function>
+    <function name="ProgramUniformMatrix3x4fvEXT" alias="ProgramUniformMatrix3x4fv" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="count" type="GLsizei"/>
+        <param name="transpose" type="GLboolean"/>
+        <param name="value" type="const GLfloat *"/>
+    </function>
+    <function name="ProgramUniformMatrix4x3fvEXT" alias="ProgramUniformMatrix4x3fv" static_dispatch="false" es2="2.0">
+        <param name="program" type="GLuint"/>
+        <param name="location" type="GLint"/>
+        <param name="count" type="GLsizei"/>
+        <param name="transpose" type="GLboolean"/>
+        <param name="value" type="const GLfloat *"/>
+    </function>
+    <function name="ValidateProgramPipelineEXT" alias="ValidateProgramPipeline" static_dispatch="false" es2="2.0">
+        <param name="pipeline" type="GLuint"/>
+    </function>
+    <function name="GetProgramPipelineInfoLogEXT" alias="GetProgramPipelineInfoLog" static_dispatch="false" es2="2.0">
+        <param name="pipeline" type="GLuint"/>
+        <param name="bufSize" type="GLsizei"/>
+        <param name="length" type="GLsizei *"/>
+        <param name="infoLog" type="GLchar *"/>
+    </function>
 </category>
 </OpenGLAPI>
index 0d1126e29daf6e214d05af00efda01a50c598cda..55ed5d3cc2cb97d6df75ae77f645191abb5ec7ea 100644 (file)
@@ -218,6 +218,7 @@ static const struct extension extension_table[] = {
    { "GL_EXT_provoking_vertex",                    o(EXT_provoking_vertex),                    GL,             2009 },
    { "GL_EXT_rescale_normal",                      o(dummy_true),                              GLL,            1997 },
    { "GL_EXT_secondary_color",                     o(dummy_true),                              GLL,            1999 },
+   { "GL_EXT_separate_shader_objects",             o(dummy_true),                                         ES2, 2013 },
    { "GL_EXT_separate_specular_color",             o(dummy_true),                              GLL,            1997 },
    { "GL_EXT_shader_integer_mix",                  o(EXT_shader_integer_mix),                  GL       | ES3, 2013 },
    { "GL_EXT_shadow_funcs",                        o(ARB_shadow),                              GLL,            2002 },
index b777352a5f758acc45563f7bc8eb7519fdc315f3..fe797f9808885629ea7565db984a1b85b563d616 100644 (file)
@@ -1303,6 +1303,43 @@ const struct function gles2_functions_possible[] = {
    { "glGetProgramBinaryOES", 20, -1 },
    { "glProgramBinaryOES", 20, -1 },
 
+   /* GL_EXT_separate_shader_objects - Also part of OpenGL ES 3.1. */
+   { "glProgramParameteriEXT", 20, -1 },
+   { "glUseProgramStagesEXT", 20, -1 },
+   { "glActiveShaderProgramEXT", 20, -1 },
+   { "glCreateShaderProgramvEXT", 20, -1 },
+   { "glBindProgramPipelineEXT", 20, -1 },
+   { "glDeleteProgramPipelinesEXT", 20, -1 },
+   { "glGenProgramPipelinesEXT", 20, -1 },
+   { "glIsProgramPipelineEXT", 20, -1 },
+   { "glGetProgramPipelineivEXT", 20, -1 },
+   { "glProgramUniform1iEXT", 20, -1 },
+   { "glProgramUniform1ivEXT", 20, -1 },
+   { "glProgramUniform1fEXT", 20, -1 },
+   { "glProgramUniform1fvEXT", 20, -1 },
+   { "glProgramUniform2iEXT", 20, -1 },
+   { "glProgramUniform2ivEXT", 20, -1 },
+   { "glProgramUniform2fEXT", 20, -1 },
+   { "glProgramUniform2fvEXT", 20, -1 },
+   { "glProgramUniform3iEXT", 20, -1 },
+   { "glProgramUniform3ivEXT", 20, -1 },
+   { "glProgramUniform3fEXT", 20, -1 },
+   { "glProgramUniform3fvEXT", 20, -1 },
+   { "glProgramUniform4iEXT", 20, -1 },
+   { "glProgramUniform4ivEXT", 20, -1 },
+   { "glProgramUniform4fEXT", 20, -1 },
+   { "glProgramUniform4fvEXT", 20, -1 },
+   { "glProgramUniformMatrix2fvEXT", 20, -1 },
+   { "glProgramUniformMatrix3fvEXT", 20, -1 },
+   { "glProgramUniformMatrix4fvEXT", 20, -1 },
+   { "glProgramUniformMatrix2x3fvEXT", 20, -1 },
+   { "glProgramUniformMatrix3x2fvEXT", 20, -1 },
+   { "glProgramUniformMatrix2x4fvEXT", 20, -1 },
+   { "glProgramUniformMatrix4x2fvEXT", 20, -1 },
+   { "glProgramUniformMatrix3x4fvEXT", 20, -1 },
+   { "glProgramUniformMatrix4x3fvEXT", 20, -1 },
+   { "glValidateProgramPipelineEXT", 20, -1 },
+   { "glGetProgramPipelineInfoLogEXT", 20, -1 },
    { NULL, 0, -1 }
 };
 
@@ -1386,7 +1423,7 @@ const struct function gles3_functions_possible[] = {
    // { "glMapBufferRange", 30, -1 },
    { "glPauseTransformFeedback", 30, -1 },
    // glProgramBinary aliases glProgramBinaryOES in GLES 2
-   { "glProgramParameteri", 30, -1 },
+   // glProgramParameteri aliases glProgramParameteriEXT in GLES 2
    // We check for the aliased -NV version in GLES 2
    // { "glReadBuffer", 30, -1 },
    { "glRenderbufferStorageMultisample", 30, -1 },
@@ -1426,5 +1463,16 @@ const struct function gles3_functions_possible[] = {
    { "glVertexAttribI4uiv", 30, -1 },
    { "glVertexAttribIPointer", 30, -1 },
    { "glWaitSync", 30, -1 },
+
+   /* GL_EXT_separate_shader_objects - Also part of OpenGL ES 3.1. */
+   { "glProgramUniform1uiEXT", 30, -1 },
+   { "glProgramUniform1uivEXT", 30, -1 },
+   { "glProgramUniform2uiEXT", 30, -1 },
+   { "glProgramUniform2uivEXT", 30, -1 },
+   { "glProgramUniform3uiEXT", 30, -1 },
+   { "glProgramUniform3uivEXT", 30, -1 },
+   { "glProgramUniform4uiEXT", 30, -1 },
+   { "glProgramUniform4uivEXT", 30, -1 },
+
    { NULL, 0, -1 }
 };