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"
52 #include "../glsl/glsl_parser_extras.h"
53 #include "../glsl/ir_uniform.h"
55 /** Define this to enable shader substitution (see below) */
56 #define SHADER_SUBST 0
60 * Return mask of GLSL_x flags by examining the MESA_GLSL env var.
63 get_shader_flags(void)
65 GLbitfield flags
= 0x0;
66 const char *env
= _mesa_getenv("MESA_GLSL");
69 if (strstr(env
, "dump"))
71 if (strstr(env
, "log"))
73 if (strstr(env
, "nopvert"))
74 flags
|= GLSL_NOP_VERT
;
75 if (strstr(env
, "nopfrag"))
76 flags
|= GLSL_NOP_FRAG
;
77 if (strstr(env
, "nopt"))
79 else if (strstr(env
, "opt"))
81 if (strstr(env
, "uniform"))
82 flags
|= GLSL_UNIFORMS
;
83 if (strstr(env
, "useprog"))
84 flags
|= GLSL_USE_PROG
;
92 * Initialize context's shader state.
95 _mesa_init_shader_state(struct gl_context
*ctx
)
97 /* Device drivers may override these to control what kind of instructions
98 * are generated by the GLSL compiler.
100 struct gl_shader_compiler_options options
;
103 memset(&options
, 0, sizeof(options
));
104 options
.MaxUnrollIterations
= 32;
106 /* Default pragma settings */
107 options
.DefaultPragmas
.Optimize
= GL_TRUE
;
109 for (sh
= 0; sh
< MESA_SHADER_TYPES
; ++sh
)
110 memcpy(&ctx
->ShaderCompilerOptions
[sh
], &options
, sizeof(options
));
112 ctx
->Shader
.Flags
= get_shader_flags();
117 * Free the per-context shader-related state.
120 _mesa_free_shader_state(struct gl_context
*ctx
)
122 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.CurrentVertexProgram
, NULL
);
123 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.CurrentGeometryProgram
,
125 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.CurrentFragmentProgram
,
127 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.ActiveProgram
, NULL
);
132 * Return the size of the given GLSL datatype, in floats (components).
135 _mesa_sizeof_glsl_type(GLenum type
)
140 case GL_UNSIGNED_INT
:
145 case GL_SAMPLER_CUBE
:
146 case GL_SAMPLER_1D_SHADOW
:
147 case GL_SAMPLER_2D_SHADOW
:
148 case GL_SAMPLER_2D_RECT_ARB
:
149 case GL_SAMPLER_2D_RECT_SHADOW_ARB
:
150 case GL_SAMPLER_1D_ARRAY_EXT
:
151 case GL_SAMPLER_2D_ARRAY_EXT
:
152 case GL_SAMPLER_1D_ARRAY_SHADOW_EXT
:
153 case GL_SAMPLER_2D_ARRAY_SHADOW_EXT
:
154 case GL_SAMPLER_CUBE_SHADOW_EXT
:
155 case GL_SAMPLER_EXTERNAL_OES
:
159 case GL_UNSIGNED_INT_VEC2
:
164 case GL_UNSIGNED_INT_VEC3
:
169 case GL_UNSIGNED_INT_VEC4
:
173 case GL_FLOAT_MAT2x3
:
174 case GL_FLOAT_MAT2x4
:
175 return 8; /* two float[4] vectors */
177 case GL_FLOAT_MAT3x2
:
178 case GL_FLOAT_MAT3x4
:
179 return 12; /* three float[4] vectors */
181 case GL_FLOAT_MAT4x2
:
182 case GL_FLOAT_MAT4x3
:
183 return 16; /* four float[4] vectors */
185 _mesa_problem(NULL
, "Invalid type in _mesa_sizeof_glsl_type()");
192 * Copy string from <src> to <dst>, up to maxLength characters, returning
193 * length of <dst> in <length>.
194 * \param src the strings source
195 * \param maxLength max chars to copy
196 * \param length returns number of chars copied
197 * \param dst the string destination
200 _mesa_copy_string(GLchar
*dst
, GLsizei maxLength
,
201 GLsizei
*length
, const GLchar
*src
)
204 for (len
= 0; len
< maxLength
- 1 && src
&& src
[len
]; len
++)
215 * Confirm that the a shader type is valid and supported by the implementation
217 * \param ctx Current GL context
218 * \param type Shader target
222 validate_shader_target(const struct gl_context
*ctx
, GLenum type
)
225 #if FEATURE_ARB_fragment_shader
226 case GL_FRAGMENT_SHADER
:
227 return ctx
->Extensions
.ARB_fragment_shader
;
229 #if FEATURE_ARB_vertex_shader
230 case GL_VERTEX_SHADER
:
231 return ctx
->Extensions
.ARB_vertex_shader
;
233 #if FEATURE_ARB_geometry_shader4
234 case GL_GEOMETRY_SHADER_ARB
:
235 return ctx
->Extensions
.ARB_geometry_shader4
;
244 * Find the length of the longest transform feedback varying name
245 * which was specified with glTransformFeedbackVaryings().
248 longest_feedback_varying_name(const struct gl_shader_program
*shProg
)
252 for (i
= 0; i
< shProg
->TransformFeedback
.NumVarying
; i
++) {
253 GLint len
= strlen(shProg
->TransformFeedback
.VaryingNames
[i
]);
263 is_program(struct gl_context
*ctx
, GLuint name
)
265 struct gl_shader_program
*shProg
= _mesa_lookup_shader_program(ctx
, name
);
266 return shProg
? GL_TRUE
: GL_FALSE
;
271 is_shader(struct gl_context
*ctx
, GLuint name
)
273 struct gl_shader
*shader
= _mesa_lookup_shader(ctx
, name
);
274 return shader
? GL_TRUE
: GL_FALSE
;
279 * Attach shader to a shader program.
282 attach_shader(struct gl_context
*ctx
, GLuint program
, GLuint shader
)
284 struct gl_shader_program
*shProg
;
285 struct gl_shader
*sh
;
288 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glAttachShader");
292 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glAttachShader");
297 n
= shProg
->NumShaders
;
298 for (i
= 0; i
< n
; i
++) {
299 if (shProg
->Shaders
[i
] == sh
) {
300 /* The shader is already attched to this program. The
301 * GL_ARB_shader_objects spec says:
303 * "The error INVALID_OPERATION is generated by AttachObjectARB
304 * if <obj> is already attached to <containerObj>."
306 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glAttachShader");
312 shProg
->Shaders
= (struct gl_shader
**)
313 _mesa_realloc(shProg
->Shaders
,
314 n
* sizeof(struct gl_shader
*),
315 (n
+ 1) * sizeof(struct gl_shader
*));
316 if (!shProg
->Shaders
) {
317 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glAttachShader");
322 shProg
->Shaders
[n
] = NULL
; /* since realloc() didn't zero the new space */
323 _mesa_reference_shader(ctx
, &shProg
->Shaders
[n
], sh
);
324 shProg
->NumShaders
++;
329 bind_frag_data_location(struct gl_context
*ctx
, GLuint program
,
330 GLuint colorNumber
, const GLchar
*name
)
332 _mesa_problem(ctx
, "bind_frag_data_location() not implemented yet");
337 create_shader(struct gl_context
*ctx
, GLenum type
)
339 struct gl_shader
*sh
;
342 if (!validate_shader_target(ctx
, type
)) {
343 _mesa_error(ctx
, GL_INVALID_ENUM
, "CreateShader(type)");
347 name
= _mesa_HashFindFreeKeyBlock(ctx
->Shared
->ShaderObjects
, 1);
348 sh
= ctx
->Driver
.NewShader(ctx
, name
, type
);
349 _mesa_HashInsert(ctx
->Shared
->ShaderObjects
, name
, sh
);
356 create_shader_program(struct gl_context
*ctx
)
359 struct gl_shader_program
*shProg
;
361 name
= _mesa_HashFindFreeKeyBlock(ctx
->Shared
->ShaderObjects
, 1);
363 shProg
= ctx
->Driver
.NewShaderProgram(ctx
, name
);
365 _mesa_HashInsert(ctx
->Shared
->ShaderObjects
, name
, shProg
);
367 assert(shProg
->RefCount
== 1);
374 * Named w/ "2" to indicate OpenGL 2.x vs GL_ARB_fragment_programs's
378 delete_shader_program(struct gl_context
*ctx
, GLuint name
)
381 * NOTE: deleting shaders/programs works a bit differently than
382 * texture objects (and buffer objects, etc). Shader/program
383 * handles/IDs exist in the hash table until the object is really
384 * deleted (refcount==0). With texture objects, the handle/ID is
385 * removed from the hash table in glDeleteTextures() while the tex
386 * object itself might linger until its refcount goes to zero.
388 struct gl_shader_program
*shProg
;
390 shProg
= _mesa_lookup_shader_program_err(ctx
, name
, "glDeleteProgram");
394 if (!shProg
->DeletePending
) {
395 shProg
->DeletePending
= GL_TRUE
;
397 /* effectively, decr shProg's refcount */
398 _mesa_reference_shader_program(ctx
, &shProg
, NULL
);
404 delete_shader(struct gl_context
*ctx
, GLuint shader
)
406 struct gl_shader
*sh
;
408 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glDeleteShader");
412 sh
->DeletePending
= GL_TRUE
;
414 /* effectively, decr sh's refcount */
415 _mesa_reference_shader(ctx
, &sh
, NULL
);
420 detach_shader(struct gl_context
*ctx
, GLuint program
, GLuint shader
)
422 struct gl_shader_program
*shProg
;
426 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glDetachShader");
430 n
= shProg
->NumShaders
;
432 for (i
= 0; i
< n
; i
++) {
433 if (shProg
->Shaders
[i
]->Name
== shader
) {
435 struct gl_shader
**newList
;
438 _mesa_reference_shader(ctx
, &shProg
->Shaders
[i
], NULL
);
440 /* alloc new, smaller array */
441 newList
= (struct gl_shader
**)
442 malloc((n
- 1) * sizeof(struct gl_shader
*));
444 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glDetachShader");
447 for (j
= 0; j
< i
; j
++) {
448 newList
[j
] = shProg
->Shaders
[j
];
451 newList
[j
++] = shProg
->Shaders
[i
];
452 free(shProg
->Shaders
);
454 shProg
->Shaders
= newList
;
455 shProg
->NumShaders
= n
- 1;
460 for (j
= 0; j
< shProg
->NumShaders
; j
++) {
461 assert(shProg
->Shaders
[j
]->Type
== GL_VERTEX_SHADER
||
462 shProg
->Shaders
[j
]->Type
== GL_FRAGMENT_SHADER
);
463 assert(shProg
->Shaders
[j
]->RefCount
> 0);
475 if (is_shader(ctx
, shader
))
476 err
= GL_INVALID_OPERATION
;
477 else if (is_program(ctx
, shader
))
478 err
= GL_INVALID_OPERATION
;
480 err
= GL_INVALID_VALUE
;
481 _mesa_error(ctx
, err
, "glDetachProgram(shader)");
488 * Return list of shaders attached to shader program.
491 get_attached_shaders(struct gl_context
*ctx
, GLuint program
, GLsizei maxCount
,
492 GLsizei
*count
, GLuint
*obj
)
494 struct gl_shader_program
*shProg
=
495 _mesa_lookup_shader_program_err(ctx
, program
, "glGetAttachedShaders");
498 for (i
= 0; i
< (GLuint
) maxCount
&& i
< shProg
->NumShaders
; i
++) {
499 obj
[i
] = shProg
->Shaders
[i
]->Name
;
508 get_frag_data_location(struct gl_context
*ctx
, GLuint program
,
511 _mesa_problem(ctx
, "get_frag_data_location() not implemented yet");
518 * glGetHandleARB() - return ID/name of currently bound shader program.
521 get_handle(struct gl_context
*ctx
, GLenum pname
)
523 if (pname
== GL_PROGRAM_OBJECT_ARB
) {
524 if (ctx
->Shader
.ActiveProgram
)
525 return ctx
->Shader
.ActiveProgram
->Name
;
530 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetHandleARB");
537 * glGetProgramiv() - get shader program state.
538 * Note that this is for GLSL shader programs, not ARB vertex/fragment
539 * programs (see glGetProgramivARB).
542 get_programiv(struct gl_context
*ctx
, GLuint program
, GLenum pname
, GLint
*params
)
544 struct gl_shader_program
*shProg
545 = _mesa_lookup_shader_program(ctx
, program
);
548 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramiv(program)");
553 case GL_DELETE_STATUS
:
554 *params
= shProg
->DeletePending
;
557 *params
= shProg
->LinkStatus
;
559 case GL_VALIDATE_STATUS
:
560 *params
= shProg
->Validated
;
562 case GL_INFO_LOG_LENGTH
:
563 *params
= shProg
->InfoLog
? strlen(shProg
->InfoLog
) + 1 : 0;
565 case GL_ATTACHED_SHADERS
:
566 *params
= shProg
->NumShaders
;
568 case GL_ACTIVE_ATTRIBUTES
:
569 *params
= _mesa_count_active_attribs(shProg
);
571 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH
:
572 *params
= _mesa_longest_attribute_name_length(shProg
);
574 case GL_ACTIVE_UNIFORMS
:
575 *params
= shProg
->NumUserUniformStorage
;
577 case GL_ACTIVE_UNIFORM_MAX_LENGTH
: {
581 for (i
= 0; i
< shProg
->NumUserUniformStorage
; i
++) {
582 /* Add one for the terminating NUL character.
584 const GLint len
= strlen(shProg
->UniformStorage
[i
].name
) + 1;
593 case GL_PROGRAM_BINARY_LENGTH_OES
:
596 #if FEATURE_EXT_transform_feedback
597 case GL_TRANSFORM_FEEDBACK_VARYINGS
:
598 *params
= shProg
->TransformFeedback
.NumVarying
;
600 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH
:
601 *params
= longest_feedback_varying_name(shProg
) + 1;
603 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE
:
604 *params
= shProg
->TransformFeedback
.BufferMode
;
607 #if FEATURE_ARB_geometry_shader4
608 case GL_GEOMETRY_VERTICES_OUT_ARB
:
609 *params
= shProg
->Geom
.VerticesOut
;
611 case GL_GEOMETRY_INPUT_TYPE_ARB
:
612 *params
= shProg
->Geom
.InputType
;
614 case GL_GEOMETRY_OUTPUT_TYPE_ARB
:
615 *params
= shProg
->Geom
.OutputType
;
619 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramiv(pname)");
626 * glGetShaderiv() - get GLSL shader state
629 get_shaderiv(struct gl_context
*ctx
, GLuint name
, GLenum pname
, GLint
*params
)
631 struct gl_shader
*shader
=
632 _mesa_lookup_shader_err(ctx
, name
, "glGetShaderiv");
640 *params
= shader
->Type
;
642 case GL_DELETE_STATUS
:
643 *params
= shader
->DeletePending
;
645 case GL_COMPILE_STATUS
:
646 *params
= shader
->CompileStatus
;
648 case GL_INFO_LOG_LENGTH
:
649 *params
= shader
->InfoLog
? strlen(shader
->InfoLog
) + 1 : 0;
651 case GL_SHADER_SOURCE_LENGTH
:
652 *params
= shader
->Source
? strlen((char *) shader
->Source
) + 1 : 0;
655 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetShaderiv(pname)");
662 get_program_info_log(struct gl_context
*ctx
, GLuint program
, GLsizei bufSize
,
663 GLsizei
*length
, GLchar
*infoLog
)
665 struct gl_shader_program
*shProg
666 = _mesa_lookup_shader_program(ctx
, program
);
668 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramInfoLog(program)");
671 _mesa_copy_string(infoLog
, bufSize
, length
, shProg
->InfoLog
);
676 get_shader_info_log(struct gl_context
*ctx
, GLuint shader
, GLsizei bufSize
,
677 GLsizei
*length
, GLchar
*infoLog
)
679 struct gl_shader
*sh
= _mesa_lookup_shader(ctx
, shader
);
681 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetShaderInfoLog(shader)");
684 _mesa_copy_string(infoLog
, bufSize
, length
, sh
->InfoLog
);
689 * Return shader source code.
692 get_shader_source(struct gl_context
*ctx
, GLuint shader
, GLsizei maxLength
,
693 GLsizei
*length
, GLchar
*sourceOut
)
695 struct gl_shader
*sh
;
696 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glGetShaderSource");
700 _mesa_copy_string(sourceOut
, maxLength
, length
, sh
->Source
);
705 * Set/replace shader source code.
708 shader_source(struct gl_context
*ctx
, GLuint shader
, const GLchar
*source
)
710 struct gl_shader
*sh
;
712 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glShaderSource");
716 /* free old shader source string and install new one */
718 free((void *) sh
->Source
);
721 sh
->CompileStatus
= GL_FALSE
;
723 sh
->SourceChecksum
= _mesa_str_checksum(sh
->Source
);
732 compile_shader(struct gl_context
*ctx
, GLuint shaderObj
)
734 struct gl_shader
*sh
;
735 struct gl_shader_compiler_options
*options
;
737 sh
= _mesa_lookup_shader_err(ctx
, shaderObj
, "glCompileShader");
741 options
= &ctx
->ShaderCompilerOptions
[_mesa_shader_type_to_index(sh
->Type
)];
743 /* set default pragma state for shader */
744 sh
->Pragmas
= options
->DefaultPragmas
;
746 /* this call will set the sh->CompileStatus field to indicate if
747 * compilation was successful.
749 _mesa_glsl_compile_shader(ctx
, sh
);
754 * Link a program's shaders.
757 link_program(struct gl_context
*ctx
, GLuint program
)
759 struct gl_shader_program
*shProg
;
760 struct gl_transform_feedback_object
*obj
=
761 ctx
->TransformFeedback
.CurrentObject
;
763 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glLinkProgram");
768 && (shProg
== ctx
->Shader
.CurrentVertexProgram
769 || shProg
== ctx
->Shader
.CurrentGeometryProgram
770 || shProg
== ctx
->Shader
.CurrentFragmentProgram
)) {
771 _mesa_error(ctx
, GL_INVALID_OPERATION
,
772 "glLinkProgram(transform feedback active");
776 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
778 _mesa_glsl_link_shader(ctx
, shProg
);
784 printf("Link %u shaders in program %u: %s\n",
785 shProg
->NumShaders
, shProg
->Name
,
786 shProg
->LinkStatus
? "Success" : "Failed");
788 for (i
= 0; i
< shProg
->NumShaders
; i
++) {
789 printf(" shader %u, type 0x%x\n",
790 shProg
->Shaders
[i
]->Name
,
791 shProg
->Shaders
[i
]->Type
);
798 * Print basic shader info (for debug).
801 print_shader_info(const struct gl_shader_program
*shProg
)
805 printf("Mesa: glUseProgram(%u)\n", shProg
->Name
);
806 for (i
= 0; i
< shProg
->NumShaders
; i
++) {
808 switch (shProg
->Shaders
[i
]->Type
) {
809 case GL_VERTEX_SHADER
:
812 case GL_FRAGMENT_SHADER
:
815 case GL_GEOMETRY_SHADER
:
821 printf(" %s shader %u, checksum %u\n", s
,
822 shProg
->Shaders
[i
]->Name
,
823 shProg
->Shaders
[i
]->SourceChecksum
);
825 if (shProg
->_LinkedShaders
[MESA_SHADER_VERTEX
])
826 printf(" vert prog %u\n",
827 shProg
->_LinkedShaders
[MESA_SHADER_VERTEX
]->Program
->Id
);
828 if (shProg
->_LinkedShaders
[MESA_SHADER_FRAGMENT
])
829 printf(" frag prog %u\n",
830 shProg
->_LinkedShaders
[MESA_SHADER_FRAGMENT
]->Program
->Id
);
831 if (shProg
->_LinkedShaders
[MESA_SHADER_GEOMETRY
])
832 printf(" geom prog %u\n",
833 shProg
->_LinkedShaders
[MESA_SHADER_GEOMETRY
]->Program
->Id
);
838 * Use the named shader program for subsequent glUniform calls
841 _mesa_active_program(struct gl_context
*ctx
, struct gl_shader_program
*shProg
,
844 if ((shProg
!= NULL
) && !shProg
->LinkStatus
) {
845 _mesa_error(ctx
, GL_INVALID_OPERATION
,
846 "%s(program %u not linked)", caller
, shProg
->Name
);
850 if (ctx
->Shader
.ActiveProgram
!= shProg
) {
851 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.ActiveProgram
, shProg
);
858 use_shader_program(struct gl_context
*ctx
, GLenum type
,
859 struct gl_shader_program
*shProg
)
861 struct gl_shader_program
**target
;
864 #if FEATURE_ARB_vertex_shader
865 case GL_VERTEX_SHADER
:
866 target
= &ctx
->Shader
.CurrentVertexProgram
;
868 || (shProg
->_LinkedShaders
[MESA_SHADER_VERTEX
] == NULL
)) {
873 #if FEATURE_ARB_geometry_shader4
874 case GL_GEOMETRY_SHADER_ARB
:
875 target
= &ctx
->Shader
.CurrentGeometryProgram
;
877 || (shProg
->_LinkedShaders
[MESA_SHADER_GEOMETRY
] == NULL
)) {
882 #if FEATURE_ARB_fragment_shader
883 case GL_FRAGMENT_SHADER
:
884 target
= &ctx
->Shader
.CurrentFragmentProgram
;
886 || (shProg
->_LinkedShaders
[MESA_SHADER_FRAGMENT
] == NULL
)) {
895 if (*target
!= shProg
) {
896 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
| _NEW_PROGRAM_CONSTANTS
);
897 _mesa_reference_shader_program(ctx
, target
, shProg
);
905 * Use the named shader program for subsequent rendering.
908 _mesa_use_program(struct gl_context
*ctx
, struct gl_shader_program
*shProg
)
910 use_shader_program(ctx
, GL_VERTEX_SHADER
, shProg
);
911 use_shader_program(ctx
, GL_GEOMETRY_SHADER_ARB
, shProg
);
912 use_shader_program(ctx
, GL_FRAGMENT_SHADER
, shProg
);
913 _mesa_active_program(ctx
, shProg
, "glUseProgram");
915 if (ctx
->Driver
.UseProgram
)
916 ctx
->Driver
.UseProgram(ctx
, shProg
);
921 * Validate a program's samplers.
922 * Specifically, check that there aren't two samplers of different types
923 * pointing to the same texture unit.
924 * \return GL_TRUE if valid, GL_FALSE if invalid
927 validate_samplers(const struct gl_program
*prog
, char *errMsg
)
929 static const char *targetName
[] = {
940 GLint targetUsed
[MAX_COMBINED_TEXTURE_IMAGE_UNITS
];
941 GLbitfield samplersUsed
= prog
->SamplersUsed
;
944 assert(Elements(targetName
) == NUM_TEXTURE_TARGETS
);
946 if (samplersUsed
== 0x0)
949 for (i
= 0; i
< Elements(targetUsed
); i
++)
952 /* walk over bits which are set in 'samplers' */
953 while (samplersUsed
) {
955 gl_texture_index target
;
956 GLint sampler
= _mesa_ffs(samplersUsed
) - 1;
957 assert(sampler
>= 0);
958 assert(sampler
< Elements(prog
->SamplerUnits
));
959 unit
= prog
->SamplerUnits
[sampler
];
960 target
= prog
->SamplerTargets
[sampler
];
961 if (targetUsed
[unit
] != -1 && targetUsed
[unit
] != (int) target
) {
962 _mesa_snprintf(errMsg
, 100,
963 "Texture unit %d is accessed both as %s and %s",
964 unit
, targetName
[targetUsed
[unit
]], targetName
[target
]);
967 targetUsed
[unit
] = target
;
968 samplersUsed
^= (1 << sampler
);
976 * Do validation of the given shader program.
977 * \param errMsg returns error message if validation fails.
978 * \return GL_TRUE if valid, GL_FALSE if invalid (and set errMsg)
981 validate_shader_program(const struct gl_shader_program
*shProg
,
986 if (!shProg
->LinkStatus
) {
990 /* From the GL spec, a program is invalid if any of these are true:
992 any two active samplers in the current program object are of
993 different types, but refer to the same texture image unit,
995 any active sampler in the current program object refers to a texture
996 image unit where fixed-function fragment processing accesses a
997 texture target that does not match the sampler type, or
999 the sum of the number of active samplers in the program and the
1000 number of texture image units enabled for fixed-function fragment
1001 processing exceeds the combined limit on the total number of texture
1002 image units allowed.
1007 * Check: any two active samplers in the current program object are of
1008 * different types, but refer to the same texture image unit,
1010 for (i
= 0; i
< Elements(shProg
->_LinkedShaders
); i
++) {
1011 if (shProg
->_LinkedShaders
[i
]
1012 && !validate_samplers(shProg
->_LinkedShaders
[i
]->Program
, errMsg
)) {
1022 * Called via glValidateProgram()
1025 validate_program(struct gl_context
*ctx
, GLuint program
)
1027 struct gl_shader_program
*shProg
;
1028 char errMsg
[100] = "";
1030 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glValidateProgram");
1035 shProg
->Validated
= validate_shader_program(shProg
, errMsg
);
1036 if (!shProg
->Validated
) {
1037 /* update info log */
1038 if (shProg
->InfoLog
) {
1039 ralloc_free(shProg
->InfoLog
);
1041 shProg
->InfoLog
= ralloc_strdup(shProg
, errMsg
);
1048 _mesa_AttachObjectARB(GLhandleARB program
, GLhandleARB shader
)
1050 GET_CURRENT_CONTEXT(ctx
);
1051 attach_shader(ctx
, program
, shader
);
1056 _mesa_AttachShader(GLuint program
, GLuint shader
)
1058 GET_CURRENT_CONTEXT(ctx
);
1059 attach_shader(ctx
, program
, shader
);
1063 /* GL_EXT_gpu_shader4, GL3 */
1065 _mesa_BindFragDataLocation(GLuint program
, GLuint colorNumber
,
1068 GET_CURRENT_CONTEXT(ctx
);
1069 bind_frag_data_location(ctx
, program
, colorNumber
, name
);
1074 _mesa_CompileShaderARB(GLhandleARB shaderObj
)
1076 GET_CURRENT_CONTEXT(ctx
);
1077 if (MESA_VERBOSE
& VERBOSE_API
)
1078 _mesa_debug(ctx
, "glCompileShader %u\n", shaderObj
);
1079 compile_shader(ctx
, shaderObj
);
1084 _mesa_CreateShader(GLenum type
)
1086 GET_CURRENT_CONTEXT(ctx
);
1087 if (MESA_VERBOSE
& VERBOSE_API
)
1088 _mesa_debug(ctx
, "glCreateShader %s\n", _mesa_lookup_enum_by_nr(type
));
1089 return create_shader(ctx
, type
);
1093 GLhandleARB GLAPIENTRY
1094 _mesa_CreateShaderObjectARB(GLenum type
)
1096 GET_CURRENT_CONTEXT(ctx
);
1097 return create_shader(ctx
, type
);
1102 _mesa_CreateProgram(void)
1104 GET_CURRENT_CONTEXT(ctx
);
1105 if (MESA_VERBOSE
& VERBOSE_API
)
1106 _mesa_debug(ctx
, "glCreateProgram\n");
1107 return create_shader_program(ctx
);
1111 GLhandleARB GLAPIENTRY
1112 _mesa_CreateProgramObjectARB(void)
1114 GET_CURRENT_CONTEXT(ctx
);
1115 return create_shader_program(ctx
);
1120 _mesa_DeleteObjectARB(GLhandleARB obj
)
1122 if (MESA_VERBOSE
& VERBOSE_API
) {
1123 GET_CURRENT_CONTEXT(ctx
);
1124 _mesa_debug(ctx
, "glDeleteObjectARB(%u)\n", obj
);
1128 GET_CURRENT_CONTEXT(ctx
);
1129 FLUSH_VERTICES(ctx
, 0);
1130 if (is_program(ctx
, obj
)) {
1131 delete_shader_program(ctx
, obj
);
1133 else if (is_shader(ctx
, obj
)) {
1134 delete_shader(ctx
, obj
);
1144 _mesa_DeleteProgram(GLuint name
)
1147 GET_CURRENT_CONTEXT(ctx
);
1148 FLUSH_VERTICES(ctx
, 0);
1149 delete_shader_program(ctx
, name
);
1155 _mesa_DeleteShader(GLuint name
)
1158 GET_CURRENT_CONTEXT(ctx
);
1159 FLUSH_VERTICES(ctx
, 0);
1160 delete_shader(ctx
, name
);
1166 _mesa_DetachObjectARB(GLhandleARB program
, GLhandleARB shader
)
1168 GET_CURRENT_CONTEXT(ctx
);
1169 detach_shader(ctx
, program
, shader
);
1174 _mesa_DetachShader(GLuint program
, GLuint shader
)
1176 GET_CURRENT_CONTEXT(ctx
);
1177 detach_shader(ctx
, program
, shader
);
1182 _mesa_GetAttachedObjectsARB(GLhandleARB container
, GLsizei maxCount
,
1183 GLsizei
* count
, GLhandleARB
* obj
)
1185 GET_CURRENT_CONTEXT(ctx
);
1186 get_attached_shaders(ctx
, container
, maxCount
, count
, obj
);
1191 _mesa_GetAttachedShaders(GLuint program
, GLsizei maxCount
,
1192 GLsizei
*count
, GLuint
*obj
)
1194 GET_CURRENT_CONTEXT(ctx
);
1195 get_attached_shaders(ctx
, program
, maxCount
, count
, obj
);
1199 /* GL_EXT_gpu_shader4, GL3 */
1201 _mesa_GetFragDataLocation(GLuint program
, const GLchar
*name
)
1203 GET_CURRENT_CONTEXT(ctx
);
1204 return get_frag_data_location(ctx
, program
, name
);
1210 _mesa_GetInfoLogARB(GLhandleARB object
, GLsizei maxLength
, GLsizei
* length
,
1211 GLcharARB
* infoLog
)
1213 GET_CURRENT_CONTEXT(ctx
);
1214 if (is_program(ctx
, object
)) {
1215 get_program_info_log(ctx
, object
, maxLength
, length
, infoLog
);
1217 else if (is_shader(ctx
, object
)) {
1218 get_shader_info_log(ctx
, object
, maxLength
, length
, infoLog
);
1221 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetInfoLogARB");
1227 _mesa_GetObjectParameterivARB(GLhandleARB object
, GLenum pname
, GLint
*params
)
1229 GET_CURRENT_CONTEXT(ctx
);
1230 /* Implement in terms of GetProgramiv, GetShaderiv */
1231 if (is_program(ctx
, object
)) {
1232 if (pname
== GL_OBJECT_TYPE_ARB
) {
1233 *params
= GL_PROGRAM_OBJECT_ARB
;
1236 get_programiv(ctx
, object
, pname
, params
);
1239 else if (is_shader(ctx
, object
)) {
1240 if (pname
== GL_OBJECT_TYPE_ARB
) {
1241 *params
= GL_SHADER_OBJECT_ARB
;
1244 get_shaderiv(ctx
, object
, pname
, params
);
1248 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetObjectParameterivARB");
1254 _mesa_GetObjectParameterfvARB(GLhandleARB object
, GLenum pname
,
1257 GLint iparams
[1]; /* XXX is one element enough? */
1258 _mesa_GetObjectParameterivARB(object
, pname
, iparams
);
1259 params
[0] = (GLfloat
) iparams
[0];
1264 _mesa_GetProgramiv(GLuint program
, GLenum pname
, GLint
*params
)
1266 GET_CURRENT_CONTEXT(ctx
);
1267 get_programiv(ctx
, program
, pname
, params
);
1272 _mesa_GetShaderiv(GLuint shader
, GLenum pname
, GLint
*params
)
1274 GET_CURRENT_CONTEXT(ctx
);
1275 get_shaderiv(ctx
, shader
, pname
, params
);
1280 _mesa_GetProgramInfoLog(GLuint program
, GLsizei bufSize
,
1281 GLsizei
*length
, GLchar
*infoLog
)
1283 GET_CURRENT_CONTEXT(ctx
);
1284 get_program_info_log(ctx
, program
, bufSize
, length
, infoLog
);
1289 _mesa_GetShaderInfoLog(GLuint shader
, GLsizei bufSize
,
1290 GLsizei
*length
, GLchar
*infoLog
)
1292 GET_CURRENT_CONTEXT(ctx
);
1293 get_shader_info_log(ctx
, shader
, bufSize
, length
, infoLog
);
1298 _mesa_GetShaderSourceARB(GLhandleARB shader
, GLsizei maxLength
,
1299 GLsizei
*length
, GLcharARB
*sourceOut
)
1301 GET_CURRENT_CONTEXT(ctx
);
1302 get_shader_source(ctx
, shader
, maxLength
, length
, sourceOut
);
1306 GLhandleARB GLAPIENTRY
1307 _mesa_GetHandleARB(GLenum pname
)
1309 GET_CURRENT_CONTEXT(ctx
);
1310 return get_handle(ctx
, pname
);
1314 GLboolean GLAPIENTRY
1315 _mesa_IsProgram(GLuint name
)
1317 GET_CURRENT_CONTEXT(ctx
);
1318 return is_program(ctx
, name
);
1322 GLboolean GLAPIENTRY
1323 _mesa_IsShader(GLuint name
)
1325 GET_CURRENT_CONTEXT(ctx
);
1326 return is_shader(ctx
, name
);
1331 _mesa_LinkProgramARB(GLhandleARB programObj
)
1333 GET_CURRENT_CONTEXT(ctx
);
1334 link_program(ctx
, programObj
);
1340 * Read shader source code from a file.
1341 * Useful for debugging to override an app's shader.
1344 read_shader(const char *fname
)
1346 const int max
= 50*1000;
1347 FILE *f
= fopen(fname
, "r");
1348 GLcharARB
*buffer
, *shader
;
1355 buffer
= (char *) malloc(max
);
1356 len
= fread(buffer
, 1, max
, f
);
1361 shader
= _mesa_strdup(buffer
);
1369 * Called via glShaderSource() and glShaderSourceARB() API functions.
1370 * Basically, concatenate the source code strings into one long string
1371 * and pass it to _mesa_shader_source().
1374 _mesa_ShaderSourceARB(GLhandleARB shaderObj
, GLsizei count
,
1375 const GLcharARB
** string
, const GLint
* length
)
1377 GET_CURRENT_CONTEXT(ctx
);
1379 GLsizei i
, totalLength
;
1383 if (!shaderObj
|| string
== NULL
) {
1384 _mesa_error(ctx
, GL_INVALID_VALUE
, "glShaderSourceARB");
1389 * This array holds offsets of where the appropriate string ends, thus the
1390 * last element will be set to the total length of the source code.
1392 offsets
= (GLint
*) malloc(count
* sizeof(GLint
));
1393 if (offsets
== NULL
) {
1394 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glShaderSourceARB");
1398 for (i
= 0; i
< count
; i
++) {
1399 if (string
[i
] == NULL
) {
1400 free((GLvoid
*) offsets
);
1401 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1402 "glShaderSourceARB(null string)");
1405 if (length
== NULL
|| length
[i
] < 0)
1406 offsets
[i
] = strlen(string
[i
]);
1408 offsets
[i
] = length
[i
];
1409 /* accumulate string lengths */
1411 offsets
[i
] += offsets
[i
- 1];
1414 /* Total length of source string is sum off all strings plus two.
1415 * One extra byte for terminating zero, another extra byte to silence
1416 * valgrind warnings in the parser/grammer code.
1418 totalLength
= offsets
[count
- 1] + 2;
1419 source
= (GLcharARB
*) malloc(totalLength
* sizeof(GLcharARB
));
1420 if (source
== NULL
) {
1421 free((GLvoid
*) offsets
);
1422 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glShaderSourceARB");
1426 for (i
= 0; i
< count
; i
++) {
1427 GLint start
= (i
> 0) ? offsets
[i
- 1] : 0;
1428 memcpy(source
+ start
, string
[i
],
1429 (offsets
[i
] - start
) * sizeof(GLcharARB
));
1431 source
[totalLength
- 1] = '\0';
1432 source
[totalLength
- 2] = '\0';
1435 /* Compute the shader's source code checksum then try to open a file
1436 * named newshader_<CHECKSUM>. If it exists, use it in place of the
1437 * original shader source code. For debugging.
1440 GLcharARB
*newSource
;
1442 checksum
= _mesa_str_checksum(source
);
1444 _mesa_snprintf(filename
, sizeof(filename
), "newshader_%d", checksum
);
1446 newSource
= read_shader(filename
);
1448 fprintf(stderr
, "Mesa: Replacing shader %u chksum=%d with %s\n",
1449 shaderObj
, checksum
, filename
);
1455 shader_source(ctx
, shaderObj
, source
);
1458 struct gl_shader
*sh
= _mesa_lookup_shader(ctx
, shaderObj
);
1460 sh
->SourceChecksum
= checksum
; /* save original checksum */
1468 _mesa_UseProgramObjectARB(GLhandleARB program
)
1470 GET_CURRENT_CONTEXT(ctx
);
1471 struct gl_shader_program
*shProg
;
1472 struct gl_transform_feedback_object
*obj
=
1473 ctx
->TransformFeedback
.CurrentObject
;
1475 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1478 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1479 "glUseProgram(transform feedback active)");
1484 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glUseProgram");
1488 if (!shProg
->LinkStatus
) {
1489 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1490 "glUseProgram(program %u not linked)", program
);
1495 if (ctx
->Shader
.Flags
& GLSL_USE_PROG
) {
1496 print_shader_info(shProg
);
1503 _mesa_use_program(ctx
, shProg
);
1508 _mesa_ValidateProgramARB(GLhandleARB program
)
1510 GET_CURRENT_CONTEXT(ctx
);
1511 validate_program(ctx
, program
);
1517 _mesa_GetShaderPrecisionFormat(GLenum shadertype
, GLenum precisiontype
,
1518 GLint
* range
, GLint
* precision
)
1520 const struct gl_program_constants
*limits
;
1521 const struct gl_precision
*p
;
1522 GET_CURRENT_CONTEXT(ctx
);
1524 switch (shadertype
) {
1525 case GL_VERTEX_SHADER
:
1526 limits
= &ctx
->Const
.VertexProgram
;
1528 case GL_FRAGMENT_SHADER
:
1529 limits
= &ctx
->Const
.FragmentProgram
;
1532 _mesa_error(ctx
, GL_INVALID_ENUM
,
1533 "glGetShaderPrecisionFormat(shadertype)");
1537 switch (precisiontype
) {
1539 p
= &limits
->LowFloat
;
1541 case GL_MEDIUM_FLOAT
:
1542 p
= &limits
->MediumFloat
;
1545 p
= &limits
->HighFloat
;
1548 p
= &limits
->LowInt
;
1551 p
= &limits
->MediumInt
;
1554 p
= &limits
->HighInt
;
1557 _mesa_error(ctx
, GL_INVALID_ENUM
,
1558 "glGetShaderPrecisionFormat(precisiontype)");
1562 range
[0] = p
->RangeMin
;
1563 range
[1] = p
->RangeMax
;
1564 precision
[0] = p
->Precision
;
1569 _mesa_ReleaseShaderCompiler(void)
1571 _mesa_destroy_shader_compiler_caches();
1576 _mesa_ShaderBinary(GLint n
, const GLuint
* shaders
, GLenum binaryformat
,
1577 const void* binary
, GLint length
)
1579 GET_CURRENT_CONTEXT(ctx
);
1582 (void) binaryformat
;
1585 _mesa_error(ctx
, GL_INVALID_OPERATION
, __FUNCTION__
);
1588 #endif /* FEATURE_ES2 */
1591 #if FEATURE_ARB_geometry_shader4
1594 _mesa_ProgramParameteriARB(GLuint program
, GLenum pname
, GLint value
)
1596 struct gl_shader_program
*shProg
;
1597 GET_CURRENT_CONTEXT(ctx
);
1599 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1601 shProg
= _mesa_lookup_shader_program_err(ctx
, program
,
1602 "glProgramParameteri");
1607 case GL_GEOMETRY_VERTICES_OUT_ARB
:
1609 (unsigned) value
> ctx
->Const
.MaxGeometryOutputVertices
) {
1610 _mesa_error(ctx
, GL_INVALID_VALUE
,
1611 "glProgramParameteri(GL_GEOMETRY_VERTICES_OUT_ARB=%d",
1615 shProg
->Geom
.VerticesOut
= value
;
1617 case GL_GEOMETRY_INPUT_TYPE_ARB
:
1621 case GL_LINES_ADJACENCY_ARB
:
1623 case GL_TRIANGLES_ADJACENCY_ARB
:
1624 shProg
->Geom
.InputType
= value
;
1627 _mesa_error(ctx
, GL_INVALID_VALUE
,
1628 "glProgramParameteri(geometry input type = %s",
1629 _mesa_lookup_enum_by_nr(value
));
1633 case GL_GEOMETRY_OUTPUT_TYPE_ARB
:
1637 case GL_TRIANGLE_STRIP
:
1638 shProg
->Geom
.OutputType
= value
;
1641 _mesa_error(ctx
, GL_INVALID_VALUE
,
1642 "glProgramParameteri(geometry output type = %s",
1643 _mesa_lookup_enum_by_nr(value
));
1648 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramParameteriARB(pname=%s)",
1649 _mesa_lookup_enum_by_nr(pname
));
1657 _mesa_use_shader_program(struct gl_context
*ctx
, GLenum type
,
1658 struct gl_shader_program
*shProg
)
1660 use_shader_program(ctx
, type
, shProg
);
1662 if (ctx
->Driver
.UseProgram
)
1663 ctx
->Driver
.UseProgram(ctx
, shProg
);
1667 _mesa_UseShaderProgramEXT(GLenum type
, GLuint program
)
1669 GET_CURRENT_CONTEXT(ctx
);
1670 struct gl_shader_program
*shProg
= NULL
;
1672 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1674 if (!validate_shader_target(ctx
, type
)) {
1675 _mesa_error(ctx
, GL_INVALID_ENUM
, "glUseShaderProgramEXT(type)");
1679 if (ctx
->TransformFeedback
.CurrentObject
->Active
) {
1680 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1681 "glUseShaderProgramEXT(transform feedback is active)");
1686 shProg
= _mesa_lookup_shader_program_err(ctx
, program
,
1687 "glUseShaderProgramEXT");
1691 if (!shProg
->LinkStatus
) {
1692 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1693 "glUseShaderProgramEXT(program not linked)");
1698 _mesa_use_shader_program(ctx
, type
, shProg
);
1702 _mesa_ActiveProgramEXT(GLuint program
)
1704 GET_CURRENT_CONTEXT(ctx
);
1705 struct gl_shader_program
*shProg
= (program
!= 0)
1706 ? _mesa_lookup_shader_program_err(ctx
, program
, "glActiveProgramEXT")
1709 _mesa_active_program(ctx
, shProg
, "glActiveProgramEXT");
1714 _mesa_CreateShaderProgramEXT(GLenum type
, const GLchar
*string
)
1716 GET_CURRENT_CONTEXT(ctx
);
1717 const GLuint shader
= create_shader(ctx
, type
);
1721 shader_source(ctx
, shader
, _mesa_strdup(string
));
1722 compile_shader(ctx
, shader
);
1724 program
= create_shader_program(ctx
);
1726 struct gl_shader_program
*shProg
;
1727 struct gl_shader
*sh
;
1728 GLint compiled
= GL_FALSE
;
1730 shProg
= _mesa_lookup_shader_program(ctx
, program
);
1731 sh
= _mesa_lookup_shader(ctx
, shader
);
1733 get_shaderiv(ctx
, shader
, GL_COMPILE_STATUS
, &compiled
);
1735 attach_shader(ctx
, program
, shader
);
1736 link_program(ctx
, program
);
1737 detach_shader(ctx
, program
, shader
);
1741 if (active
-user
-defined
-varyings
-in
-linked
-program
) {
1742 append
-error
-to
-info
-log
;
1743 shProg
->LinkStatus
= GL_FALSE
;
1748 ralloc_strcat(&shProg
->InfoLog
, sh
->InfoLog
);
1751 delete_shader(ctx
, shader
);
1758 * Plug in shader-related functions into API dispatch table.
1761 _mesa_init_shader_dispatch(struct _glapi_table
*exec
)
1764 /* GL_ARB_vertex/fragment_shader */
1765 SET_DeleteObjectARB(exec
, _mesa_DeleteObjectARB
);
1766 SET_GetHandleARB(exec
, _mesa_GetHandleARB
);
1767 SET_DetachObjectARB(exec
, _mesa_DetachObjectARB
);
1768 SET_CreateShaderObjectARB(exec
, _mesa_CreateShaderObjectARB
);
1769 SET_ShaderSourceARB(exec
, _mesa_ShaderSourceARB
);
1770 SET_CompileShaderARB(exec
, _mesa_CompileShaderARB
);
1771 SET_CreateProgramObjectARB(exec
, _mesa_CreateProgramObjectARB
);
1772 SET_AttachObjectARB(exec
, _mesa_AttachObjectARB
);
1773 SET_LinkProgramARB(exec
, _mesa_LinkProgramARB
);
1774 SET_UseProgramObjectARB(exec
, _mesa_UseProgramObjectARB
);
1775 SET_ValidateProgramARB(exec
, _mesa_ValidateProgramARB
);
1776 SET_GetObjectParameterfvARB(exec
, _mesa_GetObjectParameterfvARB
);
1777 SET_GetObjectParameterivARB(exec
, _mesa_GetObjectParameterivARB
);
1778 SET_GetInfoLogARB(exec
, _mesa_GetInfoLogARB
);
1779 SET_GetAttachedObjectsARB(exec
, _mesa_GetAttachedObjectsARB
);
1780 SET_GetShaderSourceARB(exec
, _mesa_GetShaderSourceARB
);
1783 SET_AttachShader(exec
, _mesa_AttachShader
);
1784 SET_CreateProgram(exec
, _mesa_CreateProgram
);
1785 SET_CreateShader(exec
, _mesa_CreateShader
);
1786 SET_DeleteProgram(exec
, _mesa_DeleteProgram
);
1787 SET_DeleteShader(exec
, _mesa_DeleteShader
);
1788 SET_DetachShader(exec
, _mesa_DetachShader
);
1789 SET_GetAttachedShaders(exec
, _mesa_GetAttachedShaders
);
1790 SET_GetProgramiv(exec
, _mesa_GetProgramiv
);
1791 SET_GetProgramInfoLog(exec
, _mesa_GetProgramInfoLog
);
1792 SET_GetShaderiv(exec
, _mesa_GetShaderiv
);
1793 SET_GetShaderInfoLog(exec
, _mesa_GetShaderInfoLog
);
1794 SET_IsProgram(exec
, _mesa_IsProgram
);
1795 SET_IsShader(exec
, _mesa_IsShader
);
1797 #if FEATURE_ARB_vertex_shader
1798 SET_BindAttribLocationARB(exec
, _mesa_BindAttribLocationARB
);
1799 SET_GetActiveAttribARB(exec
, _mesa_GetActiveAttribARB
);
1800 SET_GetAttribLocationARB(exec
, _mesa_GetAttribLocationARB
);
1803 #if FEATURE_ARB_geometry_shader4
1804 SET_ProgramParameteriARB(exec
, _mesa_ProgramParameteriARB
);
1807 SET_UseShaderProgramEXT(exec
, _mesa_UseShaderProgramEXT
);
1808 SET_ActiveProgramEXT(exec
, _mesa_ActiveProgramEXT
);
1809 SET_CreateShaderProgramEXT(exec
, _mesa_CreateShaderProgramEXT
);
1811 /* GL_EXT_gpu_shader4 / GL 3.0 */
1812 SET_BindFragDataLocationEXT(exec
, _mesa_BindFragDataLocation
);
1813 SET_GetFragDataLocationEXT(exec
, _mesa_GetFragDataLocation
);
1815 /* GL_ARB_ES2_compatibility */
1816 SET_ReleaseShaderCompiler(exec
, _mesa_ReleaseShaderCompiler
);
1817 SET_GetShaderPrecisionFormat(exec
, _mesa_GetShaderPrecisionFormat
);
1819 #endif /* FEATURE_GL */