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;
109 /* Default pragma settings */
110 options
.DefaultPragmas
.Optimize
= GL_TRUE
;
112 for (sh
= 0; sh
< MESA_SHADER_TYPES
; ++sh
)
113 memcpy(&ctx
->ShaderCompilerOptions
[sh
], &options
, sizeof(options
));
115 ctx
->Shader
.Flags
= get_shader_flags();
120 * Free the per-context shader-related state.
123 _mesa_free_shader_state(struct gl_context
*ctx
)
125 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.CurrentVertexProgram
, NULL
);
126 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.CurrentGeometryProgram
,
128 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.CurrentFragmentProgram
,
130 _mesa_reference_shader_program(ctx
, &ctx
->Shader
._CurrentFragmentProgram
,
132 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.ActiveProgram
, NULL
);
137 * Copy string from <src> to <dst>, up to maxLength characters, returning
138 * length of <dst> in <length>.
139 * \param src the strings source
140 * \param maxLength max chars to copy
141 * \param length returns number of chars copied
142 * \param dst the string destination
145 _mesa_copy_string(GLchar
*dst
, GLsizei maxLength
,
146 GLsizei
*length
, const GLchar
*src
)
149 for (len
= 0; len
< maxLength
- 1 && src
&& src
[len
]; len
++)
160 * Confirm that the a shader type is valid and supported by the implementation
162 * \param ctx Current GL context
163 * \param type Shader target
167 validate_shader_target(const struct gl_context
*ctx
, GLenum type
)
170 #if FEATURE_ARB_fragment_shader
171 case GL_FRAGMENT_SHADER
:
172 return ctx
->Extensions
.ARB_fragment_shader
;
174 #if FEATURE_ARB_vertex_shader
175 case GL_VERTEX_SHADER
:
176 return ctx
->Extensions
.ARB_vertex_shader
;
178 #if FEATURE_ARB_geometry_shader4
179 case GL_GEOMETRY_SHADER_ARB
:
180 return _mesa_is_desktop_gl(ctx
) && ctx
->Extensions
.ARB_geometry_shader4
;
189 * Find the length of the longest transform feedback varying name
190 * which was specified with glTransformFeedbackVaryings().
193 longest_feedback_varying_name(const struct gl_shader_program
*shProg
)
197 for (i
= 0; i
< shProg
->TransformFeedback
.NumVarying
; i
++) {
198 GLint len
= strlen(shProg
->TransformFeedback
.VaryingNames
[i
]);
208 is_program(struct gl_context
*ctx
, GLuint name
)
210 struct gl_shader_program
*shProg
= _mesa_lookup_shader_program(ctx
, name
);
211 return shProg
? GL_TRUE
: GL_FALSE
;
216 is_shader(struct gl_context
*ctx
, GLuint name
)
218 struct gl_shader
*shader
= _mesa_lookup_shader(ctx
, name
);
219 return shader
? GL_TRUE
: GL_FALSE
;
224 * Attach shader to a shader program.
227 attach_shader(struct gl_context
*ctx
, GLuint program
, GLuint shader
)
229 struct gl_shader_program
*shProg
;
230 struct gl_shader
*sh
;
233 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glAttachShader");
237 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glAttachShader");
242 n
= shProg
->NumShaders
;
243 for (i
= 0; i
< n
; i
++) {
244 if (shProg
->Shaders
[i
] == sh
) {
245 /* The shader is already attched to this program. The
246 * GL_ARB_shader_objects spec says:
248 * "The error INVALID_OPERATION is generated by AttachObjectARB
249 * if <obj> is already attached to <containerObj>."
251 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glAttachShader");
257 shProg
->Shaders
= (struct gl_shader
**)
258 _mesa_realloc(shProg
->Shaders
,
259 n
* sizeof(struct gl_shader
*),
260 (n
+ 1) * sizeof(struct gl_shader
*));
261 if (!shProg
->Shaders
) {
262 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glAttachShader");
267 shProg
->Shaders
[n
] = NULL
; /* since realloc() didn't zero the new space */
268 _mesa_reference_shader(ctx
, &shProg
->Shaders
[n
], sh
);
269 shProg
->NumShaders
++;
274 create_shader(struct gl_context
*ctx
, GLenum type
)
276 struct gl_shader
*sh
;
279 if (!validate_shader_target(ctx
, type
)) {
280 _mesa_error(ctx
, GL_INVALID_ENUM
, "CreateShader(type)");
284 name
= _mesa_HashFindFreeKeyBlock(ctx
->Shared
->ShaderObjects
, 1);
285 sh
= ctx
->Driver
.NewShader(ctx
, name
, type
);
286 _mesa_HashInsert(ctx
->Shared
->ShaderObjects
, name
, sh
);
293 create_shader_program(struct gl_context
*ctx
)
296 struct gl_shader_program
*shProg
;
298 name
= _mesa_HashFindFreeKeyBlock(ctx
->Shared
->ShaderObjects
, 1);
300 shProg
= ctx
->Driver
.NewShaderProgram(ctx
, name
);
302 _mesa_HashInsert(ctx
->Shared
->ShaderObjects
, name
, shProg
);
304 assert(shProg
->RefCount
== 1);
311 * Named w/ "2" to indicate OpenGL 2.x vs GL_ARB_fragment_programs's
315 delete_shader_program(struct gl_context
*ctx
, GLuint name
)
318 * NOTE: deleting shaders/programs works a bit differently than
319 * texture objects (and buffer objects, etc). Shader/program
320 * handles/IDs exist in the hash table until the object is really
321 * deleted (refcount==0). With texture objects, the handle/ID is
322 * removed from the hash table in glDeleteTextures() while the tex
323 * object itself might linger until its refcount goes to zero.
325 struct gl_shader_program
*shProg
;
327 shProg
= _mesa_lookup_shader_program_err(ctx
, name
, "glDeleteProgram");
331 if (!shProg
->DeletePending
) {
332 shProg
->DeletePending
= GL_TRUE
;
334 /* effectively, decr shProg's refcount */
335 _mesa_reference_shader_program(ctx
, &shProg
, NULL
);
341 delete_shader(struct gl_context
*ctx
, GLuint shader
)
343 struct gl_shader
*sh
;
345 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glDeleteShader");
349 if (!sh
->DeletePending
) {
350 sh
->DeletePending
= GL_TRUE
;
352 /* effectively, decr sh's refcount */
353 _mesa_reference_shader(ctx
, &sh
, NULL
);
359 detach_shader(struct gl_context
*ctx
, GLuint program
, GLuint shader
)
361 struct gl_shader_program
*shProg
;
365 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glDetachShader");
369 n
= shProg
->NumShaders
;
371 for (i
= 0; i
< n
; i
++) {
372 if (shProg
->Shaders
[i
]->Name
== shader
) {
374 struct gl_shader
**newList
;
377 _mesa_reference_shader(ctx
, &shProg
->Shaders
[i
], NULL
);
379 /* alloc new, smaller array */
381 malloc((n
- 1) * sizeof(struct gl_shader
*));
383 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glDetachShader");
386 for (j
= 0; j
< i
; j
++) {
387 newList
[j
] = shProg
->Shaders
[j
];
390 newList
[j
++] = shProg
->Shaders
[i
];
391 free(shProg
->Shaders
);
393 shProg
->Shaders
= newList
;
394 shProg
->NumShaders
= n
- 1;
399 for (j
= 0; j
< shProg
->NumShaders
; j
++) {
400 assert(shProg
->Shaders
[j
]->Type
== GL_VERTEX_SHADER
||
401 shProg
->Shaders
[j
]->Type
== GL_FRAGMENT_SHADER
);
402 assert(shProg
->Shaders
[j
]->RefCount
> 0);
414 if (is_shader(ctx
, shader
))
415 err
= GL_INVALID_OPERATION
;
416 else if (is_program(ctx
, shader
))
417 err
= GL_INVALID_OPERATION
;
419 err
= GL_INVALID_VALUE
;
420 _mesa_error(ctx
, err
, "glDetachProgram(shader)");
427 * Return list of shaders attached to shader program.
430 get_attached_shaders(struct gl_context
*ctx
, GLuint program
, GLsizei maxCount
,
431 GLsizei
*count
, GLuint
*obj
)
433 struct gl_shader_program
*shProg
=
434 _mesa_lookup_shader_program_err(ctx
, program
, "glGetAttachedShaders");
437 for (i
= 0; i
< (GLuint
) maxCount
&& i
< shProg
->NumShaders
; i
++) {
438 obj
[i
] = shProg
->Shaders
[i
]->Name
;
447 * glGetHandleARB() - return ID/name of currently bound shader program.
450 get_handle(struct gl_context
*ctx
, GLenum pname
)
452 if (pname
== GL_PROGRAM_OBJECT_ARB
) {
453 if (ctx
->Shader
.ActiveProgram
)
454 return ctx
->Shader
.ActiveProgram
->Name
;
459 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetHandleARB");
466 * glGetProgramiv() - get shader program state.
467 * Note that this is for GLSL shader programs, not ARB vertex/fragment
468 * programs (see glGetProgramivARB).
471 get_programiv(struct gl_context
*ctx
, GLuint program
, GLenum pname
, GLint
*params
)
473 struct gl_shader_program
*shProg
474 = _mesa_lookup_shader_program(ctx
, program
);
476 #if FEATURE_EXT_transform_feedback
477 /* Is transform feedback available in this context?
480 (ctx
->API
== API_OPENGL
&& ctx
->Extensions
.EXT_transform_feedback
)
481 || ctx
->API
== API_OPENGL_CORE
482 || _mesa_is_gles3(ctx
);
485 #if FEATURE_ARB_geometry_shader4
486 /* Are geometry shaders available in this context?
489 _mesa_is_desktop_gl(ctx
) && ctx
->Extensions
.ARB_geometry_shader4
;
492 /* Are uniform buffer objects available in this context?
495 (ctx
->API
== API_OPENGL
&& ctx
->Extensions
.ARB_uniform_buffer_object
)
496 || ctx
->API
== API_OPENGL_CORE
497 || _mesa_is_gles3(ctx
);
500 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramiv(program)");
505 case GL_DELETE_STATUS
:
506 *params
= shProg
->DeletePending
;
509 *params
= shProg
->LinkStatus
;
511 case GL_VALIDATE_STATUS
:
512 *params
= shProg
->Validated
;
514 case GL_INFO_LOG_LENGTH
:
515 *params
= shProg
->InfoLog
? strlen(shProg
->InfoLog
) + 1 : 0;
517 case GL_ATTACHED_SHADERS
:
518 *params
= shProg
->NumShaders
;
520 case GL_ACTIVE_ATTRIBUTES
:
521 *params
= _mesa_count_active_attribs(shProg
);
523 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH
:
524 *params
= _mesa_longest_attribute_name_length(shProg
);
526 case GL_ACTIVE_UNIFORMS
:
527 *params
= shProg
->NumUserUniformStorage
;
529 case GL_ACTIVE_UNIFORM_MAX_LENGTH
: {
533 for (i
= 0; i
< shProg
->NumUserUniformStorage
; i
++) {
534 /* Add one for the terminating NUL character.
536 const GLint len
= strlen(shProg
->UniformStorage
[i
].name
) + 1;
545 #if FEATURE_EXT_transform_feedback
546 case GL_TRANSFORM_FEEDBACK_VARYINGS
:
549 *params
= shProg
->TransformFeedback
.NumVarying
;
551 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH
:
554 *params
= longest_feedback_varying_name(shProg
) + 1;
556 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE
:
559 *params
= shProg
->TransformFeedback
.BufferMode
;
562 #if FEATURE_ARB_geometry_shader4
563 case GL_GEOMETRY_VERTICES_OUT_ARB
:
566 *params
= shProg
->Geom
.VerticesOut
;
568 case GL_GEOMETRY_INPUT_TYPE_ARB
:
571 *params
= shProg
->Geom
.InputType
;
573 case GL_GEOMETRY_OUTPUT_TYPE_ARB
:
576 *params
= shProg
->Geom
.OutputType
;
579 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH
: {
586 for (i
= 0; i
< shProg
->NumUniformBlocks
; i
++) {
587 /* Add one for the terminating NUL character.
589 const GLint len
= strlen(shProg
->UniformBlocks
[i
].Name
) + 1;
598 case GL_ACTIVE_UNIFORM_BLOCKS
:
602 *params
= shProg
->NumUniformBlocks
;
608 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramiv(pname=%s)",
609 _mesa_lookup_enum_by_nr(pname
));
614 * glGetShaderiv() - get GLSL shader state
617 get_shaderiv(struct gl_context
*ctx
, GLuint name
, GLenum pname
, GLint
*params
)
619 struct gl_shader
*shader
=
620 _mesa_lookup_shader_err(ctx
, name
, "glGetShaderiv");
628 *params
= shader
->Type
;
630 case GL_DELETE_STATUS
:
631 *params
= shader
->DeletePending
;
633 case GL_COMPILE_STATUS
:
634 *params
= shader
->CompileStatus
;
636 case GL_INFO_LOG_LENGTH
:
637 *params
= shader
->InfoLog
? strlen(shader
->InfoLog
) + 1 : 0;
639 case GL_SHADER_SOURCE_LENGTH
:
640 *params
= shader
->Source
? strlen((char *) shader
->Source
) + 1 : 0;
643 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetShaderiv(pname)");
650 get_program_info_log(struct gl_context
*ctx
, GLuint program
, GLsizei bufSize
,
651 GLsizei
*length
, GLchar
*infoLog
)
653 struct gl_shader_program
*shProg
654 = _mesa_lookup_shader_program(ctx
, program
);
656 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramInfoLog(program)");
659 _mesa_copy_string(infoLog
, bufSize
, length
, shProg
->InfoLog
);
664 get_shader_info_log(struct gl_context
*ctx
, GLuint shader
, GLsizei bufSize
,
665 GLsizei
*length
, GLchar
*infoLog
)
667 struct gl_shader
*sh
= _mesa_lookup_shader(ctx
, shader
);
669 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetShaderInfoLog(shader)");
672 _mesa_copy_string(infoLog
, bufSize
, length
, sh
->InfoLog
);
677 * Return shader source code.
680 get_shader_source(struct gl_context
*ctx
, GLuint shader
, GLsizei maxLength
,
681 GLsizei
*length
, GLchar
*sourceOut
)
683 struct gl_shader
*sh
;
684 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glGetShaderSource");
688 _mesa_copy_string(sourceOut
, maxLength
, length
, sh
->Source
);
693 * Set/replace shader source code. A helper function used by
694 * glShaderSource[ARB] and glCreateShaderProgramEXT.
697 shader_source(struct gl_context
*ctx
, GLuint shader
, const GLchar
*source
)
699 struct gl_shader
*sh
;
701 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glShaderSource");
705 /* free old shader source string and install new one */
706 free((void *)sh
->Source
);
708 sh
->CompileStatus
= GL_FALSE
;
710 sh
->SourceChecksum
= _mesa_str_checksum(sh
->Source
);
719 compile_shader(struct gl_context
*ctx
, GLuint shaderObj
)
721 struct gl_shader
*sh
;
722 struct gl_shader_compiler_options
*options
;
724 sh
= _mesa_lookup_shader_err(ctx
, shaderObj
, "glCompileShader");
728 options
= &ctx
->ShaderCompilerOptions
[_mesa_shader_type_to_index(sh
->Type
)];
730 /* set default pragma state for shader */
731 sh
->Pragmas
= options
->DefaultPragmas
;
733 /* this call will set the sh->CompileStatus field to indicate if
734 * compilation was successful.
736 _mesa_glsl_compile_shader(ctx
, sh
);
738 if (sh
->CompileStatus
== GL_FALSE
&&
739 (ctx
->Shader
.Flags
& GLSL_REPORT_ERRORS
)) {
740 _mesa_debug(ctx
, "Error compiling shader %u:\n%s\n",
741 sh
->Name
, sh
->InfoLog
);
747 * Link a program's shaders.
750 link_program(struct gl_context
*ctx
, GLuint program
)
752 struct gl_shader_program
*shProg
;
753 struct gl_transform_feedback_object
*obj
=
754 ctx
->TransformFeedback
.CurrentObject
;
756 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glLinkProgram");
761 && (shProg
== ctx
->Shader
.CurrentVertexProgram
762 || shProg
== ctx
->Shader
.CurrentGeometryProgram
763 || shProg
== ctx
->Shader
.CurrentFragmentProgram
)) {
764 _mesa_error(ctx
, GL_INVALID_OPERATION
,
765 "glLinkProgram(transform feedback active)");
769 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
771 _mesa_glsl_link_shader(ctx
, shProg
);
773 if (shProg
->LinkStatus
== GL_FALSE
&&
774 (ctx
->Shader
.Flags
& GLSL_REPORT_ERRORS
)) {
775 _mesa_debug(ctx
, "Error linking program %u:\n%s\n",
776 shProg
->Name
, shProg
->InfoLog
);
783 printf("Link %u shaders in program %u: %s\n",
784 shProg
->NumShaders
, shProg
->Name
,
785 shProg
->LinkStatus
? "Success" : "Failed");
787 for (i
= 0; i
< shProg
->NumShaders
; i
++) {
788 printf(" shader %u, type 0x%x\n",
789 shProg
->Shaders
[i
]->Name
,
790 shProg
->Shaders
[i
]->Type
);
797 * Print basic shader info (for debug).
800 print_shader_info(const struct gl_shader_program
*shProg
)
804 printf("Mesa: glUseProgram(%u)\n", shProg
->Name
);
805 for (i
= 0; i
< shProg
->NumShaders
; i
++) {
807 switch (shProg
->Shaders
[i
]->Type
) {
808 case GL_VERTEX_SHADER
:
811 case GL_FRAGMENT_SHADER
:
814 case GL_GEOMETRY_SHADER
:
820 printf(" %s shader %u, checksum %u\n", s
,
821 shProg
->Shaders
[i
]->Name
,
822 shProg
->Shaders
[i
]->SourceChecksum
);
824 if (shProg
->_LinkedShaders
[MESA_SHADER_VERTEX
])
825 printf(" vert prog %u\n",
826 shProg
->_LinkedShaders
[MESA_SHADER_VERTEX
]->Program
->Id
);
827 if (shProg
->_LinkedShaders
[MESA_SHADER_FRAGMENT
])
828 printf(" frag prog %u\n",
829 shProg
->_LinkedShaders
[MESA_SHADER_FRAGMENT
]->Program
->Id
);
830 if (shProg
->_LinkedShaders
[MESA_SHADER_GEOMETRY
])
831 printf(" geom prog %u\n",
832 shProg
->_LinkedShaders
[MESA_SHADER_GEOMETRY
]->Program
->Id
);
837 * Use the named shader program for subsequent glUniform calls
840 _mesa_active_program(struct gl_context
*ctx
, struct gl_shader_program
*shProg
,
843 if ((shProg
!= NULL
) && !shProg
->LinkStatus
) {
844 _mesa_error(ctx
, GL_INVALID_OPERATION
,
845 "%s(program %u not linked)", caller
, shProg
->Name
);
849 if (ctx
->Shader
.ActiveProgram
!= shProg
) {
850 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.ActiveProgram
, shProg
);
857 use_shader_program(struct gl_context
*ctx
, GLenum type
,
858 struct gl_shader_program
*shProg
)
860 struct gl_shader_program
**target
;
863 #if FEATURE_ARB_vertex_shader
864 case GL_VERTEX_SHADER
:
865 target
= &ctx
->Shader
.CurrentVertexProgram
;
867 || (shProg
->_LinkedShaders
[MESA_SHADER_VERTEX
] == NULL
)) {
872 #if FEATURE_ARB_geometry_shader4
873 case GL_GEOMETRY_SHADER_ARB
:
874 target
= &ctx
->Shader
.CurrentGeometryProgram
;
876 || (shProg
->_LinkedShaders
[MESA_SHADER_GEOMETRY
] == NULL
)) {
881 #if FEATURE_ARB_fragment_shader
882 case GL_FRAGMENT_SHADER
:
883 target
= &ctx
->Shader
.CurrentFragmentProgram
;
885 || (shProg
->_LinkedShaders
[MESA_SHADER_FRAGMENT
] == NULL
)) {
894 if (*target
!= shProg
) {
895 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
| _NEW_PROGRAM_CONSTANTS
);
897 /* If the shader is also bound as the current rendering shader, unbind
898 * it from that binding point as well. This ensures that the correct
899 * semantics of glDeleteProgram are maintained.
902 #if FEATURE_ARB_vertex_shader
903 case GL_VERTEX_SHADER
:
907 #if FEATURE_ARB_geometry_shader4
908 case GL_GEOMETRY_SHADER_ARB
:
912 #if FEATURE_ARB_fragment_shader
913 case GL_FRAGMENT_SHADER
:
914 if (*target
== ctx
->Shader
._CurrentFragmentProgram
) {
915 _mesa_reference_shader_program(ctx
,
916 &ctx
->Shader
._CurrentFragmentProgram
,
923 _mesa_reference_shader_program(ctx
, target
, shProg
);
931 * Use the named shader program for subsequent rendering.
934 _mesa_use_program(struct gl_context
*ctx
, struct gl_shader_program
*shProg
)
936 use_shader_program(ctx
, GL_VERTEX_SHADER
, shProg
);
937 use_shader_program(ctx
, GL_GEOMETRY_SHADER_ARB
, shProg
);
938 use_shader_program(ctx
, GL_FRAGMENT_SHADER
, shProg
);
939 _mesa_active_program(ctx
, shProg
, "glUseProgram");
941 if (ctx
->Driver
.UseProgram
)
942 ctx
->Driver
.UseProgram(ctx
, shProg
);
947 * Do validation of the given shader program.
948 * \param errMsg returns error message if validation fails.
949 * \return GL_TRUE if valid, GL_FALSE if invalid (and set errMsg)
952 validate_shader_program(const struct gl_shader_program
*shProg
,
955 if (!shProg
->LinkStatus
) {
959 /* From the GL spec, a program is invalid if any of these are true:
961 any two active samplers in the current program object are of
962 different types, but refer to the same texture image unit,
964 any active sampler in the current program object refers to a texture
965 image unit where fixed-function fragment processing accesses a
966 texture target that does not match the sampler type, or
968 the sum of the number of active samplers in the program and the
969 number of texture image units enabled for fixed-function fragment
970 processing exceeds the combined limit on the total number of texture
976 * Check: any two active samplers in the current program object are of
977 * different types, but refer to the same texture image unit,
979 if (!_mesa_sampler_uniforms_are_valid(shProg
, errMsg
, 100))
987 * Called via glValidateProgram()
990 validate_program(struct gl_context
*ctx
, GLuint program
)
992 struct gl_shader_program
*shProg
;
993 char errMsg
[100] = "";
995 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glValidateProgram");
1000 shProg
->Validated
= validate_shader_program(shProg
, errMsg
);
1001 if (!shProg
->Validated
) {
1002 /* update info log */
1003 if (shProg
->InfoLog
) {
1004 ralloc_free(shProg
->InfoLog
);
1006 shProg
->InfoLog
= ralloc_strdup(shProg
, errMsg
);
1013 _mesa_AttachObjectARB(GLhandleARB program
, GLhandleARB shader
)
1015 GET_CURRENT_CONTEXT(ctx
);
1016 attach_shader(ctx
, program
, shader
);
1021 _mesa_AttachShader(GLuint program
, GLuint shader
)
1023 GET_CURRENT_CONTEXT(ctx
);
1024 attach_shader(ctx
, program
, shader
);
1029 _mesa_CompileShaderARB(GLhandleARB shaderObj
)
1031 GET_CURRENT_CONTEXT(ctx
);
1032 if (MESA_VERBOSE
& VERBOSE_API
)
1033 _mesa_debug(ctx
, "glCompileShader %u\n", shaderObj
);
1034 compile_shader(ctx
, shaderObj
);
1039 _mesa_CreateShader(GLenum type
)
1041 GET_CURRENT_CONTEXT(ctx
);
1042 if (MESA_VERBOSE
& VERBOSE_API
)
1043 _mesa_debug(ctx
, "glCreateShader %s\n", _mesa_lookup_enum_by_nr(type
));
1044 return create_shader(ctx
, type
);
1048 GLhandleARB GLAPIENTRY
1049 _mesa_CreateShaderObjectARB(GLenum type
)
1051 GET_CURRENT_CONTEXT(ctx
);
1052 return create_shader(ctx
, type
);
1057 _mesa_CreateProgram(void)
1059 GET_CURRENT_CONTEXT(ctx
);
1060 if (MESA_VERBOSE
& VERBOSE_API
)
1061 _mesa_debug(ctx
, "glCreateProgram\n");
1062 return create_shader_program(ctx
);
1066 GLhandleARB GLAPIENTRY
1067 _mesa_CreateProgramObjectARB(void)
1069 GET_CURRENT_CONTEXT(ctx
);
1070 return create_shader_program(ctx
);
1075 _mesa_DeleteObjectARB(GLhandleARB obj
)
1077 if (MESA_VERBOSE
& VERBOSE_API
) {
1078 GET_CURRENT_CONTEXT(ctx
);
1079 _mesa_debug(ctx
, "glDeleteObjectARB(%u)\n", obj
);
1083 GET_CURRENT_CONTEXT(ctx
);
1084 FLUSH_VERTICES(ctx
, 0);
1085 if (is_program(ctx
, obj
)) {
1086 delete_shader_program(ctx
, obj
);
1088 else if (is_shader(ctx
, obj
)) {
1089 delete_shader(ctx
, obj
);
1099 _mesa_DeleteProgram(GLuint name
)
1102 GET_CURRENT_CONTEXT(ctx
);
1103 FLUSH_VERTICES(ctx
, 0);
1104 delete_shader_program(ctx
, name
);
1110 _mesa_DeleteShader(GLuint name
)
1113 GET_CURRENT_CONTEXT(ctx
);
1114 FLUSH_VERTICES(ctx
, 0);
1115 delete_shader(ctx
, name
);
1121 _mesa_DetachObjectARB(GLhandleARB program
, GLhandleARB shader
)
1123 GET_CURRENT_CONTEXT(ctx
);
1124 detach_shader(ctx
, program
, shader
);
1129 _mesa_DetachShader(GLuint program
, GLuint shader
)
1131 GET_CURRENT_CONTEXT(ctx
);
1132 detach_shader(ctx
, program
, shader
);
1137 _mesa_GetAttachedObjectsARB(GLhandleARB container
, GLsizei maxCount
,
1138 GLsizei
* count
, GLhandleARB
* obj
)
1140 GET_CURRENT_CONTEXT(ctx
);
1141 get_attached_shaders(ctx
, container
, maxCount
, count
, obj
);
1146 _mesa_GetAttachedShaders(GLuint program
, GLsizei maxCount
,
1147 GLsizei
*count
, GLuint
*obj
)
1149 GET_CURRENT_CONTEXT(ctx
);
1150 get_attached_shaders(ctx
, program
, maxCount
, count
, obj
);
1155 _mesa_GetInfoLogARB(GLhandleARB object
, GLsizei maxLength
, GLsizei
* length
,
1156 GLcharARB
* infoLog
)
1158 GET_CURRENT_CONTEXT(ctx
);
1159 if (is_program(ctx
, object
)) {
1160 get_program_info_log(ctx
, object
, maxLength
, length
, infoLog
);
1162 else if (is_shader(ctx
, object
)) {
1163 get_shader_info_log(ctx
, object
, maxLength
, length
, infoLog
);
1166 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetInfoLogARB");
1172 _mesa_GetObjectParameterivARB(GLhandleARB object
, GLenum pname
, GLint
*params
)
1174 GET_CURRENT_CONTEXT(ctx
);
1175 /* Implement in terms of GetProgramiv, GetShaderiv */
1176 if (is_program(ctx
, object
)) {
1177 if (pname
== GL_OBJECT_TYPE_ARB
) {
1178 *params
= GL_PROGRAM_OBJECT_ARB
;
1181 get_programiv(ctx
, object
, pname
, params
);
1184 else if (is_shader(ctx
, object
)) {
1185 if (pname
== GL_OBJECT_TYPE_ARB
) {
1186 *params
= GL_SHADER_OBJECT_ARB
;
1189 get_shaderiv(ctx
, object
, pname
, params
);
1193 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetObjectParameterivARB");
1199 _mesa_GetObjectParameterfvARB(GLhandleARB object
, GLenum pname
,
1202 GLint iparams
[1]; /* XXX is one element enough? */
1203 _mesa_GetObjectParameterivARB(object
, pname
, iparams
);
1204 params
[0] = (GLfloat
) iparams
[0];
1209 _mesa_GetProgramiv(GLuint program
, GLenum pname
, GLint
*params
)
1211 GET_CURRENT_CONTEXT(ctx
);
1212 get_programiv(ctx
, program
, pname
, params
);
1217 _mesa_GetShaderiv(GLuint shader
, GLenum pname
, GLint
*params
)
1219 GET_CURRENT_CONTEXT(ctx
);
1220 get_shaderiv(ctx
, shader
, pname
, params
);
1225 _mesa_GetProgramInfoLog(GLuint program
, GLsizei bufSize
,
1226 GLsizei
*length
, GLchar
*infoLog
)
1228 GET_CURRENT_CONTEXT(ctx
);
1229 get_program_info_log(ctx
, program
, bufSize
, length
, infoLog
);
1234 _mesa_GetShaderInfoLog(GLuint shader
, GLsizei bufSize
,
1235 GLsizei
*length
, GLchar
*infoLog
)
1237 GET_CURRENT_CONTEXT(ctx
);
1238 get_shader_info_log(ctx
, shader
, bufSize
, length
, infoLog
);
1243 _mesa_GetShaderSourceARB(GLhandleARB shader
, GLsizei maxLength
,
1244 GLsizei
*length
, GLcharARB
*sourceOut
)
1246 GET_CURRENT_CONTEXT(ctx
);
1247 get_shader_source(ctx
, shader
, maxLength
, length
, sourceOut
);
1251 GLhandleARB GLAPIENTRY
1252 _mesa_GetHandleARB(GLenum pname
)
1254 GET_CURRENT_CONTEXT(ctx
);
1255 return get_handle(ctx
, pname
);
1259 GLboolean GLAPIENTRY
1260 _mesa_IsProgram(GLuint name
)
1262 GET_CURRENT_CONTEXT(ctx
);
1263 return is_program(ctx
, name
);
1267 GLboolean GLAPIENTRY
1268 _mesa_IsShader(GLuint name
)
1270 GET_CURRENT_CONTEXT(ctx
);
1271 return is_shader(ctx
, name
);
1276 _mesa_LinkProgramARB(GLhandleARB programObj
)
1278 GET_CURRENT_CONTEXT(ctx
);
1279 link_program(ctx
, programObj
);
1285 * Read shader source code from a file.
1286 * Useful for debugging to override an app's shader.
1289 read_shader(const char *fname
)
1291 const int max
= 50*1000;
1292 FILE *f
= fopen(fname
, "r");
1293 GLcharARB
*buffer
, *shader
;
1300 buffer
= malloc(max
);
1301 len
= fread(buffer
, 1, max
, f
);
1306 shader
= _mesa_strdup(buffer
);
1314 * Called via glShaderSource() and glShaderSourceARB() API functions.
1315 * Basically, concatenate the source code strings into one long string
1316 * and pass it to _mesa_shader_source().
1319 _mesa_ShaderSourceARB(GLhandleARB shaderObj
, GLsizei count
,
1320 const GLcharARB
** string
, const GLint
* length
)
1322 GET_CURRENT_CONTEXT(ctx
);
1324 GLsizei i
, totalLength
;
1328 if (!shaderObj
|| string
== NULL
) {
1329 _mesa_error(ctx
, GL_INVALID_VALUE
, "glShaderSourceARB");
1334 * This array holds offsets of where the appropriate string ends, thus the
1335 * last element will be set to the total length of the source code.
1337 offsets
= malloc(count
* sizeof(GLint
));
1338 if (offsets
== NULL
) {
1339 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glShaderSourceARB");
1343 for (i
= 0; i
< count
; i
++) {
1344 if (string
[i
] == NULL
) {
1345 free((GLvoid
*) offsets
);
1346 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1347 "glShaderSourceARB(null string)");
1350 if (length
== NULL
|| length
[i
] < 0)
1351 offsets
[i
] = strlen(string
[i
]);
1353 offsets
[i
] = length
[i
];
1354 /* accumulate string lengths */
1356 offsets
[i
] += offsets
[i
- 1];
1359 /* Total length of source string is sum off all strings plus two.
1360 * One extra byte for terminating zero, another extra byte to silence
1361 * valgrind warnings in the parser/grammer code.
1363 totalLength
= offsets
[count
- 1] + 2;
1364 source
= malloc(totalLength
* sizeof(GLcharARB
));
1365 if (source
== NULL
) {
1366 free((GLvoid
*) offsets
);
1367 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glShaderSourceARB");
1371 for (i
= 0; i
< count
; i
++) {
1372 GLint start
= (i
> 0) ? offsets
[i
- 1] : 0;
1373 memcpy(source
+ start
, string
[i
],
1374 (offsets
[i
] - start
) * sizeof(GLcharARB
));
1376 source
[totalLength
- 1] = '\0';
1377 source
[totalLength
- 2] = '\0';
1380 /* Compute the shader's source code checksum then try to open a file
1381 * named newshader_<CHECKSUM>. If it exists, use it in place of the
1382 * original shader source code. For debugging.
1385 GLcharARB
*newSource
;
1387 checksum
= _mesa_str_checksum(source
);
1389 _mesa_snprintf(filename
, sizeof(filename
), "newshader_%d", checksum
);
1391 newSource
= read_shader(filename
);
1393 fprintf(stderr
, "Mesa: Replacing shader %u chksum=%d with %s\n",
1394 shaderObj
, checksum
, filename
);
1400 shader_source(ctx
, shaderObj
, source
);
1403 struct gl_shader
*sh
= _mesa_lookup_shader(ctx
, shaderObj
);
1405 sh
->SourceChecksum
= checksum
; /* save original checksum */
1413 _mesa_UseProgramObjectARB(GLhandleARB program
)
1415 GET_CURRENT_CONTEXT(ctx
);
1416 struct gl_shader_program
*shProg
;
1417 struct gl_transform_feedback_object
*obj
=
1418 ctx
->TransformFeedback
.CurrentObject
;
1420 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1422 if (obj
->Active
&& !obj
->Paused
) {
1423 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1424 "glUseProgram(transform feedback active)");
1429 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glUseProgram");
1433 if (!shProg
->LinkStatus
) {
1434 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1435 "glUseProgram(program %u not linked)", program
);
1440 if (ctx
->Shader
.Flags
& GLSL_USE_PROG
) {
1441 print_shader_info(shProg
);
1448 _mesa_use_program(ctx
, shProg
);
1453 _mesa_ValidateProgramARB(GLhandleARB program
)
1455 GET_CURRENT_CONTEXT(ctx
);
1456 validate_program(ctx
, program
);
1462 _mesa_GetShaderPrecisionFormat(GLenum shadertype
, GLenum precisiontype
,
1463 GLint
* range
, GLint
* precision
)
1465 const struct gl_program_constants
*limits
;
1466 const struct gl_precision
*p
;
1467 GET_CURRENT_CONTEXT(ctx
);
1469 switch (shadertype
) {
1470 case GL_VERTEX_SHADER
:
1471 limits
= &ctx
->Const
.VertexProgram
;
1473 case GL_FRAGMENT_SHADER
:
1474 limits
= &ctx
->Const
.FragmentProgram
;
1477 _mesa_error(ctx
, GL_INVALID_ENUM
,
1478 "glGetShaderPrecisionFormat(shadertype)");
1482 switch (precisiontype
) {
1484 p
= &limits
->LowFloat
;
1486 case GL_MEDIUM_FLOAT
:
1487 p
= &limits
->MediumFloat
;
1490 p
= &limits
->HighFloat
;
1493 p
= &limits
->LowInt
;
1496 p
= &limits
->MediumInt
;
1499 p
= &limits
->HighInt
;
1502 _mesa_error(ctx
, GL_INVALID_ENUM
,
1503 "glGetShaderPrecisionFormat(precisiontype)");
1507 range
[0] = p
->RangeMin
;
1508 range
[1] = p
->RangeMax
;
1509 precision
[0] = p
->Precision
;
1514 _mesa_ReleaseShaderCompiler(void)
1516 _mesa_destroy_shader_compiler_caches();
1521 _mesa_ShaderBinary(GLint n
, const GLuint
* shaders
, GLenum binaryformat
,
1522 const void* binary
, GLint length
)
1524 GET_CURRENT_CONTEXT(ctx
);
1527 (void) binaryformat
;
1530 _mesa_error(ctx
, GL_INVALID_OPERATION
, __FUNCTION__
);
1533 #endif /* FEATURE_ES2 */
1536 #if FEATURE_ARB_geometry_shader4
1539 _mesa_ProgramParameteriARB(GLuint program
, GLenum pname
, GLint value
)
1541 struct gl_shader_program
*shProg
;
1542 GET_CURRENT_CONTEXT(ctx
);
1544 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1546 shProg
= _mesa_lookup_shader_program_err(ctx
, program
,
1547 "glProgramParameteri");
1552 case GL_GEOMETRY_VERTICES_OUT_ARB
:
1554 (unsigned) value
> ctx
->Const
.MaxGeometryOutputVertices
) {
1555 _mesa_error(ctx
, GL_INVALID_VALUE
,
1556 "glProgramParameteri(GL_GEOMETRY_VERTICES_OUT_ARB=%d",
1560 shProg
->Geom
.VerticesOut
= value
;
1562 case GL_GEOMETRY_INPUT_TYPE_ARB
:
1566 case GL_LINES_ADJACENCY_ARB
:
1568 case GL_TRIANGLES_ADJACENCY_ARB
:
1569 shProg
->Geom
.InputType
= value
;
1572 _mesa_error(ctx
, GL_INVALID_VALUE
,
1573 "glProgramParameteri(geometry input type = %s",
1574 _mesa_lookup_enum_by_nr(value
));
1578 case GL_GEOMETRY_OUTPUT_TYPE_ARB
:
1582 case GL_TRIANGLE_STRIP
:
1583 shProg
->Geom
.OutputType
= value
;
1586 _mesa_error(ctx
, GL_INVALID_VALUE
,
1587 "glProgramParameteri(geometry output type = %s",
1588 _mesa_lookup_enum_by_nr(value
));
1593 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramParameteriARB(pname=%s)",
1594 _mesa_lookup_enum_by_nr(pname
));
1602 _mesa_use_shader_program(struct gl_context
*ctx
, GLenum type
,
1603 struct gl_shader_program
*shProg
)
1605 use_shader_program(ctx
, type
, shProg
);
1607 if (ctx
->Driver
.UseProgram
)
1608 ctx
->Driver
.UseProgram(ctx
, shProg
);
1613 * For GL_EXT_separate_shader_objects
1616 _mesa_UseShaderProgramEXT(GLenum type
, GLuint program
)
1618 GET_CURRENT_CONTEXT(ctx
);
1619 struct gl_shader_program
*shProg
= NULL
;
1621 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1623 if (!validate_shader_target(ctx
, type
)) {
1624 _mesa_error(ctx
, GL_INVALID_ENUM
, "glUseShaderProgramEXT(type)");
1628 if (ctx
->TransformFeedback
.CurrentObject
->Active
&&
1629 !ctx
->TransformFeedback
.CurrentObject
->Paused
) {
1630 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1631 "glUseShaderProgramEXT(transform feedback is active)");
1636 shProg
= _mesa_lookup_shader_program_err(ctx
, program
,
1637 "glUseShaderProgramEXT");
1641 if (!shProg
->LinkStatus
) {
1642 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1643 "glUseShaderProgramEXT(program not linked)");
1648 _mesa_use_shader_program(ctx
, type
, shProg
);
1653 * For GL_EXT_separate_shader_objects
1656 _mesa_ActiveProgramEXT(GLuint program
)
1658 GET_CURRENT_CONTEXT(ctx
);
1659 struct gl_shader_program
*shProg
= (program
!= 0)
1660 ? _mesa_lookup_shader_program_err(ctx
, program
, "glActiveProgramEXT")
1663 _mesa_active_program(ctx
, shProg
, "glActiveProgramEXT");
1669 * For GL_EXT_separate_shader_objects
1672 _mesa_CreateShaderProgramEXT(GLenum type
, const GLchar
*string
)
1674 GET_CURRENT_CONTEXT(ctx
);
1675 const GLuint shader
= create_shader(ctx
, type
);
1679 shader_source(ctx
, shader
, _mesa_strdup(string
));
1680 compile_shader(ctx
, shader
);
1682 program
= create_shader_program(ctx
);
1684 struct gl_shader_program
*shProg
;
1685 struct gl_shader
*sh
;
1686 GLint compiled
= GL_FALSE
;
1688 shProg
= _mesa_lookup_shader_program(ctx
, program
);
1689 sh
= _mesa_lookup_shader(ctx
, shader
);
1691 get_shaderiv(ctx
, shader
, GL_COMPILE_STATUS
, &compiled
);
1693 attach_shader(ctx
, program
, shader
);
1694 link_program(ctx
, program
);
1695 detach_shader(ctx
, program
, shader
);
1699 if (active
-user
-defined
-varyings
-in
-linked
-program
) {
1700 append
-error
-to
-info
-log
;
1701 shProg
->LinkStatus
= GL_FALSE
;
1706 ralloc_strcat(&shProg
->InfoLog
, sh
->InfoLog
);
1709 delete_shader(ctx
, shader
);
1716 * Plug in shader-related functions into API dispatch table.
1719 _mesa_init_shader_dispatch(struct _glapi_table
*exec
)
1722 /* GL_ARB_vertex/fragment_shader */
1723 SET_DeleteObjectARB(exec
, _mesa_DeleteObjectARB
);
1724 SET_GetHandleARB(exec
, _mesa_GetHandleARB
);
1725 SET_DetachObjectARB(exec
, _mesa_DetachObjectARB
);
1726 SET_CreateShaderObjectARB(exec
, _mesa_CreateShaderObjectARB
);
1727 SET_ShaderSourceARB(exec
, _mesa_ShaderSourceARB
);
1728 SET_CompileShaderARB(exec
, _mesa_CompileShaderARB
);
1729 SET_CreateProgramObjectARB(exec
, _mesa_CreateProgramObjectARB
);
1730 SET_AttachObjectARB(exec
, _mesa_AttachObjectARB
);
1731 SET_LinkProgramARB(exec
, _mesa_LinkProgramARB
);
1732 SET_UseProgramObjectARB(exec
, _mesa_UseProgramObjectARB
);
1733 SET_ValidateProgramARB(exec
, _mesa_ValidateProgramARB
);
1734 SET_GetObjectParameterfvARB(exec
, _mesa_GetObjectParameterfvARB
);
1735 SET_GetObjectParameterivARB(exec
, _mesa_GetObjectParameterivARB
);
1736 SET_GetInfoLogARB(exec
, _mesa_GetInfoLogARB
);
1737 SET_GetAttachedObjectsARB(exec
, _mesa_GetAttachedObjectsARB
);
1738 SET_GetShaderSourceARB(exec
, _mesa_GetShaderSourceARB
);
1741 SET_AttachShader(exec
, _mesa_AttachShader
);
1742 SET_CreateProgram(exec
, _mesa_CreateProgram
);
1743 SET_CreateShader(exec
, _mesa_CreateShader
);
1744 SET_DeleteProgram(exec
, _mesa_DeleteProgram
);
1745 SET_DeleteShader(exec
, _mesa_DeleteShader
);
1746 SET_DetachShader(exec
, _mesa_DetachShader
);
1747 SET_GetAttachedShaders(exec
, _mesa_GetAttachedShaders
);
1748 SET_GetProgramiv(exec
, _mesa_GetProgramiv
);
1749 SET_GetProgramInfoLog(exec
, _mesa_GetProgramInfoLog
);
1750 SET_GetShaderiv(exec
, _mesa_GetShaderiv
);
1751 SET_GetShaderInfoLog(exec
, _mesa_GetShaderInfoLog
);
1752 SET_IsProgram(exec
, _mesa_IsProgram
);
1753 SET_IsShader(exec
, _mesa_IsShader
);
1755 #if FEATURE_ARB_vertex_shader
1756 SET_BindAttribLocationARB(exec
, _mesa_BindAttribLocationARB
);
1757 SET_GetActiveAttribARB(exec
, _mesa_GetActiveAttribARB
);
1758 SET_GetAttribLocationARB(exec
, _mesa_GetAttribLocationARB
);
1761 #if FEATURE_ARB_geometry_shader4
1762 SET_ProgramParameteriARB(exec
, _mesa_ProgramParameteriARB
);
1765 SET_UseShaderProgramEXT(exec
, _mesa_UseShaderProgramEXT
);
1766 SET_ActiveProgramEXT(exec
, _mesa_ActiveProgramEXT
);
1767 SET_CreateShaderProgramEXT(exec
, _mesa_CreateShaderProgramEXT
);
1769 /* GL_EXT_gpu_shader4 / GL 3.0 */
1770 SET_BindFragDataLocationEXT(exec
, _mesa_BindFragDataLocation
);
1771 SET_GetFragDataLocationEXT(exec
, _mesa_GetFragDataLocation
);
1773 /* GL_ARB_ES2_compatibility */
1774 SET_ReleaseShaderCompiler(exec
, _mesa_ReleaseShaderCompiler
);
1775 SET_GetShaderPrecisionFormat(exec
, _mesa_GetShaderPrecisionFormat
);
1777 /* GL_ARB_blend_func_extended */
1778 SET_BindFragDataLocationIndexed(exec
, _mesa_BindFragDataLocationIndexed
);
1779 SET_GetFragDataIndex(exec
, _mesa_GetFragDataIndex
);
1780 #endif /* FEATURE_GL */