2 * Mesa 3-D graphics library
4 * Copyright (C) 2004-2008 Brian Paul All Rights Reserved.
5 * Copyright (C) 2009-2010 VMware, Inc. All Rights Reserved.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 * Implementation of GLSL-related API functions.
30 * The glUniform* functions are in uniforms.c
34 * 1. Check that the right error code is generated for all _mesa_error() calls.
35 * 2. Insert FLUSH_VERTICES calls in various places
39 #include "main/glheader.h"
40 #include "main/context.h"
41 #include "main/dispatch.h"
42 #include "main/enums.h"
43 #include "main/hash.h"
44 #include "main/mfeatures.h"
45 #include "main/mtypes.h"
46 #include "main/shaderapi.h"
47 #include "main/shaderobj.h"
48 #include "main/uniforms.h"
49 #include "program/program.h"
50 #include "program/prog_parameter.h"
53 #include "../glsl/glsl_parser_extras.h"
54 #include "../glsl/ir_uniform.h"
56 /** Define this to enable shader substitution (see below) */
57 #define SHADER_SUBST 0
61 * Return mask of GLSL_x flags by examining the MESA_GLSL env var.
64 get_shader_flags(void)
66 GLbitfield flags = 0x0;
67 const char *env = _mesa_getenv("MESA_GLSL");
70 if (strstr(env, "dump"))
72 if (strstr(env, "log"))
74 if (strstr(env, "nopvert"))
75 flags |= GLSL_NOP_VERT;
76 if (strstr(env, "nopfrag"))
77 flags |= GLSL_NOP_FRAG;
78 if (strstr(env, "nopt"))
80 else if (strstr(env, "opt"))
82 if (strstr(env, "uniform"))
83 flags |= GLSL_UNIFORMS;
84 if (strstr(env, "useprog"))
85 flags |= GLSL_USE_PROG;
86 if (strstr(env, "errors"))
87 flags |= GLSL_REPORT_ERRORS;
95 * Initialize context's shader state.
98 _mesa_init_shader_state(struct gl_context *ctx)
100 /* Device drivers may override these to control what kind of instructions
101 * are generated by the GLSL compiler.
103 struct gl_shader_compiler_options options;
106 memset(&options, 0, sizeof(options));
107 options.MaxUnrollIterations = 32;
108 options.MaxIfDepth = UINT_MAX;
110 /* Default pragma settings */
111 options.DefaultPragmas.Optimize = GL_TRUE;
113 for (sh = 0; sh < MESA_SHADER_TYPES; ++sh)
114 memcpy(&ctx->ShaderCompilerOptions[sh], &options, sizeof(options));
116 ctx->Shader.Flags = get_shader_flags();
121 * Free the per-context shader-related state.
124 _mesa_free_shader_state(struct gl_context *ctx)
126 _mesa_reference_shader_program(ctx, &ctx->Shader.CurrentVertexProgram, NULL);
127 _mesa_reference_shader_program(ctx, &ctx->Shader.CurrentGeometryProgram,
129 _mesa_reference_shader_program(ctx, &ctx->Shader.CurrentFragmentProgram,
131 _mesa_reference_shader_program(ctx, &ctx->Shader._CurrentFragmentProgram,
133 _mesa_reference_shader_program(ctx, &ctx->Shader.ActiveProgram, NULL);
138 * Copy string from <src> to <dst>, up to maxLength characters, returning
139 * length of <dst> in <length>.
140 * \param src the strings source
141 * \param maxLength max chars to copy
142 * \param length returns number of chars copied
143 * \param dst the string destination
146 _mesa_copy_string(GLchar *dst, GLsizei maxLength,
147 GLsizei *length, const GLchar *src)
150 for (len = 0; len < maxLength - 1 && src && src[len]; len++)
161 * Confirm that the a shader type is valid and supported by the implementation
163 * \param ctx Current GL context
164 * \param type Shader target
168 validate_shader_target(const struct gl_context *ctx, GLenum type)
171 #if FEATURE_ARB_fragment_shader
172 case GL_FRAGMENT_SHADER:
173 return ctx->Extensions.ARB_fragment_shader;
175 #if FEATURE_ARB_vertex_shader
176 case GL_VERTEX_SHADER:
177 return ctx->Extensions.ARB_vertex_shader;
179 #if FEATURE_ARB_geometry_shader4
180 case GL_GEOMETRY_SHADER_ARB:
181 return _mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_geometry_shader4;
190 is_program(struct gl_context *ctx, GLuint name)
192 struct gl_shader_program *shProg = _mesa_lookup_shader_program(ctx, name);
193 return shProg ? GL_TRUE : GL_FALSE;
198 is_shader(struct gl_context *ctx, GLuint name)
200 struct gl_shader *shader = _mesa_lookup_shader(ctx, name);
201 return shader ? GL_TRUE : GL_FALSE;
206 * Attach shader to a shader program.
209 attach_shader(struct gl_context *ctx, GLuint program, GLuint shader)
211 struct gl_shader_program *shProg;
212 struct gl_shader *sh;
215 shProg = _mesa_lookup_shader_program_err(ctx, program, "glAttachShader");
219 sh = _mesa_lookup_shader_err(ctx, shader, "glAttachShader");
224 n = shProg->NumShaders;
225 for (i = 0; i < n; i++) {
226 if (shProg->Shaders[i] == sh) {
227 /* The shader is already attched to this program. The
228 * GL_ARB_shader_objects spec says:
230 * "The error INVALID_OPERATION is generated by AttachObjectARB
231 * if <obj> is already attached to <containerObj>."
233 _mesa_error(ctx, GL_INVALID_OPERATION, "glAttachShader");
239 shProg->Shaders = (struct gl_shader **)
240 _mesa_realloc(shProg->Shaders,
241 n * sizeof(struct gl_shader *),
242 (n + 1) * sizeof(struct gl_shader *));
243 if (!shProg->Shaders) {
244 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glAttachShader");
249 shProg->Shaders[n] = NULL; /* since realloc() didn't zero the new space */
250 _mesa_reference_shader(ctx, &shProg->Shaders[n], sh);
251 shProg->NumShaders++;
256 create_shader(struct gl_context *ctx, GLenum type)
258 struct gl_shader *sh;
261 if (!validate_shader_target(ctx, type)) {
262 _mesa_error(ctx, GL_INVALID_ENUM, "CreateShader(type)");
266 name = _mesa_HashFindFreeKeyBlock(ctx->Shared->ShaderObjects, 1);
267 sh = ctx->Driver.NewShader(ctx, name, type);
268 _mesa_HashInsert(ctx->Shared->ShaderObjects, name, sh);
275 create_shader_program(struct gl_context *ctx)
278 struct gl_shader_program *shProg;
280 name = _mesa_HashFindFreeKeyBlock(ctx->Shared->ShaderObjects, 1);
282 shProg = ctx->Driver.NewShaderProgram(ctx, name);
284 _mesa_HashInsert(ctx->Shared->ShaderObjects, name, shProg);
286 assert(shProg->RefCount == 1);
293 * Named w/ "2" to indicate OpenGL 2.x vs GL_ARB_fragment_programs's
297 delete_shader_program(struct gl_context *ctx, GLuint name)
300 * NOTE: deleting shaders/programs works a bit differently than
301 * texture objects (and buffer objects, etc). Shader/program
302 * handles/IDs exist in the hash table until the object is really
303 * deleted (refcount==0). With texture objects, the handle/ID is
304 * removed from the hash table in glDeleteTextures() while the tex
305 * object itself might linger until its refcount goes to zero.
307 struct gl_shader_program *shProg;
309 shProg = _mesa_lookup_shader_program_err(ctx, name, "glDeleteProgram");
313 if (!shProg->DeletePending) {
314 shProg->DeletePending = GL_TRUE;
316 /* effectively, decr shProg's refcount */
317 _mesa_reference_shader_program(ctx, &shProg, NULL);
323 delete_shader(struct gl_context *ctx, GLuint shader)
325 struct gl_shader *sh;
327 sh = _mesa_lookup_shader_err(ctx, shader, "glDeleteShader");
331 if (!sh->DeletePending) {
332 sh->DeletePending = GL_TRUE;
334 /* effectively, decr sh's refcount */
335 _mesa_reference_shader(ctx, &sh, NULL);
341 detach_shader(struct gl_context *ctx, GLuint program, GLuint shader)
343 struct gl_shader_program *shProg;
347 shProg = _mesa_lookup_shader_program_err(ctx, program, "glDetachShader");
351 n = shProg->NumShaders;
353 for (i = 0; i < n; i++) {
354 if (shProg->Shaders[i]->Name == shader) {
356 struct gl_shader **newList;
359 _mesa_reference_shader(ctx, &shProg->Shaders[i], NULL);
361 /* alloc new, smaller array */
362 newList = (struct gl_shader **)
363 malloc((n - 1) * sizeof(struct gl_shader *));
365 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glDetachShader");
368 for (j = 0; j < i; j++) {
369 newList[j] = shProg->Shaders[j];
372 newList[j++] = shProg->Shaders[i];
373 free(shProg->Shaders);
375 shProg->Shaders = newList;
376 shProg->NumShaders = n - 1;
381 for (j = 0; j < shProg->NumShaders; j++) {
382 assert(shProg->Shaders[j]->Type == GL_VERTEX_SHADER ||
383 shProg->Shaders[j]->Type == GL_FRAGMENT_SHADER);
384 assert(shProg->Shaders[j]->RefCount > 0);
396 if (is_shader(ctx, shader))
397 err = GL_INVALID_OPERATION;
398 else if (is_program(ctx, shader))
399 err = GL_INVALID_OPERATION;
401 err = GL_INVALID_VALUE;
402 _mesa_error(ctx, err, "glDetachProgram(shader)");
409 * Return list of shaders attached to shader program.
412 get_attached_shaders(struct gl_context *ctx, GLuint program, GLsizei maxCount,
413 GLsizei *count, GLuint *obj)
415 struct gl_shader_program *shProg =
416 _mesa_lookup_shader_program_err(ctx, program, "glGetAttachedShaders");
419 for (i = 0; i < (GLuint) maxCount && i < shProg->NumShaders; i++) {
420 obj[i] = shProg->Shaders[i]->Name;
429 * glGetHandleARB() - return ID/name of currently bound shader program.
432 get_handle(struct gl_context *ctx, GLenum pname)
434 if (pname == GL_PROGRAM_OBJECT_ARB) {
435 if (ctx->Shader.ActiveProgram)
436 return ctx->Shader.ActiveProgram->Name;
441 _mesa_error(ctx, GL_INVALID_ENUM, "glGetHandleARB");
448 * glGetProgramiv() - get shader program state.
449 * Note that this is for GLSL shader programs, not ARB vertex/fragment
450 * programs (see glGetProgramivARB).
453 get_programiv(struct gl_context *ctx, GLuint program, GLenum pname, GLint *params)
455 struct gl_shader_program *shProg
456 = _mesa_lookup_shader_program(ctx, program);
458 #if FEATURE_EXT_transform_feedback
459 /* Is transform feedback available in this context?
462 (ctx->API == API_OPENGL && ctx->Extensions.EXT_transform_feedback)
463 || ctx->API == API_OPENGL_CORE
464 || _mesa_is_gles3(ctx);
467 #if FEATURE_ARB_geometry_shader4
468 /* Are geometry shaders available in this context?
471 _mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_geometry_shader4;
474 /* Are uniform buffer objects available in this context?
477 (ctx->API == API_OPENGL && ctx->Extensions.ARB_uniform_buffer_object)
478 || ctx->API == API_OPENGL_CORE
479 || _mesa_is_gles3(ctx);
482 _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramiv(program)");
487 case GL_DELETE_STATUS:
488 *params = shProg->DeletePending;
491 *params = shProg->LinkStatus;
493 case GL_VALIDATE_STATUS:
494 *params = shProg->Validated;
496 case GL_INFO_LOG_LENGTH:
497 *params = shProg->InfoLog ? strlen(shProg->InfoLog) + 1 : 0;
499 case GL_ATTACHED_SHADERS:
500 *params = shProg->NumShaders;
502 case GL_ACTIVE_ATTRIBUTES:
503 *params = _mesa_count_active_attribs(shProg);
505 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
506 *params = _mesa_longest_attribute_name_length(shProg);
508 case GL_ACTIVE_UNIFORMS:
509 *params = shProg->NumUserUniformStorage;
511 case GL_ACTIVE_UNIFORM_MAX_LENGTH: {
515 for (i = 0; i < shProg->NumUserUniformStorage; i++) {
516 /* Add one for the terminating NUL character.
518 const GLint len = strlen(shProg->UniformStorage[i].name) + 1;
527 #if FEATURE_EXT_transform_feedback
528 case GL_TRANSFORM_FEEDBACK_VARYINGS:
531 *params = shProg->TransformFeedback.NumVarying;
533 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH: {
539 for (i = 0; i < shProg->TransformFeedback.NumVarying; i++) {
540 /* Add one for the terminating NUL character.
542 const GLint len = strlen(shProg->TransformFeedback.VaryingNames[i]) + 1;
551 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
554 *params = shProg->TransformFeedback.BufferMode;
557 #if FEATURE_ARB_geometry_shader4
558 case GL_GEOMETRY_VERTICES_OUT_ARB:
561 *params = shProg->Geom.VerticesOut;
563 case GL_GEOMETRY_INPUT_TYPE_ARB:
566 *params = shProg->Geom.InputType;
568 case GL_GEOMETRY_OUTPUT_TYPE_ARB:
571 *params = shProg->Geom.OutputType;
574 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH: {
581 for (i = 0; i < shProg->NumUniformBlocks; i++) {
582 /* Add one for the terminating NUL character.
584 const GLint len = strlen(shProg->UniformBlocks[i].Name) + 1;
593 case GL_ACTIVE_UNIFORM_BLOCKS:
597 *params = shProg->NumUniformBlocks;
603 _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramiv(pname=%s)",
604 _mesa_lookup_enum_by_nr(pname));
609 * glGetShaderiv() - get GLSL shader state
612 get_shaderiv(struct gl_context *ctx, GLuint name, GLenum pname, GLint *params)
614 struct gl_shader *shader =
615 _mesa_lookup_shader_err(ctx, name, "glGetShaderiv");
623 *params = shader->Type;
625 case GL_DELETE_STATUS:
626 *params = shader->DeletePending;
628 case GL_COMPILE_STATUS:
629 *params = shader->CompileStatus;
631 case GL_INFO_LOG_LENGTH:
632 *params = shader->InfoLog ? strlen(shader->InfoLog) + 1 : 0;
634 case GL_SHADER_SOURCE_LENGTH:
635 *params = shader->Source ? strlen((char *) shader->Source) + 1 : 0;
638 _mesa_error(ctx, GL_INVALID_ENUM, "glGetShaderiv(pname)");
645 get_program_info_log(struct gl_context *ctx, GLuint program, GLsizei bufSize,
646 GLsizei *length, GLchar *infoLog)
648 struct gl_shader_program *shProg
649 = _mesa_lookup_shader_program(ctx, program);
651 _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramInfoLog(program)");
654 _mesa_copy_string(infoLog, bufSize, length, shProg->InfoLog);
659 get_shader_info_log(struct gl_context *ctx, GLuint shader, GLsizei bufSize,
660 GLsizei *length, GLchar *infoLog)
662 struct gl_shader *sh = _mesa_lookup_shader(ctx, shader);
664 _mesa_error(ctx, GL_INVALID_VALUE, "glGetShaderInfoLog(shader)");
667 _mesa_copy_string(infoLog, bufSize, length, sh->InfoLog);
672 * Return shader source code.
675 get_shader_source(struct gl_context *ctx, GLuint shader, GLsizei maxLength,
676 GLsizei *length, GLchar *sourceOut)
678 struct gl_shader *sh;
679 sh = _mesa_lookup_shader_err(ctx, shader, "glGetShaderSource");
683 _mesa_copy_string(sourceOut, maxLength, length, sh->Source);
688 * Set/replace shader source code. A helper function used by
689 * glShaderSource[ARB] and glCreateShaderProgramEXT.
692 shader_source(struct gl_context *ctx, GLuint shader, const GLchar *source)
694 struct gl_shader *sh;
696 sh = _mesa_lookup_shader_err(ctx, shader, "glShaderSource");
700 /* free old shader source string and install new one */
702 free((void *) sh->Source);
705 sh->CompileStatus = GL_FALSE;
707 sh->SourceChecksum = _mesa_str_checksum(sh->Source);
716 compile_shader(struct gl_context *ctx, GLuint shaderObj)
718 struct gl_shader *sh;
719 struct gl_shader_compiler_options *options;
721 sh = _mesa_lookup_shader_err(ctx, shaderObj, "glCompileShader");
725 options = &ctx->ShaderCompilerOptions[_mesa_shader_type_to_index(sh->Type)];
727 /* set default pragma state for shader */
728 sh->Pragmas = options->DefaultPragmas;
730 /* this call will set the sh->CompileStatus field to indicate if
731 * compilation was successful.
733 _mesa_glsl_compile_shader(ctx, sh);
735 if (sh->CompileStatus == GL_FALSE &&
736 (ctx->Shader.Flags & GLSL_REPORT_ERRORS)) {
737 _mesa_debug(ctx, "Error compiling shader %u:\n%s\n",
738 sh->Name, sh->InfoLog);
744 * Link a program's shaders.
747 link_program(struct gl_context *ctx, GLuint program)
749 struct gl_shader_program *shProg;
750 struct gl_transform_feedback_object *obj =
751 ctx->TransformFeedback.CurrentObject;
753 shProg = _mesa_lookup_shader_program_err(ctx, program, "glLinkProgram");
758 && (shProg == ctx->Shader.CurrentVertexProgram
759 || shProg == ctx->Shader.CurrentGeometryProgram
760 || shProg == ctx->Shader.CurrentFragmentProgram)) {
761 _mesa_error(ctx, GL_INVALID_OPERATION,
762 "glLinkProgram(transform feedback active)");
766 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
768 _mesa_glsl_link_shader(ctx, shProg);
770 if (shProg->LinkStatus == GL_FALSE &&
771 (ctx->Shader.Flags & GLSL_REPORT_ERRORS)) {
772 _mesa_debug(ctx, "Error linking program %u:\n%s\n",
773 shProg->Name, shProg->InfoLog);
780 printf("Link %u shaders in program %u: %s\n",
781 shProg->NumShaders, shProg->Name,
782 shProg->LinkStatus ? "Success" : "Failed");
784 for (i = 0; i < shProg->NumShaders; i++) {
785 printf(" shader %u, type 0x%x\n",
786 shProg->Shaders[i]->Name,
787 shProg->Shaders[i]->Type);
794 * Print basic shader info (for debug).
797 print_shader_info(const struct gl_shader_program *shProg)
801 printf("Mesa: glUseProgram(%u)\n", shProg->Name);
802 for (i = 0; i < shProg->NumShaders; i++) {
804 switch (shProg->Shaders[i]->Type) {
805 case GL_VERTEX_SHADER:
808 case GL_FRAGMENT_SHADER:
811 case GL_GEOMETRY_SHADER:
817 printf(" %s shader %u, checksum %u\n", s,
818 shProg->Shaders[i]->Name,
819 shProg->Shaders[i]->SourceChecksum);
821 if (shProg->_LinkedShaders[MESA_SHADER_VERTEX])
822 printf(" vert prog %u\n",
823 shProg->_LinkedShaders[MESA_SHADER_VERTEX]->Program->Id);
824 if (shProg->_LinkedShaders[MESA_SHADER_FRAGMENT])
825 printf(" frag prog %u\n",
826 shProg->_LinkedShaders[MESA_SHADER_FRAGMENT]->Program->Id);
827 if (shProg->_LinkedShaders[MESA_SHADER_GEOMETRY])
828 printf(" geom prog %u\n",
829 shProg->_LinkedShaders[MESA_SHADER_GEOMETRY]->Program->Id);
834 * Use the named shader program for subsequent glUniform calls
837 _mesa_active_program(struct gl_context *ctx, struct gl_shader_program *shProg,
840 if ((shProg != NULL) && !shProg->LinkStatus) {
841 _mesa_error(ctx, GL_INVALID_OPERATION,
842 "%s(program %u not linked)", caller, shProg->Name);
846 if (ctx->Shader.ActiveProgram != shProg) {
847 _mesa_reference_shader_program(ctx, &ctx->Shader.ActiveProgram, shProg);
854 use_shader_program(struct gl_context *ctx, GLenum type,
855 struct gl_shader_program *shProg)
857 struct gl_shader_program **target;
860 #if FEATURE_ARB_vertex_shader
861 case GL_VERTEX_SHADER:
862 target = &ctx->Shader.CurrentVertexProgram;
864 || (shProg->_LinkedShaders[MESA_SHADER_VERTEX] == NULL)) {
869 #if FEATURE_ARB_geometry_shader4
870 case GL_GEOMETRY_SHADER_ARB:
871 target = &ctx->Shader.CurrentGeometryProgram;
873 || (shProg->_LinkedShaders[MESA_SHADER_GEOMETRY] == NULL)) {
878 #if FEATURE_ARB_fragment_shader
879 case GL_FRAGMENT_SHADER:
880 target = &ctx->Shader.CurrentFragmentProgram;
882 || (shProg->_LinkedShaders[MESA_SHADER_FRAGMENT] == NULL)) {
891 if (*target != shProg) {
892 FLUSH_VERTICES(ctx, _NEW_PROGRAM | _NEW_PROGRAM_CONSTANTS);
894 /* If the shader is also bound as the current rendering shader, unbind
895 * it from that binding point as well. This ensures that the correct
896 * semantics of glDeleteProgram are maintained.
899 #if FEATURE_ARB_vertex_shader
900 case GL_VERTEX_SHADER:
904 #if FEATURE_ARB_geometry_shader4
905 case GL_GEOMETRY_SHADER_ARB:
909 #if FEATURE_ARB_fragment_shader
910 case GL_FRAGMENT_SHADER:
911 if (*target == ctx->Shader._CurrentFragmentProgram) {
912 _mesa_reference_shader_program(ctx,
913 &ctx->Shader._CurrentFragmentProgram,
920 _mesa_reference_shader_program(ctx, target, shProg);
928 * Use the named shader program for subsequent rendering.
931 _mesa_use_program(struct gl_context *ctx, struct gl_shader_program *shProg)
933 use_shader_program(ctx, GL_VERTEX_SHADER, shProg);
934 use_shader_program(ctx, GL_GEOMETRY_SHADER_ARB, shProg);
935 use_shader_program(ctx, GL_FRAGMENT_SHADER, shProg);
936 _mesa_active_program(ctx, shProg, "glUseProgram");
938 if (ctx->Driver.UseProgram)
939 ctx->Driver.UseProgram(ctx, shProg);
944 * Do validation of the given shader program.
945 * \param errMsg returns error message if validation fails.
946 * \return GL_TRUE if valid, GL_FALSE if invalid (and set errMsg)
949 validate_shader_program(const struct gl_shader_program *shProg,
952 if (!shProg->LinkStatus) {
956 /* From the GL spec, a program is invalid if any of these are true:
958 any two active samplers in the current program object are of
959 different types, but refer to the same texture image unit,
961 any active sampler in the current program object refers to a texture
962 image unit where fixed-function fragment processing accesses a
963 texture target that does not match the sampler type, or
965 the sum of the number of active samplers in the program and the
966 number of texture image units enabled for fixed-function fragment
967 processing exceeds the combined limit on the total number of texture
973 * Check: any two active samplers in the current program object are of
974 * different types, but refer to the same texture image unit,
976 if (!_mesa_sampler_uniforms_are_valid(shProg, errMsg, 100))
984 * Called via glValidateProgram()
987 validate_program(struct gl_context *ctx, GLuint program)
989 struct gl_shader_program *shProg;
990 char errMsg[100] = "";
992 shProg = _mesa_lookup_shader_program_err(ctx, program, "glValidateProgram");
997 shProg->Validated = validate_shader_program(shProg, errMsg);
998 if (!shProg->Validated) {
999 /* update info log */
1000 if (shProg->InfoLog) {
1001 ralloc_free(shProg->InfoLog);
1003 shProg->InfoLog = ralloc_strdup(shProg, errMsg);
1010 _mesa_AttachObjectARB(GLhandleARB program, GLhandleARB shader)
1012 GET_CURRENT_CONTEXT(ctx);
1013 attach_shader(ctx, program, shader);
1018 _mesa_AttachShader(GLuint program, GLuint shader)
1020 GET_CURRENT_CONTEXT(ctx);
1021 attach_shader(ctx, program, shader);
1026 _mesa_CompileShaderARB(GLhandleARB shaderObj)
1028 GET_CURRENT_CONTEXT(ctx);
1029 if (MESA_VERBOSE & VERBOSE_API)
1030 _mesa_debug(ctx, "glCompileShader %u\n", shaderObj);
1031 compile_shader(ctx, shaderObj);
1036 _mesa_CreateShader(GLenum type)
1038 GET_CURRENT_CONTEXT(ctx);
1039 if (MESA_VERBOSE & VERBOSE_API)
1040 _mesa_debug(ctx, "glCreateShader %s\n", _mesa_lookup_enum_by_nr(type));
1041 return create_shader(ctx, type);
1045 GLhandleARB GLAPIENTRY
1046 _mesa_CreateShaderObjectARB(GLenum type)
1048 GET_CURRENT_CONTEXT(ctx);
1049 return create_shader(ctx, type);
1054 _mesa_CreateProgram(void)
1056 GET_CURRENT_CONTEXT(ctx);
1057 if (MESA_VERBOSE & VERBOSE_API)
1058 _mesa_debug(ctx, "glCreateProgram\n");
1059 return create_shader_program(ctx);
1063 GLhandleARB GLAPIENTRY
1064 _mesa_CreateProgramObjectARB(void)
1066 GET_CURRENT_CONTEXT(ctx);
1067 return create_shader_program(ctx);
1072 _mesa_DeleteObjectARB(GLhandleARB obj)
1074 if (MESA_VERBOSE & VERBOSE_API) {
1075 GET_CURRENT_CONTEXT(ctx);
1076 _mesa_debug(ctx, "glDeleteObjectARB(%u)\n", obj);
1080 GET_CURRENT_CONTEXT(ctx);
1081 FLUSH_VERTICES(ctx, 0);
1082 if (is_program(ctx, obj)) {
1083 delete_shader_program(ctx, obj);
1085 else if (is_shader(ctx, obj)) {
1086 delete_shader(ctx, obj);
1096 _mesa_DeleteProgram(GLuint name)
1099 GET_CURRENT_CONTEXT(ctx);
1100 FLUSH_VERTICES(ctx, 0);
1101 delete_shader_program(ctx, name);
1107 _mesa_DeleteShader(GLuint name)
1110 GET_CURRENT_CONTEXT(ctx);
1111 FLUSH_VERTICES(ctx, 0);
1112 delete_shader(ctx, name);
1118 _mesa_DetachObjectARB(GLhandleARB program, GLhandleARB shader)
1120 GET_CURRENT_CONTEXT(ctx);
1121 detach_shader(ctx, program, shader);
1126 _mesa_DetachShader(GLuint program, GLuint shader)
1128 GET_CURRENT_CONTEXT(ctx);
1129 detach_shader(ctx, program, shader);
1134 _mesa_GetAttachedObjectsARB(GLhandleARB container, GLsizei maxCount,
1135 GLsizei * count, GLhandleARB * obj)
1137 GET_CURRENT_CONTEXT(ctx);
1138 get_attached_shaders(ctx, container, maxCount, count, obj);
1143 _mesa_GetAttachedShaders(GLuint program, GLsizei maxCount,
1144 GLsizei *count, GLuint *obj)
1146 GET_CURRENT_CONTEXT(ctx);
1147 get_attached_shaders(ctx, program, maxCount, count, obj);
1152 _mesa_GetInfoLogARB(GLhandleARB object, GLsizei maxLength, GLsizei * length,
1153 GLcharARB * infoLog)
1155 GET_CURRENT_CONTEXT(ctx);
1156 if (is_program(ctx, object)) {
1157 get_program_info_log(ctx, object, maxLength, length, infoLog);
1159 else if (is_shader(ctx, object)) {
1160 get_shader_info_log(ctx, object, maxLength, length, infoLog);
1163 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetInfoLogARB");
1169 _mesa_GetObjectParameterivARB(GLhandleARB object, GLenum pname, GLint *params)
1171 GET_CURRENT_CONTEXT(ctx);
1172 /* Implement in terms of GetProgramiv, GetShaderiv */
1173 if (is_program(ctx, object)) {
1174 if (pname == GL_OBJECT_TYPE_ARB) {
1175 *params = GL_PROGRAM_OBJECT_ARB;
1178 get_programiv(ctx, object, pname, params);
1181 else if (is_shader(ctx, object)) {
1182 if (pname == GL_OBJECT_TYPE_ARB) {
1183 *params = GL_SHADER_OBJECT_ARB;
1186 get_shaderiv(ctx, object, pname, params);
1190 _mesa_error(ctx, GL_INVALID_VALUE, "glGetObjectParameterivARB");
1196 _mesa_GetObjectParameterfvARB(GLhandleARB object, GLenum pname,
1199 GLint iparams[1]; /* XXX is one element enough? */
1200 _mesa_GetObjectParameterivARB(object, pname, iparams);
1201 params[0] = (GLfloat) iparams[0];
1206 _mesa_GetProgramiv(GLuint program, GLenum pname, GLint *params)
1208 GET_CURRENT_CONTEXT(ctx);
1209 get_programiv(ctx, program, pname, params);
1214 _mesa_GetShaderiv(GLuint shader, GLenum pname, GLint *params)
1216 GET_CURRENT_CONTEXT(ctx);
1217 get_shaderiv(ctx, shader, pname, params);
1222 _mesa_GetProgramInfoLog(GLuint program, GLsizei bufSize,
1223 GLsizei *length, GLchar *infoLog)
1225 GET_CURRENT_CONTEXT(ctx);
1226 get_program_info_log(ctx, program, bufSize, length, infoLog);
1231 _mesa_GetShaderInfoLog(GLuint shader, GLsizei bufSize,
1232 GLsizei *length, GLchar *infoLog)
1234 GET_CURRENT_CONTEXT(ctx);
1235 get_shader_info_log(ctx, shader, bufSize, length, infoLog);
1240 _mesa_GetShaderSourceARB(GLhandleARB shader, GLsizei maxLength,
1241 GLsizei *length, GLcharARB *sourceOut)
1243 GET_CURRENT_CONTEXT(ctx);
1244 get_shader_source(ctx, shader, maxLength, length, sourceOut);
1248 GLhandleARB GLAPIENTRY
1249 _mesa_GetHandleARB(GLenum pname)
1251 GET_CURRENT_CONTEXT(ctx);
1252 return get_handle(ctx, pname);
1256 GLboolean GLAPIENTRY
1257 _mesa_IsProgram(GLuint name)
1259 GET_CURRENT_CONTEXT(ctx);
1260 return is_program(ctx, name);
1264 GLboolean GLAPIENTRY
1265 _mesa_IsShader(GLuint name)
1267 GET_CURRENT_CONTEXT(ctx);
1268 return is_shader(ctx, name);
1273 _mesa_LinkProgramARB(GLhandleARB programObj)
1275 GET_CURRENT_CONTEXT(ctx);
1276 link_program(ctx, programObj);
1282 * Read shader source code from a file.
1283 * Useful for debugging to override an app's shader.
1286 read_shader(const char *fname)
1288 const int max = 50*1000;
1289 FILE *f = fopen(fname, "r");
1290 GLcharARB *buffer, *shader;
1297 buffer = (char *) malloc(max);
1298 len = fread(buffer, 1, max, f);
1303 shader = _mesa_strdup(buffer);
1311 * Called via glShaderSource() and glShaderSourceARB() API functions.
1312 * Basically, concatenate the source code strings into one long string
1313 * and pass it to _mesa_shader_source().
1316 _mesa_ShaderSourceARB(GLhandleARB shaderObj, GLsizei count,
1317 const GLcharARB ** string, const GLint * length)
1319 GET_CURRENT_CONTEXT(ctx);
1321 GLsizei i, totalLength;
1325 if (!shaderObj || string == NULL) {
1326 _mesa_error(ctx, GL_INVALID_VALUE, "glShaderSourceARB");
1331 * This array holds offsets of where the appropriate string ends, thus the
1332 * last element will be set to the total length of the source code.
1334 offsets = (GLint *) malloc(count * sizeof(GLint));
1335 if (offsets == NULL) {
1336 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
1340 for (i = 0; i < count; i++) {
1341 if (string[i] == NULL) {
1342 free((GLvoid *) offsets);
1343 _mesa_error(ctx, GL_INVALID_OPERATION,
1344 "glShaderSourceARB(null string)");
1347 if (length == NULL || length[i] < 0)
1348 offsets[i] = strlen(string[i]);
1350 offsets[i] = length[i];
1351 /* accumulate string lengths */
1353 offsets[i] += offsets[i - 1];
1356 /* Total length of source string is sum off all strings plus two.
1357 * One extra byte for terminating zero, another extra byte to silence
1358 * valgrind warnings in the parser/grammer code.
1360 totalLength = offsets[count - 1] + 2;
1361 source = (GLcharARB *) malloc(totalLength * sizeof(GLcharARB));
1362 if (source == NULL) {
1363 free((GLvoid *) offsets);
1364 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
1368 for (i = 0; i < count; i++) {
1369 GLint start = (i > 0) ? offsets[i - 1] : 0;
1370 memcpy(source + start, string[i],
1371 (offsets[i] - start) * sizeof(GLcharARB));
1373 source[totalLength - 1] = '\0';
1374 source[totalLength - 2] = '\0';
1377 /* Compute the shader's source code checksum then try to open a file
1378 * named newshader_<CHECKSUM>. If it exists, use it in place of the
1379 * original shader source code. For debugging.
1382 GLcharARB *newSource;
1384 checksum = _mesa_str_checksum(source);
1386 _mesa_snprintf(filename, sizeof(filename), "newshader_%d", checksum);
1388 newSource = read_shader(filename);
1390 fprintf(stderr, "Mesa: Replacing shader %u chksum=%d with %s\n",
1391 shaderObj, checksum, filename);
1397 shader_source(ctx, shaderObj, source);
1400 struct gl_shader *sh = _mesa_lookup_shader(ctx, shaderObj);
1402 sh->SourceChecksum = checksum; /* save original checksum */
1410 _mesa_UseProgramObjectARB(GLhandleARB program)
1412 GET_CURRENT_CONTEXT(ctx);
1413 struct gl_shader_program *shProg;
1414 struct gl_transform_feedback_object *obj =
1415 ctx->TransformFeedback.CurrentObject;
1417 ASSERT_OUTSIDE_BEGIN_END(ctx);
1419 if (obj->Active && !obj->Paused) {
1420 _mesa_error(ctx, GL_INVALID_OPERATION,
1421 "glUseProgram(transform feedback active)");
1426 shProg = _mesa_lookup_shader_program_err(ctx, program, "glUseProgram");
1430 if (!shProg->LinkStatus) {
1431 _mesa_error(ctx, GL_INVALID_OPERATION,
1432 "glUseProgram(program %u not linked)", program);
1437 if (ctx->Shader.Flags & GLSL_USE_PROG) {
1438 print_shader_info(shProg);
1445 _mesa_use_program(ctx, shProg);
1450 _mesa_ValidateProgramARB(GLhandleARB program)
1452 GET_CURRENT_CONTEXT(ctx);
1453 validate_program(ctx, program);
1459 _mesa_GetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype,
1460 GLint* range, GLint* precision)
1462 const struct gl_program_constants *limits;
1463 const struct gl_precision *p;
1464 GET_CURRENT_CONTEXT(ctx);
1466 switch (shadertype) {
1467 case GL_VERTEX_SHADER:
1468 limits = &ctx->Const.VertexProgram;
1470 case GL_FRAGMENT_SHADER:
1471 limits = &ctx->Const.FragmentProgram;
1474 _mesa_error(ctx, GL_INVALID_ENUM,
1475 "glGetShaderPrecisionFormat(shadertype)");
1479 switch (precisiontype) {
1481 p = &limits->LowFloat;
1483 case GL_MEDIUM_FLOAT:
1484 p = &limits->MediumFloat;
1487 p = &limits->HighFloat;
1490 p = &limits->LowInt;
1493 p = &limits->MediumInt;
1496 p = &limits->HighInt;
1499 _mesa_error(ctx, GL_INVALID_ENUM,
1500 "glGetShaderPrecisionFormat(precisiontype)");
1504 range[0] = p->RangeMin;
1505 range[1] = p->RangeMax;
1506 precision[0] = p->Precision;
1511 _mesa_ReleaseShaderCompiler(void)
1513 _mesa_destroy_shader_compiler_caches();
1518 _mesa_ShaderBinary(GLint n, const GLuint* shaders, GLenum binaryformat,
1519 const void* binary, GLint length)
1521 GET_CURRENT_CONTEXT(ctx);
1524 (void) binaryformat;
1527 _mesa_error(ctx, GL_INVALID_OPERATION, __FUNCTION__);
1530 #endif /* FEATURE_ES2 */
1533 #if FEATURE_ARB_geometry_shader4
1536 _mesa_ProgramParameteriARB(GLuint program, GLenum pname, GLint value)
1538 struct gl_shader_program *shProg;
1539 GET_CURRENT_CONTEXT(ctx);
1541 ASSERT_OUTSIDE_BEGIN_END(ctx);
1543 shProg = _mesa_lookup_shader_program_err(ctx, program,
1544 "glProgramParameteri");
1549 case GL_GEOMETRY_VERTICES_OUT_ARB:
1551 (unsigned) value > ctx->Const.MaxGeometryOutputVertices) {
1552 _mesa_error(ctx, GL_INVALID_VALUE,
1553 "glProgramParameteri(GL_GEOMETRY_VERTICES_OUT_ARB=%d",
1557 shProg->Geom.VerticesOut = value;
1559 case GL_GEOMETRY_INPUT_TYPE_ARB:
1563 case GL_LINES_ADJACENCY_ARB:
1565 case GL_TRIANGLES_ADJACENCY_ARB:
1566 shProg->Geom.InputType = value;
1569 _mesa_error(ctx, GL_INVALID_VALUE,
1570 "glProgramParameteri(geometry input type = %s",
1571 _mesa_lookup_enum_by_nr(value));
1575 case GL_GEOMETRY_OUTPUT_TYPE_ARB:
1579 case GL_TRIANGLE_STRIP:
1580 shProg->Geom.OutputType = value;
1583 _mesa_error(ctx, GL_INVALID_VALUE,
1584 "glProgramParameteri(geometry output type = %s",
1585 _mesa_lookup_enum_by_nr(value));
1590 _mesa_error(ctx, GL_INVALID_ENUM, "glProgramParameteriARB(pname=%s)",
1591 _mesa_lookup_enum_by_nr(pname));
1599 _mesa_use_shader_program(struct gl_context *ctx, GLenum type,
1600 struct gl_shader_program *shProg)
1602 use_shader_program(ctx, type, shProg);
1604 if (ctx->Driver.UseProgram)
1605 ctx->Driver.UseProgram(ctx, shProg);
1610 * For GL_EXT_separate_shader_objects
1613 _mesa_UseShaderProgramEXT(GLenum type, GLuint program)
1615 GET_CURRENT_CONTEXT(ctx);
1616 struct gl_shader_program *shProg = NULL;
1618 ASSERT_OUTSIDE_BEGIN_END(ctx);
1620 if (!validate_shader_target(ctx, type)) {
1621 _mesa_error(ctx, GL_INVALID_ENUM, "glUseShaderProgramEXT(type)");
1625 if (ctx->TransformFeedback.CurrentObject->Active &&
1626 !ctx->TransformFeedback.CurrentObject->Paused) {
1627 _mesa_error(ctx, GL_INVALID_OPERATION,
1628 "glUseShaderProgramEXT(transform feedback is active)");
1633 shProg = _mesa_lookup_shader_program_err(ctx, program,
1634 "glUseShaderProgramEXT");
1638 if (!shProg->LinkStatus) {
1639 _mesa_error(ctx, GL_INVALID_OPERATION,
1640 "glUseShaderProgramEXT(program not linked)");
1645 _mesa_use_shader_program(ctx, type, shProg);
1650 * For GL_EXT_separate_shader_objects
1653 _mesa_ActiveProgramEXT(GLuint program)
1655 GET_CURRENT_CONTEXT(ctx);
1656 struct gl_shader_program *shProg = (program != 0)
1657 ? _mesa_lookup_shader_program_err(ctx, program, "glActiveProgramEXT")
1660 _mesa_active_program(ctx, shProg, "glActiveProgramEXT");
1666 * For GL_EXT_separate_shader_objects
1669 _mesa_CreateShaderProgramEXT(GLenum type, const GLchar *string)
1671 GET_CURRENT_CONTEXT(ctx);
1672 const GLuint shader = create_shader(ctx, type);
1676 shader_source(ctx, shader, _mesa_strdup(string));
1677 compile_shader(ctx, shader);
1679 program = create_shader_program(ctx);
1681 struct gl_shader_program *shProg;
1682 struct gl_shader *sh;
1683 GLint compiled = GL_FALSE;
1685 shProg = _mesa_lookup_shader_program(ctx, program);
1686 sh = _mesa_lookup_shader(ctx, shader);
1688 get_shaderiv(ctx, shader, GL_COMPILE_STATUS, &compiled);
1690 attach_shader(ctx, program, shader);
1691 link_program(ctx, program);
1692 detach_shader(ctx, program, shader);
1696 if (active-user-defined-varyings-in-linked-program) {
1697 append-error-to-info-log;
1698 shProg->LinkStatus = GL_FALSE;
1703 ralloc_strcat(&shProg->InfoLog, sh->InfoLog);
1706 delete_shader(ctx, shader);
1713 * Plug in shader-related functions into API dispatch table.
1716 _mesa_init_shader_dispatch(const struct gl_context *ctx,
1717 struct _glapi_table *exec)
1720 /* GL_ARB_vertex/fragment_shader */
1721 if (ctx->API != API_OPENGLES2) {
1722 SET_DeleteObjectARB(exec, _mesa_DeleteObjectARB);
1723 SET_GetHandleARB(exec, _mesa_GetHandleARB);
1724 SET_DetachObjectARB(exec, _mesa_DetachObjectARB);
1725 SET_CreateShaderObjectARB(exec, _mesa_CreateShaderObjectARB);
1726 SET_CreateProgramObjectARB(exec, _mesa_CreateProgramObjectARB);
1727 SET_AttachObjectARB(exec, _mesa_AttachObjectARB);
1728 SET_GetObjectParameterfvARB(exec, _mesa_GetObjectParameterfvARB);
1729 SET_GetObjectParameterivARB(exec, _mesa_GetObjectParameterivARB);
1730 SET_GetInfoLogARB(exec, _mesa_GetInfoLogARB);
1731 SET_GetAttachedObjectsARB(exec, _mesa_GetAttachedObjectsARB);
1734 SET_ShaderSourceARB(exec, _mesa_ShaderSourceARB);
1735 SET_CompileShaderARB(exec, _mesa_CompileShaderARB);
1736 SET_LinkProgramARB(exec, _mesa_LinkProgramARB);
1737 SET_UseProgramObjectARB(exec, _mesa_UseProgramObjectARB);
1738 SET_ValidateProgramARB(exec, _mesa_ValidateProgramARB);
1739 SET_GetShaderSourceARB(exec, _mesa_GetShaderSourceARB);
1742 SET_AttachShader(exec, _mesa_AttachShader);
1743 SET_CreateProgram(exec, _mesa_CreateProgram);
1744 SET_CreateShader(exec, _mesa_CreateShader);
1745 SET_DeleteProgram(exec, _mesa_DeleteProgram);
1746 SET_DeleteShader(exec, _mesa_DeleteShader);
1747 SET_DetachShader(exec, _mesa_DetachShader);
1748 SET_GetAttachedShaders(exec, _mesa_GetAttachedShaders);
1749 SET_GetProgramiv(exec, _mesa_GetProgramiv);
1750 SET_GetProgramInfoLog(exec, _mesa_GetProgramInfoLog);
1751 SET_GetShaderiv(exec, _mesa_GetShaderiv);
1752 SET_GetShaderInfoLog(exec, _mesa_GetShaderInfoLog);
1753 SET_IsProgram(exec, _mesa_IsProgram);
1754 SET_IsShader(exec, _mesa_IsShader);
1756 #if FEATURE_ARB_vertex_shader
1757 SET_BindAttribLocationARB(exec, _mesa_BindAttribLocationARB);
1758 SET_GetActiveAttribARB(exec, _mesa_GetActiveAttribARB);
1759 SET_GetAttribLocationARB(exec, _mesa_GetAttribLocationARB);
1762 if (ctx->API != API_OPENGLES2) {
1763 #if FEATURE_ARB_geometry_shader4
1764 SET_ProgramParameteriARB(exec, _mesa_ProgramParameteriARB);
1767 SET_UseShaderProgramEXT(exec, _mesa_UseShaderProgramEXT);
1768 SET_ActiveProgramEXT(exec, _mesa_ActiveProgramEXT);
1769 SET_CreateShaderProgramEXT(exec, _mesa_CreateShaderProgramEXT);
1772 /* GL_EXT_gpu_shader4 / GL 3.0 */
1773 if (ctx->API != API_OPENGLES2) {
1774 SET_BindFragDataLocationEXT(exec, _mesa_BindFragDataLocation);
1776 if (ctx->API != API_OPENGLES2 || _mesa_is_gles3(ctx)) {
1777 SET_GetFragDataLocationEXT(exec, _mesa_GetFragDataLocation);
1780 /* GL_ARB_ES2_compatibility */
1781 SET_ReleaseShaderCompiler(exec, _mesa_ReleaseShaderCompiler);
1782 SET_GetShaderPrecisionFormat(exec, _mesa_GetShaderPrecisionFormat);
1784 /* GL_ARB_blend_func_extended */
1785 if (ctx->API != API_OPENGLES2) {
1786 SET_BindFragDataLocationIndexed(exec, _mesa_BindFragDataLocationIndexed);
1787 SET_GetFragDataIndex(exec, _mesa_GetFragDataIndex);
1789 #endif /* FEATURE_GL */