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/transformfeedback.h"
49 #include "main/uniforms.h"
50 #include "program/program.h"
51 #include "program/prog_parameter.h"
54 #include "../glsl/glsl_parser_extras.h"
55 #include "../glsl/ir_uniform.h"
57 /** Define this to enable shader substitution (see below) */
58 #define SHADER_SUBST 0
62 * Return mask of GLSL_x flags by examining the MESA_GLSL env var.
65 get_shader_flags(void)
67 GLbitfield flags
= 0x0;
68 const char *env
= _mesa_getenv("MESA_GLSL");
71 if (strstr(env
, "dump"))
73 if (strstr(env
, "log"))
75 if (strstr(env
, "nopvert"))
76 flags
|= GLSL_NOP_VERT
;
77 if (strstr(env
, "nopfrag"))
78 flags
|= GLSL_NOP_FRAG
;
79 if (strstr(env
, "nopt"))
81 else if (strstr(env
, "opt"))
83 if (strstr(env
, "uniform"))
84 flags
|= GLSL_UNIFORMS
;
85 if (strstr(env
, "useprog"))
86 flags
|= GLSL_USE_PROG
;
87 if (strstr(env
, "errors"))
88 flags
|= GLSL_REPORT_ERRORS
;
96 * Initialize context's shader state.
99 _mesa_init_shader_state(struct gl_context
*ctx
)
101 /* Device drivers may override these to control what kind of instructions
102 * are generated by the GLSL compiler.
104 struct gl_shader_compiler_options options
;
107 memset(&options
, 0, sizeof(options
));
108 options
.MaxUnrollIterations
= 32;
109 options
.MaxIfDepth
= UINT_MAX
;
111 /* Default pragma settings */
112 options
.DefaultPragmas
.Optimize
= GL_TRUE
;
114 for (sh
= 0; sh
< MESA_SHADER_TYPES
; ++sh
)
115 memcpy(&ctx
->ShaderCompilerOptions
[sh
], &options
, sizeof(options
));
117 ctx
->Shader
.Flags
= get_shader_flags();
122 * Free the per-context shader-related state.
125 _mesa_free_shader_state(struct gl_context
*ctx
)
127 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.CurrentVertexProgram
, NULL
);
128 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.CurrentGeometryProgram
,
130 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.CurrentFragmentProgram
,
132 _mesa_reference_shader_program(ctx
, &ctx
->Shader
._CurrentFragmentProgram
,
134 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.ActiveProgram
, NULL
);
139 * Copy string from <src> to <dst>, up to maxLength characters, returning
140 * length of <dst> in <length>.
141 * \param src the strings source
142 * \param maxLength max chars to copy
143 * \param length returns number of chars copied
144 * \param dst the string destination
147 _mesa_copy_string(GLchar
*dst
, GLsizei maxLength
,
148 GLsizei
*length
, const GLchar
*src
)
151 for (len
= 0; len
< maxLength
- 1 && src
&& src
[len
]; len
++)
162 * Confirm that the a shader type is valid and supported by the implementation
164 * \param ctx Current GL context
165 * \param type Shader target
169 validate_shader_target(const struct gl_context
*ctx
, GLenum type
)
172 case GL_FRAGMENT_SHADER
:
173 return ctx
->Extensions
.ARB_fragment_shader
;
174 case GL_VERTEX_SHADER
:
175 return ctx
->Extensions
.ARB_vertex_shader
;
176 case GL_GEOMETRY_SHADER_ARB
:
177 return _mesa_is_desktop_gl(ctx
) && ctx
->Extensions
.ARB_geometry_shader4
;
185 is_program(struct gl_context
*ctx
, GLuint name
)
187 struct gl_shader_program
*shProg
= _mesa_lookup_shader_program(ctx
, name
);
188 return shProg
? GL_TRUE
: GL_FALSE
;
193 is_shader(struct gl_context
*ctx
, GLuint name
)
195 struct gl_shader
*shader
= _mesa_lookup_shader(ctx
, name
);
196 return shader
? GL_TRUE
: GL_FALSE
;
201 * Attach shader to a shader program.
204 attach_shader(struct gl_context
*ctx
, GLuint program
, GLuint shader
)
206 struct gl_shader_program
*shProg
;
207 struct gl_shader
*sh
;
210 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glAttachShader");
214 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glAttachShader");
219 n
= shProg
->NumShaders
;
220 for (i
= 0; i
< n
; i
++) {
221 if (shProg
->Shaders
[i
] == sh
) {
222 /* The shader is already attched to this program. The
223 * GL_ARB_shader_objects spec says:
225 * "The error INVALID_OPERATION is generated by AttachObjectARB
226 * if <obj> is already attached to <containerObj>."
228 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glAttachShader");
234 shProg
->Shaders
= (struct gl_shader
**)
235 _mesa_realloc(shProg
->Shaders
,
236 n
* sizeof(struct gl_shader
*),
237 (n
+ 1) * sizeof(struct gl_shader
*));
238 if (!shProg
->Shaders
) {
239 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glAttachShader");
244 shProg
->Shaders
[n
] = NULL
; /* since realloc() didn't zero the new space */
245 _mesa_reference_shader(ctx
, &shProg
->Shaders
[n
], sh
);
246 shProg
->NumShaders
++;
251 create_shader(struct gl_context
*ctx
, GLenum type
)
253 struct gl_shader
*sh
;
256 if (!validate_shader_target(ctx
, type
)) {
257 _mesa_error(ctx
, GL_INVALID_ENUM
, "CreateShader(type)");
261 name
= _mesa_HashFindFreeKeyBlock(ctx
->Shared
->ShaderObjects
, 1);
262 sh
= ctx
->Driver
.NewShader(ctx
, name
, type
);
263 _mesa_HashInsert(ctx
->Shared
->ShaderObjects
, name
, sh
);
270 create_shader_program(struct gl_context
*ctx
)
273 struct gl_shader_program
*shProg
;
275 name
= _mesa_HashFindFreeKeyBlock(ctx
->Shared
->ShaderObjects
, 1);
277 shProg
= ctx
->Driver
.NewShaderProgram(ctx
, name
);
279 _mesa_HashInsert(ctx
->Shared
->ShaderObjects
, name
, shProg
);
281 assert(shProg
->RefCount
== 1);
288 * Named w/ "2" to indicate OpenGL 2.x vs GL_ARB_fragment_programs's
292 delete_shader_program(struct gl_context
*ctx
, GLuint name
)
295 * NOTE: deleting shaders/programs works a bit differently than
296 * texture objects (and buffer objects, etc). Shader/program
297 * handles/IDs exist in the hash table until the object is really
298 * deleted (refcount==0). With texture objects, the handle/ID is
299 * removed from the hash table in glDeleteTextures() while the tex
300 * object itself might linger until its refcount goes to zero.
302 struct gl_shader_program
*shProg
;
304 shProg
= _mesa_lookup_shader_program_err(ctx
, name
, "glDeleteProgram");
308 if (!shProg
->DeletePending
) {
309 shProg
->DeletePending
= GL_TRUE
;
311 /* effectively, decr shProg's refcount */
312 _mesa_reference_shader_program(ctx
, &shProg
, NULL
);
318 delete_shader(struct gl_context
*ctx
, GLuint shader
)
320 struct gl_shader
*sh
;
322 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glDeleteShader");
326 if (!sh
->DeletePending
) {
327 sh
->DeletePending
= GL_TRUE
;
329 /* effectively, decr sh's refcount */
330 _mesa_reference_shader(ctx
, &sh
, NULL
);
336 detach_shader(struct gl_context
*ctx
, GLuint program
, GLuint shader
)
338 struct gl_shader_program
*shProg
;
342 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glDetachShader");
346 n
= shProg
->NumShaders
;
348 for (i
= 0; i
< n
; i
++) {
349 if (shProg
->Shaders
[i
]->Name
== shader
) {
351 struct gl_shader
**newList
;
354 _mesa_reference_shader(ctx
, &shProg
->Shaders
[i
], NULL
);
356 /* alloc new, smaller array */
358 malloc((n
- 1) * sizeof(struct gl_shader
*));
360 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glDetachShader");
363 for (j
= 0; j
< i
; j
++) {
364 newList
[j
] = shProg
->Shaders
[j
];
367 newList
[j
++] = shProg
->Shaders
[i
];
368 free(shProg
->Shaders
);
370 shProg
->Shaders
= newList
;
371 shProg
->NumShaders
= n
- 1;
376 for (j
= 0; j
< shProg
->NumShaders
; j
++) {
377 assert(shProg
->Shaders
[j
]->Type
== GL_VERTEX_SHADER
||
378 shProg
->Shaders
[j
]->Type
== GL_FRAGMENT_SHADER
);
379 assert(shProg
->Shaders
[j
]->RefCount
> 0);
391 if (is_shader(ctx
, shader
))
392 err
= GL_INVALID_OPERATION
;
393 else if (is_program(ctx
, shader
))
394 err
= GL_INVALID_OPERATION
;
396 err
= GL_INVALID_VALUE
;
397 _mesa_error(ctx
, err
, "glDetachProgram(shader)");
404 * Return list of shaders attached to shader program.
407 get_attached_shaders(struct gl_context
*ctx
, GLuint program
, GLsizei maxCount
,
408 GLsizei
*count
, GLuint
*obj
)
410 struct gl_shader_program
*shProg
=
411 _mesa_lookup_shader_program_err(ctx
, program
, "glGetAttachedShaders");
414 for (i
= 0; i
< (GLuint
) maxCount
&& i
< shProg
->NumShaders
; i
++) {
415 obj
[i
] = shProg
->Shaders
[i
]->Name
;
424 * glGetHandleARB() - return ID/name of currently bound shader program.
427 get_handle(struct gl_context
*ctx
, GLenum pname
)
429 if (pname
== GL_PROGRAM_OBJECT_ARB
) {
430 if (ctx
->Shader
.ActiveProgram
)
431 return ctx
->Shader
.ActiveProgram
->Name
;
436 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetHandleARB");
443 * glGetProgramiv() - get shader program state.
444 * Note that this is for GLSL shader programs, not ARB vertex/fragment
445 * programs (see glGetProgramivARB).
448 get_programiv(struct gl_context
*ctx
, GLuint program
, GLenum pname
, GLint
*params
)
450 struct gl_shader_program
*shProg
451 = _mesa_lookup_shader_program(ctx
, program
);
453 /* Is transform feedback available in this context?
456 (ctx
->API
== API_OPENGL_COMPAT
&& ctx
->Extensions
.EXT_transform_feedback
)
457 || ctx
->API
== API_OPENGL_CORE
458 || _mesa_is_gles3(ctx
);
460 /* Are geometry shaders available in this context?
463 _mesa_is_desktop_gl(ctx
) && ctx
->Extensions
.ARB_geometry_shader4
;
465 /* Are uniform buffer objects available in this context?
468 (ctx
->API
== API_OPENGL_COMPAT
&& ctx
->Extensions
.ARB_uniform_buffer_object
)
469 || ctx
->API
== API_OPENGL_CORE
470 || _mesa_is_gles3(ctx
);
473 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramiv(program)");
478 case GL_DELETE_STATUS
:
479 *params
= shProg
->DeletePending
;
482 *params
= shProg
->LinkStatus
;
484 case GL_VALIDATE_STATUS
:
485 *params
= shProg
->Validated
;
487 case GL_INFO_LOG_LENGTH
:
488 *params
= shProg
->InfoLog
? strlen(shProg
->InfoLog
) + 1 : 0;
490 case GL_ATTACHED_SHADERS
:
491 *params
= shProg
->NumShaders
;
493 case GL_ACTIVE_ATTRIBUTES
:
494 *params
= _mesa_count_active_attribs(shProg
);
496 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH
:
497 *params
= _mesa_longest_attribute_name_length(shProg
);
499 case GL_ACTIVE_UNIFORMS
:
500 *params
= shProg
->NumUserUniformStorage
;
502 case GL_ACTIVE_UNIFORM_MAX_LENGTH
: {
506 for (i
= 0; i
< shProg
->NumUserUniformStorage
; i
++) {
507 /* Add one for the terminating NUL character.
509 const GLint len
= strlen(shProg
->UniformStorage
[i
].name
) + 1;
518 case GL_TRANSFORM_FEEDBACK_VARYINGS
:
521 *params
= shProg
->TransformFeedback
.NumVarying
;
523 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH
: {
529 for (i
= 0; i
< shProg
->TransformFeedback
.NumVarying
; i
++) {
530 /* Add one for the terminating NUL character.
532 const GLint len
= strlen(shProg
->TransformFeedback
.VaryingNames
[i
]) + 1;
541 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE
:
544 *params
= shProg
->TransformFeedback
.BufferMode
;
546 case GL_GEOMETRY_VERTICES_OUT_ARB
:
549 *params
= shProg
->Geom
.VerticesOut
;
551 case GL_GEOMETRY_INPUT_TYPE_ARB
:
554 *params
= shProg
->Geom
.InputType
;
556 case GL_GEOMETRY_OUTPUT_TYPE_ARB
:
559 *params
= shProg
->Geom
.OutputType
;
561 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH
: {
568 for (i
= 0; i
< shProg
->NumUniformBlocks
; i
++) {
569 /* Add one for the terminating NUL character.
571 const GLint len
= strlen(shProg
->UniformBlocks
[i
].Name
) + 1;
580 case GL_ACTIVE_UNIFORM_BLOCKS
:
584 *params
= shProg
->NumUniformBlocks
;
590 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramiv(pname=%s)",
591 _mesa_lookup_enum_by_nr(pname
));
596 * glGetShaderiv() - get GLSL shader state
599 get_shaderiv(struct gl_context
*ctx
, GLuint name
, GLenum pname
, GLint
*params
)
601 struct gl_shader
*shader
=
602 _mesa_lookup_shader_err(ctx
, name
, "glGetShaderiv");
610 *params
= shader
->Type
;
612 case GL_DELETE_STATUS
:
613 *params
= shader
->DeletePending
;
615 case GL_COMPILE_STATUS
:
616 *params
= shader
->CompileStatus
;
618 case GL_INFO_LOG_LENGTH
:
619 *params
= shader
->InfoLog
? strlen(shader
->InfoLog
) + 1 : 0;
621 case GL_SHADER_SOURCE_LENGTH
:
622 *params
= shader
->Source
? strlen((char *) shader
->Source
) + 1 : 0;
625 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetShaderiv(pname)");
632 get_program_info_log(struct gl_context
*ctx
, GLuint program
, GLsizei bufSize
,
633 GLsizei
*length
, GLchar
*infoLog
)
635 struct gl_shader_program
*shProg
636 = _mesa_lookup_shader_program(ctx
, program
);
638 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramInfoLog(program)");
641 _mesa_copy_string(infoLog
, bufSize
, length
, shProg
->InfoLog
);
646 get_shader_info_log(struct gl_context
*ctx
, GLuint shader
, GLsizei bufSize
,
647 GLsizei
*length
, GLchar
*infoLog
)
649 struct gl_shader
*sh
= _mesa_lookup_shader(ctx
, shader
);
651 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetShaderInfoLog(shader)");
654 _mesa_copy_string(infoLog
, bufSize
, length
, sh
->InfoLog
);
659 * Return shader source code.
662 get_shader_source(struct gl_context
*ctx
, GLuint shader
, GLsizei maxLength
,
663 GLsizei
*length
, GLchar
*sourceOut
)
665 struct gl_shader
*sh
;
666 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glGetShaderSource");
670 _mesa_copy_string(sourceOut
, maxLength
, length
, sh
->Source
);
675 * Set/replace shader source code. A helper function used by
676 * glShaderSource[ARB] and glCreateShaderProgramEXT.
679 shader_source(struct gl_context
*ctx
, GLuint shader
, const GLchar
*source
)
681 struct gl_shader
*sh
;
683 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glShaderSource");
687 /* free old shader source string and install new one */
688 free((void *)sh
->Source
);
690 sh
->CompileStatus
= GL_FALSE
;
692 sh
->SourceChecksum
= _mesa_str_checksum(sh
->Source
);
701 compile_shader(struct gl_context
*ctx
, GLuint shaderObj
)
703 struct gl_shader
*sh
;
704 struct gl_shader_compiler_options
*options
;
706 sh
= _mesa_lookup_shader_err(ctx
, shaderObj
, "glCompileShader");
710 options
= &ctx
->ShaderCompilerOptions
[_mesa_shader_type_to_index(sh
->Type
)];
712 /* set default pragma state for shader */
713 sh
->Pragmas
= options
->DefaultPragmas
;
715 /* this call will set the sh->CompileStatus field to indicate if
716 * compilation was successful.
718 _mesa_glsl_compile_shader(ctx
, sh
);
720 if (sh
->CompileStatus
== GL_FALSE
&&
721 (ctx
->Shader
.Flags
& GLSL_REPORT_ERRORS
)) {
722 _mesa_debug(ctx
, "Error compiling shader %u:\n%s\n",
723 sh
->Name
, sh
->InfoLog
);
729 * Link a program's shaders.
732 link_program(struct gl_context
*ctx
, GLuint program
)
734 struct gl_shader_program
*shProg
;
735 struct gl_transform_feedback_object
*obj
=
736 ctx
->TransformFeedback
.CurrentObject
;
738 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glLinkProgram");
743 && (shProg
== ctx
->Shader
.CurrentVertexProgram
744 || shProg
== ctx
->Shader
.CurrentGeometryProgram
745 || shProg
== ctx
->Shader
.CurrentFragmentProgram
)) {
746 _mesa_error(ctx
, GL_INVALID_OPERATION
,
747 "glLinkProgram(transform feedback active)");
751 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
753 _mesa_glsl_link_shader(ctx
, shProg
);
755 if (shProg
->LinkStatus
== GL_FALSE
&&
756 (ctx
->Shader
.Flags
& GLSL_REPORT_ERRORS
)) {
757 _mesa_debug(ctx
, "Error linking program %u:\n%s\n",
758 shProg
->Name
, shProg
->InfoLog
);
765 printf("Link %u shaders in program %u: %s\n",
766 shProg
->NumShaders
, shProg
->Name
,
767 shProg
->LinkStatus
? "Success" : "Failed");
769 for (i
= 0; i
< shProg
->NumShaders
; i
++) {
770 printf(" shader %u, type 0x%x\n",
771 shProg
->Shaders
[i
]->Name
,
772 shProg
->Shaders
[i
]->Type
);
779 * Print basic shader info (for debug).
782 print_shader_info(const struct gl_shader_program
*shProg
)
786 printf("Mesa: glUseProgram(%u)\n", shProg
->Name
);
787 for (i
= 0; i
< shProg
->NumShaders
; i
++) {
789 switch (shProg
->Shaders
[i
]->Type
) {
790 case GL_VERTEX_SHADER
:
793 case GL_FRAGMENT_SHADER
:
796 case GL_GEOMETRY_SHADER
:
802 printf(" %s shader %u, checksum %u\n", s
,
803 shProg
->Shaders
[i
]->Name
,
804 shProg
->Shaders
[i
]->SourceChecksum
);
806 if (shProg
->_LinkedShaders
[MESA_SHADER_VERTEX
])
807 printf(" vert prog %u\n",
808 shProg
->_LinkedShaders
[MESA_SHADER_VERTEX
]->Program
->Id
);
809 if (shProg
->_LinkedShaders
[MESA_SHADER_FRAGMENT
])
810 printf(" frag prog %u\n",
811 shProg
->_LinkedShaders
[MESA_SHADER_FRAGMENT
]->Program
->Id
);
812 if (shProg
->_LinkedShaders
[MESA_SHADER_GEOMETRY
])
813 printf(" geom prog %u\n",
814 shProg
->_LinkedShaders
[MESA_SHADER_GEOMETRY
]->Program
->Id
);
819 * Use the named shader program for subsequent glUniform calls
822 _mesa_active_program(struct gl_context
*ctx
, struct gl_shader_program
*shProg
,
825 if ((shProg
!= NULL
) && !shProg
->LinkStatus
) {
826 _mesa_error(ctx
, GL_INVALID_OPERATION
,
827 "%s(program %u not linked)", caller
, shProg
->Name
);
831 if (ctx
->Shader
.ActiveProgram
!= shProg
) {
832 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.ActiveProgram
, shProg
);
839 use_shader_program(struct gl_context
*ctx
, GLenum type
,
840 struct gl_shader_program
*shProg
)
842 struct gl_shader_program
**target
;
845 case GL_VERTEX_SHADER
:
846 target
= &ctx
->Shader
.CurrentVertexProgram
;
848 || (shProg
->_LinkedShaders
[MESA_SHADER_VERTEX
] == NULL
)) {
852 case GL_GEOMETRY_SHADER_ARB
:
853 target
= &ctx
->Shader
.CurrentGeometryProgram
;
855 || (shProg
->_LinkedShaders
[MESA_SHADER_GEOMETRY
] == NULL
)) {
859 case GL_FRAGMENT_SHADER
:
860 target
= &ctx
->Shader
.CurrentFragmentProgram
;
862 || (shProg
->_LinkedShaders
[MESA_SHADER_FRAGMENT
] == NULL
)) {
870 if (*target
!= shProg
) {
871 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
| _NEW_PROGRAM_CONSTANTS
);
873 /* If the shader is also bound as the current rendering shader, unbind
874 * it from that binding point as well. This ensures that the correct
875 * semantics of glDeleteProgram are maintained.
878 case GL_VERTEX_SHADER
:
881 case GL_GEOMETRY_SHADER_ARB
:
884 case GL_FRAGMENT_SHADER
:
885 if (*target
== ctx
->Shader
._CurrentFragmentProgram
) {
886 _mesa_reference_shader_program(ctx
,
887 &ctx
->Shader
._CurrentFragmentProgram
,
893 _mesa_reference_shader_program(ctx
, target
, shProg
);
901 * Use the named shader program for subsequent rendering.
904 _mesa_use_program(struct gl_context
*ctx
, struct gl_shader_program
*shProg
)
906 use_shader_program(ctx
, GL_VERTEX_SHADER
, shProg
);
907 use_shader_program(ctx
, GL_GEOMETRY_SHADER_ARB
, shProg
);
908 use_shader_program(ctx
, GL_FRAGMENT_SHADER
, shProg
);
909 _mesa_active_program(ctx
, shProg
, "glUseProgram");
911 if (ctx
->Driver
.UseProgram
)
912 ctx
->Driver
.UseProgram(ctx
, shProg
);
917 * Do validation of the given shader program.
918 * \param errMsg returns error message if validation fails.
919 * \return GL_TRUE if valid, GL_FALSE if invalid (and set errMsg)
922 validate_shader_program(const struct gl_shader_program
*shProg
,
925 if (!shProg
->LinkStatus
) {
929 /* From the GL spec, a program is invalid if any of these are true:
931 any two active samplers in the current program object are of
932 different types, but refer to the same texture image unit,
934 any active sampler in the current program object refers to a texture
935 image unit where fixed-function fragment processing accesses a
936 texture target that does not match the sampler type, or
938 the sum of the number of active samplers in the program and the
939 number of texture image units enabled for fixed-function fragment
940 processing exceeds the combined limit on the total number of texture
946 * Check: any two active samplers in the current program object are of
947 * different types, but refer to the same texture image unit,
949 if (!_mesa_sampler_uniforms_are_valid(shProg
, errMsg
, 100))
957 * Called via glValidateProgram()
960 validate_program(struct gl_context
*ctx
, GLuint program
)
962 struct gl_shader_program
*shProg
;
963 char errMsg
[100] = "";
965 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glValidateProgram");
970 shProg
->Validated
= validate_shader_program(shProg
, errMsg
);
971 if (!shProg
->Validated
) {
972 /* update info log */
973 if (shProg
->InfoLog
) {
974 ralloc_free(shProg
->InfoLog
);
976 shProg
->InfoLog
= ralloc_strdup(shProg
, errMsg
);
983 _mesa_AttachObjectARB(GLhandleARB program
, GLhandleARB shader
)
985 GET_CURRENT_CONTEXT(ctx
);
986 attach_shader(ctx
, program
, shader
);
991 _mesa_AttachShader(GLuint program
, GLuint shader
)
993 GET_CURRENT_CONTEXT(ctx
);
994 attach_shader(ctx
, program
, shader
);
999 _mesa_CompileShader(GLhandleARB shaderObj
)
1001 GET_CURRENT_CONTEXT(ctx
);
1002 if (MESA_VERBOSE
& VERBOSE_API
)
1003 _mesa_debug(ctx
, "glCompileShader %u\n", shaderObj
);
1004 compile_shader(ctx
, shaderObj
);
1009 _mesa_CreateShader(GLenum type
)
1011 GET_CURRENT_CONTEXT(ctx
);
1012 if (MESA_VERBOSE
& VERBOSE_API
)
1013 _mesa_debug(ctx
, "glCreateShader %s\n", _mesa_lookup_enum_by_nr(type
));
1014 return create_shader(ctx
, type
);
1018 GLhandleARB GLAPIENTRY
1019 _mesa_CreateShaderObjectARB(GLenum type
)
1021 GET_CURRENT_CONTEXT(ctx
);
1022 return create_shader(ctx
, type
);
1027 _mesa_CreateProgram(void)
1029 GET_CURRENT_CONTEXT(ctx
);
1030 if (MESA_VERBOSE
& VERBOSE_API
)
1031 _mesa_debug(ctx
, "glCreateProgram\n");
1032 return create_shader_program(ctx
);
1036 GLhandleARB GLAPIENTRY
1037 _mesa_CreateProgramObjectARB(void)
1039 GET_CURRENT_CONTEXT(ctx
);
1040 return create_shader_program(ctx
);
1045 _mesa_DeleteObjectARB(GLhandleARB obj
)
1047 if (MESA_VERBOSE
& VERBOSE_API
) {
1048 GET_CURRENT_CONTEXT(ctx
);
1049 _mesa_debug(ctx
, "glDeleteObjectARB(%u)\n", obj
);
1053 GET_CURRENT_CONTEXT(ctx
);
1054 FLUSH_VERTICES(ctx
, 0);
1055 if (is_program(ctx
, obj
)) {
1056 delete_shader_program(ctx
, obj
);
1058 else if (is_shader(ctx
, obj
)) {
1059 delete_shader(ctx
, obj
);
1069 _mesa_DeleteProgram(GLuint name
)
1072 GET_CURRENT_CONTEXT(ctx
);
1073 FLUSH_VERTICES(ctx
, 0);
1074 delete_shader_program(ctx
, name
);
1080 _mesa_DeleteShader(GLuint name
)
1083 GET_CURRENT_CONTEXT(ctx
);
1084 FLUSH_VERTICES(ctx
, 0);
1085 delete_shader(ctx
, name
);
1091 _mesa_DetachObjectARB(GLhandleARB program
, GLhandleARB shader
)
1093 GET_CURRENT_CONTEXT(ctx
);
1094 detach_shader(ctx
, program
, shader
);
1099 _mesa_DetachShader(GLuint program
, GLuint shader
)
1101 GET_CURRENT_CONTEXT(ctx
);
1102 detach_shader(ctx
, program
, shader
);
1107 _mesa_GetAttachedObjectsARB(GLhandleARB container
, GLsizei maxCount
,
1108 GLsizei
* count
, GLhandleARB
* obj
)
1110 GET_CURRENT_CONTEXT(ctx
);
1111 get_attached_shaders(ctx
, container
, maxCount
, count
, obj
);
1116 _mesa_GetAttachedShaders(GLuint program
, GLsizei maxCount
,
1117 GLsizei
*count
, GLuint
*obj
)
1119 GET_CURRENT_CONTEXT(ctx
);
1120 get_attached_shaders(ctx
, program
, maxCount
, count
, obj
);
1125 _mesa_GetInfoLogARB(GLhandleARB object
, GLsizei maxLength
, GLsizei
* length
,
1126 GLcharARB
* infoLog
)
1128 GET_CURRENT_CONTEXT(ctx
);
1129 if (is_program(ctx
, object
)) {
1130 get_program_info_log(ctx
, object
, maxLength
, length
, infoLog
);
1132 else if (is_shader(ctx
, object
)) {
1133 get_shader_info_log(ctx
, object
, maxLength
, length
, infoLog
);
1136 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetInfoLogARB");
1142 _mesa_GetObjectParameterivARB(GLhandleARB object
, GLenum pname
, GLint
*params
)
1144 GET_CURRENT_CONTEXT(ctx
);
1145 /* Implement in terms of GetProgramiv, GetShaderiv */
1146 if (is_program(ctx
, object
)) {
1147 if (pname
== GL_OBJECT_TYPE_ARB
) {
1148 *params
= GL_PROGRAM_OBJECT_ARB
;
1151 get_programiv(ctx
, object
, pname
, params
);
1154 else if (is_shader(ctx
, object
)) {
1155 if (pname
== GL_OBJECT_TYPE_ARB
) {
1156 *params
= GL_SHADER_OBJECT_ARB
;
1159 get_shaderiv(ctx
, object
, pname
, params
);
1163 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetObjectParameterivARB");
1169 _mesa_GetObjectParameterfvARB(GLhandleARB object
, GLenum pname
,
1172 GLint iparams
[1]; /* XXX is one element enough? */
1173 _mesa_GetObjectParameterivARB(object
, pname
, iparams
);
1174 params
[0] = (GLfloat
) iparams
[0];
1179 _mesa_GetProgramiv(GLuint program
, GLenum pname
, GLint
*params
)
1181 GET_CURRENT_CONTEXT(ctx
);
1182 get_programiv(ctx
, program
, pname
, params
);
1187 _mesa_GetShaderiv(GLuint shader
, GLenum pname
, GLint
*params
)
1189 GET_CURRENT_CONTEXT(ctx
);
1190 get_shaderiv(ctx
, shader
, pname
, params
);
1195 _mesa_GetProgramInfoLog(GLuint program
, GLsizei bufSize
,
1196 GLsizei
*length
, GLchar
*infoLog
)
1198 GET_CURRENT_CONTEXT(ctx
);
1199 get_program_info_log(ctx
, program
, bufSize
, length
, infoLog
);
1204 _mesa_GetShaderInfoLog(GLuint shader
, GLsizei bufSize
,
1205 GLsizei
*length
, GLchar
*infoLog
)
1207 GET_CURRENT_CONTEXT(ctx
);
1208 get_shader_info_log(ctx
, shader
, bufSize
, length
, infoLog
);
1213 _mesa_GetShaderSource(GLhandleARB shader
, GLsizei maxLength
,
1214 GLsizei
*length
, GLcharARB
*sourceOut
)
1216 GET_CURRENT_CONTEXT(ctx
);
1217 get_shader_source(ctx
, shader
, maxLength
, length
, sourceOut
);
1221 GLhandleARB GLAPIENTRY
1222 _mesa_GetHandleARB(GLenum pname
)
1224 GET_CURRENT_CONTEXT(ctx
);
1225 return get_handle(ctx
, pname
);
1229 GLboolean GLAPIENTRY
1230 _mesa_IsProgram(GLuint name
)
1232 GET_CURRENT_CONTEXT(ctx
);
1233 return is_program(ctx
, name
);
1237 GLboolean GLAPIENTRY
1238 _mesa_IsShader(GLuint name
)
1240 GET_CURRENT_CONTEXT(ctx
);
1241 return is_shader(ctx
, name
);
1246 _mesa_LinkProgram(GLhandleARB programObj
)
1248 GET_CURRENT_CONTEXT(ctx
);
1249 link_program(ctx
, programObj
);
1255 * Read shader source code from a file.
1256 * Useful for debugging to override an app's shader.
1259 read_shader(const char *fname
)
1261 const int max
= 50*1000;
1262 FILE *f
= fopen(fname
, "r");
1263 GLcharARB
*buffer
, *shader
;
1270 buffer
= malloc(max
);
1271 len
= fread(buffer
, 1, max
, f
);
1276 shader
= _mesa_strdup(buffer
);
1284 * Called via glShaderSource() and glShaderSourceARB() API functions.
1285 * Basically, concatenate the source code strings into one long string
1286 * and pass it to _mesa_shader_source().
1289 _mesa_ShaderSource(GLhandleARB shaderObj
, GLsizei count
,
1290 const GLcharARB
* const * string
, const GLint
* length
)
1292 GET_CURRENT_CONTEXT(ctx
);
1294 GLsizei i
, totalLength
;
1298 if (!shaderObj
|| string
== NULL
) {
1299 _mesa_error(ctx
, GL_INVALID_VALUE
, "glShaderSourceARB");
1304 * This array holds offsets of where the appropriate string ends, thus the
1305 * last element will be set to the total length of the source code.
1307 offsets
= malloc(count
* sizeof(GLint
));
1308 if (offsets
== NULL
) {
1309 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glShaderSourceARB");
1313 for (i
= 0; i
< count
; i
++) {
1314 if (string
[i
] == NULL
) {
1315 free((GLvoid
*) offsets
);
1316 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1317 "glShaderSourceARB(null string)");
1320 if (length
== NULL
|| length
[i
] < 0)
1321 offsets
[i
] = strlen(string
[i
]);
1323 offsets
[i
] = length
[i
];
1324 /* accumulate string lengths */
1326 offsets
[i
] += offsets
[i
- 1];
1329 /* Total length of source string is sum off all strings plus two.
1330 * One extra byte for terminating zero, another extra byte to silence
1331 * valgrind warnings in the parser/grammer code.
1333 totalLength
= offsets
[count
- 1] + 2;
1334 source
= malloc(totalLength
* sizeof(GLcharARB
));
1335 if (source
== NULL
) {
1336 free((GLvoid
*) offsets
);
1337 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glShaderSourceARB");
1341 for (i
= 0; i
< count
; i
++) {
1342 GLint start
= (i
> 0) ? offsets
[i
- 1] : 0;
1343 memcpy(source
+ start
, string
[i
],
1344 (offsets
[i
] - start
) * sizeof(GLcharARB
));
1346 source
[totalLength
- 1] = '\0';
1347 source
[totalLength
- 2] = '\0';
1350 /* Compute the shader's source code checksum then try to open a file
1351 * named newshader_<CHECKSUM>. If it exists, use it in place of the
1352 * original shader source code. For debugging.
1355 GLcharARB
*newSource
;
1357 checksum
= _mesa_str_checksum(source
);
1359 _mesa_snprintf(filename
, sizeof(filename
), "newshader_%d", checksum
);
1361 newSource
= read_shader(filename
);
1363 fprintf(stderr
, "Mesa: Replacing shader %u chksum=%d with %s\n",
1364 shaderObj
, checksum
, filename
);
1370 shader_source(ctx
, shaderObj
, source
);
1373 struct gl_shader
*sh
= _mesa_lookup_shader(ctx
, shaderObj
);
1375 sh
->SourceChecksum
= checksum
; /* save original checksum */
1383 _mesa_UseProgram(GLhandleARB program
)
1385 GET_CURRENT_CONTEXT(ctx
);
1386 struct gl_shader_program
*shProg
;
1388 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1390 if (_mesa_is_xfb_active_and_unpaused(ctx
)) {
1391 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1392 "glUseProgram(transform feedback active)");
1397 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glUseProgram");
1401 if (!shProg
->LinkStatus
) {
1402 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1403 "glUseProgram(program %u not linked)", program
);
1408 if (ctx
->Shader
.Flags
& GLSL_USE_PROG
) {
1409 print_shader_info(shProg
);
1416 _mesa_use_program(ctx
, shProg
);
1421 _mesa_ValidateProgram(GLhandleARB program
)
1423 GET_CURRENT_CONTEXT(ctx
);
1424 validate_program(ctx
, program
);
1430 _mesa_GetShaderPrecisionFormat(GLenum shadertype
, GLenum precisiontype
,
1431 GLint
* range
, GLint
* precision
)
1433 const struct gl_program_constants
*limits
;
1434 const struct gl_precision
*p
;
1435 GET_CURRENT_CONTEXT(ctx
);
1437 switch (shadertype
) {
1438 case GL_VERTEX_SHADER
:
1439 limits
= &ctx
->Const
.VertexProgram
;
1441 case GL_FRAGMENT_SHADER
:
1442 limits
= &ctx
->Const
.FragmentProgram
;
1445 _mesa_error(ctx
, GL_INVALID_ENUM
,
1446 "glGetShaderPrecisionFormat(shadertype)");
1450 switch (precisiontype
) {
1452 p
= &limits
->LowFloat
;
1454 case GL_MEDIUM_FLOAT
:
1455 p
= &limits
->MediumFloat
;
1458 p
= &limits
->HighFloat
;
1461 p
= &limits
->LowInt
;
1464 p
= &limits
->MediumInt
;
1467 p
= &limits
->HighInt
;
1470 _mesa_error(ctx
, GL_INVALID_ENUM
,
1471 "glGetShaderPrecisionFormat(precisiontype)");
1475 range
[0] = p
->RangeMin
;
1476 range
[1] = p
->RangeMax
;
1477 precision
[0] = p
->Precision
;
1482 _mesa_ReleaseShaderCompiler(void)
1484 _mesa_destroy_shader_compiler_caches();
1489 _mesa_ShaderBinary(GLint n
, const GLuint
* shaders
, GLenum binaryformat
,
1490 const void* binary
, GLint length
)
1492 GET_CURRENT_CONTEXT(ctx
);
1495 (void) binaryformat
;
1498 _mesa_error(ctx
, GL_INVALID_OPERATION
, __FUNCTION__
);
1501 #endif /* FEATURE_ES2 */
1504 _mesa_GetProgramBinary(GLuint program
, GLsizei bufSize
, GLsizei
*length
,
1505 GLenum
*binaryFormat
, GLvoid
*binary
)
1507 struct gl_shader_program
*shProg
;
1508 GET_CURRENT_CONTEXT(ctx
);
1510 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1512 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glGetProgramBinary");
1516 if (!shProg
->LinkStatus
) {
1517 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1518 "glGetProgramBinary(program %u not linked)",
1524 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramBinary(bufSize < 0)");
1528 /* The ARB_get_program_binary spec says:
1530 * "If <length> is NULL, then no length is returned."
1535 (void) binaryFormat
;
1540 _mesa_ProgramBinary(GLuint program
, GLenum binaryFormat
,
1541 const GLvoid
*binary
, GLsizei length
)
1543 struct gl_shader_program
*shProg
;
1544 GET_CURRENT_CONTEXT(ctx
);
1546 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1548 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glProgramBinary");
1552 (void) binaryFormat
;
1555 _mesa_error(ctx
, GL_INVALID_OPERATION
, __FUNCTION__
);
1560 _mesa_ProgramParameteri(GLuint program
, GLenum pname
, GLint value
)
1562 struct gl_shader_program
*shProg
;
1563 GET_CURRENT_CONTEXT(ctx
);
1565 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1567 shProg
= _mesa_lookup_shader_program_err(ctx
, program
,
1568 "glProgramParameteri");
1573 case GL_GEOMETRY_VERTICES_OUT_ARB
:
1574 if (!_mesa_is_desktop_gl(ctx
) || !ctx
->Extensions
.ARB_geometry_shader4
)
1578 (unsigned) value
> ctx
->Const
.MaxGeometryOutputVertices
) {
1579 _mesa_error(ctx
, GL_INVALID_VALUE
,
1580 "glProgramParameteri(GL_GEOMETRY_VERTICES_OUT_ARB=%d",
1584 shProg
->Geom
.VerticesOut
= value
;
1586 case GL_GEOMETRY_INPUT_TYPE_ARB
:
1587 if (!_mesa_is_desktop_gl(ctx
) || !ctx
->Extensions
.ARB_geometry_shader4
)
1593 case GL_LINES_ADJACENCY_ARB
:
1595 case GL_TRIANGLES_ADJACENCY_ARB
:
1596 shProg
->Geom
.InputType
= value
;
1599 _mesa_error(ctx
, GL_INVALID_VALUE
,
1600 "glProgramParameteri(geometry input type = %s",
1601 _mesa_lookup_enum_by_nr(value
));
1605 case GL_GEOMETRY_OUTPUT_TYPE_ARB
:
1606 if (!_mesa_is_desktop_gl(ctx
) || !ctx
->Extensions
.ARB_geometry_shader4
)
1612 case GL_TRIANGLE_STRIP
:
1613 shProg
->Geom
.OutputType
= value
;
1616 _mesa_error(ctx
, GL_INVALID_VALUE
,
1617 "glProgramParameteri(geometry output type = %s",
1618 _mesa_lookup_enum_by_nr(value
));
1626 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramParameteri(pname=%s)",
1627 _mesa_lookup_enum_by_nr(pname
));
1631 _mesa_use_shader_program(struct gl_context
*ctx
, GLenum type
,
1632 struct gl_shader_program
*shProg
)
1634 use_shader_program(ctx
, type
, shProg
);
1636 if (ctx
->Driver
.UseProgram
)
1637 ctx
->Driver
.UseProgram(ctx
, shProg
);
1642 * For GL_EXT_separate_shader_objects
1645 _mesa_UseShaderProgramEXT(GLenum type
, GLuint program
)
1647 GET_CURRENT_CONTEXT(ctx
);
1648 struct gl_shader_program
*shProg
= NULL
;
1650 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1652 if (!validate_shader_target(ctx
, type
)) {
1653 _mesa_error(ctx
, GL_INVALID_ENUM
, "glUseShaderProgramEXT(type)");
1657 if (_mesa_is_xfb_active_and_unpaused(ctx
)) {
1658 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1659 "glUseShaderProgramEXT(transform feedback is active)");
1664 shProg
= _mesa_lookup_shader_program_err(ctx
, program
,
1665 "glUseShaderProgramEXT");
1669 if (!shProg
->LinkStatus
) {
1670 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1671 "glUseShaderProgramEXT(program not linked)");
1676 _mesa_use_shader_program(ctx
, type
, shProg
);
1681 * For GL_EXT_separate_shader_objects
1684 _mesa_ActiveProgramEXT(GLuint program
)
1686 GET_CURRENT_CONTEXT(ctx
);
1687 struct gl_shader_program
*shProg
= (program
!= 0)
1688 ? _mesa_lookup_shader_program_err(ctx
, program
, "glActiveProgramEXT")
1691 _mesa_active_program(ctx
, shProg
, "glActiveProgramEXT");
1697 * For GL_EXT_separate_shader_objects
1700 _mesa_CreateShaderProgramEXT(GLenum type
, const GLchar
*string
)
1702 GET_CURRENT_CONTEXT(ctx
);
1703 const GLuint shader
= create_shader(ctx
, type
);
1707 shader_source(ctx
, shader
, _mesa_strdup(string
));
1708 compile_shader(ctx
, shader
);
1710 program
= create_shader_program(ctx
);
1712 struct gl_shader_program
*shProg
;
1713 struct gl_shader
*sh
;
1714 GLint compiled
= GL_FALSE
;
1716 shProg
= _mesa_lookup_shader_program(ctx
, program
);
1717 sh
= _mesa_lookup_shader(ctx
, shader
);
1719 get_shaderiv(ctx
, shader
, GL_COMPILE_STATUS
, &compiled
);
1721 attach_shader(ctx
, program
, shader
);
1722 link_program(ctx
, program
);
1723 detach_shader(ctx
, program
, shader
);
1727 if (active
-user
-defined
-varyings
-in
-linked
-program
) {
1728 append
-error
-to
-info
-log
;
1729 shProg
->LinkStatus
= GL_FALSE
;
1734 ralloc_strcat(&shProg
->InfoLog
, sh
->InfoLog
);
1737 delete_shader(ctx
, shader
);
1744 * Plug in shader-related functions into API dispatch table.
1747 _mesa_init_shader_dispatch(const struct gl_context
*ctx
,
1748 struct _glapi_table
*exec
)
1751 /* GL_ARB_vertex/fragment_shader */
1752 if (_mesa_is_desktop_gl(ctx
)) {
1753 SET_DeleteObjectARB(exec
, _mesa_DeleteObjectARB
);
1754 SET_GetHandleARB(exec
, _mesa_GetHandleARB
);
1755 SET_DetachObjectARB(exec
, _mesa_DetachObjectARB
);
1756 SET_CreateShaderObjectARB(exec
, _mesa_CreateShaderObjectARB
);
1757 SET_CreateProgramObjectARB(exec
, _mesa_CreateProgramObjectARB
);
1758 SET_AttachObjectARB(exec
, _mesa_AttachObjectARB
);
1759 SET_GetObjectParameterfvARB(exec
, _mesa_GetObjectParameterfvARB
);
1760 SET_GetObjectParameterivARB(exec
, _mesa_GetObjectParameterivARB
);
1761 SET_GetInfoLogARB(exec
, _mesa_GetInfoLogARB
);
1762 SET_GetAttachedObjectsARB(exec
, _mesa_GetAttachedObjectsARB
);
1765 if (ctx
->API
!= API_OPENGLES
) {
1766 SET_ShaderSource(exec
, _mesa_ShaderSource
);
1767 SET_CompileShader(exec
, _mesa_CompileShader
);
1768 SET_LinkProgram(exec
, _mesa_LinkProgram
);
1769 SET_UseProgram(exec
, _mesa_UseProgram
);
1770 SET_ValidateProgram(exec
, _mesa_ValidateProgram
);
1771 SET_GetShaderSource(exec
, _mesa_GetShaderSource
);
1774 SET_AttachShader(exec
, _mesa_AttachShader
);
1775 SET_CreateProgram(exec
, _mesa_CreateProgram
);
1776 SET_CreateShader(exec
, _mesa_CreateShader
);
1777 SET_DeleteProgram(exec
, _mesa_DeleteProgram
);
1778 SET_DeleteShader(exec
, _mesa_DeleteShader
);
1779 SET_DetachShader(exec
, _mesa_DetachShader
);
1780 SET_GetAttachedShaders(exec
, _mesa_GetAttachedShaders
);
1781 SET_GetProgramiv(exec
, _mesa_GetProgramiv
);
1782 SET_GetProgramInfoLog(exec
, _mesa_GetProgramInfoLog
);
1783 SET_GetShaderiv(exec
, _mesa_GetShaderiv
);
1784 SET_GetShaderInfoLog(exec
, _mesa_GetShaderInfoLog
);
1785 SET_IsProgram(exec
, _mesa_IsProgram
);
1786 SET_IsShader(exec
, _mesa_IsShader
);
1788 /* GL_ARB_vertex_shader */
1789 SET_BindAttribLocation(exec
, _mesa_BindAttribLocation
);
1790 SET_GetActiveAttrib(exec
, _mesa_GetActiveAttrib
);
1791 SET_GetAttribLocation(exec
, _mesa_GetAttribLocation
);
1794 if (ctx
->API
== API_OPENGL_COMPAT
) {
1795 SET_UseShaderProgramEXT(exec
, _mesa_UseShaderProgramEXT
);
1796 SET_ActiveProgramEXT(exec
, _mesa_ActiveProgramEXT
);
1797 SET_CreateShaderProgramEXT(exec
, _mesa_CreateShaderProgramEXT
);
1800 /* GL_EXT_gpu_shader4 / GL 3.0 */
1801 if (_mesa_is_desktop_gl(ctx
)) {
1802 SET_BindFragDataLocation(exec
, _mesa_BindFragDataLocation
);
1804 if (_mesa_is_desktop_gl(ctx
) || _mesa_is_gles3(ctx
)) {
1805 SET_GetFragDataLocation(exec
, _mesa_GetFragDataLocation
);
1808 /* GL_ARB_ES2_compatibility */
1809 if (ctx
->API
!= API_OPENGLES
) {
1810 SET_ReleaseShaderCompiler(exec
, _mesa_ReleaseShaderCompiler
);
1811 SET_GetShaderPrecisionFormat(exec
, _mesa_GetShaderPrecisionFormat
);
1812 SET_ShaderBinary(exec
, _mesa_ShaderBinary
);
1815 /* GL_ARB_blend_func_extended */
1816 if (_mesa_is_desktop_gl(ctx
)) {
1817 SET_BindFragDataLocationIndexed(exec
, _mesa_BindFragDataLocationIndexed
);
1818 SET_GetFragDataIndex(exec
, _mesa_GetFragDataIndex
);
1820 #endif /* FEATURE_GL */