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 "program/program.h"
49 #include "program/prog_parameter.h"
50 #include "program/prog_uniform.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
;
93 * Initialize context's shader state.
96 _mesa_init_shader_state(struct gl_context
*ctx
)
98 /* Device drivers may override these to control what kind of instructions
99 * are generated by the GLSL compiler.
101 struct gl_shader_compiler_options options
;
104 memset(&options
, 0, sizeof(options
));
105 options
.MaxUnrollIterations
= 32;
107 /* Default pragma settings */
108 options
.DefaultPragmas
.Optimize
= GL_TRUE
;
110 for (sh
= 0; sh
< MESA_SHADER_TYPES
; ++sh
)
111 memcpy(&ctx
->ShaderCompilerOptions
[sh
], &options
, sizeof(options
));
113 ctx
->Shader
.Flags
= get_shader_flags();
118 * Free the per-context shader-related state.
121 _mesa_free_shader_state(struct gl_context
*ctx
)
123 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.CurrentVertexProgram
, NULL
);
124 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.CurrentGeometryProgram
,
126 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.CurrentFragmentProgram
,
128 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.ActiveProgram
, NULL
);
133 * Return the size of the given GLSL datatype, in floats (components).
136 _mesa_sizeof_glsl_type(GLenum type
)
141 case GL_UNSIGNED_INT
:
146 case GL_SAMPLER_CUBE
:
147 case GL_SAMPLER_1D_SHADOW
:
148 case GL_SAMPLER_2D_SHADOW
:
149 case GL_SAMPLER_2D_RECT_ARB
:
150 case GL_SAMPLER_2D_RECT_SHADOW_ARB
:
151 case GL_SAMPLER_1D_ARRAY_EXT
:
152 case GL_SAMPLER_2D_ARRAY_EXT
:
153 case GL_SAMPLER_1D_ARRAY_SHADOW_EXT
:
154 case GL_SAMPLER_2D_ARRAY_SHADOW_EXT
:
155 case GL_SAMPLER_CUBE_SHADOW_EXT
:
156 case GL_SAMPLER_EXTERNAL_OES
:
160 case GL_UNSIGNED_INT_VEC2
:
165 case GL_UNSIGNED_INT_VEC3
:
170 case GL_UNSIGNED_INT_VEC4
:
174 case GL_FLOAT_MAT2x3
:
175 case GL_FLOAT_MAT2x4
:
176 return 8; /* two float[4] vectors */
178 case GL_FLOAT_MAT3x2
:
179 case GL_FLOAT_MAT3x4
:
180 return 12; /* three float[4] vectors */
182 case GL_FLOAT_MAT4x2
:
183 case GL_FLOAT_MAT4x3
:
184 return 16; /* four float[4] vectors */
186 _mesa_problem(NULL
, "Invalid type in _mesa_sizeof_glsl_type()");
193 * Copy string from <src> to <dst>, up to maxLength characters, returning
194 * length of <dst> in <length>.
195 * \param src the strings source
196 * \param maxLength max chars to copy
197 * \param length returns number of chars copied
198 * \param dst the string destination
201 _mesa_copy_string(GLchar
*dst
, GLsizei maxLength
,
202 GLsizei
*length
, const GLchar
*src
)
205 for (len
= 0; len
< maxLength
- 1 && src
&& src
[len
]; len
++)
216 * Confirm that the a shader type is valid and supported by the implementation
218 * \param ctx Current GL context
219 * \param type Shader target
223 validate_shader_target(const struct gl_context
*ctx
, GLenum type
)
226 #if FEATURE_ARB_fragment_shader
227 case GL_FRAGMENT_SHADER
:
228 return ctx
->Extensions
.ARB_fragment_shader
;
230 #if FEATURE_ARB_vertex_shader
231 case GL_VERTEX_SHADER
:
232 return ctx
->Extensions
.ARB_vertex_shader
;
234 #if FEATURE_ARB_geometry_shader4
235 case GL_GEOMETRY_SHADER_ARB
:
236 return ctx
->Extensions
.ARB_geometry_shader4
;
245 * Find the length of the longest transform feedback varying name
246 * which was specified with glTransformFeedbackVaryings().
249 longest_feedback_varying_name(const struct gl_shader_program
*shProg
)
253 for (i
= 0; i
< shProg
->TransformFeedback
.NumVarying
; i
++) {
254 GLint len
= strlen(shProg
->TransformFeedback
.VaryingNames
[i
]);
264 is_program(struct gl_context
*ctx
, GLuint name
)
266 struct gl_shader_program
*shProg
= _mesa_lookup_shader_program(ctx
, name
);
267 return shProg
? GL_TRUE
: GL_FALSE
;
272 is_shader(struct gl_context
*ctx
, GLuint name
)
274 struct gl_shader
*shader
= _mesa_lookup_shader(ctx
, name
);
275 return shader
? GL_TRUE
: GL_FALSE
;
280 * Attach shader to a shader program.
283 attach_shader(struct gl_context
*ctx
, GLuint program
, GLuint shader
)
285 struct gl_shader_program
*shProg
;
286 struct gl_shader
*sh
;
289 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glAttachShader");
293 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glAttachShader");
298 n
= shProg
->NumShaders
;
299 for (i
= 0; i
< n
; i
++) {
300 if (shProg
->Shaders
[i
] == sh
) {
301 /* The shader is already attched to this program. The
302 * GL_ARB_shader_objects spec says:
304 * "The error INVALID_OPERATION is generated by AttachObjectARB
305 * if <obj> is already attached to <containerObj>."
307 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glAttachShader");
313 shProg
->Shaders
= (struct gl_shader
**)
314 _mesa_realloc(shProg
->Shaders
,
315 n
* sizeof(struct gl_shader
*),
316 (n
+ 1) * sizeof(struct gl_shader
*));
317 if (!shProg
->Shaders
) {
318 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glAttachShader");
323 shProg
->Shaders
[n
] = NULL
; /* since realloc() didn't zero the new space */
324 _mesa_reference_shader(ctx
, &shProg
->Shaders
[n
], sh
);
325 shProg
->NumShaders
++;
330 bind_frag_data_location(struct gl_context
*ctx
, GLuint program
,
331 GLuint colorNumber
, const GLchar
*name
)
333 _mesa_problem(ctx
, "bind_frag_data_location() not implemented yet");
338 create_shader(struct gl_context
*ctx
, GLenum type
)
340 struct gl_shader
*sh
;
343 if (!validate_shader_target(ctx
, type
)) {
344 _mesa_error(ctx
, GL_INVALID_ENUM
, "CreateShader(type)");
348 name
= _mesa_HashFindFreeKeyBlock(ctx
->Shared
->ShaderObjects
, 1);
349 sh
= ctx
->Driver
.NewShader(ctx
, name
, type
);
350 _mesa_HashInsert(ctx
->Shared
->ShaderObjects
, name
, sh
);
357 create_shader_program(struct gl_context
*ctx
)
360 struct gl_shader_program
*shProg
;
362 name
= _mesa_HashFindFreeKeyBlock(ctx
->Shared
->ShaderObjects
, 1);
364 shProg
= ctx
->Driver
.NewShaderProgram(ctx
, name
);
366 _mesa_HashInsert(ctx
->Shared
->ShaderObjects
, name
, shProg
);
368 assert(shProg
->RefCount
== 1);
375 * Named w/ "2" to indicate OpenGL 2.x vs GL_ARB_fragment_programs's
379 delete_shader_program(struct gl_context
*ctx
, GLuint name
)
382 * NOTE: deleting shaders/programs works a bit differently than
383 * texture objects (and buffer objects, etc). Shader/program
384 * handles/IDs exist in the hash table until the object is really
385 * deleted (refcount==0). With texture objects, the handle/ID is
386 * removed from the hash table in glDeleteTextures() while the tex
387 * object itself might linger until its refcount goes to zero.
389 struct gl_shader_program
*shProg
;
391 shProg
= _mesa_lookup_shader_program_err(ctx
, name
, "glDeleteProgram");
395 if (!shProg
->DeletePending
) {
396 shProg
->DeletePending
= GL_TRUE
;
398 /* effectively, decr shProg's refcount */
399 _mesa_reference_shader_program(ctx
, &shProg
, NULL
);
405 delete_shader(struct gl_context
*ctx
, GLuint shader
)
407 struct gl_shader
*sh
;
409 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glDeleteShader");
413 sh
->DeletePending
= GL_TRUE
;
415 /* effectively, decr sh's refcount */
416 _mesa_reference_shader(ctx
, &sh
, NULL
);
421 detach_shader(struct gl_context
*ctx
, GLuint program
, GLuint shader
)
423 struct gl_shader_program
*shProg
;
427 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glDetachShader");
431 n
= shProg
->NumShaders
;
433 for (i
= 0; i
< n
; i
++) {
434 if (shProg
->Shaders
[i
]->Name
== shader
) {
436 struct gl_shader
**newList
;
439 _mesa_reference_shader(ctx
, &shProg
->Shaders
[i
], NULL
);
441 /* alloc new, smaller array */
442 newList
= (struct gl_shader
**)
443 malloc((n
- 1) * sizeof(struct gl_shader
*));
445 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glDetachShader");
448 for (j
= 0; j
< i
; j
++) {
449 newList
[j
] = shProg
->Shaders
[j
];
452 newList
[j
++] = shProg
->Shaders
[i
];
453 free(shProg
->Shaders
);
455 shProg
->Shaders
= newList
;
456 shProg
->NumShaders
= n
- 1;
461 for (j
= 0; j
< shProg
->NumShaders
; j
++) {
462 assert(shProg
->Shaders
[j
]->Type
== GL_VERTEX_SHADER
||
463 shProg
->Shaders
[j
]->Type
== GL_FRAGMENT_SHADER
);
464 assert(shProg
->Shaders
[j
]->RefCount
> 0);
476 if (is_shader(ctx
, shader
))
477 err
= GL_INVALID_OPERATION
;
478 else if (is_program(ctx
, shader
))
479 err
= GL_INVALID_OPERATION
;
481 err
= GL_INVALID_VALUE
;
482 _mesa_error(ctx
, err
, "glDetachProgram(shader)");
489 * Return list of shaders attached to shader program.
492 get_attached_shaders(struct gl_context
*ctx
, GLuint program
, GLsizei maxCount
,
493 GLsizei
*count
, GLuint
*obj
)
495 struct gl_shader_program
*shProg
=
496 _mesa_lookup_shader_program_err(ctx
, program
, "glGetAttachedShaders");
499 for (i
= 0; i
< (GLuint
) maxCount
&& i
< shProg
->NumShaders
; i
++) {
500 obj
[i
] = shProg
->Shaders
[i
]->Name
;
509 get_frag_data_location(struct gl_context
*ctx
, GLuint program
,
512 _mesa_problem(ctx
, "get_frag_data_location() not implemented yet");
519 * glGetHandleARB() - return ID/name of currently bound shader program.
522 get_handle(struct gl_context
*ctx
, GLenum pname
)
524 if (pname
== GL_PROGRAM_OBJECT_ARB
) {
525 if (ctx
->Shader
.ActiveProgram
)
526 return ctx
->Shader
.ActiveProgram
->Name
;
531 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetHandleARB");
538 * glGetProgramiv() - get shader program state.
539 * Note that this is for GLSL shader programs, not ARB vertex/fragment
540 * programs (see glGetProgramivARB).
543 get_programiv(struct gl_context
*ctx
, GLuint program
, GLenum pname
, GLint
*params
)
545 struct gl_shader_program
*shProg
546 = _mesa_lookup_shader_program(ctx
, program
);
549 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramiv(program)");
554 case GL_DELETE_STATUS
:
555 *params
= shProg
->DeletePending
;
558 *params
= shProg
->LinkStatus
;
560 case GL_VALIDATE_STATUS
:
561 *params
= shProg
->Validated
;
563 case GL_INFO_LOG_LENGTH
:
564 *params
= shProg
->InfoLog
? strlen(shProg
->InfoLog
) + 1 : 0;
566 case GL_ATTACHED_SHADERS
:
567 *params
= shProg
->NumShaders
;
569 case GL_ACTIVE_ATTRIBUTES
:
570 *params
= _mesa_count_active_attribs(shProg
);
572 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH
:
573 *params
= _mesa_longest_attribute_name_length(shProg
);
575 case GL_ACTIVE_UNIFORMS
:
576 *params
= shProg
->NumUserUniformStorage
;
578 case GL_ACTIVE_UNIFORM_MAX_LENGTH
: {
582 for (i
= 0; i
< shProg
->NumUserUniformStorage
; i
++) {
583 /* Add one for the terminating NUL character.
585 const GLint len
= strlen(shProg
->UniformStorage
[i
].name
) + 1;
594 case GL_PROGRAM_BINARY_LENGTH_OES
:
597 #if FEATURE_EXT_transform_feedback
598 case GL_TRANSFORM_FEEDBACK_VARYINGS
:
599 *params
= shProg
->TransformFeedback
.NumVarying
;
601 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH
:
602 *params
= longest_feedback_varying_name(shProg
) + 1;
604 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE
:
605 *params
= shProg
->TransformFeedback
.BufferMode
;
608 #if FEATURE_ARB_geometry_shader4
609 case GL_GEOMETRY_VERTICES_OUT_ARB
:
610 *params
= shProg
->Geom
.VerticesOut
;
612 case GL_GEOMETRY_INPUT_TYPE_ARB
:
613 *params
= shProg
->Geom
.InputType
;
615 case GL_GEOMETRY_OUTPUT_TYPE_ARB
:
616 *params
= shProg
->Geom
.OutputType
;
620 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramiv(pname)");
627 * glGetShaderiv() - get GLSL shader state
630 get_shaderiv(struct gl_context
*ctx
, GLuint name
, GLenum pname
, GLint
*params
)
632 struct gl_shader
*shader
=
633 _mesa_lookup_shader_err(ctx
, name
, "glGetShaderiv");
641 *params
= shader
->Type
;
643 case GL_DELETE_STATUS
:
644 *params
= shader
->DeletePending
;
646 case GL_COMPILE_STATUS
:
647 *params
= shader
->CompileStatus
;
649 case GL_INFO_LOG_LENGTH
:
650 *params
= shader
->InfoLog
? strlen(shader
->InfoLog
) + 1 : 0;
652 case GL_SHADER_SOURCE_LENGTH
:
653 *params
= shader
->Source
? strlen((char *) shader
->Source
) + 1 : 0;
656 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetShaderiv(pname)");
663 get_program_info_log(struct gl_context
*ctx
, GLuint program
, GLsizei bufSize
,
664 GLsizei
*length
, GLchar
*infoLog
)
666 struct gl_shader_program
*shProg
667 = _mesa_lookup_shader_program(ctx
, program
);
669 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramInfoLog(program)");
672 _mesa_copy_string(infoLog
, bufSize
, length
, shProg
->InfoLog
);
677 get_shader_info_log(struct gl_context
*ctx
, GLuint shader
, GLsizei bufSize
,
678 GLsizei
*length
, GLchar
*infoLog
)
680 struct gl_shader
*sh
= _mesa_lookup_shader(ctx
, shader
);
682 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetShaderInfoLog(shader)");
685 _mesa_copy_string(infoLog
, bufSize
, length
, sh
->InfoLog
);
690 * Return shader source code.
693 get_shader_source(struct gl_context
*ctx
, GLuint shader
, GLsizei maxLength
,
694 GLsizei
*length
, GLchar
*sourceOut
)
696 struct gl_shader
*sh
;
697 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glGetShaderSource");
701 _mesa_copy_string(sourceOut
, maxLength
, length
, sh
->Source
);
706 * Set/replace shader source code.
709 shader_source(struct gl_context
*ctx
, GLuint shader
, const GLchar
*source
)
711 struct gl_shader
*sh
;
713 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glShaderSource");
717 /* free old shader source string and install new one */
719 free((void *) sh
->Source
);
722 sh
->CompileStatus
= GL_FALSE
;
724 sh
->SourceChecksum
= _mesa_str_checksum(sh
->Source
);
733 compile_shader(struct gl_context
*ctx
, GLuint shaderObj
)
735 struct gl_shader
*sh
;
736 struct gl_shader_compiler_options
*options
;
738 sh
= _mesa_lookup_shader_err(ctx
, shaderObj
, "glCompileShader");
742 options
= &ctx
->ShaderCompilerOptions
[_mesa_shader_type_to_index(sh
->Type
)];
744 /* set default pragma state for shader */
745 sh
->Pragmas
= options
->DefaultPragmas
;
747 /* this call will set the sh->CompileStatus field to indicate if
748 * compilation was successful.
750 _mesa_glsl_compile_shader(ctx
, sh
);
755 * Link a program's shaders.
758 link_program(struct gl_context
*ctx
, GLuint program
)
760 struct gl_shader_program
*shProg
;
761 struct gl_transform_feedback_object
*obj
=
762 ctx
->TransformFeedback
.CurrentObject
;
764 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glLinkProgram");
769 && (shProg
== ctx
->Shader
.CurrentVertexProgram
770 || shProg
== ctx
->Shader
.CurrentGeometryProgram
771 || shProg
== ctx
->Shader
.CurrentFragmentProgram
)) {
772 _mesa_error(ctx
, GL_INVALID_OPERATION
,
773 "glLinkProgram(transform feedback active");
777 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
779 _mesa_glsl_link_shader(ctx
, shProg
);
785 printf("Link %u shaders in program %u: %s\n",
786 shProg
->NumShaders
, shProg
->Name
,
787 shProg
->LinkStatus
? "Success" : "Failed");
789 for (i
= 0; i
< shProg
->NumShaders
; i
++) {
790 printf(" shader %u, type 0x%x\n",
791 shProg
->Shaders
[i
]->Name
,
792 shProg
->Shaders
[i
]->Type
);
799 * Print basic shader info (for debug).
802 print_shader_info(const struct gl_shader_program
*shProg
)
806 printf("Mesa: glUseProgram(%u)\n", shProg
->Name
);
807 for (i
= 0; i
< shProg
->NumShaders
; i
++) {
809 switch (shProg
->Shaders
[i
]->Type
) {
810 case GL_VERTEX_SHADER
:
813 case GL_FRAGMENT_SHADER
:
816 case GL_GEOMETRY_SHADER
:
822 printf(" %s shader %u, checksum %u\n", s
,
823 shProg
->Shaders
[i
]->Name
,
824 shProg
->Shaders
[i
]->SourceChecksum
);
826 if (shProg
->_LinkedShaders
[MESA_SHADER_VERTEX
])
827 printf(" vert prog %u\n",
828 shProg
->_LinkedShaders
[MESA_SHADER_VERTEX
]->Program
->Id
);
829 if (shProg
->_LinkedShaders
[MESA_SHADER_FRAGMENT
])
830 printf(" frag prog %u\n",
831 shProg
->_LinkedShaders
[MESA_SHADER_FRAGMENT
]->Program
->Id
);
832 if (shProg
->_LinkedShaders
[MESA_SHADER_GEOMETRY
])
833 printf(" geom prog %u\n",
834 shProg
->_LinkedShaders
[MESA_SHADER_GEOMETRY
]->Program
->Id
);
839 * Use the named shader program for subsequent glUniform calls
842 _mesa_active_program(struct gl_context
*ctx
, struct gl_shader_program
*shProg
,
845 if ((shProg
!= NULL
) && !shProg
->LinkStatus
) {
846 _mesa_error(ctx
, GL_INVALID_OPERATION
,
847 "%s(program %u not linked)", caller
, shProg
->Name
);
851 if (ctx
->Shader
.ActiveProgram
!= shProg
) {
852 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.ActiveProgram
, shProg
);
859 use_shader_program(struct gl_context
*ctx
, GLenum type
,
860 struct gl_shader_program
*shProg
)
862 struct gl_shader_program
**target
;
865 #if FEATURE_ARB_vertex_shader
866 case GL_VERTEX_SHADER
:
867 target
= &ctx
->Shader
.CurrentVertexProgram
;
869 || (shProg
->_LinkedShaders
[MESA_SHADER_VERTEX
] == NULL
)) {
874 #if FEATURE_ARB_geometry_shader4
875 case GL_GEOMETRY_SHADER_ARB
:
876 target
= &ctx
->Shader
.CurrentGeometryProgram
;
878 || (shProg
->_LinkedShaders
[MESA_SHADER_GEOMETRY
] == NULL
)) {
883 #if FEATURE_ARB_fragment_shader
884 case GL_FRAGMENT_SHADER
:
885 target
= &ctx
->Shader
.CurrentFragmentProgram
;
887 || (shProg
->_LinkedShaders
[MESA_SHADER_FRAGMENT
] == NULL
)) {
896 if (*target
!= shProg
) {
897 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
| _NEW_PROGRAM_CONSTANTS
);
898 _mesa_reference_shader_program(ctx
, target
, shProg
);
906 * Use the named shader program for subsequent rendering.
909 _mesa_use_program(struct gl_context
*ctx
, struct gl_shader_program
*shProg
)
911 use_shader_program(ctx
, GL_VERTEX_SHADER
, shProg
);
912 use_shader_program(ctx
, GL_GEOMETRY_SHADER_ARB
, shProg
);
913 use_shader_program(ctx
, GL_FRAGMENT_SHADER
, shProg
);
914 _mesa_active_program(ctx
, shProg
, "glUseProgram");
916 if (ctx
->Driver
.UseProgram
)
917 ctx
->Driver
.UseProgram(ctx
, shProg
);
922 * Validate a program's samplers.
923 * Specifically, check that there aren't two samplers of different types
924 * pointing to the same texture unit.
925 * \return GL_TRUE if valid, GL_FALSE if invalid
928 validate_samplers(const struct gl_program
*prog
, char *errMsg
)
930 static const char *targetName
[] = {
941 GLint targetUsed
[MAX_COMBINED_TEXTURE_IMAGE_UNITS
];
942 GLbitfield samplersUsed
= prog
->SamplersUsed
;
945 assert(Elements(targetName
) == NUM_TEXTURE_TARGETS
);
947 if (samplersUsed
== 0x0)
950 for (i
= 0; i
< Elements(targetUsed
); i
++)
953 /* walk over bits which are set in 'samplers' */
954 while (samplersUsed
) {
956 gl_texture_index target
;
957 GLint sampler
= _mesa_ffs(samplersUsed
) - 1;
958 assert(sampler
>= 0);
959 assert(sampler
< Elements(prog
->SamplerUnits
));
960 unit
= prog
->SamplerUnits
[sampler
];
961 target
= prog
->SamplerTargets
[sampler
];
962 if (targetUsed
[unit
] != -1 && targetUsed
[unit
] != (int) target
) {
963 _mesa_snprintf(errMsg
, 100,
964 "Texture unit %d is accessed both as %s and %s",
965 unit
, targetName
[targetUsed
[unit
]], targetName
[target
]);
968 targetUsed
[unit
] = target
;
969 samplersUsed
^= (1 << sampler
);
977 * Do validation of the given shader program.
978 * \param errMsg returns error message if validation fails.
979 * \return GL_TRUE if valid, GL_FALSE if invalid (and set errMsg)
982 validate_shader_program(const struct gl_shader_program
*shProg
,
987 if (!shProg
->LinkStatus
) {
991 /* From the GL spec, a program is invalid if any of these are true:
993 any two active samplers in the current program object are of
994 different types, but refer to the same texture image unit,
996 any active sampler in the current program object refers to a texture
997 image unit where fixed-function fragment processing accesses a
998 texture target that does not match the sampler type, or
1000 the sum of the number of active samplers in the program and the
1001 number of texture image units enabled for fixed-function fragment
1002 processing exceeds the combined limit on the total number of texture
1003 image units allowed.
1008 * Check: any two active samplers in the current program object are of
1009 * different types, but refer to the same texture image unit,
1011 for (i
= 0; i
< Elements(shProg
->_LinkedShaders
); i
++) {
1012 if (shProg
->_LinkedShaders
[i
]
1013 && !validate_samplers(shProg
->_LinkedShaders
[i
]->Program
, errMsg
)) {
1023 * Called via glValidateProgram()
1026 validate_program(struct gl_context
*ctx
, GLuint program
)
1028 struct gl_shader_program
*shProg
;
1029 char errMsg
[100] = "";
1031 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glValidateProgram");
1036 shProg
->Validated
= validate_shader_program(shProg
, errMsg
);
1037 if (!shProg
->Validated
) {
1038 /* update info log */
1039 if (shProg
->InfoLog
) {
1040 ralloc_free(shProg
->InfoLog
);
1042 shProg
->InfoLog
= ralloc_strdup(shProg
, errMsg
);
1049 _mesa_AttachObjectARB(GLhandleARB program
, GLhandleARB shader
)
1051 GET_CURRENT_CONTEXT(ctx
);
1052 attach_shader(ctx
, program
, shader
);
1057 _mesa_AttachShader(GLuint program
, GLuint shader
)
1059 GET_CURRENT_CONTEXT(ctx
);
1060 attach_shader(ctx
, program
, shader
);
1064 /* GL_EXT_gpu_shader4, GL3 */
1066 _mesa_BindFragDataLocation(GLuint program
, GLuint colorNumber
,
1069 GET_CURRENT_CONTEXT(ctx
);
1070 bind_frag_data_location(ctx
, program
, colorNumber
, name
);
1075 _mesa_CompileShaderARB(GLhandleARB shaderObj
)
1077 GET_CURRENT_CONTEXT(ctx
);
1078 if (MESA_VERBOSE
& VERBOSE_API
)
1079 _mesa_debug(ctx
, "glCompileShader %u\n", shaderObj
);
1080 compile_shader(ctx
, shaderObj
);
1085 _mesa_CreateShader(GLenum type
)
1087 GET_CURRENT_CONTEXT(ctx
);
1088 if (MESA_VERBOSE
& VERBOSE_API
)
1089 _mesa_debug(ctx
, "glCreateShader %s\n", _mesa_lookup_enum_by_nr(type
));
1090 return create_shader(ctx
, type
);
1094 GLhandleARB GLAPIENTRY
1095 _mesa_CreateShaderObjectARB(GLenum type
)
1097 GET_CURRENT_CONTEXT(ctx
);
1098 return create_shader(ctx
, type
);
1103 _mesa_CreateProgram(void)
1105 GET_CURRENT_CONTEXT(ctx
);
1106 if (MESA_VERBOSE
& VERBOSE_API
)
1107 _mesa_debug(ctx
, "glCreateProgram\n");
1108 return create_shader_program(ctx
);
1112 GLhandleARB GLAPIENTRY
1113 _mesa_CreateProgramObjectARB(void)
1115 GET_CURRENT_CONTEXT(ctx
);
1116 return create_shader_program(ctx
);
1121 _mesa_DeleteObjectARB(GLhandleARB obj
)
1123 if (MESA_VERBOSE
& VERBOSE_API
) {
1124 GET_CURRENT_CONTEXT(ctx
);
1125 _mesa_debug(ctx
, "glDeleteObjectARB(%u)\n", obj
);
1129 GET_CURRENT_CONTEXT(ctx
);
1130 FLUSH_VERTICES(ctx
, 0);
1131 if (is_program(ctx
, obj
)) {
1132 delete_shader_program(ctx
, obj
);
1134 else if (is_shader(ctx
, obj
)) {
1135 delete_shader(ctx
, obj
);
1145 _mesa_DeleteProgram(GLuint name
)
1148 GET_CURRENT_CONTEXT(ctx
);
1149 FLUSH_VERTICES(ctx
, 0);
1150 delete_shader_program(ctx
, name
);
1156 _mesa_DeleteShader(GLuint name
)
1159 GET_CURRENT_CONTEXT(ctx
);
1160 FLUSH_VERTICES(ctx
, 0);
1161 delete_shader(ctx
, name
);
1167 _mesa_DetachObjectARB(GLhandleARB program
, GLhandleARB shader
)
1169 GET_CURRENT_CONTEXT(ctx
);
1170 detach_shader(ctx
, program
, shader
);
1175 _mesa_DetachShader(GLuint program
, GLuint shader
)
1177 GET_CURRENT_CONTEXT(ctx
);
1178 detach_shader(ctx
, program
, shader
);
1183 _mesa_GetAttachedObjectsARB(GLhandleARB container
, GLsizei maxCount
,
1184 GLsizei
* count
, GLhandleARB
* obj
)
1186 GET_CURRENT_CONTEXT(ctx
);
1187 get_attached_shaders(ctx
, container
, maxCount
, count
, obj
);
1192 _mesa_GetAttachedShaders(GLuint program
, GLsizei maxCount
,
1193 GLsizei
*count
, GLuint
*obj
)
1195 GET_CURRENT_CONTEXT(ctx
);
1196 get_attached_shaders(ctx
, program
, maxCount
, count
, obj
);
1200 /* GL_EXT_gpu_shader4, GL3 */
1202 _mesa_GetFragDataLocation(GLuint program
, const GLchar
*name
)
1204 GET_CURRENT_CONTEXT(ctx
);
1205 return get_frag_data_location(ctx
, program
, name
);
1211 _mesa_GetInfoLogARB(GLhandleARB object
, GLsizei maxLength
, GLsizei
* length
,
1212 GLcharARB
* infoLog
)
1214 GET_CURRENT_CONTEXT(ctx
);
1215 if (is_program(ctx
, object
)) {
1216 get_program_info_log(ctx
, object
, maxLength
, length
, infoLog
);
1218 else if (is_shader(ctx
, object
)) {
1219 get_shader_info_log(ctx
, object
, maxLength
, length
, infoLog
);
1222 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetInfoLogARB");
1228 _mesa_GetObjectParameterivARB(GLhandleARB object
, GLenum pname
, GLint
*params
)
1230 GET_CURRENT_CONTEXT(ctx
);
1231 /* Implement in terms of GetProgramiv, GetShaderiv */
1232 if (is_program(ctx
, object
)) {
1233 if (pname
== GL_OBJECT_TYPE_ARB
) {
1234 *params
= GL_PROGRAM_OBJECT_ARB
;
1237 get_programiv(ctx
, object
, pname
, params
);
1240 else if (is_shader(ctx
, object
)) {
1241 if (pname
== GL_OBJECT_TYPE_ARB
) {
1242 *params
= GL_SHADER_OBJECT_ARB
;
1245 get_shaderiv(ctx
, object
, pname
, params
);
1249 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetObjectParameterivARB");
1255 _mesa_GetObjectParameterfvARB(GLhandleARB object
, GLenum pname
,
1258 GLint iparams
[1]; /* XXX is one element enough? */
1259 _mesa_GetObjectParameterivARB(object
, pname
, iparams
);
1260 params
[0] = (GLfloat
) iparams
[0];
1265 _mesa_GetProgramiv(GLuint program
, GLenum pname
, GLint
*params
)
1267 GET_CURRENT_CONTEXT(ctx
);
1268 get_programiv(ctx
, program
, pname
, params
);
1273 _mesa_GetShaderiv(GLuint shader
, GLenum pname
, GLint
*params
)
1275 GET_CURRENT_CONTEXT(ctx
);
1276 get_shaderiv(ctx
, shader
, pname
, params
);
1281 _mesa_GetProgramInfoLog(GLuint program
, GLsizei bufSize
,
1282 GLsizei
*length
, GLchar
*infoLog
)
1284 GET_CURRENT_CONTEXT(ctx
);
1285 get_program_info_log(ctx
, program
, bufSize
, length
, infoLog
);
1290 _mesa_GetShaderInfoLog(GLuint shader
, GLsizei bufSize
,
1291 GLsizei
*length
, GLchar
*infoLog
)
1293 GET_CURRENT_CONTEXT(ctx
);
1294 get_shader_info_log(ctx
, shader
, bufSize
, length
, infoLog
);
1299 _mesa_GetShaderSourceARB(GLhandleARB shader
, GLsizei maxLength
,
1300 GLsizei
*length
, GLcharARB
*sourceOut
)
1302 GET_CURRENT_CONTEXT(ctx
);
1303 get_shader_source(ctx
, shader
, maxLength
, length
, sourceOut
);
1307 GLhandleARB GLAPIENTRY
1308 _mesa_GetHandleARB(GLenum pname
)
1310 GET_CURRENT_CONTEXT(ctx
);
1311 return get_handle(ctx
, pname
);
1315 GLboolean GLAPIENTRY
1316 _mesa_IsProgram(GLuint name
)
1318 GET_CURRENT_CONTEXT(ctx
);
1319 return is_program(ctx
, name
);
1323 GLboolean GLAPIENTRY
1324 _mesa_IsShader(GLuint name
)
1326 GET_CURRENT_CONTEXT(ctx
);
1327 return is_shader(ctx
, name
);
1332 _mesa_LinkProgramARB(GLhandleARB programObj
)
1334 GET_CURRENT_CONTEXT(ctx
);
1335 link_program(ctx
, programObj
);
1341 * Read shader source code from a file.
1342 * Useful for debugging to override an app's shader.
1345 read_shader(const char *fname
)
1347 const int max
= 50*1000;
1348 FILE *f
= fopen(fname
, "r");
1349 GLcharARB
*buffer
, *shader
;
1356 buffer
= (char *) malloc(max
);
1357 len
= fread(buffer
, 1, max
, f
);
1362 shader
= _mesa_strdup(buffer
);
1370 * Called via glShaderSource() and glShaderSourceARB() API functions.
1371 * Basically, concatenate the source code strings into one long string
1372 * and pass it to _mesa_shader_source().
1375 _mesa_ShaderSourceARB(GLhandleARB shaderObj
, GLsizei count
,
1376 const GLcharARB
** string
, const GLint
* length
)
1378 GET_CURRENT_CONTEXT(ctx
);
1380 GLsizei i
, totalLength
;
1384 if (!shaderObj
|| string
== NULL
) {
1385 _mesa_error(ctx
, GL_INVALID_VALUE
, "glShaderSourceARB");
1390 * This array holds offsets of where the appropriate string ends, thus the
1391 * last element will be set to the total length of the source code.
1393 offsets
= (GLint
*) malloc(count
* sizeof(GLint
));
1394 if (offsets
== NULL
) {
1395 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glShaderSourceARB");
1399 for (i
= 0; i
< count
; i
++) {
1400 if (string
[i
] == NULL
) {
1401 free((GLvoid
*) offsets
);
1402 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1403 "glShaderSourceARB(null string)");
1406 if (length
== NULL
|| length
[i
] < 0)
1407 offsets
[i
] = strlen(string
[i
]);
1409 offsets
[i
] = length
[i
];
1410 /* accumulate string lengths */
1412 offsets
[i
] += offsets
[i
- 1];
1415 /* Total length of source string is sum off all strings plus two.
1416 * One extra byte for terminating zero, another extra byte to silence
1417 * valgrind warnings in the parser/grammer code.
1419 totalLength
= offsets
[count
- 1] + 2;
1420 source
= (GLcharARB
*) malloc(totalLength
* sizeof(GLcharARB
));
1421 if (source
== NULL
) {
1422 free((GLvoid
*) offsets
);
1423 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glShaderSourceARB");
1427 for (i
= 0; i
< count
; i
++) {
1428 GLint start
= (i
> 0) ? offsets
[i
- 1] : 0;
1429 memcpy(source
+ start
, string
[i
],
1430 (offsets
[i
] - start
) * sizeof(GLcharARB
));
1432 source
[totalLength
- 1] = '\0';
1433 source
[totalLength
- 2] = '\0';
1436 /* Compute the shader's source code checksum then try to open a file
1437 * named newshader_<CHECKSUM>. If it exists, use it in place of the
1438 * original shader source code. For debugging.
1441 GLcharARB
*newSource
;
1443 checksum
= _mesa_str_checksum(source
);
1445 _mesa_snprintf(filename
, sizeof(filename
), "newshader_%d", checksum
);
1447 newSource
= read_shader(filename
);
1449 fprintf(stderr
, "Mesa: Replacing shader %u chksum=%d with %s\n",
1450 shaderObj
, checksum
, filename
);
1456 shader_source(ctx
, shaderObj
, source
);
1459 struct gl_shader
*sh
= _mesa_lookup_shader(ctx
, shaderObj
);
1461 sh
->SourceChecksum
= checksum
; /* save original checksum */
1469 _mesa_UseProgramObjectARB(GLhandleARB program
)
1471 GET_CURRENT_CONTEXT(ctx
);
1472 struct gl_shader_program
*shProg
;
1473 struct gl_transform_feedback_object
*obj
=
1474 ctx
->TransformFeedback
.CurrentObject
;
1476 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1479 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1480 "glUseProgram(transform feedback active)");
1485 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glUseProgram");
1489 if (!shProg
->LinkStatus
) {
1490 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1491 "glUseProgram(program %u not linked)", program
);
1496 if (ctx
->Shader
.Flags
& GLSL_USE_PROG
) {
1497 print_shader_info(shProg
);
1504 _mesa_use_program(ctx
, shProg
);
1509 _mesa_ValidateProgramARB(GLhandleARB program
)
1511 GET_CURRENT_CONTEXT(ctx
);
1512 validate_program(ctx
, program
);
1518 _mesa_GetShaderPrecisionFormat(GLenum shadertype
, GLenum precisiontype
,
1519 GLint
* range
, GLint
* precision
)
1521 const struct gl_program_constants
*limits
;
1522 const struct gl_precision
*p
;
1523 GET_CURRENT_CONTEXT(ctx
);
1525 switch (shadertype
) {
1526 case GL_VERTEX_SHADER
:
1527 limits
= &ctx
->Const
.VertexProgram
;
1529 case GL_FRAGMENT_SHADER
:
1530 limits
= &ctx
->Const
.FragmentProgram
;
1533 _mesa_error(ctx
, GL_INVALID_ENUM
,
1534 "glGetShaderPrecisionFormat(shadertype)");
1538 switch (precisiontype
) {
1540 p
= &limits
->LowFloat
;
1542 case GL_MEDIUM_FLOAT
:
1543 p
= &limits
->MediumFloat
;
1546 p
= &limits
->HighFloat
;
1549 p
= &limits
->LowInt
;
1552 p
= &limits
->MediumInt
;
1555 p
= &limits
->HighInt
;
1558 _mesa_error(ctx
, GL_INVALID_ENUM
,
1559 "glGetShaderPrecisionFormat(precisiontype)");
1563 range
[0] = p
->RangeMin
;
1564 range
[1] = p
->RangeMax
;
1565 precision
[0] = p
->Precision
;
1570 _mesa_ReleaseShaderCompiler(void)
1572 _mesa_destroy_shader_compiler_caches();
1577 _mesa_ShaderBinary(GLint n
, const GLuint
* shaders
, GLenum binaryformat
,
1578 const void* binary
, GLint length
)
1580 GET_CURRENT_CONTEXT(ctx
);
1583 (void) binaryformat
;
1586 _mesa_error(ctx
, GL_INVALID_OPERATION
, __FUNCTION__
);
1589 #endif /* FEATURE_ES2 */
1592 #if FEATURE_ARB_geometry_shader4
1595 _mesa_ProgramParameteriARB(GLuint program
, GLenum pname
, GLint value
)
1597 struct gl_shader_program
*shProg
;
1598 GET_CURRENT_CONTEXT(ctx
);
1600 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1602 shProg
= _mesa_lookup_shader_program_err(ctx
, program
,
1603 "glProgramParameteri");
1608 case GL_GEOMETRY_VERTICES_OUT_ARB
:
1610 (unsigned) value
> ctx
->Const
.MaxGeometryOutputVertices
) {
1611 _mesa_error(ctx
, GL_INVALID_VALUE
,
1612 "glProgramParameteri(GL_GEOMETRY_VERTICES_OUT_ARB=%d",
1616 shProg
->Geom
.VerticesOut
= value
;
1618 case GL_GEOMETRY_INPUT_TYPE_ARB
:
1622 case GL_LINES_ADJACENCY_ARB
:
1624 case GL_TRIANGLES_ADJACENCY_ARB
:
1625 shProg
->Geom
.InputType
= value
;
1628 _mesa_error(ctx
, GL_INVALID_VALUE
,
1629 "glProgramParameteri(geometry input type = %s",
1630 _mesa_lookup_enum_by_nr(value
));
1634 case GL_GEOMETRY_OUTPUT_TYPE_ARB
:
1638 case GL_TRIANGLE_STRIP
:
1639 shProg
->Geom
.OutputType
= value
;
1642 _mesa_error(ctx
, GL_INVALID_VALUE
,
1643 "glProgramParameteri(geometry output type = %s",
1644 _mesa_lookup_enum_by_nr(value
));
1649 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramParameteriARB(pname=%s)",
1650 _mesa_lookup_enum_by_nr(pname
));
1658 _mesa_use_shader_program(struct gl_context
*ctx
, GLenum type
,
1659 struct gl_shader_program
*shProg
)
1661 use_shader_program(ctx
, type
, shProg
);
1663 if (ctx
->Driver
.UseProgram
)
1664 ctx
->Driver
.UseProgram(ctx
, shProg
);
1668 _mesa_UseShaderProgramEXT(GLenum type
, GLuint program
)
1670 GET_CURRENT_CONTEXT(ctx
);
1671 struct gl_shader_program
*shProg
= NULL
;
1673 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1675 if (!validate_shader_target(ctx
, type
)) {
1676 _mesa_error(ctx
, GL_INVALID_ENUM
, "glUseShaderProgramEXT(type)");
1680 if (ctx
->TransformFeedback
.CurrentObject
->Active
) {
1681 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1682 "glUseShaderProgramEXT(transform feedback is active)");
1687 shProg
= _mesa_lookup_shader_program_err(ctx
, program
,
1688 "glUseShaderProgramEXT");
1692 if (!shProg
->LinkStatus
) {
1693 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1694 "glUseShaderProgramEXT(program not linked)");
1699 _mesa_use_shader_program(ctx
, type
, shProg
);
1703 _mesa_ActiveProgramEXT(GLuint program
)
1705 GET_CURRENT_CONTEXT(ctx
);
1706 struct gl_shader_program
*shProg
= (program
!= 0)
1707 ? _mesa_lookup_shader_program_err(ctx
, program
, "glActiveProgramEXT")
1710 _mesa_active_program(ctx
, shProg
, "glActiveProgramEXT");
1715 _mesa_CreateShaderProgramEXT(GLenum type
, const GLchar
*string
)
1717 GET_CURRENT_CONTEXT(ctx
);
1718 const GLuint shader
= create_shader(ctx
, type
);
1722 shader_source(ctx
, shader
, _mesa_strdup(string
));
1723 compile_shader(ctx
, shader
);
1725 program
= create_shader_program(ctx
);
1727 struct gl_shader_program
*shProg
;
1728 struct gl_shader
*sh
;
1729 GLint compiled
= GL_FALSE
;
1731 shProg
= _mesa_lookup_shader_program(ctx
, program
);
1732 sh
= _mesa_lookup_shader(ctx
, shader
);
1734 get_shaderiv(ctx
, shader
, GL_COMPILE_STATUS
, &compiled
);
1736 attach_shader(ctx
, program
, shader
);
1737 link_program(ctx
, program
);
1738 detach_shader(ctx
, program
, shader
);
1742 if (active
-user
-defined
-varyings
-in
-linked
-program
) {
1743 append
-error
-to
-info
-log
;
1744 shProg
->LinkStatus
= GL_FALSE
;
1749 ralloc_strcat(&shProg
->InfoLog
, sh
->InfoLog
);
1752 delete_shader(ctx
, shader
);
1759 * Plug in shader-related functions into API dispatch table.
1762 _mesa_init_shader_dispatch(struct _glapi_table
*exec
)
1765 /* GL_ARB_vertex/fragment_shader */
1766 SET_DeleteObjectARB(exec
, _mesa_DeleteObjectARB
);
1767 SET_GetHandleARB(exec
, _mesa_GetHandleARB
);
1768 SET_DetachObjectARB(exec
, _mesa_DetachObjectARB
);
1769 SET_CreateShaderObjectARB(exec
, _mesa_CreateShaderObjectARB
);
1770 SET_ShaderSourceARB(exec
, _mesa_ShaderSourceARB
);
1771 SET_CompileShaderARB(exec
, _mesa_CompileShaderARB
);
1772 SET_CreateProgramObjectARB(exec
, _mesa_CreateProgramObjectARB
);
1773 SET_AttachObjectARB(exec
, _mesa_AttachObjectARB
);
1774 SET_LinkProgramARB(exec
, _mesa_LinkProgramARB
);
1775 SET_UseProgramObjectARB(exec
, _mesa_UseProgramObjectARB
);
1776 SET_ValidateProgramARB(exec
, _mesa_ValidateProgramARB
);
1777 SET_GetObjectParameterfvARB(exec
, _mesa_GetObjectParameterfvARB
);
1778 SET_GetObjectParameterivARB(exec
, _mesa_GetObjectParameterivARB
);
1779 SET_GetInfoLogARB(exec
, _mesa_GetInfoLogARB
);
1780 SET_GetAttachedObjectsARB(exec
, _mesa_GetAttachedObjectsARB
);
1781 SET_GetShaderSourceARB(exec
, _mesa_GetShaderSourceARB
);
1784 SET_AttachShader(exec
, _mesa_AttachShader
);
1785 SET_CreateProgram(exec
, _mesa_CreateProgram
);
1786 SET_CreateShader(exec
, _mesa_CreateShader
);
1787 SET_DeleteProgram(exec
, _mesa_DeleteProgram
);
1788 SET_DeleteShader(exec
, _mesa_DeleteShader
);
1789 SET_DetachShader(exec
, _mesa_DetachShader
);
1790 SET_GetAttachedShaders(exec
, _mesa_GetAttachedShaders
);
1791 SET_GetProgramiv(exec
, _mesa_GetProgramiv
);
1792 SET_GetProgramInfoLog(exec
, _mesa_GetProgramInfoLog
);
1793 SET_GetShaderiv(exec
, _mesa_GetShaderiv
);
1794 SET_GetShaderInfoLog(exec
, _mesa_GetShaderInfoLog
);
1795 SET_IsProgram(exec
, _mesa_IsProgram
);
1796 SET_IsShader(exec
, _mesa_IsShader
);
1798 #if FEATURE_ARB_vertex_shader
1799 SET_BindAttribLocationARB(exec
, _mesa_BindAttribLocationARB
);
1800 SET_GetActiveAttribARB(exec
, _mesa_GetActiveAttribARB
);
1801 SET_GetAttribLocationARB(exec
, _mesa_GetAttribLocationARB
);
1804 #if FEATURE_ARB_geometry_shader4
1805 SET_ProgramParameteriARB(exec
, _mesa_ProgramParameteriARB
);
1808 SET_UseShaderProgramEXT(exec
, _mesa_UseShaderProgramEXT
);
1809 SET_ActiveProgramEXT(exec
, _mesa_ActiveProgramEXT
);
1810 SET_CreateShaderProgramEXT(exec
, _mesa_CreateShaderProgramEXT
);
1812 /* GL_EXT_gpu_shader4 / GL 3.0 */
1813 SET_BindFragDataLocationEXT(exec
, _mesa_BindFragDataLocation
);
1814 SET_GetFragDataLocationEXT(exec
, _mesa_GetFragDataLocation
);
1816 /* GL_ARB_ES2_compatibility */
1817 SET_ReleaseShaderCompiler(exec
, _mesa_ReleaseShaderCompiler
);
1818 SET_GetShaderPrecisionFormat(exec
, _mesa_GetShaderPrecisionFormat
);
1820 #endif /* FEATURE_GL */