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/shaderapi.h"
45 #include "main/shaderobj.h"
46 #include "program/program.h"
47 #include "program/prog_parameter.h"
48 #include "program/prog_uniform.h"
52 /** Define this to enable shader substitution (see below) */
53 #define SHADER_SUBST 0
57 * Return mask of GLSL_x flags by examining the MESA_GLSL env var.
60 get_shader_flags(void)
62 GLbitfield flags
= 0x0;
63 const char *env
= _mesa_getenv("MESA_GLSL");
66 if (strstr(env
, "dump"))
68 if (strstr(env
, "log"))
70 if (strstr(env
, "nopvert"))
71 flags
|= GLSL_NOP_VERT
;
72 if (strstr(env
, "nopfrag"))
73 flags
|= GLSL_NOP_FRAG
;
74 if (strstr(env
, "nopt"))
76 else if (strstr(env
, "opt"))
78 if (strstr(env
, "uniform"))
79 flags
|= GLSL_UNIFORMS
;
80 if (strstr(env
, "useprog"))
81 flags
|= GLSL_USE_PROG
;
89 * Initialize context's shader state.
92 _mesa_init_shader_state(struct gl_context
*ctx
)
94 /* Device drivers may override these to control what kind of instructions
95 * are generated by the GLSL compiler.
97 struct gl_shader_compiler_options options
;
100 memset(&options
, 0, sizeof(options
));
101 options
.MaxUnrollIterations
= 32;
103 /* Default pragma settings */
104 options
.DefaultPragmas
.Optimize
= GL_TRUE
;
106 for(i
= 0; i
< MESA_SHADER_TYPES
; ++i
)
107 memcpy(&ctx
->ShaderCompilerOptions
[i
], &options
, sizeof(options
));
109 ctx
->Shader
.Flags
= get_shader_flags();
114 * Free the per-context shader-related state.
117 _mesa_free_shader_state(struct gl_context
*ctx
)
119 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.CurrentProgram
, NULL
);
120 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.ActiveProgram
, NULL
);
125 * Return the size of the given GLSL datatype, in floats (components).
128 _mesa_sizeof_glsl_type(GLenum type
)
137 case GL_SAMPLER_CUBE
:
138 case GL_SAMPLER_1D_SHADOW
:
139 case GL_SAMPLER_2D_SHADOW
:
140 case GL_SAMPLER_2D_RECT_ARB
:
141 case GL_SAMPLER_2D_RECT_SHADOW_ARB
:
142 case GL_SAMPLER_1D_ARRAY_EXT
:
143 case GL_SAMPLER_2D_ARRAY_EXT
:
144 case GL_SAMPLER_1D_ARRAY_SHADOW_EXT
:
145 case GL_SAMPLER_2D_ARRAY_SHADOW_EXT
:
146 case GL_SAMPLER_CUBE_SHADOW_EXT
:
150 case GL_UNSIGNED_INT_VEC2
:
155 case GL_UNSIGNED_INT_VEC3
:
160 case GL_UNSIGNED_INT_VEC4
:
164 case GL_FLOAT_MAT2x3
:
165 case GL_FLOAT_MAT2x4
:
166 return 8; /* two float[4] vectors */
168 case GL_FLOAT_MAT3x2
:
169 case GL_FLOAT_MAT3x4
:
170 return 12; /* three float[4] vectors */
172 case GL_FLOAT_MAT4x2
:
173 case GL_FLOAT_MAT4x3
:
174 return 16; /* four float[4] vectors */
176 _mesa_problem(NULL
, "Invalid type in _mesa_sizeof_glsl_type()");
183 * Copy string from <src> to <dst>, up to maxLength characters, returning
184 * length of <dst> in <length>.
185 * \param src the strings source
186 * \param maxLength max chars to copy
187 * \param length returns number of chars copied
188 * \param dst the string destination
191 _mesa_copy_string(GLchar
*dst
, GLsizei maxLength
,
192 GLsizei
*length
, const GLchar
*src
)
195 for (len
= 0; len
< maxLength
- 1 && src
&& src
[len
]; len
++)
206 * Confirm that the a shader type is valid and supported by the implementation
208 * \param ctx Current GL context
209 * \param type Shader target
213 validate_shader_target(const struct gl_context
*ctx
, GLenum type
)
216 #if FEATURE_ARB_fragment_shader
217 case GL_FRAGMENT_SHADER
:
218 return ctx
->Extensions
.ARB_fragment_shader
;
220 #if FEATURE_ARB_vertex_shader
221 case GL_VERTEX_SHADER
:
222 return ctx
->Extensions
.ARB_vertex_shader
;
224 #if FEATURE_ARB_geometry_shader4
225 case GL_GEOMETRY_SHADER_ARB
:
226 return ctx
->Extensions
.ARB_geometry_shader4
;
235 * Find the length of the longest transform feedback varying name
236 * which was specified with glTransformFeedbackVaryings().
239 longest_feedback_varying_name(const struct gl_shader_program
*shProg
)
243 for (i
= 0; i
< shProg
->TransformFeedback
.NumVarying
; i
++) {
244 GLint len
= strlen(shProg
->TransformFeedback
.VaryingNames
[i
]);
254 is_program(struct gl_context
*ctx
, GLuint name
)
256 struct gl_shader_program
*shProg
= _mesa_lookup_shader_program(ctx
, name
);
257 return shProg
? GL_TRUE
: GL_FALSE
;
262 is_shader(struct gl_context
*ctx
, GLuint name
)
264 struct gl_shader
*shader
= _mesa_lookup_shader(ctx
, name
);
265 return shader
? GL_TRUE
: GL_FALSE
;
270 * Attach shader to a shader program.
273 attach_shader(struct gl_context
*ctx
, GLuint program
, GLuint shader
)
275 struct gl_shader_program
*shProg
;
276 struct gl_shader
*sh
;
279 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glAttachShader");
283 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glAttachShader");
288 n
= shProg
->NumShaders
;
289 for (i
= 0; i
< n
; i
++) {
290 if (shProg
->Shaders
[i
] == sh
) {
291 /* The shader is already attched to this program. The
292 * GL_ARB_shader_objects spec says:
294 * "The error INVALID_OPERATION is generated by AttachObjectARB
295 * if <obj> is already attached to <containerObj>."
297 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glAttachShader");
303 shProg
->Shaders
= (struct gl_shader
**)
304 _mesa_realloc(shProg
->Shaders
,
305 n
* sizeof(struct gl_shader
*),
306 (n
+ 1) * sizeof(struct gl_shader
*));
307 if (!shProg
->Shaders
) {
308 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glAttachShader");
313 shProg
->Shaders
[n
] = NULL
; /* since realloc() didn't zero the new space */
314 _mesa_reference_shader(ctx
, &shProg
->Shaders
[n
], sh
);
315 shProg
->NumShaders
++;
320 get_attrib_location(struct gl_context
*ctx
, GLuint program
, const GLchar
*name
)
322 struct gl_shader_program
*shProg
323 = _mesa_lookup_shader_program_err(ctx
, program
, "glGetAttribLocation");
329 if (!shProg
->LinkStatus
) {
330 _mesa_error(ctx
, GL_INVALID_OPERATION
,
331 "glGetAttribLocation(program not linked)");
338 if (shProg
->VertexProgram
) {
339 const struct gl_program_parameter_list
*attribs
=
340 shProg
->VertexProgram
->Base
.Attributes
;
342 GLint i
= _mesa_lookup_parameter_index(attribs
, -1, name
);
344 return attribs
->Parameters
[i
].StateIndexes
[0];
353 bind_attrib_location(struct gl_context
*ctx
, GLuint program
, GLuint index
,
356 struct gl_shader_program
*shProg
;
357 const GLint size
= -1; /* unknown size */
359 GLenum datatype
= GL_FLOAT_VEC4
;
361 shProg
= _mesa_lookup_shader_program_err(ctx
, program
,
362 "glBindAttribLocation");
370 if (strncmp(name
, "gl_", 3) == 0) {
371 _mesa_error(ctx
, GL_INVALID_OPERATION
,
372 "glBindAttribLocation(illegal name)");
376 if (index
>= ctx
->Const
.VertexProgram
.MaxAttribs
) {
377 _mesa_error(ctx
, GL_INVALID_VALUE
, "glBindAttribLocation(index)");
381 if (shProg
->LinkStatus
) {
382 /* get current index/location for the attribute */
383 oldIndex
= get_attrib_location(ctx
, program
, name
);
389 /* this will replace the current value if it's already in the list */
390 i
= _mesa_add_attribute(shProg
->Attributes
, name
, size
, datatype
, index
);
392 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glBindAttribLocation");
397 * Note that this attribute binding won't go into effect until
398 * glLinkProgram is called again.
404 create_shader(struct gl_context
*ctx
, GLenum type
)
406 struct gl_shader
*sh
;
409 if (!validate_shader_target(ctx
, type
)) {
410 _mesa_error(ctx
, GL_INVALID_ENUM
, "CreateShader(type)");
414 name
= _mesa_HashFindFreeKeyBlock(ctx
->Shared
->ShaderObjects
, 1);
415 sh
= ctx
->Driver
.NewShader(ctx
, name
, type
);
416 _mesa_HashInsert(ctx
->Shared
->ShaderObjects
, name
, sh
);
423 create_shader_program(struct gl_context
*ctx
)
426 struct gl_shader_program
*shProg
;
428 name
= _mesa_HashFindFreeKeyBlock(ctx
->Shared
->ShaderObjects
, 1);
430 shProg
= ctx
->Driver
.NewShaderProgram(ctx
, name
);
432 _mesa_HashInsert(ctx
->Shared
->ShaderObjects
, name
, shProg
);
434 assert(shProg
->RefCount
== 1);
441 * Named w/ "2" to indicate OpenGL 2.x vs GL_ARB_fragment_programs's
445 delete_shader_program(struct gl_context
*ctx
, GLuint name
)
448 * NOTE: deleting shaders/programs works a bit differently than
449 * texture objects (and buffer objects, etc). Shader/program
450 * handles/IDs exist in the hash table until the object is really
451 * deleted (refcount==0). With texture objects, the handle/ID is
452 * removed from the hash table in glDeleteTextures() while the tex
453 * object itself might linger until its refcount goes to zero.
455 struct gl_shader_program
*shProg
;
457 shProg
= _mesa_lookup_shader_program_err(ctx
, name
, "glDeleteProgram");
461 shProg
->DeletePending
= GL_TRUE
;
463 /* effectively, decr shProg's refcount */
464 _mesa_reference_shader_program(ctx
, &shProg
, NULL
);
469 delete_shader(struct gl_context
*ctx
, GLuint shader
)
471 struct gl_shader
*sh
;
473 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glDeleteShader");
477 sh
->DeletePending
= GL_TRUE
;
479 /* effectively, decr sh's refcount */
480 _mesa_reference_shader(ctx
, &sh
, NULL
);
485 detach_shader(struct gl_context
*ctx
, GLuint program
, GLuint shader
)
487 struct gl_shader_program
*shProg
;
491 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glDetachShader");
495 n
= shProg
->NumShaders
;
497 for (i
= 0; i
< n
; i
++) {
498 if (shProg
->Shaders
[i
]->Name
== shader
) {
500 struct gl_shader
**newList
;
503 _mesa_reference_shader(ctx
, &shProg
->Shaders
[i
], NULL
);
505 /* alloc new, smaller array */
506 newList
= (struct gl_shader
**)
507 malloc((n
- 1) * sizeof(struct gl_shader
*));
509 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glDetachShader");
512 for (j
= 0; j
< i
; j
++) {
513 newList
[j
] = shProg
->Shaders
[j
];
516 newList
[j
++] = shProg
->Shaders
[i
];
517 free(shProg
->Shaders
);
519 shProg
->Shaders
= newList
;
520 shProg
->NumShaders
= n
- 1;
525 for (j
= 0; j
< shProg
->NumShaders
; j
++) {
526 assert(shProg
->Shaders
[j
]->Type
== GL_VERTEX_SHADER
||
527 shProg
->Shaders
[j
]->Type
== GL_FRAGMENT_SHADER
);
528 assert(shProg
->Shaders
[j
]->RefCount
> 0);
540 if (is_shader(ctx
, shader
))
541 err
= GL_INVALID_OPERATION
;
542 else if (is_program(ctx
, shader
))
543 err
= GL_INVALID_OPERATION
;
545 err
= GL_INVALID_VALUE
;
546 _mesa_error(ctx
, err
, "glDetachProgram(shader)");
553 get_active_attrib(struct gl_context
*ctx
, GLuint program
, GLuint index
,
554 GLsizei maxLength
, GLsizei
*length
, GLint
*size
,
555 GLenum
*type
, GLchar
*nameOut
)
557 const struct gl_program_parameter_list
*attribs
= NULL
;
558 struct gl_shader_program
*shProg
;
560 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glGetActiveAttrib");
564 if (shProg
->VertexProgram
)
565 attribs
= shProg
->VertexProgram
->Base
.Attributes
;
567 if (!attribs
|| index
>= attribs
->NumParameters
) {
568 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetActiveAttrib(index)");
572 _mesa_copy_string(nameOut
, maxLength
, length
,
573 attribs
->Parameters
[index
].Name
);
576 *size
= attribs
->Parameters
[index
].Size
577 / _mesa_sizeof_glsl_type(attribs
->Parameters
[index
].DataType
);
580 *type
= attribs
->Parameters
[index
].DataType
;
585 * Return list of shaders attached to shader program.
588 get_attached_shaders(struct gl_context
*ctx
, GLuint program
, GLsizei maxCount
,
589 GLsizei
*count
, GLuint
*obj
)
591 struct gl_shader_program
*shProg
=
592 _mesa_lookup_shader_program_err(ctx
, program
, "glGetAttachedShaders");
595 for (i
= 0; i
< (GLuint
) maxCount
&& i
< shProg
->NumShaders
; i
++) {
596 obj
[i
] = shProg
->Shaders
[i
]->Name
;
605 * glGetHandleARB() - return ID/name of currently bound shader program.
608 get_handle(struct gl_context
*ctx
, GLenum pname
)
610 if (pname
== GL_PROGRAM_OBJECT_ARB
) {
611 if (ctx
->Shader
.ActiveProgram
)
612 return ctx
->Shader
.ActiveProgram
->Name
;
617 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetHandleARB");
624 * glGetProgramiv() - get shader program state.
625 * Note that this is for GLSL shader programs, not ARB vertex/fragment
626 * programs (see glGetProgramivARB).
629 get_programiv(struct gl_context
*ctx
, GLuint program
, GLenum pname
, GLint
*params
)
631 const struct gl_program_parameter_list
*attribs
;
632 struct gl_shader_program
*shProg
633 = _mesa_lookup_shader_program(ctx
, program
);
636 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramiv(program)");
640 if (shProg
->VertexProgram
)
641 attribs
= shProg
->VertexProgram
->Base
.Attributes
;
646 case GL_DELETE_STATUS
:
647 *params
= shProg
->DeletePending
;
650 *params
= shProg
->LinkStatus
;
652 case GL_VALIDATE_STATUS
:
653 *params
= shProg
->Validated
;
655 case GL_INFO_LOG_LENGTH
:
656 *params
= shProg
->InfoLog
? strlen(shProg
->InfoLog
) + 1 : 0;
658 case GL_ATTACHED_SHADERS
:
659 *params
= shProg
->NumShaders
;
661 case GL_ACTIVE_ATTRIBUTES
:
662 *params
= attribs
? attribs
->NumParameters
: 0;
664 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH
:
665 *params
= _mesa_longest_parameter_name(attribs
, PROGRAM_INPUT
) + 1;
667 case GL_ACTIVE_UNIFORMS
:
668 *params
= shProg
->Uniforms
? shProg
->Uniforms
->NumUniforms
: 0;
670 case GL_ACTIVE_UNIFORM_MAX_LENGTH
:
671 *params
= _mesa_longest_uniform_name(shProg
->Uniforms
);
673 (*params
)++; /* add one for terminating zero */
675 case GL_PROGRAM_BINARY_LENGTH_OES
:
678 #if FEATURE_EXT_transform_feedback
679 case GL_TRANSFORM_FEEDBACK_VARYINGS
:
680 *params
= shProg
->TransformFeedback
.NumVarying
;
682 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH
:
683 *params
= longest_feedback_varying_name(shProg
) + 1;
685 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE
:
686 *params
= shProg
->TransformFeedback
.BufferMode
;
689 #if FEATURE_ARB_geometry_shader4
690 case GL_GEOMETRY_VERTICES_OUT_ARB
:
691 *params
= shProg
->Geom
.VerticesOut
;
693 case GL_GEOMETRY_INPUT_TYPE_ARB
:
694 *params
= shProg
->Geom
.InputType
;
696 case GL_GEOMETRY_OUTPUT_TYPE_ARB
:
697 *params
= shProg
->Geom
.OutputType
;
701 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramiv(pname)");
708 * glGetShaderiv() - get GLSL shader state
711 get_shaderiv(struct gl_context
*ctx
, GLuint name
, GLenum pname
, GLint
*params
)
713 struct gl_shader
*shader
=
714 _mesa_lookup_shader_err(ctx
, name
, "glGetShaderiv");
722 *params
= shader
->Type
;
724 case GL_DELETE_STATUS
:
725 *params
= shader
->DeletePending
;
727 case GL_COMPILE_STATUS
:
728 *params
= shader
->CompileStatus
;
730 case GL_INFO_LOG_LENGTH
:
731 *params
= shader
->InfoLog
? strlen(shader
->InfoLog
) + 1 : 0;
733 case GL_SHADER_SOURCE_LENGTH
:
734 *params
= shader
->Source
? strlen((char *) shader
->Source
) + 1 : 0;
737 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetShaderiv(pname)");
744 get_program_info_log(struct gl_context
*ctx
, GLuint program
, GLsizei bufSize
,
745 GLsizei
*length
, GLchar
*infoLog
)
747 struct gl_shader_program
*shProg
748 = _mesa_lookup_shader_program(ctx
, program
);
750 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramInfoLog(program)");
753 _mesa_copy_string(infoLog
, bufSize
, length
, shProg
->InfoLog
);
758 get_shader_info_log(struct gl_context
*ctx
, GLuint shader
, GLsizei bufSize
,
759 GLsizei
*length
, GLchar
*infoLog
)
761 struct gl_shader
*sh
= _mesa_lookup_shader(ctx
, shader
);
763 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetShaderInfoLog(shader)");
766 _mesa_copy_string(infoLog
, bufSize
, length
, sh
->InfoLog
);
771 * Return shader source code.
774 get_shader_source(struct gl_context
*ctx
, GLuint shader
, GLsizei maxLength
,
775 GLsizei
*length
, GLchar
*sourceOut
)
777 struct gl_shader
*sh
;
778 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glGetShaderSource");
782 _mesa_copy_string(sourceOut
, maxLength
, length
, sh
->Source
);
787 * Set/replace shader source code.
790 shader_source(struct gl_context
*ctx
, GLuint shader
, const GLchar
*source
)
792 struct gl_shader
*sh
;
794 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glShaderSource");
798 /* free old shader source string and install new one */
800 free((void *) sh
->Source
);
803 sh
->CompileStatus
= GL_FALSE
;
805 sh
->SourceChecksum
= _mesa_str_checksum(sh
->Source
);
814 compile_shader(struct gl_context
*ctx
, GLuint shaderObj
)
816 struct gl_shader
*sh
;
817 struct gl_shader_compiler_options
*options
;
819 sh
= _mesa_lookup_shader_err(ctx
, shaderObj
, "glCompileShader");
823 options
= &ctx
->ShaderCompilerOptions
[_mesa_shader_type_to_index(sh
->Type
)];
825 /* set default pragma state for shader */
826 sh
->Pragmas
= options
->DefaultPragmas
;
828 /* this call will set the sh->CompileStatus field to indicate if
829 * compilation was successful.
831 _mesa_glsl_compile_shader(ctx
, sh
);
836 * Link a program's shaders.
839 link_program(struct gl_context
*ctx
, GLuint program
)
841 struct gl_shader_program
*shProg
;
842 struct gl_transform_feedback_object
*obj
=
843 ctx
->TransformFeedback
.CurrentObject
;
845 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glLinkProgram");
849 if (obj
->Active
&& shProg
== ctx
->Shader
.CurrentProgram
) {
850 _mesa_error(ctx
, GL_INVALID_OPERATION
,
851 "glLinkProgram(transform feedback active");
855 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
857 _mesa_glsl_link_shader(ctx
, shProg
);
863 printf("Link %u shaders in program %u: %s\n",
864 shProg
->NumShaders
, shProg
->Name
,
865 shProg
->LinkStatus
? "Success" : "Failed");
867 for (i
= 0; i
< shProg
->NumShaders
; i
++) {
868 printf(" shader %u, type 0x%x\n",
869 shProg
->Shaders
[i
]->Name
,
870 shProg
->Shaders
[i
]->Type
);
877 * Print basic shader info (for debug).
880 print_shader_info(const struct gl_shader_program
*shProg
)
884 printf("Mesa: glUseProgram(%u)\n", shProg
->Name
);
885 for (i
= 0; i
< shProg
->NumShaders
; i
++) {
887 switch (shProg
->Shaders
[i
]->Type
) {
888 case GL_VERTEX_SHADER
:
891 case GL_FRAGMENT_SHADER
:
894 case GL_GEOMETRY_SHADER
:
900 printf(" %s shader %u, checksum %u\n", s
,
901 shProg
->Shaders
[i
]->Name
,
902 shProg
->Shaders
[i
]->SourceChecksum
);
904 if (shProg
->VertexProgram
)
905 printf(" vert prog %u\n", shProg
->VertexProgram
->Base
.Id
);
906 if (shProg
->FragmentProgram
)
907 printf(" frag prog %u\n", shProg
->FragmentProgram
->Base
.Id
);
912 * Use the named shader program for subsequent glUniform calls
915 active_program(struct gl_context
*ctx
, struct gl_shader_program
*shProg
,
918 if ((shProg
!= NULL
) && !shProg
->LinkStatus
) {
919 _mesa_error(ctx
, GL_INVALID_OPERATION
,
920 "%s(program %u not linked)", caller
, shProg
->Name
);
924 if (ctx
->Shader
.ActiveProgram
!= shProg
) {
925 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.ActiveProgram
, shProg
);
930 * Use the named shader program for subsequent rendering.
933 _mesa_use_program(struct gl_context
*ctx
, GLuint program
)
935 struct gl_shader_program
*shProg
;
936 struct gl_transform_feedback_object
*obj
=
937 ctx
->TransformFeedback
.CurrentObject
;
940 _mesa_error(ctx
, GL_INVALID_OPERATION
,
941 "glUseProgram(transform feedback active)");
945 if (ctx
->Shader
.CurrentProgram
&&
946 ctx
->Shader
.CurrentProgram
->Name
== program
) {
952 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glUseProgram");
956 if (!shProg
->LinkStatus
) {
957 _mesa_error(ctx
, GL_INVALID_OPERATION
,
958 "glUseProgram(program %u not linked)", program
);
962 active_program(ctx
, shProg
, "glUseProgram");
965 if (ctx
->Shader
.Flags
& GLSL_USE_PROG
) {
966 print_shader_info(shProg
);
973 if (ctx
->Shader
.CurrentProgram
!= shProg
) {
974 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
| _NEW_PROGRAM_CONSTANTS
);
975 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.CurrentProgram
, shProg
);
978 if (ctx
->Driver
.UseProgram
)
979 ctx
->Driver
.UseProgram(ctx
, shProg
);
984 * Validate a program's samplers.
985 * Specifically, check that there aren't two samplers of different types
986 * pointing to the same texture unit.
987 * \return GL_TRUE if valid, GL_FALSE if invalid
990 validate_samplers(const struct gl_program
*prog
, char *errMsg
)
992 static const char *targetName
[] = {
1001 GLint targetUsed
[MAX_TEXTURE_IMAGE_UNITS
];
1002 GLbitfield samplersUsed
= prog
->SamplersUsed
;
1005 assert(Elements(targetName
) == NUM_TEXTURE_TARGETS
);
1007 if (samplersUsed
== 0x0)
1010 for (i
= 0; i
< Elements(targetUsed
); i
++)
1013 /* walk over bits which are set in 'samplers' */
1014 while (samplersUsed
) {
1016 gl_texture_index target
;
1017 GLint sampler
= _mesa_ffs(samplersUsed
) - 1;
1018 assert(sampler
>= 0);
1019 assert(sampler
< MAX_TEXTURE_IMAGE_UNITS
);
1020 unit
= prog
->SamplerUnits
[sampler
];
1021 target
= prog
->SamplerTargets
[sampler
];
1022 if (targetUsed
[unit
] != -1 && targetUsed
[unit
] != (int) target
) {
1023 _mesa_snprintf(errMsg
, 100,
1024 "Texture unit %d is accessed both as %s and %s",
1025 unit
, targetName
[targetUsed
[unit
]], targetName
[target
]);
1028 targetUsed
[unit
] = target
;
1029 samplersUsed
^= (1 << sampler
);
1037 * Do validation of the given shader program.
1038 * \param errMsg returns error message if validation fails.
1039 * \return GL_TRUE if valid, GL_FALSE if invalid (and set errMsg)
1042 validate_shader_program(const struct gl_shader_program
*shProg
,
1045 const struct gl_vertex_program
*vp
= shProg
->VertexProgram
;
1046 const struct gl_fragment_program
*fp
= shProg
->FragmentProgram
;
1048 if (!shProg
->LinkStatus
) {
1052 /* From the GL spec, a program is invalid if any of these are true:
1054 any two active samplers in the current program object are of
1055 different types, but refer to the same texture image unit,
1057 any active sampler in the current program object refers to a texture
1058 image unit where fixed-function fragment processing accesses a
1059 texture target that does not match the sampler type, or
1061 the sum of the number of active samplers in the program and the
1062 number of texture image units enabled for fixed-function fragment
1063 processing exceeds the combined limit on the total number of texture
1064 image units allowed.
1069 * Check: any two active samplers in the current program object are of
1070 * different types, but refer to the same texture image unit,
1072 if (vp
&& !validate_samplers(&vp
->Base
, errMsg
)) {
1075 if (fp
&& !validate_samplers(&fp
->Base
, errMsg
)) {
1084 * Called via glValidateProgram()
1087 validate_program(struct gl_context
*ctx
, GLuint program
)
1089 struct gl_shader_program
*shProg
;
1092 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glValidateProgram");
1097 shProg
->Validated
= validate_shader_program(shProg
, errMsg
);
1098 if (!shProg
->Validated
) {
1099 /* update info log */
1100 if (shProg
->InfoLog
) {
1101 talloc_free(shProg
->InfoLog
);
1103 shProg
->InfoLog
= talloc_strdup(shProg
, errMsg
);
1110 _mesa_AttachObjectARB(GLhandleARB program
, GLhandleARB shader
)
1112 GET_CURRENT_CONTEXT(ctx
);
1113 attach_shader(ctx
, program
, shader
);
1118 _mesa_AttachShader(GLuint program
, GLuint shader
)
1120 GET_CURRENT_CONTEXT(ctx
);
1121 attach_shader(ctx
, program
, shader
);
1126 _mesa_BindAttribLocationARB(GLhandleARB program
, GLuint index
,
1127 const GLcharARB
*name
)
1129 GET_CURRENT_CONTEXT(ctx
);
1130 bind_attrib_location(ctx
, program
, index
, name
);
1135 _mesa_CompileShaderARB(GLhandleARB shaderObj
)
1137 GET_CURRENT_CONTEXT(ctx
);
1138 compile_shader(ctx
, shaderObj
);
1143 _mesa_CreateShader(GLenum type
)
1145 GET_CURRENT_CONTEXT(ctx
);
1146 return create_shader(ctx
, type
);
1150 GLhandleARB GLAPIENTRY
1151 _mesa_CreateShaderObjectARB(GLenum type
)
1153 GET_CURRENT_CONTEXT(ctx
);
1154 return create_shader(ctx
, type
);
1159 _mesa_CreateProgram(void)
1161 GET_CURRENT_CONTEXT(ctx
);
1162 return create_shader_program(ctx
);
1166 GLhandleARB GLAPIENTRY
1167 _mesa_CreateProgramObjectARB(void)
1169 GET_CURRENT_CONTEXT(ctx
);
1170 return create_shader_program(ctx
);
1175 _mesa_DeleteObjectARB(GLhandleARB obj
)
1178 GET_CURRENT_CONTEXT(ctx
);
1179 if (is_program(ctx
, obj
)) {
1180 delete_shader_program(ctx
, obj
);
1182 else if (is_shader(ctx
, obj
)) {
1183 delete_shader(ctx
, obj
);
1193 _mesa_DeleteProgram(GLuint name
)
1196 GET_CURRENT_CONTEXT(ctx
);
1197 delete_shader_program(ctx
, name
);
1203 _mesa_DeleteShader(GLuint name
)
1206 GET_CURRENT_CONTEXT(ctx
);
1207 delete_shader(ctx
, name
);
1213 _mesa_DetachObjectARB(GLhandleARB program
, GLhandleARB shader
)
1215 GET_CURRENT_CONTEXT(ctx
);
1216 detach_shader(ctx
, program
, shader
);
1221 _mesa_DetachShader(GLuint program
, GLuint shader
)
1223 GET_CURRENT_CONTEXT(ctx
);
1224 detach_shader(ctx
, program
, shader
);
1229 _mesa_GetActiveAttribARB(GLhandleARB program
, GLuint index
,
1230 GLsizei maxLength
, GLsizei
* length
, GLint
* size
,
1231 GLenum
* type
, GLcharARB
* name
)
1233 GET_CURRENT_CONTEXT(ctx
);
1234 get_active_attrib(ctx
, program
, index
, maxLength
, length
, size
, type
, name
);
1239 _mesa_GetAttachedObjectsARB(GLhandleARB container
, GLsizei maxCount
,
1240 GLsizei
* count
, GLhandleARB
* obj
)
1242 GET_CURRENT_CONTEXT(ctx
);
1243 get_attached_shaders(ctx
, container
, maxCount
, count
, obj
);
1248 _mesa_GetAttachedShaders(GLuint program
, GLsizei maxCount
,
1249 GLsizei
*count
, GLuint
*obj
)
1251 GET_CURRENT_CONTEXT(ctx
);
1252 get_attached_shaders(ctx
, program
, maxCount
, count
, obj
);
1257 _mesa_GetAttribLocationARB(GLhandleARB program
, const GLcharARB
* name
)
1259 GET_CURRENT_CONTEXT(ctx
);
1260 return get_attrib_location(ctx
, program
, name
);
1265 _mesa_GetInfoLogARB(GLhandleARB object
, GLsizei maxLength
, GLsizei
* length
,
1266 GLcharARB
* infoLog
)
1268 GET_CURRENT_CONTEXT(ctx
);
1269 if (is_program(ctx
, object
)) {
1270 get_program_info_log(ctx
, object
, maxLength
, length
, infoLog
);
1272 else if (is_shader(ctx
, object
)) {
1273 get_shader_info_log(ctx
, object
, maxLength
, length
, infoLog
);
1276 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetInfoLogARB");
1282 _mesa_GetObjectParameterivARB(GLhandleARB object
, GLenum pname
, GLint
*params
)
1284 GET_CURRENT_CONTEXT(ctx
);
1285 /* Implement in terms of GetProgramiv, GetShaderiv */
1286 if (is_program(ctx
, object
)) {
1287 if (pname
== GL_OBJECT_TYPE_ARB
) {
1288 *params
= GL_PROGRAM_OBJECT_ARB
;
1291 get_programiv(ctx
, object
, pname
, params
);
1294 else if (is_shader(ctx
, object
)) {
1295 if (pname
== GL_OBJECT_TYPE_ARB
) {
1296 *params
= GL_SHADER_OBJECT_ARB
;
1299 get_shaderiv(ctx
, object
, pname
, params
);
1303 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetObjectParameterivARB");
1309 _mesa_GetObjectParameterfvARB(GLhandleARB object
, GLenum pname
,
1312 GLint iparams
[1]; /* XXX is one element enough? */
1313 _mesa_GetObjectParameterivARB(object
, pname
, iparams
);
1314 params
[0] = (GLfloat
) iparams
[0];
1319 _mesa_GetProgramiv(GLuint program
, GLenum pname
, GLint
*params
)
1321 GET_CURRENT_CONTEXT(ctx
);
1322 get_programiv(ctx
, program
, pname
, params
);
1327 _mesa_GetShaderiv(GLuint shader
, GLenum pname
, GLint
*params
)
1329 GET_CURRENT_CONTEXT(ctx
);
1330 get_shaderiv(ctx
, shader
, pname
, params
);
1335 _mesa_GetProgramInfoLog(GLuint program
, GLsizei bufSize
,
1336 GLsizei
*length
, GLchar
*infoLog
)
1338 GET_CURRENT_CONTEXT(ctx
);
1339 get_program_info_log(ctx
, program
, bufSize
, length
, infoLog
);
1344 _mesa_GetShaderInfoLog(GLuint shader
, GLsizei bufSize
,
1345 GLsizei
*length
, GLchar
*infoLog
)
1347 GET_CURRENT_CONTEXT(ctx
);
1348 get_shader_info_log(ctx
, shader
, bufSize
, length
, infoLog
);
1353 _mesa_GetShaderSourceARB(GLhandleARB shader
, GLsizei maxLength
,
1354 GLsizei
*length
, GLcharARB
*sourceOut
)
1356 GET_CURRENT_CONTEXT(ctx
);
1357 get_shader_source(ctx
, shader
, maxLength
, length
, sourceOut
);
1361 GLhandleARB GLAPIENTRY
1362 _mesa_GetHandleARB(GLenum pname
)
1364 GET_CURRENT_CONTEXT(ctx
);
1365 return get_handle(ctx
, pname
);
1369 GLboolean GLAPIENTRY
1370 _mesa_IsProgram(GLuint name
)
1372 GET_CURRENT_CONTEXT(ctx
);
1373 return is_program(ctx
, name
);
1377 GLboolean GLAPIENTRY
1378 _mesa_IsShader(GLuint name
)
1380 GET_CURRENT_CONTEXT(ctx
);
1381 return is_shader(ctx
, name
);
1386 _mesa_LinkProgramARB(GLhandleARB programObj
)
1388 GET_CURRENT_CONTEXT(ctx
);
1389 link_program(ctx
, programObj
);
1395 * Read shader source code from a file.
1396 * Useful for debugging to override an app's shader.
1399 read_shader(const char *fname
)
1401 const int max
= 50*1000;
1402 FILE *f
= fopen(fname
, "r");
1403 GLcharARB
*buffer
, *shader
;
1410 buffer
= (char *) malloc(max
);
1411 len
= fread(buffer
, 1, max
, f
);
1416 shader
= _mesa_strdup(buffer
);
1424 * Called via glShaderSource() and glShaderSourceARB() API functions.
1425 * Basically, concatenate the source code strings into one long string
1426 * and pass it to _mesa_shader_source().
1429 _mesa_ShaderSourceARB(GLhandleARB shaderObj
, GLsizei count
,
1430 const GLcharARB
** string
, const GLint
* length
)
1432 GET_CURRENT_CONTEXT(ctx
);
1434 GLsizei i
, totalLength
;
1438 if (!shaderObj
|| string
== NULL
) {
1439 _mesa_error(ctx
, GL_INVALID_VALUE
, "glShaderSourceARB");
1444 * This array holds offsets of where the appropriate string ends, thus the
1445 * last element will be set to the total length of the source code.
1447 offsets
= (GLint
*) malloc(count
* sizeof(GLint
));
1448 if (offsets
== NULL
) {
1449 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glShaderSourceARB");
1453 for (i
= 0; i
< count
; i
++) {
1454 if (string
[i
] == NULL
) {
1455 free((GLvoid
*) offsets
);
1456 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glShaderSourceARB(null string)");
1459 if (length
== NULL
|| length
[i
] < 0)
1460 offsets
[i
] = strlen(string
[i
]);
1462 offsets
[i
] = length
[i
];
1463 /* accumulate string lengths */
1465 offsets
[i
] += offsets
[i
- 1];
1468 /* Total length of source string is sum off all strings plus two.
1469 * One extra byte for terminating zero, another extra byte to silence
1470 * valgrind warnings in the parser/grammer code.
1472 totalLength
= offsets
[count
- 1] + 2;
1473 source
= (GLcharARB
*) malloc(totalLength
* sizeof(GLcharARB
));
1474 if (source
== NULL
) {
1475 free((GLvoid
*) offsets
);
1476 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glShaderSourceARB");
1480 for (i
= 0; i
< count
; i
++) {
1481 GLint start
= (i
> 0) ? offsets
[i
- 1] : 0;
1482 memcpy(source
+ start
, string
[i
],
1483 (offsets
[i
] - start
) * sizeof(GLcharARB
));
1485 source
[totalLength
- 1] = '\0';
1486 source
[totalLength
- 2] = '\0';
1489 /* Compute the shader's source code checksum then try to open a file
1490 * named newshader_<CHECKSUM>. If it exists, use it in place of the
1491 * original shader source code. For debugging.
1494 GLcharARB
*newSource
;
1496 checksum
= _mesa_str_checksum(source
);
1498 _mesa_snprintf(filename
, sizeof(filename
), "newshader_%d", checksum
);
1500 newSource
= read_shader(filename
);
1502 fprintf(stderr
, "Mesa: Replacing shader %u chksum=%d with %s\n",
1503 shaderObj
, checksum
, filename
);
1509 shader_source(ctx
, shaderObj
, source
);
1512 struct gl_shader
*sh
= _mesa_lookup_shader(ctx
, shaderObj
);
1514 sh
->SourceChecksum
= checksum
; /* save original checksum */
1522 _mesa_UseProgramObjectARB(GLhandleARB program
)
1524 GET_CURRENT_CONTEXT(ctx
);
1525 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
1526 _mesa_use_program(ctx
, program
);
1531 _mesa_ValidateProgramARB(GLhandleARB program
)
1533 GET_CURRENT_CONTEXT(ctx
);
1534 validate_program(ctx
, program
);
1540 _mesa_GetShaderPrecisionFormat(GLenum shadertype
, GLenum precisiontype
,
1541 GLint
* range
, GLint
* precision
)
1543 GET_CURRENT_CONTEXT(ctx
);
1545 (void) precisiontype
;
1548 _mesa_error(ctx
, GL_INVALID_OPERATION
, __FUNCTION__
);
1553 _mesa_ReleaseShaderCompiler(void)
1555 GET_CURRENT_CONTEXT(ctx
);
1556 _mesa_error(ctx
, GL_INVALID_OPERATION
, __FUNCTION__
);
1561 _mesa_ShaderBinary(GLint n
, const GLuint
* shaders
, GLenum binaryformat
,
1562 const void* binary
, GLint length
)
1564 GET_CURRENT_CONTEXT(ctx
);
1567 (void) binaryformat
;
1570 _mesa_error(ctx
, GL_INVALID_OPERATION
, __FUNCTION__
);
1573 #endif /* FEATURE_ES2 */
1576 #if FEATURE_ARB_geometry_shader4
1579 _mesa_ProgramParameteriARB(GLuint program
, GLenum pname
,
1582 struct gl_shader_program
*shProg
;
1583 GET_CURRENT_CONTEXT(ctx
);
1585 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1587 shProg
= _mesa_lookup_shader_program_err(ctx
, program
,
1588 "glProgramParameteri");
1593 case GL_GEOMETRY_VERTICES_OUT_ARB
:
1595 (unsigned) value
> ctx
->Const
.GeometryProgram
.MaxGeometryOutputVertices
) {
1596 _mesa_error(ctx
, GL_INVALID_VALUE
,
1597 "glProgramParameteri(GL_GEOMETRY_VERTICES_OUT_ARB=%d",
1601 shProg
->Geom
.VerticesOut
= value
;
1603 case GL_GEOMETRY_INPUT_TYPE_ARB
:
1607 case GL_LINES_ADJACENCY_ARB
:
1609 case GL_TRIANGLES_ADJACENCY_ARB
:
1610 shProg
->Geom
.InputType
= value
;
1613 _mesa_error(ctx
, GL_INVALID_VALUE
,
1614 "glProgramParameteri(geometry input type = %s",
1615 _mesa_lookup_enum_by_nr(value
));
1619 case GL_GEOMETRY_OUTPUT_TYPE_ARB
:
1623 case GL_TRIANGLE_STRIP
:
1624 shProg
->Geom
.OutputType
= value
;
1627 _mesa_error(ctx
, GL_INVALID_VALUE
,
1628 "glProgramParameteri(geometry output type = %s",
1629 _mesa_lookup_enum_by_nr(value
));
1634 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramParameteriARB(pname=%s)",
1635 _mesa_lookup_enum_by_nr(pname
));
1643 _mesa_UseShaderProgramEXT(GLenum type
, GLuint program
)
1645 GET_CURRENT_CONTEXT(ctx
);
1646 struct gl_shader_program
*shProg
;
1648 if (!validate_shader_target(ctx
, type
)) {
1649 _mesa_error(ctx
, GL_INVALID_ENUM
, "glUseShaderProgramEXT(type)");
1653 if (ctx
->TransformFeedback
.CurrentObject
->Active
) {
1654 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1655 "glUseShaderProgramEXT(transform feedback is active)");
1660 shProg
= _mesa_lookup_shader_program_err(ctx
, program
,
1661 "glUseShaderProgramEXT");
1665 if (!shProg
->LinkStatus
) {
1666 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1667 "glUseShaderProgramEXT(program not linked)");
1672 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1673 "glUseShaderProgramEXT(NOT YET IMPLEMENTED)");
1678 _mesa_ActiveProgramEXT(GLuint program
)
1680 GET_CURRENT_CONTEXT(ctx
);
1681 struct gl_shader_program
*shProg
= (program
!= 0)
1682 ? _mesa_lookup_shader_program_err(ctx
, program
, "glActiveProgramEXT")
1685 active_program(ctx
, shProg
, "glActiveProgramEXT");
1690 _mesa_CreateShaderProgramEXT(GLenum type
, const GLchar
*string
)
1692 GET_CURRENT_CONTEXT(ctx
);
1693 const GLuint shader
= create_shader(ctx
, type
);
1697 shader_source(ctx
, shader
, _mesa_strdup(string
));
1698 compile_shader(ctx
, shader
);
1700 program
= create_shader_program(ctx
);
1702 struct gl_shader_program
*shProg
;
1703 struct gl_shader
*sh
;
1704 GLint compiled
= GL_FALSE
;
1706 shProg
= _mesa_lookup_shader_program(ctx
, program
);
1707 sh
= _mesa_lookup_shader(ctx
, shader
);
1709 get_shaderiv(ctx
, shader
, GL_COMPILE_STATUS
, &compiled
);
1711 attach_shader(ctx
, program
, shader
);
1712 link_program(ctx
, program
);
1713 detach_shader(ctx
, program
, shader
);
1717 if (active
-user
-defined
-varyings
-in
-linked
-program
) {
1718 append
-error
-to
-info
-log
;
1719 shProg
->LinkStatus
= GL_FALSE
;
1724 shProg
->InfoLog
= talloc_strdup_append(shProg
->InfoLog
, sh
->InfoLog
);
1727 delete_shader(ctx
, shader
);
1734 * Plug in shader-related functions into API dispatch table.
1737 _mesa_init_shader_dispatch(struct _glapi_table
*exec
)
1740 /* GL_ARB_vertex/fragment_shader */
1741 SET_DeleteObjectARB(exec
, _mesa_DeleteObjectARB
);
1742 SET_GetHandleARB(exec
, _mesa_GetHandleARB
);
1743 SET_DetachObjectARB(exec
, _mesa_DetachObjectARB
);
1744 SET_CreateShaderObjectARB(exec
, _mesa_CreateShaderObjectARB
);
1745 SET_ShaderSourceARB(exec
, _mesa_ShaderSourceARB
);
1746 SET_CompileShaderARB(exec
, _mesa_CompileShaderARB
);
1747 SET_CreateProgramObjectARB(exec
, _mesa_CreateProgramObjectARB
);
1748 SET_AttachObjectARB(exec
, _mesa_AttachObjectARB
);
1749 SET_LinkProgramARB(exec
, _mesa_LinkProgramARB
);
1750 SET_UseProgramObjectARB(exec
, _mesa_UseProgramObjectARB
);
1751 SET_ValidateProgramARB(exec
, _mesa_ValidateProgramARB
);
1752 SET_GetObjectParameterfvARB(exec
, _mesa_GetObjectParameterfvARB
);
1753 SET_GetObjectParameterivARB(exec
, _mesa_GetObjectParameterivARB
);
1754 SET_GetInfoLogARB(exec
, _mesa_GetInfoLogARB
);
1755 SET_GetAttachedObjectsARB(exec
, _mesa_GetAttachedObjectsARB
);
1756 SET_GetShaderSourceARB(exec
, _mesa_GetShaderSourceARB
);
1759 SET_AttachShader(exec
, _mesa_AttachShader
);
1760 SET_CreateProgram(exec
, _mesa_CreateProgram
);
1761 SET_CreateShader(exec
, _mesa_CreateShader
);
1762 SET_DeleteProgram(exec
, _mesa_DeleteProgram
);
1763 SET_DeleteShader(exec
, _mesa_DeleteShader
);
1764 SET_DetachShader(exec
, _mesa_DetachShader
);
1765 SET_GetAttachedShaders(exec
, _mesa_GetAttachedShaders
);
1766 SET_GetProgramiv(exec
, _mesa_GetProgramiv
);
1767 SET_GetProgramInfoLog(exec
, _mesa_GetProgramInfoLog
);
1768 SET_GetShaderiv(exec
, _mesa_GetShaderiv
);
1769 SET_GetShaderInfoLog(exec
, _mesa_GetShaderInfoLog
);
1770 SET_IsProgram(exec
, _mesa_IsProgram
);
1771 SET_IsShader(exec
, _mesa_IsShader
);
1773 #if FEATURE_ARB_vertex_shader
1774 SET_BindAttribLocationARB(exec
, _mesa_BindAttribLocationARB
);
1775 SET_GetActiveAttribARB(exec
, _mesa_GetActiveAttribARB
);
1776 SET_GetAttribLocationARB(exec
, _mesa_GetAttribLocationARB
);
1779 #if FEATURE_ARB_geometry_shader4
1780 SET_ProgramParameteriARB(exec
, _mesa_ProgramParameteriARB
);
1783 SET_UseShaderProgramEXT(exec
, _mesa_UseShaderProgramEXT
);
1784 SET_ActiveProgramEXT(exec
, _mesa_ActiveProgramEXT
);
1785 SET_CreateShaderProgramEXT(exec
, _mesa_CreateShaderProgramEXT
);
1786 #endif /* FEATURE_GL */