2 * Mesa 3-D graphics library
4 * Copyright (C) 2004-2008 Brian Paul All Rights Reserved.
5 * Copyright (C) 2009-2010 VMware, Inc. All Rights Reserved.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 * Implementation of GLSL-related API functions.
30 * The glUniform* functions are in uniforms.c
34 * 1. Check that the right error code is generated for all _mesa_error() calls.
35 * 2. Insert FLUSH_VERTICES calls in various places
39 #include "main/glheader.h"
40 #include "main/context.h"
41 #include "main/dispatch.h"
42 #include "main/enums.h"
43 #include "main/hash.h"
44 #include "main/mfeatures.h"
45 #include "main/mtypes.h"
46 #include "main/shaderapi.h"
47 #include "main/shaderobj.h"
48 #include "program/program.h"
49 #include "program/prog_parameter.h"
50 #include "program/prog_uniform.h"
54 /** Define this to enable shader substitution (see below) */
55 #define SHADER_SUBST 0
59 * Return mask of GLSL_x flags by examining the MESA_GLSL env var.
62 get_shader_flags(void)
64 GLbitfield flags
= 0x0;
65 const char *env
= _mesa_getenv("MESA_GLSL");
68 if (strstr(env
, "dump"))
70 if (strstr(env
, "log"))
72 if (strstr(env
, "nopvert"))
73 flags
|= GLSL_NOP_VERT
;
74 if (strstr(env
, "nopfrag"))
75 flags
|= GLSL_NOP_FRAG
;
76 if (strstr(env
, "nopt"))
78 else if (strstr(env
, "opt"))
80 if (strstr(env
, "uniform"))
81 flags
|= GLSL_UNIFORMS
;
82 if (strstr(env
, "useprog"))
83 flags
|= GLSL_USE_PROG
;
91 * Initialize context's shader state.
94 _mesa_init_shader_state(struct gl_context
*ctx
)
96 /* Device drivers may override these to control what kind of instructions
97 * are generated by the GLSL compiler.
99 struct gl_shader_compiler_options options
;
102 memset(&options
, 0, sizeof(options
));
103 options
.MaxUnrollIterations
= 32;
105 /* Default pragma settings */
106 options
.DefaultPragmas
.Optimize
= GL_TRUE
;
108 for (sh
= 0; sh
< MESA_SHADER_TYPES
; ++sh
)
109 memcpy(&ctx
->ShaderCompilerOptions
[sh
], &options
, sizeof(options
));
111 ctx
->Shader
.Flags
= get_shader_flags();
116 * Free the per-context shader-related state.
119 _mesa_free_shader_state(struct gl_context
*ctx
)
121 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.CurrentVertexProgram
, NULL
);
122 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.CurrentGeometryProgram
,
124 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.CurrentFragmentProgram
,
126 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.ActiveProgram
, NULL
);
131 * Return the size of the given GLSL datatype, in floats (components).
134 _mesa_sizeof_glsl_type(GLenum type
)
143 case GL_SAMPLER_CUBE
:
144 case GL_SAMPLER_1D_SHADOW
:
145 case GL_SAMPLER_2D_SHADOW
:
146 case GL_SAMPLER_2D_RECT_ARB
:
147 case GL_SAMPLER_2D_RECT_SHADOW_ARB
:
148 case GL_SAMPLER_1D_ARRAY_EXT
:
149 case GL_SAMPLER_2D_ARRAY_EXT
:
150 case GL_SAMPLER_1D_ARRAY_SHADOW_EXT
:
151 case GL_SAMPLER_2D_ARRAY_SHADOW_EXT
:
152 case GL_SAMPLER_CUBE_SHADOW_EXT
:
156 case GL_UNSIGNED_INT_VEC2
:
161 case GL_UNSIGNED_INT_VEC3
:
166 case GL_UNSIGNED_INT_VEC4
:
170 case GL_FLOAT_MAT2x3
:
171 case GL_FLOAT_MAT2x4
:
172 return 8; /* two float[4] vectors */
174 case GL_FLOAT_MAT3x2
:
175 case GL_FLOAT_MAT3x4
:
176 return 12; /* three float[4] vectors */
178 case GL_FLOAT_MAT4x2
:
179 case GL_FLOAT_MAT4x3
:
180 return 16; /* four float[4] vectors */
182 _mesa_problem(NULL
, "Invalid type in _mesa_sizeof_glsl_type()");
189 * Copy string from <src> to <dst>, up to maxLength characters, returning
190 * length of <dst> in <length>.
191 * \param src the strings source
192 * \param maxLength max chars to copy
193 * \param length returns number of chars copied
194 * \param dst the string destination
197 _mesa_copy_string(GLchar
*dst
, GLsizei maxLength
,
198 GLsizei
*length
, const GLchar
*src
)
201 for (len
= 0; len
< maxLength
- 1 && src
&& src
[len
]; len
++)
212 * Confirm that the a shader type is valid and supported by the implementation
214 * \param ctx Current GL context
215 * \param type Shader target
219 validate_shader_target(const struct gl_context
*ctx
, GLenum type
)
222 #if FEATURE_ARB_fragment_shader
223 case GL_FRAGMENT_SHADER
:
224 return ctx
->Extensions
.ARB_fragment_shader
;
226 #if FEATURE_ARB_vertex_shader
227 case GL_VERTEX_SHADER
:
228 return ctx
->Extensions
.ARB_vertex_shader
;
230 #if FEATURE_ARB_geometry_shader4
231 case GL_GEOMETRY_SHADER_ARB
:
232 return ctx
->Extensions
.ARB_geometry_shader4
;
241 * Find the length of the longest transform feedback varying name
242 * which was specified with glTransformFeedbackVaryings().
245 longest_feedback_varying_name(const struct gl_shader_program
*shProg
)
249 for (i
= 0; i
< shProg
->TransformFeedback
.NumVarying
; i
++) {
250 GLint len
= strlen(shProg
->TransformFeedback
.VaryingNames
[i
]);
260 is_program(struct gl_context
*ctx
, GLuint name
)
262 struct gl_shader_program
*shProg
= _mesa_lookup_shader_program(ctx
, name
);
263 return shProg
? GL_TRUE
: GL_FALSE
;
268 is_shader(struct gl_context
*ctx
, GLuint name
)
270 struct gl_shader
*shader
= _mesa_lookup_shader(ctx
, name
);
271 return shader
? GL_TRUE
: GL_FALSE
;
276 * Attach shader to a shader program.
279 attach_shader(struct gl_context
*ctx
, GLuint program
, GLuint shader
)
281 struct gl_shader_program
*shProg
;
282 struct gl_shader
*sh
;
285 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glAttachShader");
289 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glAttachShader");
294 n
= shProg
->NumShaders
;
295 for (i
= 0; i
< n
; i
++) {
296 if (shProg
->Shaders
[i
] == sh
) {
297 /* The shader is already attched to this program. The
298 * GL_ARB_shader_objects spec says:
300 * "The error INVALID_OPERATION is generated by AttachObjectARB
301 * if <obj> is already attached to <containerObj>."
303 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glAttachShader");
309 shProg
->Shaders
= (struct gl_shader
**)
310 _mesa_realloc(shProg
->Shaders
,
311 n
* sizeof(struct gl_shader
*),
312 (n
+ 1) * sizeof(struct gl_shader
*));
313 if (!shProg
->Shaders
) {
314 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glAttachShader");
319 shProg
->Shaders
[n
] = NULL
; /* since realloc() didn't zero the new space */
320 _mesa_reference_shader(ctx
, &shProg
->Shaders
[n
], sh
);
321 shProg
->NumShaders
++;
326 get_attrib_location(struct gl_context
*ctx
, GLuint program
, const GLchar
*name
)
328 struct gl_shader_program
*shProg
329 = _mesa_lookup_shader_program_err(ctx
, program
, "glGetAttribLocation");
335 if (!shProg
->LinkStatus
) {
336 _mesa_error(ctx
, GL_INVALID_OPERATION
,
337 "glGetAttribLocation(program not linked)");
344 if (shProg
->VertexProgram
) {
345 const struct gl_program_parameter_list
*attribs
=
346 shProg
->VertexProgram
->Base
.Attributes
;
348 GLint i
= _mesa_lookup_parameter_index(attribs
, -1, name
);
350 return attribs
->Parameters
[i
].StateIndexes
[0];
359 bind_attrib_location(struct gl_context
*ctx
, GLuint program
, GLuint index
,
362 struct gl_shader_program
*shProg
;
363 const GLint size
= -1; /* unknown size */
365 GLenum datatype
= GL_FLOAT_VEC4
;
367 shProg
= _mesa_lookup_shader_program_err(ctx
, program
,
368 "glBindAttribLocation");
376 if (strncmp(name
, "gl_", 3) == 0) {
377 _mesa_error(ctx
, GL_INVALID_OPERATION
,
378 "glBindAttribLocation(illegal name)");
382 if (index
>= ctx
->Const
.VertexProgram
.MaxAttribs
) {
383 _mesa_error(ctx
, GL_INVALID_VALUE
, "glBindAttribLocation(index)");
387 if (shProg
->LinkStatus
) {
388 /* get current index/location for the attribute */
389 oldIndex
= get_attrib_location(ctx
, program
, name
);
395 /* this will replace the current value if it's already in the list */
396 i
= _mesa_add_attribute(shProg
->Attributes
, name
, size
, datatype
, index
);
398 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glBindAttribLocation");
403 * Note that this attribute binding won't go into effect until
404 * glLinkProgram is called again.
410 bind_frag_data_location(struct gl_context
*ctx
, GLuint program
,
411 GLuint colorNumber
, const GLchar
*name
)
413 _mesa_problem(ctx
, "bind_frag_data_location() not implemented yet");
418 create_shader(struct gl_context
*ctx
, GLenum type
)
420 struct gl_shader
*sh
;
423 if (!validate_shader_target(ctx
, type
)) {
424 _mesa_error(ctx
, GL_INVALID_ENUM
, "CreateShader(type)");
428 name
= _mesa_HashFindFreeKeyBlock(ctx
->Shared
->ShaderObjects
, 1);
429 sh
= ctx
->Driver
.NewShader(ctx
, name
, type
);
430 _mesa_HashInsert(ctx
->Shared
->ShaderObjects
, name
, sh
);
437 create_shader_program(struct gl_context
*ctx
)
440 struct gl_shader_program
*shProg
;
442 name
= _mesa_HashFindFreeKeyBlock(ctx
->Shared
->ShaderObjects
, 1);
444 shProg
= ctx
->Driver
.NewShaderProgram(ctx
, name
);
446 _mesa_HashInsert(ctx
->Shared
->ShaderObjects
, name
, shProg
);
448 assert(shProg
->RefCount
== 1);
455 * Named w/ "2" to indicate OpenGL 2.x vs GL_ARB_fragment_programs's
459 delete_shader_program(struct gl_context
*ctx
, GLuint name
)
462 * NOTE: deleting shaders/programs works a bit differently than
463 * texture objects (and buffer objects, etc). Shader/program
464 * handles/IDs exist in the hash table until the object is really
465 * deleted (refcount==0). With texture objects, the handle/ID is
466 * removed from the hash table in glDeleteTextures() while the tex
467 * object itself might linger until its refcount goes to zero.
469 struct gl_shader_program
*shProg
;
471 shProg
= _mesa_lookup_shader_program_err(ctx
, name
, "glDeleteProgram");
475 shProg
->DeletePending
= GL_TRUE
;
477 /* effectively, decr shProg's refcount */
478 _mesa_reference_shader_program(ctx
, &shProg
, NULL
);
483 delete_shader(struct gl_context
*ctx
, GLuint shader
)
485 struct gl_shader
*sh
;
487 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glDeleteShader");
491 sh
->DeletePending
= GL_TRUE
;
493 /* effectively, decr sh's refcount */
494 _mesa_reference_shader(ctx
, &sh
, NULL
);
499 detach_shader(struct gl_context
*ctx
, GLuint program
, GLuint shader
)
501 struct gl_shader_program
*shProg
;
505 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glDetachShader");
509 n
= shProg
->NumShaders
;
511 for (i
= 0; i
< n
; i
++) {
512 if (shProg
->Shaders
[i
]->Name
== shader
) {
514 struct gl_shader
**newList
;
517 _mesa_reference_shader(ctx
, &shProg
->Shaders
[i
], NULL
);
519 /* alloc new, smaller array */
520 newList
= (struct gl_shader
**)
521 malloc((n
- 1) * sizeof(struct gl_shader
*));
523 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glDetachShader");
526 for (j
= 0; j
< i
; j
++) {
527 newList
[j
] = shProg
->Shaders
[j
];
530 newList
[j
++] = shProg
->Shaders
[i
];
531 free(shProg
->Shaders
);
533 shProg
->Shaders
= newList
;
534 shProg
->NumShaders
= n
- 1;
539 for (j
= 0; j
< shProg
->NumShaders
; j
++) {
540 assert(shProg
->Shaders
[j
]->Type
== GL_VERTEX_SHADER
||
541 shProg
->Shaders
[j
]->Type
== GL_FRAGMENT_SHADER
);
542 assert(shProg
->Shaders
[j
]->RefCount
> 0);
554 if (is_shader(ctx
, shader
))
555 err
= GL_INVALID_OPERATION
;
556 else if (is_program(ctx
, shader
))
557 err
= GL_INVALID_OPERATION
;
559 err
= GL_INVALID_VALUE
;
560 _mesa_error(ctx
, err
, "glDetachProgram(shader)");
567 get_active_attrib(struct gl_context
*ctx
, GLuint program
, GLuint index
,
568 GLsizei maxLength
, GLsizei
*length
, GLint
*size
,
569 GLenum
*type
, GLchar
*nameOut
)
571 const struct gl_program_parameter_list
*attribs
= NULL
;
572 struct gl_shader_program
*shProg
;
574 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glGetActiveAttrib");
578 if (shProg
->VertexProgram
)
579 attribs
= shProg
->VertexProgram
->Base
.Attributes
;
581 if (!attribs
|| index
>= attribs
->NumParameters
) {
582 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetActiveAttrib(index)");
586 _mesa_copy_string(nameOut
, maxLength
, length
,
587 attribs
->Parameters
[index
].Name
);
590 *size
= attribs
->Parameters
[index
].Size
591 / _mesa_sizeof_glsl_type(attribs
->Parameters
[index
].DataType
);
594 *type
= attribs
->Parameters
[index
].DataType
;
599 * Return list of shaders attached to shader program.
602 get_attached_shaders(struct gl_context
*ctx
, GLuint program
, GLsizei maxCount
,
603 GLsizei
*count
, GLuint
*obj
)
605 struct gl_shader_program
*shProg
=
606 _mesa_lookup_shader_program_err(ctx
, program
, "glGetAttachedShaders");
609 for (i
= 0; i
< (GLuint
) maxCount
&& i
< shProg
->NumShaders
; i
++) {
610 obj
[i
] = shProg
->Shaders
[i
]->Name
;
619 get_frag_data_location(struct gl_context
*ctx
, GLuint program
,
622 _mesa_problem(ctx
, "get_frag_data_location() not implemented yet");
629 * glGetHandleARB() - return ID/name of currently bound shader program.
632 get_handle(struct gl_context
*ctx
, GLenum pname
)
634 if (pname
== GL_PROGRAM_OBJECT_ARB
) {
635 if (ctx
->Shader
.ActiveProgram
)
636 return ctx
->Shader
.ActiveProgram
->Name
;
641 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetHandleARB");
648 * glGetProgramiv() - get shader program state.
649 * Note that this is for GLSL shader programs, not ARB vertex/fragment
650 * programs (see glGetProgramivARB).
653 get_programiv(struct gl_context
*ctx
, GLuint program
, GLenum pname
, GLint
*params
)
655 const struct gl_program_parameter_list
*attribs
;
656 struct gl_shader_program
*shProg
657 = _mesa_lookup_shader_program(ctx
, program
);
660 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramiv(program)");
664 if (shProg
->VertexProgram
)
665 attribs
= shProg
->VertexProgram
->Base
.Attributes
;
670 case GL_DELETE_STATUS
:
671 *params
= shProg
->DeletePending
;
674 *params
= shProg
->LinkStatus
;
676 case GL_VALIDATE_STATUS
:
677 *params
= shProg
->Validated
;
679 case GL_INFO_LOG_LENGTH
:
680 *params
= shProg
->InfoLog
? strlen(shProg
->InfoLog
) + 1 : 0;
682 case GL_ATTACHED_SHADERS
:
683 *params
= shProg
->NumShaders
;
685 case GL_ACTIVE_ATTRIBUTES
:
686 *params
= attribs
? attribs
->NumParameters
: 0;
688 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH
:
689 *params
= _mesa_longest_parameter_name(attribs
, PROGRAM_INPUT
) + 1;
691 case GL_ACTIVE_UNIFORMS
:
692 *params
= shProg
->Uniforms
? shProg
->Uniforms
->NumUniforms
: 0;
694 case GL_ACTIVE_UNIFORM_MAX_LENGTH
:
695 *params
= _mesa_longest_uniform_name(shProg
->Uniforms
);
697 (*params
)++; /* add one for terminating zero */
699 case GL_PROGRAM_BINARY_LENGTH_OES
:
702 #if FEATURE_EXT_transform_feedback
703 case GL_TRANSFORM_FEEDBACK_VARYINGS
:
704 *params
= shProg
->TransformFeedback
.NumVarying
;
706 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH
:
707 *params
= longest_feedback_varying_name(shProg
) + 1;
709 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE
:
710 *params
= shProg
->TransformFeedback
.BufferMode
;
713 #if FEATURE_ARB_geometry_shader4
714 case GL_GEOMETRY_VERTICES_OUT_ARB
:
715 *params
= shProg
->Geom
.VerticesOut
;
717 case GL_GEOMETRY_INPUT_TYPE_ARB
:
718 *params
= shProg
->Geom
.InputType
;
720 case GL_GEOMETRY_OUTPUT_TYPE_ARB
:
721 *params
= shProg
->Geom
.OutputType
;
725 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramiv(pname)");
732 * glGetShaderiv() - get GLSL shader state
735 get_shaderiv(struct gl_context
*ctx
, GLuint name
, GLenum pname
, GLint
*params
)
737 struct gl_shader
*shader
=
738 _mesa_lookup_shader_err(ctx
, name
, "glGetShaderiv");
746 *params
= shader
->Type
;
748 case GL_DELETE_STATUS
:
749 *params
= shader
->DeletePending
;
751 case GL_COMPILE_STATUS
:
752 *params
= shader
->CompileStatus
;
754 case GL_INFO_LOG_LENGTH
:
755 *params
= shader
->InfoLog
? strlen(shader
->InfoLog
) + 1 : 0;
757 case GL_SHADER_SOURCE_LENGTH
:
758 *params
= shader
->Source
? strlen((char *) shader
->Source
) + 1 : 0;
761 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetShaderiv(pname)");
768 get_program_info_log(struct gl_context
*ctx
, GLuint program
, GLsizei bufSize
,
769 GLsizei
*length
, GLchar
*infoLog
)
771 struct gl_shader_program
*shProg
772 = _mesa_lookup_shader_program(ctx
, program
);
774 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramInfoLog(program)");
777 _mesa_copy_string(infoLog
, bufSize
, length
, shProg
->InfoLog
);
782 get_shader_info_log(struct gl_context
*ctx
, GLuint shader
, GLsizei bufSize
,
783 GLsizei
*length
, GLchar
*infoLog
)
785 struct gl_shader
*sh
= _mesa_lookup_shader(ctx
, shader
);
787 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetShaderInfoLog(shader)");
790 _mesa_copy_string(infoLog
, bufSize
, length
, sh
->InfoLog
);
795 * Return shader source code.
798 get_shader_source(struct gl_context
*ctx
, GLuint shader
, GLsizei maxLength
,
799 GLsizei
*length
, GLchar
*sourceOut
)
801 struct gl_shader
*sh
;
802 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glGetShaderSource");
806 _mesa_copy_string(sourceOut
, maxLength
, length
, sh
->Source
);
811 * Set/replace shader source code.
814 shader_source(struct gl_context
*ctx
, GLuint shader
, const GLchar
*source
)
816 struct gl_shader
*sh
;
818 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glShaderSource");
822 /* free old shader source string and install new one */
824 free((void *) sh
->Source
);
827 sh
->CompileStatus
= GL_FALSE
;
829 sh
->SourceChecksum
= _mesa_str_checksum(sh
->Source
);
838 compile_shader(struct gl_context
*ctx
, GLuint shaderObj
)
840 struct gl_shader
*sh
;
841 struct gl_shader_compiler_options
*options
;
843 sh
= _mesa_lookup_shader_err(ctx
, shaderObj
, "glCompileShader");
847 options
= &ctx
->ShaderCompilerOptions
[_mesa_shader_type_to_index(sh
->Type
)];
849 /* set default pragma state for shader */
850 sh
->Pragmas
= options
->DefaultPragmas
;
852 /* this call will set the sh->CompileStatus field to indicate if
853 * compilation was successful.
855 _mesa_glsl_compile_shader(ctx
, sh
);
860 * Link a program's shaders.
863 link_program(struct gl_context
*ctx
, GLuint program
)
865 struct gl_shader_program
*shProg
;
866 struct gl_transform_feedback_object
*obj
=
867 ctx
->TransformFeedback
.CurrentObject
;
869 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glLinkProgram");
874 && (shProg
== ctx
->Shader
.CurrentVertexProgram
875 || shProg
== ctx
->Shader
.CurrentGeometryProgram
876 || shProg
== ctx
->Shader
.CurrentFragmentProgram
)) {
877 _mesa_error(ctx
, GL_INVALID_OPERATION
,
878 "glLinkProgram(transform feedback active");
882 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
884 _mesa_glsl_link_shader(ctx
, shProg
);
890 printf("Link %u shaders in program %u: %s\n",
891 shProg
->NumShaders
, shProg
->Name
,
892 shProg
->LinkStatus
? "Success" : "Failed");
894 for (i
= 0; i
< shProg
->NumShaders
; i
++) {
895 printf(" shader %u, type 0x%x\n",
896 shProg
->Shaders
[i
]->Name
,
897 shProg
->Shaders
[i
]->Type
);
904 * Print basic shader info (for debug).
907 print_shader_info(const struct gl_shader_program
*shProg
)
911 printf("Mesa: glUseProgram(%u)\n", shProg
->Name
);
912 for (i
= 0; i
< shProg
->NumShaders
; i
++) {
914 switch (shProg
->Shaders
[i
]->Type
) {
915 case GL_VERTEX_SHADER
:
918 case GL_FRAGMENT_SHADER
:
921 case GL_GEOMETRY_SHADER
:
927 printf(" %s shader %u, checksum %u\n", s
,
928 shProg
->Shaders
[i
]->Name
,
929 shProg
->Shaders
[i
]->SourceChecksum
);
931 if (shProg
->VertexProgram
)
932 printf(" vert prog %u\n", shProg
->VertexProgram
->Base
.Id
);
933 if (shProg
->FragmentProgram
)
934 printf(" frag prog %u\n", shProg
->FragmentProgram
->Base
.Id
);
939 * Use the named shader program for subsequent glUniform calls
942 _mesa_active_program(struct gl_context
*ctx
, struct gl_shader_program
*shProg
,
945 if ((shProg
!= NULL
) && !shProg
->LinkStatus
) {
946 _mesa_error(ctx
, GL_INVALID_OPERATION
,
947 "%s(program %u not linked)", caller
, shProg
->Name
);
951 if (ctx
->Shader
.ActiveProgram
!= shProg
) {
952 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.ActiveProgram
, shProg
);
959 use_shader_program(struct gl_context
*ctx
, GLenum type
,
960 struct gl_shader_program
*shProg
)
962 struct gl_shader_program
**target
;
965 #if FEATURE_ARB_vertex_shader
966 case GL_VERTEX_SHADER
:
967 target
= &ctx
->Shader
.CurrentVertexProgram
;
969 || (shProg
->_LinkedShaders
[MESA_SHADER_VERTEX
] == NULL
)) {
974 #if FEATURE_ARB_geometry_shader4
975 case GL_GEOMETRY_SHADER_ARB
:
976 target
= &ctx
->Shader
.CurrentGeometryProgram
;
978 || (shProg
->_LinkedShaders
[MESA_SHADER_GEOMETRY
] == NULL
)) {
983 #if FEATURE_ARB_fragment_shader
984 case GL_FRAGMENT_SHADER
:
985 target
= &ctx
->Shader
.CurrentFragmentProgram
;
987 || (shProg
->_LinkedShaders
[MESA_SHADER_FRAGMENT
] == NULL
)) {
996 if (*target
!= shProg
) {
997 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
| _NEW_PROGRAM_CONSTANTS
);
998 _mesa_reference_shader_program(ctx
, target
, shProg
);
1006 * Use the named shader program for subsequent rendering.
1009 _mesa_use_program(struct gl_context
*ctx
, struct gl_shader_program
*shProg
)
1011 use_shader_program(ctx
, GL_VERTEX_SHADER
, shProg
);
1012 use_shader_program(ctx
, GL_GEOMETRY_SHADER_ARB
, shProg
);
1013 use_shader_program(ctx
, GL_FRAGMENT_SHADER
, shProg
);
1014 _mesa_active_program(ctx
, shProg
, "glUseProgram");
1016 if (ctx
->Driver
.UseProgram
)
1017 ctx
->Driver
.UseProgram(ctx
, shProg
);
1022 * Validate a program's samplers.
1023 * Specifically, check that there aren't two samplers of different types
1024 * pointing to the same texture unit.
1025 * \return GL_TRUE if valid, GL_FALSE if invalid
1028 validate_samplers(const struct gl_program
*prog
, char *errMsg
)
1030 static const char *targetName
[] = {
1039 GLint targetUsed
[MAX_TEXTURE_IMAGE_UNITS
];
1040 GLbitfield samplersUsed
= prog
->SamplersUsed
;
1043 assert(Elements(targetName
) == NUM_TEXTURE_TARGETS
);
1045 if (samplersUsed
== 0x0)
1048 for (i
= 0; i
< Elements(targetUsed
); i
++)
1051 /* walk over bits which are set in 'samplers' */
1052 while (samplersUsed
) {
1054 gl_texture_index target
;
1055 GLint sampler
= _mesa_ffs(samplersUsed
) - 1;
1056 assert(sampler
>= 0);
1057 assert(sampler
< MAX_TEXTURE_IMAGE_UNITS
);
1058 unit
= prog
->SamplerUnits
[sampler
];
1059 target
= prog
->SamplerTargets
[sampler
];
1060 if (targetUsed
[unit
] != -1 && targetUsed
[unit
] != (int) target
) {
1061 _mesa_snprintf(errMsg
, 100,
1062 "Texture unit %d is accessed both as %s and %s",
1063 unit
, targetName
[targetUsed
[unit
]], targetName
[target
]);
1066 targetUsed
[unit
] = target
;
1067 samplersUsed
^= (1 << sampler
);
1075 * Do validation of the given shader program.
1076 * \param errMsg returns error message if validation fails.
1077 * \return GL_TRUE if valid, GL_FALSE if invalid (and set errMsg)
1080 validate_shader_program(const struct gl_shader_program
*shProg
,
1083 const struct gl_vertex_program
*vp
= shProg
->VertexProgram
;
1084 const struct gl_fragment_program
*fp
= shProg
->FragmentProgram
;
1086 if (!shProg
->LinkStatus
) {
1090 /* From the GL spec, a program is invalid if any of these are true:
1092 any two active samplers in the current program object are of
1093 different types, but refer to the same texture image unit,
1095 any active sampler in the current program object refers to a texture
1096 image unit where fixed-function fragment processing accesses a
1097 texture target that does not match the sampler type, or
1099 the sum of the number of active samplers in the program and the
1100 number of texture image units enabled for fixed-function fragment
1101 processing exceeds the combined limit on the total number of texture
1102 image units allowed.
1107 * Check: any two active samplers in the current program object are of
1108 * different types, but refer to the same texture image unit,
1110 if (vp
&& !validate_samplers(&vp
->Base
, errMsg
)) {
1113 if (fp
&& !validate_samplers(&fp
->Base
, errMsg
)) {
1122 * Called via glValidateProgram()
1125 validate_program(struct gl_context
*ctx
, GLuint program
)
1127 struct gl_shader_program
*shProg
;
1130 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glValidateProgram");
1135 shProg
->Validated
= validate_shader_program(shProg
, errMsg
);
1136 if (!shProg
->Validated
) {
1137 /* update info log */
1138 if (shProg
->InfoLog
) {
1139 talloc_free(shProg
->InfoLog
);
1141 shProg
->InfoLog
= talloc_strdup(shProg
, errMsg
);
1148 _mesa_AttachObjectARB(GLhandleARB program
, GLhandleARB shader
)
1150 GET_CURRENT_CONTEXT(ctx
);
1151 attach_shader(ctx
, program
, shader
);
1156 _mesa_AttachShader(GLuint program
, GLuint shader
)
1158 GET_CURRENT_CONTEXT(ctx
);
1159 attach_shader(ctx
, program
, shader
);
1164 _mesa_BindAttribLocationARB(GLhandleARB program
, GLuint index
,
1165 const GLcharARB
*name
)
1167 GET_CURRENT_CONTEXT(ctx
);
1168 bind_attrib_location(ctx
, program
, index
, name
);
1172 /* GL_EXT_gpu_shader4, GL3 */
1174 _mesa_BindFragDataLocation(GLuint program
, GLuint colorNumber
,
1177 GET_CURRENT_CONTEXT(ctx
);
1178 bind_frag_data_location(ctx
, program
, colorNumber
, name
);
1183 _mesa_CompileShaderARB(GLhandleARB shaderObj
)
1185 GET_CURRENT_CONTEXT(ctx
);
1186 compile_shader(ctx
, shaderObj
);
1191 _mesa_CreateShader(GLenum type
)
1193 GET_CURRENT_CONTEXT(ctx
);
1194 return create_shader(ctx
, type
);
1198 GLhandleARB GLAPIENTRY
1199 _mesa_CreateShaderObjectARB(GLenum type
)
1201 GET_CURRENT_CONTEXT(ctx
);
1202 return create_shader(ctx
, type
);
1207 _mesa_CreateProgram(void)
1209 GET_CURRENT_CONTEXT(ctx
);
1210 return create_shader_program(ctx
);
1214 GLhandleARB GLAPIENTRY
1215 _mesa_CreateProgramObjectARB(void)
1217 GET_CURRENT_CONTEXT(ctx
);
1218 return create_shader_program(ctx
);
1223 _mesa_DeleteObjectARB(GLhandleARB obj
)
1226 GET_CURRENT_CONTEXT(ctx
);
1227 if (is_program(ctx
, obj
)) {
1228 delete_shader_program(ctx
, obj
);
1230 else if (is_shader(ctx
, obj
)) {
1231 delete_shader(ctx
, obj
);
1241 _mesa_DeleteProgram(GLuint name
)
1244 GET_CURRENT_CONTEXT(ctx
);
1245 delete_shader_program(ctx
, name
);
1251 _mesa_DeleteShader(GLuint name
)
1254 GET_CURRENT_CONTEXT(ctx
);
1255 delete_shader(ctx
, name
);
1261 _mesa_DetachObjectARB(GLhandleARB program
, GLhandleARB shader
)
1263 GET_CURRENT_CONTEXT(ctx
);
1264 detach_shader(ctx
, program
, shader
);
1269 _mesa_DetachShader(GLuint program
, GLuint shader
)
1271 GET_CURRENT_CONTEXT(ctx
);
1272 detach_shader(ctx
, program
, shader
);
1277 _mesa_GetActiveAttribARB(GLhandleARB program
, GLuint index
,
1278 GLsizei maxLength
, GLsizei
* length
, GLint
* size
,
1279 GLenum
* type
, GLcharARB
* name
)
1281 GET_CURRENT_CONTEXT(ctx
);
1282 get_active_attrib(ctx
, program
, index
, maxLength
, length
, size
, type
, name
);
1287 _mesa_GetAttachedObjectsARB(GLhandleARB container
, GLsizei maxCount
,
1288 GLsizei
* count
, GLhandleARB
* obj
)
1290 GET_CURRENT_CONTEXT(ctx
);
1291 get_attached_shaders(ctx
, container
, maxCount
, count
, obj
);
1296 _mesa_GetAttachedShaders(GLuint program
, GLsizei maxCount
,
1297 GLsizei
*count
, GLuint
*obj
)
1299 GET_CURRENT_CONTEXT(ctx
);
1300 get_attached_shaders(ctx
, program
, maxCount
, count
, obj
);
1305 _mesa_GetAttribLocationARB(GLhandleARB program
, const GLcharARB
* name
)
1307 GET_CURRENT_CONTEXT(ctx
);
1308 return get_attrib_location(ctx
, program
, name
);
1312 /* GL_EXT_gpu_shader4, GL3 */
1314 _mesa_GetFragDataLocation(GLuint program
, const GLchar
*name
)
1316 GET_CURRENT_CONTEXT(ctx
);
1317 return get_frag_data_location(ctx
, program
, name
);
1323 _mesa_GetInfoLogARB(GLhandleARB object
, GLsizei maxLength
, GLsizei
* length
,
1324 GLcharARB
* infoLog
)
1326 GET_CURRENT_CONTEXT(ctx
);
1327 if (is_program(ctx
, object
)) {
1328 get_program_info_log(ctx
, object
, maxLength
, length
, infoLog
);
1330 else if (is_shader(ctx
, object
)) {
1331 get_shader_info_log(ctx
, object
, maxLength
, length
, infoLog
);
1334 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetInfoLogARB");
1340 _mesa_GetObjectParameterivARB(GLhandleARB object
, GLenum pname
, GLint
*params
)
1342 GET_CURRENT_CONTEXT(ctx
);
1343 /* Implement in terms of GetProgramiv, GetShaderiv */
1344 if (is_program(ctx
, object
)) {
1345 if (pname
== GL_OBJECT_TYPE_ARB
) {
1346 *params
= GL_PROGRAM_OBJECT_ARB
;
1349 get_programiv(ctx
, object
, pname
, params
);
1352 else if (is_shader(ctx
, object
)) {
1353 if (pname
== GL_OBJECT_TYPE_ARB
) {
1354 *params
= GL_SHADER_OBJECT_ARB
;
1357 get_shaderiv(ctx
, object
, pname
, params
);
1361 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetObjectParameterivARB");
1367 _mesa_GetObjectParameterfvARB(GLhandleARB object
, GLenum pname
,
1370 GLint iparams
[1]; /* XXX is one element enough? */
1371 _mesa_GetObjectParameterivARB(object
, pname
, iparams
);
1372 params
[0] = (GLfloat
) iparams
[0];
1377 _mesa_GetProgramiv(GLuint program
, GLenum pname
, GLint
*params
)
1379 GET_CURRENT_CONTEXT(ctx
);
1380 get_programiv(ctx
, program
, pname
, params
);
1385 _mesa_GetShaderiv(GLuint shader
, GLenum pname
, GLint
*params
)
1387 GET_CURRENT_CONTEXT(ctx
);
1388 get_shaderiv(ctx
, shader
, pname
, params
);
1393 _mesa_GetProgramInfoLog(GLuint program
, GLsizei bufSize
,
1394 GLsizei
*length
, GLchar
*infoLog
)
1396 GET_CURRENT_CONTEXT(ctx
);
1397 get_program_info_log(ctx
, program
, bufSize
, length
, infoLog
);
1402 _mesa_GetShaderInfoLog(GLuint shader
, GLsizei bufSize
,
1403 GLsizei
*length
, GLchar
*infoLog
)
1405 GET_CURRENT_CONTEXT(ctx
);
1406 get_shader_info_log(ctx
, shader
, bufSize
, length
, infoLog
);
1411 _mesa_GetShaderSourceARB(GLhandleARB shader
, GLsizei maxLength
,
1412 GLsizei
*length
, GLcharARB
*sourceOut
)
1414 GET_CURRENT_CONTEXT(ctx
);
1415 get_shader_source(ctx
, shader
, maxLength
, length
, sourceOut
);
1419 GLhandleARB GLAPIENTRY
1420 _mesa_GetHandleARB(GLenum pname
)
1422 GET_CURRENT_CONTEXT(ctx
);
1423 return get_handle(ctx
, pname
);
1427 GLboolean GLAPIENTRY
1428 _mesa_IsProgram(GLuint name
)
1430 GET_CURRENT_CONTEXT(ctx
);
1431 return is_program(ctx
, name
);
1435 GLboolean GLAPIENTRY
1436 _mesa_IsShader(GLuint name
)
1438 GET_CURRENT_CONTEXT(ctx
);
1439 return is_shader(ctx
, name
);
1444 _mesa_LinkProgramARB(GLhandleARB programObj
)
1446 GET_CURRENT_CONTEXT(ctx
);
1447 link_program(ctx
, programObj
);
1453 * Read shader source code from a file.
1454 * Useful for debugging to override an app's shader.
1457 read_shader(const char *fname
)
1459 const int max
= 50*1000;
1460 FILE *f
= fopen(fname
, "r");
1461 GLcharARB
*buffer
, *shader
;
1468 buffer
= (char *) malloc(max
);
1469 len
= fread(buffer
, 1, max
, f
);
1474 shader
= _mesa_strdup(buffer
);
1482 * Called via glShaderSource() and glShaderSourceARB() API functions.
1483 * Basically, concatenate the source code strings into one long string
1484 * and pass it to _mesa_shader_source().
1487 _mesa_ShaderSourceARB(GLhandleARB shaderObj
, GLsizei count
,
1488 const GLcharARB
** string
, const GLint
* length
)
1490 GET_CURRENT_CONTEXT(ctx
);
1492 GLsizei i
, totalLength
;
1496 if (!shaderObj
|| string
== NULL
) {
1497 _mesa_error(ctx
, GL_INVALID_VALUE
, "glShaderSourceARB");
1502 * This array holds offsets of where the appropriate string ends, thus the
1503 * last element will be set to the total length of the source code.
1505 offsets
= (GLint
*) malloc(count
* sizeof(GLint
));
1506 if (offsets
== NULL
) {
1507 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glShaderSourceARB");
1511 for (i
= 0; i
< count
; i
++) {
1512 if (string
[i
] == NULL
) {
1513 free((GLvoid
*) offsets
);
1514 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glShaderSourceARB(null string)");
1517 if (length
== NULL
|| length
[i
] < 0)
1518 offsets
[i
] = strlen(string
[i
]);
1520 offsets
[i
] = length
[i
];
1521 /* accumulate string lengths */
1523 offsets
[i
] += offsets
[i
- 1];
1526 /* Total length of source string is sum off all strings plus two.
1527 * One extra byte for terminating zero, another extra byte to silence
1528 * valgrind warnings in the parser/grammer code.
1530 totalLength
= offsets
[count
- 1] + 2;
1531 source
= (GLcharARB
*) malloc(totalLength
* sizeof(GLcharARB
));
1532 if (source
== NULL
) {
1533 free((GLvoid
*) offsets
);
1534 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glShaderSourceARB");
1538 for (i
= 0; i
< count
; i
++) {
1539 GLint start
= (i
> 0) ? offsets
[i
- 1] : 0;
1540 memcpy(source
+ start
, string
[i
],
1541 (offsets
[i
] - start
) * sizeof(GLcharARB
));
1543 source
[totalLength
- 1] = '\0';
1544 source
[totalLength
- 2] = '\0';
1547 /* Compute the shader's source code checksum then try to open a file
1548 * named newshader_<CHECKSUM>. If it exists, use it in place of the
1549 * original shader source code. For debugging.
1552 GLcharARB
*newSource
;
1554 checksum
= _mesa_str_checksum(source
);
1556 _mesa_snprintf(filename
, sizeof(filename
), "newshader_%d", checksum
);
1558 newSource
= read_shader(filename
);
1560 fprintf(stderr
, "Mesa: Replacing shader %u chksum=%d with %s\n",
1561 shaderObj
, checksum
, filename
);
1567 shader_source(ctx
, shaderObj
, source
);
1570 struct gl_shader
*sh
= _mesa_lookup_shader(ctx
, shaderObj
);
1572 sh
->SourceChecksum
= checksum
; /* save original checksum */
1580 _mesa_UseProgramObjectARB(GLhandleARB program
)
1582 GET_CURRENT_CONTEXT(ctx
);
1583 struct gl_shader_program
*shProg
;
1584 struct gl_transform_feedback_object
*obj
=
1585 ctx
->TransformFeedback
.CurrentObject
;
1588 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1589 "glUseProgram(transform feedback active)");
1594 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glUseProgram");
1598 if (!shProg
->LinkStatus
) {
1599 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1600 "glUseProgram(program %u not linked)", program
);
1605 if (ctx
->Shader
.Flags
& GLSL_USE_PROG
) {
1606 print_shader_info(shProg
);
1613 _mesa_use_program(ctx
, shProg
);
1618 _mesa_ValidateProgramARB(GLhandleARB program
)
1620 GET_CURRENT_CONTEXT(ctx
);
1621 validate_program(ctx
, program
);
1627 _mesa_GetShaderPrecisionFormat(GLenum shadertype
, GLenum precisiontype
,
1628 GLint
* range
, GLint
* precision
)
1630 GET_CURRENT_CONTEXT(ctx
);
1632 (void) precisiontype
;
1635 _mesa_error(ctx
, GL_INVALID_OPERATION
, __FUNCTION__
);
1640 _mesa_ReleaseShaderCompiler(void)
1642 GET_CURRENT_CONTEXT(ctx
);
1643 _mesa_error(ctx
, GL_INVALID_OPERATION
, __FUNCTION__
);
1648 _mesa_ShaderBinary(GLint n
, const GLuint
* shaders
, GLenum binaryformat
,
1649 const void* binary
, GLint length
)
1651 GET_CURRENT_CONTEXT(ctx
);
1654 (void) binaryformat
;
1657 _mesa_error(ctx
, GL_INVALID_OPERATION
, __FUNCTION__
);
1660 #endif /* FEATURE_ES2 */
1663 #if FEATURE_ARB_geometry_shader4
1666 _mesa_ProgramParameteriARB(GLuint program
, GLenum pname
,
1669 struct gl_shader_program
*shProg
;
1670 GET_CURRENT_CONTEXT(ctx
);
1672 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1674 shProg
= _mesa_lookup_shader_program_err(ctx
, program
,
1675 "glProgramParameteri");
1680 case GL_GEOMETRY_VERTICES_OUT_ARB
:
1682 (unsigned) value
> ctx
->Const
.GeometryProgram
.MaxGeometryOutputVertices
) {
1683 _mesa_error(ctx
, GL_INVALID_VALUE
,
1684 "glProgramParameteri(GL_GEOMETRY_VERTICES_OUT_ARB=%d",
1688 shProg
->Geom
.VerticesOut
= value
;
1690 case GL_GEOMETRY_INPUT_TYPE_ARB
:
1694 case GL_LINES_ADJACENCY_ARB
:
1696 case GL_TRIANGLES_ADJACENCY_ARB
:
1697 shProg
->Geom
.InputType
= value
;
1700 _mesa_error(ctx
, GL_INVALID_VALUE
,
1701 "glProgramParameteri(geometry input type = %s",
1702 _mesa_lookup_enum_by_nr(value
));
1706 case GL_GEOMETRY_OUTPUT_TYPE_ARB
:
1710 case GL_TRIANGLE_STRIP
:
1711 shProg
->Geom
.OutputType
= value
;
1714 _mesa_error(ctx
, GL_INVALID_VALUE
,
1715 "glProgramParameteri(geometry output type = %s",
1716 _mesa_lookup_enum_by_nr(value
));
1721 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramParameteriARB(pname=%s)",
1722 _mesa_lookup_enum_by_nr(pname
));
1730 _mesa_use_shader_program(struct gl_context
*ctx
, GLenum type
,
1731 struct gl_shader_program
*shProg
)
1733 use_shader_program(ctx
, type
, shProg
);
1735 if (ctx
->Driver
.UseProgram
)
1736 ctx
->Driver
.UseProgram(ctx
, shProg
);
1740 _mesa_UseShaderProgramEXT(GLenum type
, GLuint program
)
1742 GET_CURRENT_CONTEXT(ctx
);
1743 struct gl_shader_program
*shProg
= NULL
;
1745 if (!validate_shader_target(ctx
, type
)) {
1746 _mesa_error(ctx
, GL_INVALID_ENUM
, "glUseShaderProgramEXT(type)");
1750 if (ctx
->TransformFeedback
.CurrentObject
->Active
) {
1751 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1752 "glUseShaderProgramEXT(transform feedback is active)");
1757 shProg
= _mesa_lookup_shader_program_err(ctx
, program
,
1758 "glUseShaderProgramEXT");
1762 if (!shProg
->LinkStatus
) {
1763 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1764 "glUseShaderProgramEXT(program not linked)");
1769 _mesa_use_shader_program(ctx
, type
, shProg
);
1773 _mesa_ActiveProgramEXT(GLuint program
)
1775 GET_CURRENT_CONTEXT(ctx
);
1776 struct gl_shader_program
*shProg
= (program
!= 0)
1777 ? _mesa_lookup_shader_program_err(ctx
, program
, "glActiveProgramEXT")
1780 _mesa_active_program(ctx
, shProg
, "glActiveProgramEXT");
1785 _mesa_CreateShaderProgramEXT(GLenum type
, const GLchar
*string
)
1787 GET_CURRENT_CONTEXT(ctx
);
1788 const GLuint shader
= create_shader(ctx
, type
);
1792 shader_source(ctx
, shader
, _mesa_strdup(string
));
1793 compile_shader(ctx
, shader
);
1795 program
= create_shader_program(ctx
);
1797 struct gl_shader_program
*shProg
;
1798 struct gl_shader
*sh
;
1799 GLint compiled
= GL_FALSE
;
1801 shProg
= _mesa_lookup_shader_program(ctx
, program
);
1802 sh
= _mesa_lookup_shader(ctx
, shader
);
1804 get_shaderiv(ctx
, shader
, GL_COMPILE_STATUS
, &compiled
);
1806 attach_shader(ctx
, program
, shader
);
1807 link_program(ctx
, program
);
1808 detach_shader(ctx
, program
, shader
);
1812 if (active
-user
-defined
-varyings
-in
-linked
-program
) {
1813 append
-error
-to
-info
-log
;
1814 shProg
->LinkStatus
= GL_FALSE
;
1819 shProg
->InfoLog
= talloc_strdup_append(shProg
->InfoLog
, sh
->InfoLog
);
1822 delete_shader(ctx
, shader
);
1829 * Plug in shader-related functions into API dispatch table.
1832 _mesa_init_shader_dispatch(struct _glapi_table
*exec
)
1835 /* GL_ARB_vertex/fragment_shader */
1836 SET_DeleteObjectARB(exec
, _mesa_DeleteObjectARB
);
1837 SET_GetHandleARB(exec
, _mesa_GetHandleARB
);
1838 SET_DetachObjectARB(exec
, _mesa_DetachObjectARB
);
1839 SET_CreateShaderObjectARB(exec
, _mesa_CreateShaderObjectARB
);
1840 SET_ShaderSourceARB(exec
, _mesa_ShaderSourceARB
);
1841 SET_CompileShaderARB(exec
, _mesa_CompileShaderARB
);
1842 SET_CreateProgramObjectARB(exec
, _mesa_CreateProgramObjectARB
);
1843 SET_AttachObjectARB(exec
, _mesa_AttachObjectARB
);
1844 SET_LinkProgramARB(exec
, _mesa_LinkProgramARB
);
1845 SET_UseProgramObjectARB(exec
, _mesa_UseProgramObjectARB
);
1846 SET_ValidateProgramARB(exec
, _mesa_ValidateProgramARB
);
1847 SET_GetObjectParameterfvARB(exec
, _mesa_GetObjectParameterfvARB
);
1848 SET_GetObjectParameterivARB(exec
, _mesa_GetObjectParameterivARB
);
1849 SET_GetInfoLogARB(exec
, _mesa_GetInfoLogARB
);
1850 SET_GetAttachedObjectsARB(exec
, _mesa_GetAttachedObjectsARB
);
1851 SET_GetShaderSourceARB(exec
, _mesa_GetShaderSourceARB
);
1854 SET_AttachShader(exec
, _mesa_AttachShader
);
1855 SET_CreateProgram(exec
, _mesa_CreateProgram
);
1856 SET_CreateShader(exec
, _mesa_CreateShader
);
1857 SET_DeleteProgram(exec
, _mesa_DeleteProgram
);
1858 SET_DeleteShader(exec
, _mesa_DeleteShader
);
1859 SET_DetachShader(exec
, _mesa_DetachShader
);
1860 SET_GetAttachedShaders(exec
, _mesa_GetAttachedShaders
);
1861 SET_GetProgramiv(exec
, _mesa_GetProgramiv
);
1862 SET_GetProgramInfoLog(exec
, _mesa_GetProgramInfoLog
);
1863 SET_GetShaderiv(exec
, _mesa_GetShaderiv
);
1864 SET_GetShaderInfoLog(exec
, _mesa_GetShaderInfoLog
);
1865 SET_IsProgram(exec
, _mesa_IsProgram
);
1866 SET_IsShader(exec
, _mesa_IsShader
);
1868 #if FEATURE_ARB_vertex_shader
1869 SET_BindAttribLocationARB(exec
, _mesa_BindAttribLocationARB
);
1870 SET_GetActiveAttribARB(exec
, _mesa_GetActiveAttribARB
);
1871 SET_GetAttribLocationARB(exec
, _mesa_GetAttribLocationARB
);
1874 #if FEATURE_ARB_geometry_shader4
1875 SET_ProgramParameteriARB(exec
, _mesa_ProgramParameteriARB
);
1878 SET_UseShaderProgramEXT(exec
, _mesa_UseShaderProgramEXT
);
1879 SET_ActiveProgramEXT(exec
, _mesa_ActiveProgramEXT
);
1880 SET_CreateShaderProgramEXT(exec
, _mesa_CreateShaderProgramEXT
);
1882 /* GL_EXT_gpu_shader4 / GL 3.0 */
1883 SET_BindFragDataLocationEXT(exec
, _mesa_BindFragDataLocation
);
1884 SET_GetFragDataLocationEXT(exec
, _mesa_GetFragDataLocation
);
1886 #endif /* FEATURE_GL */