diff options
author | Ian Romanick <[email protected]> | 2014-03-26 13:11:44 -0700 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2014-05-02 07:20:10 -0700 |
commit | 7d9adef3409583ef480d6f25014188d38e261a1e (patch) | |
tree | 3899526aab35aabd477421370c18b11b06bdddef /src | |
parent | 507b875cf50ce1743403a084f5bc5f5fac0ca22e (diff) |
mesa: Enable GL_EXT_separate_shader_objects for OpenGL ES
Signed-off-by: Ian Romanick <[email protected]>
Reviewed-by: Eric Anholt <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/glsl/glcpp/glcpp-parse.y | 1 | ||||
-rw-r--r-- | src/glsl/glsl_parser_extras.cpp | 1 | ||||
-rw-r--r-- | src/glsl/glsl_parser_extras.h | 8 | ||||
-rw-r--r-- | src/glsl/linker.cpp | 3 | ||||
-rw-r--r-- | src/mapi/glapi/gen/EXT_separate_shader_objects.xml | 273 | ||||
-rw-r--r-- | src/mesa/main/extensions.c | 1 | ||||
-rw-r--r-- | src/mesa/main/tests/dispatch_sanity.cpp | 50 |
7 files changed, 331 insertions, 6 deletions
diff --git a/src/glsl/glcpp/glcpp-parse.y b/src/glsl/glcpp/glcpp-parse.y index 412d571e6eb..98875837cdd 100644 --- a/src/glsl/glcpp/glcpp-parse.y +++ b/src/glsl/glcpp/glcpp-parse.y @@ -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) diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp index d7352a7d66d..1e619265c9e 100644 --- a/src/glsl/glsl_parser_extras.cpp +++ b/src/glsl/glsl_parser_extras.cpp @@ -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), }; diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h index 725ee62ab21..0416a9c7252 100644 --- a/src/glsl/glsl_parser_extras.h +++ b/src/glsl/glsl_parser_extras.h @@ -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; diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index fbc03587765..7ec1e5a34f3 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -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) { diff --git a/src/mapi/glapi/gen/EXT_separate_shader_objects.xml b/src/mapi/glapi/gen/EXT_separate_shader_objects.xml index 9079363ceef..c6163a193b8 100644 --- a/src/mapi/glapi/gen/EXT_separate_shader_objects.xml +++ b/src/mapi/glapi/gen/EXT_separate_shader_objects.xml @@ -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"/> @@ -22,5 +22,276 @@ <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> diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c index 0d1126e29da..55ed5d3cc2c 100644 --- a/src/mesa/main/extensions.c +++ b/src/mesa/main/extensions.c @@ -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 }, diff --git a/src/mesa/main/tests/dispatch_sanity.cpp b/src/mesa/main/tests/dispatch_sanity.cpp index b777352a5f7..fe797f98088 100644 --- a/src/mesa/main/tests/dispatch_sanity.cpp +++ b/src/mesa/main/tests/dispatch_sanity.cpp @@ -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 } }; |