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/shaderapi.h"
45 #include "main/shaderobj.h"
46 #include "program/program.h"
47 #include "program/prog_parameter.h"
48 #include "program/prog_uniform.h"
52 /** Define this to enable shader substitution (see below) */
53 #define SHADER_SUBST 0
57 * Return mask of GLSL_x flags by examining the MESA_GLSL env var.
60 get_shader_flags(void)
62 GLbitfield flags
= 0x0;
63 const char *env
= _mesa_getenv("MESA_GLSL");
66 if (strstr(env
, "dump"))
68 if (strstr(env
, "log"))
70 if (strstr(env
, "nopvert"))
71 flags
|= GLSL_NOP_VERT
;
72 if (strstr(env
, "nopfrag"))
73 flags
|= GLSL_NOP_FRAG
;
74 if (strstr(env
, "nopt"))
76 else if (strstr(env
, "opt"))
78 if (strstr(env
, "uniform"))
79 flags
|= GLSL_UNIFORMS
;
80 if (strstr(env
, "useprog"))
81 flags
|= GLSL_USE_PROG
;
89 * Initialize context's shader state.
92 _mesa_init_shader_state(struct gl_context
*ctx
)
94 /* Device drivers may override these to control what kind of instructions
95 * are generated by the GLSL compiler.
97 struct gl_shader_compiler_options options
;
100 memset(&options
, 0, sizeof(options
));
101 options
.MaxUnrollIterations
= 32;
103 /* Default pragma settings */
104 options
.DefaultPragmas
.Optimize
= GL_TRUE
;
106 for(i
= 0; i
< MESA_SHADER_TYPES
; ++i
)
107 memcpy(&ctx
->ShaderCompilerOptions
[i
], &options
, sizeof(options
));
109 ctx
->Shader
.Flags
= get_shader_flags();
114 * Free the per-context shader-related state.
117 _mesa_free_shader_state(struct gl_context
*ctx
)
119 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.CurrentVertexProgram
, NULL
);
120 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.CurrentGeometryProgram
,
122 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.CurrentFragmentProgram
,
124 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.ActiveProgram
, NULL
);
129 * Return the size of the given GLSL datatype, in floats (components).
132 _mesa_sizeof_glsl_type(GLenum type
)
141 case GL_SAMPLER_CUBE
:
142 case GL_SAMPLER_1D_SHADOW
:
143 case GL_SAMPLER_2D_SHADOW
:
144 case GL_SAMPLER_2D_RECT_ARB
:
145 case GL_SAMPLER_2D_RECT_SHADOW_ARB
:
146 case GL_SAMPLER_1D_ARRAY_EXT
:
147 case GL_SAMPLER_2D_ARRAY_EXT
:
148 case GL_SAMPLER_1D_ARRAY_SHADOW_EXT
:
149 case GL_SAMPLER_2D_ARRAY_SHADOW_EXT
:
150 case GL_SAMPLER_CUBE_SHADOW_EXT
:
154 case GL_UNSIGNED_INT_VEC2
:
159 case GL_UNSIGNED_INT_VEC3
:
164 case GL_UNSIGNED_INT_VEC4
:
168 case GL_FLOAT_MAT2x3
:
169 case GL_FLOAT_MAT2x4
:
170 return 8; /* two float[4] vectors */
172 case GL_FLOAT_MAT3x2
:
173 case GL_FLOAT_MAT3x4
:
174 return 12; /* three float[4] vectors */
176 case GL_FLOAT_MAT4x2
:
177 case GL_FLOAT_MAT4x3
:
178 return 16; /* four float[4] vectors */
180 _mesa_problem(NULL
, "Invalid type in _mesa_sizeof_glsl_type()");
187 * Copy string from <src> to <dst>, up to maxLength characters, returning
188 * length of <dst> in <length>.
189 * \param src the strings source
190 * \param maxLength max chars to copy
191 * \param length returns number of chars copied
192 * \param dst the string destination
195 _mesa_copy_string(GLchar
*dst
, GLsizei maxLength
,
196 GLsizei
*length
, const GLchar
*src
)
199 for (len
= 0; len
< maxLength
- 1 && src
&& src
[len
]; len
++)
210 * Confirm that the a shader type is valid and supported by the implementation
212 * \param ctx Current GL context
213 * \param type Shader target
217 validate_shader_target(const struct gl_context
*ctx
, GLenum type
)
220 #if FEATURE_ARB_fragment_shader
221 case GL_FRAGMENT_SHADER
:
222 return ctx
->Extensions
.ARB_fragment_shader
;
224 #if FEATURE_ARB_vertex_shader
225 case GL_VERTEX_SHADER
:
226 return ctx
->Extensions
.ARB_vertex_shader
;
228 #if FEATURE_ARB_geometry_shader4
229 case GL_GEOMETRY_SHADER_ARB
:
230 return ctx
->Extensions
.ARB_geometry_shader4
;
239 * Find the length of the longest transform feedback varying name
240 * which was specified with glTransformFeedbackVaryings().
243 longest_feedback_varying_name(const struct gl_shader_program
*shProg
)
247 for (i
= 0; i
< shProg
->TransformFeedback
.NumVarying
; i
++) {
248 GLint len
= strlen(shProg
->TransformFeedback
.VaryingNames
[i
]);
258 is_program(struct gl_context
*ctx
, GLuint name
)
260 struct gl_shader_program
*shProg
= _mesa_lookup_shader_program(ctx
, name
);
261 return shProg
? GL_TRUE
: GL_FALSE
;
266 is_shader(struct gl_context
*ctx
, GLuint name
)
268 struct gl_shader
*shader
= _mesa_lookup_shader(ctx
, name
);
269 return shader
? GL_TRUE
: GL_FALSE
;
274 * Attach shader to a shader program.
277 attach_shader(struct gl_context
*ctx
, GLuint program
, GLuint shader
)
279 struct gl_shader_program
*shProg
;
280 struct gl_shader
*sh
;
283 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glAttachShader");
287 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glAttachShader");
292 n
= shProg
->NumShaders
;
293 for (i
= 0; i
< n
; i
++) {
294 if (shProg
->Shaders
[i
] == sh
) {
295 /* The shader is already attched to this program. The
296 * GL_ARB_shader_objects spec says:
298 * "The error INVALID_OPERATION is generated by AttachObjectARB
299 * if <obj> is already attached to <containerObj>."
301 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glAttachShader");
307 shProg
->Shaders
= (struct gl_shader
**)
308 _mesa_realloc(shProg
->Shaders
,
309 n
* sizeof(struct gl_shader
*),
310 (n
+ 1) * sizeof(struct gl_shader
*));
311 if (!shProg
->Shaders
) {
312 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glAttachShader");
317 shProg
->Shaders
[n
] = NULL
; /* since realloc() didn't zero the new space */
318 _mesa_reference_shader(ctx
, &shProg
->Shaders
[n
], sh
);
319 shProg
->NumShaders
++;
324 get_attrib_location(struct gl_context
*ctx
, GLuint program
, const GLchar
*name
)
326 struct gl_shader_program
*shProg
327 = _mesa_lookup_shader_program_err(ctx
, program
, "glGetAttribLocation");
333 if (!shProg
->LinkStatus
) {
334 _mesa_error(ctx
, GL_INVALID_OPERATION
,
335 "glGetAttribLocation(program not linked)");
342 if (shProg
->VertexProgram
) {
343 const struct gl_program_parameter_list
*attribs
=
344 shProg
->VertexProgram
->Base
.Attributes
;
346 GLint i
= _mesa_lookup_parameter_index(attribs
, -1, name
);
348 return attribs
->Parameters
[i
].StateIndexes
[0];
357 bind_attrib_location(struct gl_context
*ctx
, GLuint program
, GLuint index
,
360 struct gl_shader_program
*shProg
;
361 const GLint size
= -1; /* unknown size */
363 GLenum datatype
= GL_FLOAT_VEC4
;
365 shProg
= _mesa_lookup_shader_program_err(ctx
, program
,
366 "glBindAttribLocation");
374 if (strncmp(name
, "gl_", 3) == 0) {
375 _mesa_error(ctx
, GL_INVALID_OPERATION
,
376 "glBindAttribLocation(illegal name)");
380 if (index
>= ctx
->Const
.VertexProgram
.MaxAttribs
) {
381 _mesa_error(ctx
, GL_INVALID_VALUE
, "glBindAttribLocation(index)");
385 if (shProg
->LinkStatus
) {
386 /* get current index/location for the attribute */
387 oldIndex
= get_attrib_location(ctx
, program
, name
);
393 /* this will replace the current value if it's already in the list */
394 i
= _mesa_add_attribute(shProg
->Attributes
, name
, size
, datatype
, index
);
396 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glBindAttribLocation");
401 * Note that this attribute binding won't go into effect until
402 * glLinkProgram is called again.
408 bind_frag_data_location(struct gl_context
*ctx
, GLuint program
,
409 GLuint colorNumber
, const GLchar
*name
)
411 _mesa_problem(ctx
, "bind_frag_data_location() not implemented yet");
416 create_shader(struct gl_context
*ctx
, GLenum type
)
418 struct gl_shader
*sh
;
421 if (!validate_shader_target(ctx
, type
)) {
422 _mesa_error(ctx
, GL_INVALID_ENUM
, "CreateShader(type)");
426 name
= _mesa_HashFindFreeKeyBlock(ctx
->Shared
->ShaderObjects
, 1);
427 sh
= ctx
->Driver
.NewShader(ctx
, name
, type
);
428 _mesa_HashInsert(ctx
->Shared
->ShaderObjects
, name
, sh
);
435 create_shader_program(struct gl_context
*ctx
)
438 struct gl_shader_program
*shProg
;
440 name
= _mesa_HashFindFreeKeyBlock(ctx
->Shared
->ShaderObjects
, 1);
442 shProg
= ctx
->Driver
.NewShaderProgram(ctx
, name
);
444 _mesa_HashInsert(ctx
->Shared
->ShaderObjects
, name
, shProg
);
446 assert(shProg
->RefCount
== 1);
453 * Named w/ "2" to indicate OpenGL 2.x vs GL_ARB_fragment_programs's
457 delete_shader_program(struct gl_context
*ctx
, GLuint name
)
460 * NOTE: deleting shaders/programs works a bit differently than
461 * texture objects (and buffer objects, etc). Shader/program
462 * handles/IDs exist in the hash table until the object is really
463 * deleted (refcount==0). With texture objects, the handle/ID is
464 * removed from the hash table in glDeleteTextures() while the tex
465 * object itself might linger until its refcount goes to zero.
467 struct gl_shader_program
*shProg
;
469 shProg
= _mesa_lookup_shader_program_err(ctx
, name
, "glDeleteProgram");
473 shProg
->DeletePending
= GL_TRUE
;
475 /* effectively, decr shProg's refcount */
476 _mesa_reference_shader_program(ctx
, &shProg
, NULL
);
481 delete_shader(struct gl_context
*ctx
, GLuint shader
)
483 struct gl_shader
*sh
;
485 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glDeleteShader");
489 sh
->DeletePending
= GL_TRUE
;
491 /* effectively, decr sh's refcount */
492 _mesa_reference_shader(ctx
, &sh
, NULL
);
497 detach_shader(struct gl_context
*ctx
, GLuint program
, GLuint shader
)
499 struct gl_shader_program
*shProg
;
503 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glDetachShader");
507 n
= shProg
->NumShaders
;
509 for (i
= 0; i
< n
; i
++) {
510 if (shProg
->Shaders
[i
]->Name
== shader
) {
512 struct gl_shader
**newList
;
515 _mesa_reference_shader(ctx
, &shProg
->Shaders
[i
], NULL
);
517 /* alloc new, smaller array */
518 newList
= (struct gl_shader
**)
519 malloc((n
- 1) * sizeof(struct gl_shader
*));
521 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glDetachShader");
524 for (j
= 0; j
< i
; j
++) {
525 newList
[j
] = shProg
->Shaders
[j
];
528 newList
[j
++] = shProg
->Shaders
[i
];
529 free(shProg
->Shaders
);
531 shProg
->Shaders
= newList
;
532 shProg
->NumShaders
= n
- 1;
537 for (j
= 0; j
< shProg
->NumShaders
; j
++) {
538 assert(shProg
->Shaders
[j
]->Type
== GL_VERTEX_SHADER
||
539 shProg
->Shaders
[j
]->Type
== GL_FRAGMENT_SHADER
);
540 assert(shProg
->Shaders
[j
]->RefCount
> 0);
552 if (is_shader(ctx
, shader
))
553 err
= GL_INVALID_OPERATION
;
554 else if (is_program(ctx
, shader
))
555 err
= GL_INVALID_OPERATION
;
557 err
= GL_INVALID_VALUE
;
558 _mesa_error(ctx
, err
, "glDetachProgram(shader)");
565 get_active_attrib(struct gl_context
*ctx
, GLuint program
, GLuint index
,
566 GLsizei maxLength
, GLsizei
*length
, GLint
*size
,
567 GLenum
*type
, GLchar
*nameOut
)
569 const struct gl_program_parameter_list
*attribs
= NULL
;
570 struct gl_shader_program
*shProg
;
572 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glGetActiveAttrib");
576 if (shProg
->VertexProgram
)
577 attribs
= shProg
->VertexProgram
->Base
.Attributes
;
579 if (!attribs
|| index
>= attribs
->NumParameters
) {
580 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetActiveAttrib(index)");
584 _mesa_copy_string(nameOut
, maxLength
, length
,
585 attribs
->Parameters
[index
].Name
);
588 *size
= attribs
->Parameters
[index
].Size
589 / _mesa_sizeof_glsl_type(attribs
->Parameters
[index
].DataType
);
592 *type
= attribs
->Parameters
[index
].DataType
;
597 * Return list of shaders attached to shader program.
600 get_attached_shaders(struct gl_context
*ctx
, GLuint program
, GLsizei maxCount
,
601 GLsizei
*count
, GLuint
*obj
)
603 struct gl_shader_program
*shProg
=
604 _mesa_lookup_shader_program_err(ctx
, program
, "glGetAttachedShaders");
607 for (i
= 0; i
< (GLuint
) maxCount
&& i
< shProg
->NumShaders
; i
++) {
608 obj
[i
] = shProg
->Shaders
[i
]->Name
;
617 get_frag_data_location(struct gl_context
*ctx
, GLuint program
,
620 _mesa_problem(ctx
, "get_frag_data_location() not implemented yet");
627 * glGetHandleARB() - return ID/name of currently bound shader program.
630 get_handle(struct gl_context
*ctx
, GLenum pname
)
632 if (pname
== GL_PROGRAM_OBJECT_ARB
) {
633 if (ctx
->Shader
.ActiveProgram
)
634 return ctx
->Shader
.ActiveProgram
->Name
;
639 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetHandleARB");
646 * glGetProgramiv() - get shader program state.
647 * Note that this is for GLSL shader programs, not ARB vertex/fragment
648 * programs (see glGetProgramivARB).
651 get_programiv(struct gl_context
*ctx
, GLuint program
, GLenum pname
, GLint
*params
)
653 const struct gl_program_parameter_list
*attribs
;
654 struct gl_shader_program
*shProg
655 = _mesa_lookup_shader_program(ctx
, program
);
658 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramiv(program)");
662 if (shProg
->VertexProgram
)
663 attribs
= shProg
->VertexProgram
->Base
.Attributes
;
668 case GL_DELETE_STATUS
:
669 *params
= shProg
->DeletePending
;
672 *params
= shProg
->LinkStatus
;
674 case GL_VALIDATE_STATUS
:
675 *params
= shProg
->Validated
;
677 case GL_INFO_LOG_LENGTH
:
678 *params
= shProg
->InfoLog
? strlen(shProg
->InfoLog
) + 1 : 0;
680 case GL_ATTACHED_SHADERS
:
681 *params
= shProg
->NumShaders
;
683 case GL_ACTIVE_ATTRIBUTES
:
684 *params
= attribs
? attribs
->NumParameters
: 0;
686 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH
:
687 *params
= _mesa_longest_parameter_name(attribs
, PROGRAM_INPUT
) + 1;
689 case GL_ACTIVE_UNIFORMS
:
690 *params
= shProg
->Uniforms
? shProg
->Uniforms
->NumUniforms
: 0;
692 case GL_ACTIVE_UNIFORM_MAX_LENGTH
:
693 *params
= _mesa_longest_uniform_name(shProg
->Uniforms
);
695 (*params
)++; /* add one for terminating zero */
697 case GL_PROGRAM_BINARY_LENGTH_OES
:
700 #if FEATURE_EXT_transform_feedback
701 case GL_TRANSFORM_FEEDBACK_VARYINGS
:
702 *params
= shProg
->TransformFeedback
.NumVarying
;
704 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH
:
705 *params
= longest_feedback_varying_name(shProg
) + 1;
707 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE
:
708 *params
= shProg
->TransformFeedback
.BufferMode
;
711 #if FEATURE_ARB_geometry_shader4
712 case GL_GEOMETRY_VERTICES_OUT_ARB
:
713 *params
= shProg
->Geom
.VerticesOut
;
715 case GL_GEOMETRY_INPUT_TYPE_ARB
:
716 *params
= shProg
->Geom
.InputType
;
718 case GL_GEOMETRY_OUTPUT_TYPE_ARB
:
719 *params
= shProg
->Geom
.OutputType
;
723 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramiv(pname)");
730 * glGetShaderiv() - get GLSL shader state
733 get_shaderiv(struct gl_context
*ctx
, GLuint name
, GLenum pname
, GLint
*params
)
735 struct gl_shader
*shader
=
736 _mesa_lookup_shader_err(ctx
, name
, "glGetShaderiv");
744 *params
= shader
->Type
;
746 case GL_DELETE_STATUS
:
747 *params
= shader
->DeletePending
;
749 case GL_COMPILE_STATUS
:
750 *params
= shader
->CompileStatus
;
752 case GL_INFO_LOG_LENGTH
:
753 *params
= shader
->InfoLog
? strlen(shader
->InfoLog
) + 1 : 0;
755 case GL_SHADER_SOURCE_LENGTH
:
756 *params
= shader
->Source
? strlen((char *) shader
->Source
) + 1 : 0;
759 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetShaderiv(pname)");
766 get_program_info_log(struct gl_context
*ctx
, GLuint program
, GLsizei bufSize
,
767 GLsizei
*length
, GLchar
*infoLog
)
769 struct gl_shader_program
*shProg
770 = _mesa_lookup_shader_program(ctx
, program
);
772 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramInfoLog(program)");
775 _mesa_copy_string(infoLog
, bufSize
, length
, shProg
->InfoLog
);
780 get_shader_info_log(struct gl_context
*ctx
, GLuint shader
, GLsizei bufSize
,
781 GLsizei
*length
, GLchar
*infoLog
)
783 struct gl_shader
*sh
= _mesa_lookup_shader(ctx
, shader
);
785 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetShaderInfoLog(shader)");
788 _mesa_copy_string(infoLog
, bufSize
, length
, sh
->InfoLog
);
793 * Return shader source code.
796 get_shader_source(struct gl_context
*ctx
, GLuint shader
, GLsizei maxLength
,
797 GLsizei
*length
, GLchar
*sourceOut
)
799 struct gl_shader
*sh
;
800 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glGetShaderSource");
804 _mesa_copy_string(sourceOut
, maxLength
, length
, sh
->Source
);
809 * Set/replace shader source code.
812 shader_source(struct gl_context
*ctx
, GLuint shader
, const GLchar
*source
)
814 struct gl_shader
*sh
;
816 sh
= _mesa_lookup_shader_err(ctx
, shader
, "glShaderSource");
820 /* free old shader source string and install new one */
822 free((void *) sh
->Source
);
825 sh
->CompileStatus
= GL_FALSE
;
827 sh
->SourceChecksum
= _mesa_str_checksum(sh
->Source
);
836 compile_shader(struct gl_context
*ctx
, GLuint shaderObj
)
838 struct gl_shader
*sh
;
839 struct gl_shader_compiler_options
*options
;
841 sh
= _mesa_lookup_shader_err(ctx
, shaderObj
, "glCompileShader");
845 options
= &ctx
->ShaderCompilerOptions
[_mesa_shader_type_to_index(sh
->Type
)];
847 /* set default pragma state for shader */
848 sh
->Pragmas
= options
->DefaultPragmas
;
850 /* this call will set the sh->CompileStatus field to indicate if
851 * compilation was successful.
853 _mesa_glsl_compile_shader(ctx
, sh
);
858 * Link a program's shaders.
861 link_program(struct gl_context
*ctx
, GLuint program
)
863 struct gl_shader_program
*shProg
;
864 struct gl_transform_feedback_object
*obj
=
865 ctx
->TransformFeedback
.CurrentObject
;
867 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glLinkProgram");
872 && (shProg
== ctx
->Shader
.CurrentVertexProgram
873 || shProg
== ctx
->Shader
.CurrentGeometryProgram
874 || shProg
== ctx
->Shader
.CurrentFragmentProgram
)) {
875 _mesa_error(ctx
, GL_INVALID_OPERATION
,
876 "glLinkProgram(transform feedback active");
880 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
882 _mesa_glsl_link_shader(ctx
, shProg
);
888 printf("Link %u shaders in program %u: %s\n",
889 shProg
->NumShaders
, shProg
->Name
,
890 shProg
->LinkStatus
? "Success" : "Failed");
892 for (i
= 0; i
< shProg
->NumShaders
; i
++) {
893 printf(" shader %u, type 0x%x\n",
894 shProg
->Shaders
[i
]->Name
,
895 shProg
->Shaders
[i
]->Type
);
902 * Print basic shader info (for debug).
905 print_shader_info(const struct gl_shader_program
*shProg
)
909 printf("Mesa: glUseProgram(%u)\n", shProg
->Name
);
910 for (i
= 0; i
< shProg
->NumShaders
; i
++) {
912 switch (shProg
->Shaders
[i
]->Type
) {
913 case GL_VERTEX_SHADER
:
916 case GL_FRAGMENT_SHADER
:
919 case GL_GEOMETRY_SHADER
:
925 printf(" %s shader %u, checksum %u\n", s
,
926 shProg
->Shaders
[i
]->Name
,
927 shProg
->Shaders
[i
]->SourceChecksum
);
929 if (shProg
->VertexProgram
)
930 printf(" vert prog %u\n", shProg
->VertexProgram
->Base
.Id
);
931 if (shProg
->FragmentProgram
)
932 printf(" frag prog %u\n", shProg
->FragmentProgram
->Base
.Id
);
937 * Use the named shader program for subsequent glUniform calls
940 _mesa_active_program(struct gl_context
*ctx
, struct gl_shader_program
*shProg
,
943 if ((shProg
!= NULL
) && !shProg
->LinkStatus
) {
944 _mesa_error(ctx
, GL_INVALID_OPERATION
,
945 "%s(program %u not linked)", caller
, shProg
->Name
);
949 if (ctx
->Shader
.ActiveProgram
!= shProg
) {
950 _mesa_reference_shader_program(ctx
, &ctx
->Shader
.ActiveProgram
, shProg
);
957 use_shader_program(struct gl_context
*ctx
, GLenum type
,
958 struct gl_shader_program
*shProg
)
960 struct gl_shader_program
**target
;
963 #if FEATURE_ARB_vertex_shader
964 case GL_VERTEX_SHADER
:
965 target
= &ctx
->Shader
.CurrentVertexProgram
;
967 || (shProg
->_LinkedShaders
[MESA_SHADER_VERTEX
] == NULL
)) {
972 #if FEATURE_ARB_geometry_shader4
973 case GL_GEOMETRY_SHADER_ARB
:
974 target
= &ctx
->Shader
.CurrentGeometryProgram
;
976 || (shProg
->_LinkedShaders
[MESA_SHADER_GEOMETRY
] == NULL
)) {
981 #if FEATURE_ARB_fragment_shader
982 case GL_FRAGMENT_SHADER
:
983 target
= &ctx
->Shader
.CurrentFragmentProgram
;
985 || (shProg
->_LinkedShaders
[MESA_SHADER_FRAGMENT
] == NULL
)) {
994 if (*target
!= shProg
) {
995 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
| _NEW_PROGRAM_CONSTANTS
);
996 _mesa_reference_shader_program(ctx
, target
, shProg
);
1004 * Use the named shader program for subsequent rendering.
1007 _mesa_use_program(struct gl_context
*ctx
, struct gl_shader_program
*shProg
)
1009 use_shader_program(ctx
, GL_VERTEX_SHADER
, shProg
);
1010 use_shader_program(ctx
, GL_GEOMETRY_SHADER_ARB
, shProg
);
1011 use_shader_program(ctx
, GL_FRAGMENT_SHADER
, shProg
);
1012 _mesa_active_program(ctx
, shProg
, "glUseProgram");
1014 if (ctx
->Driver
.UseProgram
)
1015 ctx
->Driver
.UseProgram(ctx
, shProg
);
1020 * Validate a program's samplers.
1021 * Specifically, check that there aren't two samplers of different types
1022 * pointing to the same texture unit.
1023 * \return GL_TRUE if valid, GL_FALSE if invalid
1026 validate_samplers(const struct gl_program
*prog
, char *errMsg
)
1028 static const char *targetName
[] = {
1037 GLint targetUsed
[MAX_TEXTURE_IMAGE_UNITS
];
1038 GLbitfield samplersUsed
= prog
->SamplersUsed
;
1041 assert(Elements(targetName
) == NUM_TEXTURE_TARGETS
);
1043 if (samplersUsed
== 0x0)
1046 for (i
= 0; i
< Elements(targetUsed
); i
++)
1049 /* walk over bits which are set in 'samplers' */
1050 while (samplersUsed
) {
1052 gl_texture_index target
;
1053 GLint sampler
= _mesa_ffs(samplersUsed
) - 1;
1054 assert(sampler
>= 0);
1055 assert(sampler
< MAX_TEXTURE_IMAGE_UNITS
);
1056 unit
= prog
->SamplerUnits
[sampler
];
1057 target
= prog
->SamplerTargets
[sampler
];
1058 if (targetUsed
[unit
] != -1 && targetUsed
[unit
] != (int) target
) {
1059 _mesa_snprintf(errMsg
, 100,
1060 "Texture unit %d is accessed both as %s and %s",
1061 unit
, targetName
[targetUsed
[unit
]], targetName
[target
]);
1064 targetUsed
[unit
] = target
;
1065 samplersUsed
^= (1 << sampler
);
1073 * Do validation of the given shader program.
1074 * \param errMsg returns error message if validation fails.
1075 * \return GL_TRUE if valid, GL_FALSE if invalid (and set errMsg)
1078 validate_shader_program(const struct gl_shader_program
*shProg
,
1081 const struct gl_vertex_program
*vp
= shProg
->VertexProgram
;
1082 const struct gl_fragment_program
*fp
= shProg
->FragmentProgram
;
1084 if (!shProg
->LinkStatus
) {
1088 /* From the GL spec, a program is invalid if any of these are true:
1090 any two active samplers in the current program object are of
1091 different types, but refer to the same texture image unit,
1093 any active sampler in the current program object refers to a texture
1094 image unit where fixed-function fragment processing accesses a
1095 texture target that does not match the sampler type, or
1097 the sum of the number of active samplers in the program and the
1098 number of texture image units enabled for fixed-function fragment
1099 processing exceeds the combined limit on the total number of texture
1100 image units allowed.
1105 * Check: any two active samplers in the current program object are of
1106 * different types, but refer to the same texture image unit,
1108 if (vp
&& !validate_samplers(&vp
->Base
, errMsg
)) {
1111 if (fp
&& !validate_samplers(&fp
->Base
, errMsg
)) {
1120 * Called via glValidateProgram()
1123 validate_program(struct gl_context
*ctx
, GLuint program
)
1125 struct gl_shader_program
*shProg
;
1128 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glValidateProgram");
1133 shProg
->Validated
= validate_shader_program(shProg
, errMsg
);
1134 if (!shProg
->Validated
) {
1135 /* update info log */
1136 if (shProg
->InfoLog
) {
1137 talloc_free(shProg
->InfoLog
);
1139 shProg
->InfoLog
= talloc_strdup(shProg
, errMsg
);
1146 _mesa_AttachObjectARB(GLhandleARB program
, GLhandleARB shader
)
1148 GET_CURRENT_CONTEXT(ctx
);
1149 attach_shader(ctx
, program
, shader
);
1154 _mesa_AttachShader(GLuint program
, GLuint shader
)
1156 GET_CURRENT_CONTEXT(ctx
);
1157 attach_shader(ctx
, program
, shader
);
1162 _mesa_BindAttribLocationARB(GLhandleARB program
, GLuint index
,
1163 const GLcharARB
*name
)
1165 GET_CURRENT_CONTEXT(ctx
);
1166 bind_attrib_location(ctx
, program
, index
, name
);
1170 /* GL_EXT_gpu_shader4, GL3 */
1172 _mesa_BindFragDataLocation(GLuint program
, GLuint colorNumber
,
1175 GET_CURRENT_CONTEXT(ctx
);
1176 bind_frag_data_location(ctx
, program
, colorNumber
, name
);
1181 _mesa_CompileShaderARB(GLhandleARB shaderObj
)
1183 GET_CURRENT_CONTEXT(ctx
);
1184 compile_shader(ctx
, shaderObj
);
1189 _mesa_CreateShader(GLenum type
)
1191 GET_CURRENT_CONTEXT(ctx
);
1192 return create_shader(ctx
, type
);
1196 GLhandleARB GLAPIENTRY
1197 _mesa_CreateShaderObjectARB(GLenum type
)
1199 GET_CURRENT_CONTEXT(ctx
);
1200 return create_shader(ctx
, type
);
1205 _mesa_CreateProgram(void)
1207 GET_CURRENT_CONTEXT(ctx
);
1208 return create_shader_program(ctx
);
1212 GLhandleARB GLAPIENTRY
1213 _mesa_CreateProgramObjectARB(void)
1215 GET_CURRENT_CONTEXT(ctx
);
1216 return create_shader_program(ctx
);
1221 _mesa_DeleteObjectARB(GLhandleARB obj
)
1224 GET_CURRENT_CONTEXT(ctx
);
1225 if (is_program(ctx
, obj
)) {
1226 delete_shader_program(ctx
, obj
);
1228 else if (is_shader(ctx
, obj
)) {
1229 delete_shader(ctx
, obj
);
1239 _mesa_DeleteProgram(GLuint name
)
1242 GET_CURRENT_CONTEXT(ctx
);
1243 delete_shader_program(ctx
, name
);
1249 _mesa_DeleteShader(GLuint name
)
1252 GET_CURRENT_CONTEXT(ctx
);
1253 delete_shader(ctx
, name
);
1259 _mesa_DetachObjectARB(GLhandleARB program
, GLhandleARB shader
)
1261 GET_CURRENT_CONTEXT(ctx
);
1262 detach_shader(ctx
, program
, shader
);
1267 _mesa_DetachShader(GLuint program
, GLuint shader
)
1269 GET_CURRENT_CONTEXT(ctx
);
1270 detach_shader(ctx
, program
, shader
);
1275 _mesa_GetActiveAttribARB(GLhandleARB program
, GLuint index
,
1276 GLsizei maxLength
, GLsizei
* length
, GLint
* size
,
1277 GLenum
* type
, GLcharARB
* name
)
1279 GET_CURRENT_CONTEXT(ctx
);
1280 get_active_attrib(ctx
, program
, index
, maxLength
, length
, size
, type
, name
);
1285 _mesa_GetAttachedObjectsARB(GLhandleARB container
, GLsizei maxCount
,
1286 GLsizei
* count
, GLhandleARB
* obj
)
1288 GET_CURRENT_CONTEXT(ctx
);
1289 get_attached_shaders(ctx
, container
, maxCount
, count
, obj
);
1294 _mesa_GetAttachedShaders(GLuint program
, GLsizei maxCount
,
1295 GLsizei
*count
, GLuint
*obj
)
1297 GET_CURRENT_CONTEXT(ctx
);
1298 get_attached_shaders(ctx
, program
, maxCount
, count
, obj
);
1303 _mesa_GetAttribLocationARB(GLhandleARB program
, const GLcharARB
* name
)
1305 GET_CURRENT_CONTEXT(ctx
);
1306 return get_attrib_location(ctx
, program
, name
);
1310 /* GL_EXT_gpu_shader4, GL3 */
1312 _mesa_GetFragDataLocation(GLuint program
, const GLchar
*name
)
1314 GET_CURRENT_CONTEXT(ctx
);
1315 return get_frag_data_location(ctx
, program
, name
);
1321 _mesa_GetInfoLogARB(GLhandleARB object
, GLsizei maxLength
, GLsizei
* length
,
1322 GLcharARB
* infoLog
)
1324 GET_CURRENT_CONTEXT(ctx
);
1325 if (is_program(ctx
, object
)) {
1326 get_program_info_log(ctx
, object
, maxLength
, length
, infoLog
);
1328 else if (is_shader(ctx
, object
)) {
1329 get_shader_info_log(ctx
, object
, maxLength
, length
, infoLog
);
1332 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetInfoLogARB");
1338 _mesa_GetObjectParameterivARB(GLhandleARB object
, GLenum pname
, GLint
*params
)
1340 GET_CURRENT_CONTEXT(ctx
);
1341 /* Implement in terms of GetProgramiv, GetShaderiv */
1342 if (is_program(ctx
, object
)) {
1343 if (pname
== GL_OBJECT_TYPE_ARB
) {
1344 *params
= GL_PROGRAM_OBJECT_ARB
;
1347 get_programiv(ctx
, object
, pname
, params
);
1350 else if (is_shader(ctx
, object
)) {
1351 if (pname
== GL_OBJECT_TYPE_ARB
) {
1352 *params
= GL_SHADER_OBJECT_ARB
;
1355 get_shaderiv(ctx
, object
, pname
, params
);
1359 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetObjectParameterivARB");
1365 _mesa_GetObjectParameterfvARB(GLhandleARB object
, GLenum pname
,
1368 GLint iparams
[1]; /* XXX is one element enough? */
1369 _mesa_GetObjectParameterivARB(object
, pname
, iparams
);
1370 params
[0] = (GLfloat
) iparams
[0];
1375 _mesa_GetProgramiv(GLuint program
, GLenum pname
, GLint
*params
)
1377 GET_CURRENT_CONTEXT(ctx
);
1378 get_programiv(ctx
, program
, pname
, params
);
1383 _mesa_GetShaderiv(GLuint shader
, GLenum pname
, GLint
*params
)
1385 GET_CURRENT_CONTEXT(ctx
);
1386 get_shaderiv(ctx
, shader
, pname
, params
);
1391 _mesa_GetProgramInfoLog(GLuint program
, GLsizei bufSize
,
1392 GLsizei
*length
, GLchar
*infoLog
)
1394 GET_CURRENT_CONTEXT(ctx
);
1395 get_program_info_log(ctx
, program
, bufSize
, length
, infoLog
);
1400 _mesa_GetShaderInfoLog(GLuint shader
, GLsizei bufSize
,
1401 GLsizei
*length
, GLchar
*infoLog
)
1403 GET_CURRENT_CONTEXT(ctx
);
1404 get_shader_info_log(ctx
, shader
, bufSize
, length
, infoLog
);
1409 _mesa_GetShaderSourceARB(GLhandleARB shader
, GLsizei maxLength
,
1410 GLsizei
*length
, GLcharARB
*sourceOut
)
1412 GET_CURRENT_CONTEXT(ctx
);
1413 get_shader_source(ctx
, shader
, maxLength
, length
, sourceOut
);
1417 GLhandleARB GLAPIENTRY
1418 _mesa_GetHandleARB(GLenum pname
)
1420 GET_CURRENT_CONTEXT(ctx
);
1421 return get_handle(ctx
, pname
);
1425 GLboolean GLAPIENTRY
1426 _mesa_IsProgram(GLuint name
)
1428 GET_CURRENT_CONTEXT(ctx
);
1429 return is_program(ctx
, name
);
1433 GLboolean GLAPIENTRY
1434 _mesa_IsShader(GLuint name
)
1436 GET_CURRENT_CONTEXT(ctx
);
1437 return is_shader(ctx
, name
);
1442 _mesa_LinkProgramARB(GLhandleARB programObj
)
1444 GET_CURRENT_CONTEXT(ctx
);
1445 link_program(ctx
, programObj
);
1451 * Read shader source code from a file.
1452 * Useful for debugging to override an app's shader.
1455 read_shader(const char *fname
)
1457 const int max
= 50*1000;
1458 FILE *f
= fopen(fname
, "r");
1459 GLcharARB
*buffer
, *shader
;
1466 buffer
= (char *) malloc(max
);
1467 len
= fread(buffer
, 1, max
, f
);
1472 shader
= _mesa_strdup(buffer
);
1480 * Called via glShaderSource() and glShaderSourceARB() API functions.
1481 * Basically, concatenate the source code strings into one long string
1482 * and pass it to _mesa_shader_source().
1485 _mesa_ShaderSourceARB(GLhandleARB shaderObj
, GLsizei count
,
1486 const GLcharARB
** string
, const GLint
* length
)
1488 GET_CURRENT_CONTEXT(ctx
);
1490 GLsizei i
, totalLength
;
1494 if (!shaderObj
|| string
== NULL
) {
1495 _mesa_error(ctx
, GL_INVALID_VALUE
, "glShaderSourceARB");
1500 * This array holds offsets of where the appropriate string ends, thus the
1501 * last element will be set to the total length of the source code.
1503 offsets
= (GLint
*) malloc(count
* sizeof(GLint
));
1504 if (offsets
== NULL
) {
1505 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glShaderSourceARB");
1509 for (i
= 0; i
< count
; i
++) {
1510 if (string
[i
] == NULL
) {
1511 free((GLvoid
*) offsets
);
1512 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glShaderSourceARB(null string)");
1515 if (length
== NULL
|| length
[i
] < 0)
1516 offsets
[i
] = strlen(string
[i
]);
1518 offsets
[i
] = length
[i
];
1519 /* accumulate string lengths */
1521 offsets
[i
] += offsets
[i
- 1];
1524 /* Total length of source string is sum off all strings plus two.
1525 * One extra byte for terminating zero, another extra byte to silence
1526 * valgrind warnings in the parser/grammer code.
1528 totalLength
= offsets
[count
- 1] + 2;
1529 source
= (GLcharARB
*) malloc(totalLength
* sizeof(GLcharARB
));
1530 if (source
== NULL
) {
1531 free((GLvoid
*) offsets
);
1532 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glShaderSourceARB");
1536 for (i
= 0; i
< count
; i
++) {
1537 GLint start
= (i
> 0) ? offsets
[i
- 1] : 0;
1538 memcpy(source
+ start
, string
[i
],
1539 (offsets
[i
] - start
) * sizeof(GLcharARB
));
1541 source
[totalLength
- 1] = '\0';
1542 source
[totalLength
- 2] = '\0';
1545 /* Compute the shader's source code checksum then try to open a file
1546 * named newshader_<CHECKSUM>. If it exists, use it in place of the
1547 * original shader source code. For debugging.
1550 GLcharARB
*newSource
;
1552 checksum
= _mesa_str_checksum(source
);
1554 _mesa_snprintf(filename
, sizeof(filename
), "newshader_%d", checksum
);
1556 newSource
= read_shader(filename
);
1558 fprintf(stderr
, "Mesa: Replacing shader %u chksum=%d with %s\n",
1559 shaderObj
, checksum
, filename
);
1565 shader_source(ctx
, shaderObj
, source
);
1568 struct gl_shader
*sh
= _mesa_lookup_shader(ctx
, shaderObj
);
1570 sh
->SourceChecksum
= checksum
; /* save original checksum */
1578 _mesa_UseProgramObjectARB(GLhandleARB program
)
1580 GET_CURRENT_CONTEXT(ctx
);
1581 struct gl_shader_program
*shProg
;
1582 struct gl_transform_feedback_object
*obj
=
1583 ctx
->TransformFeedback
.CurrentObject
;
1586 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1587 "glUseProgram(transform feedback active)");
1592 shProg
= _mesa_lookup_shader_program_err(ctx
, program
, "glUseProgram");
1596 if (!shProg
->LinkStatus
) {
1597 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1598 "glUseProgram(program %u not linked)", program
);
1603 if (ctx
->Shader
.Flags
& GLSL_USE_PROG
) {
1604 print_shader_info(shProg
);
1611 _mesa_use_program(ctx
, shProg
);
1616 _mesa_ValidateProgramARB(GLhandleARB program
)
1618 GET_CURRENT_CONTEXT(ctx
);
1619 validate_program(ctx
, program
);
1625 _mesa_GetShaderPrecisionFormat(GLenum shadertype
, GLenum precisiontype
,
1626 GLint
* range
, GLint
* precision
)
1628 GET_CURRENT_CONTEXT(ctx
);
1630 (void) precisiontype
;
1633 _mesa_error(ctx
, GL_INVALID_OPERATION
, __FUNCTION__
);
1638 _mesa_ReleaseShaderCompiler(void)
1640 GET_CURRENT_CONTEXT(ctx
);
1641 _mesa_error(ctx
, GL_INVALID_OPERATION
, __FUNCTION__
);
1646 _mesa_ShaderBinary(GLint n
, const GLuint
* shaders
, GLenum binaryformat
,
1647 const void* binary
, GLint length
)
1649 GET_CURRENT_CONTEXT(ctx
);
1652 (void) binaryformat
;
1655 _mesa_error(ctx
, GL_INVALID_OPERATION
, __FUNCTION__
);
1658 #endif /* FEATURE_ES2 */
1661 #if FEATURE_ARB_geometry_shader4
1664 _mesa_ProgramParameteriARB(GLuint program
, GLenum pname
,
1667 struct gl_shader_program
*shProg
;
1668 GET_CURRENT_CONTEXT(ctx
);
1670 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1672 shProg
= _mesa_lookup_shader_program_err(ctx
, program
,
1673 "glProgramParameteri");
1678 case GL_GEOMETRY_VERTICES_OUT_ARB
:
1680 (unsigned) value
> ctx
->Const
.GeometryProgram
.MaxGeometryOutputVertices
) {
1681 _mesa_error(ctx
, GL_INVALID_VALUE
,
1682 "glProgramParameteri(GL_GEOMETRY_VERTICES_OUT_ARB=%d",
1686 shProg
->Geom
.VerticesOut
= value
;
1688 case GL_GEOMETRY_INPUT_TYPE_ARB
:
1692 case GL_LINES_ADJACENCY_ARB
:
1694 case GL_TRIANGLES_ADJACENCY_ARB
:
1695 shProg
->Geom
.InputType
= value
;
1698 _mesa_error(ctx
, GL_INVALID_VALUE
,
1699 "glProgramParameteri(geometry input type = %s",
1700 _mesa_lookup_enum_by_nr(value
));
1704 case GL_GEOMETRY_OUTPUT_TYPE_ARB
:
1708 case GL_TRIANGLE_STRIP
:
1709 shProg
->Geom
.OutputType
= value
;
1712 _mesa_error(ctx
, GL_INVALID_VALUE
,
1713 "glProgramParameteri(geometry output type = %s",
1714 _mesa_lookup_enum_by_nr(value
));
1719 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramParameteriARB(pname=%s)",
1720 _mesa_lookup_enum_by_nr(pname
));
1728 _mesa_use_shader_program(struct gl_context
*ctx
, GLenum type
,
1729 struct gl_shader_program
*shProg
)
1731 use_shader_program(ctx
, type
, shProg
);
1733 if (ctx
->Driver
.UseProgram
)
1734 ctx
->Driver
.UseProgram(ctx
, shProg
);
1738 _mesa_UseShaderProgramEXT(GLenum type
, GLuint program
)
1740 GET_CURRENT_CONTEXT(ctx
);
1741 struct gl_shader_program
*shProg
= NULL
;
1743 if (!validate_shader_target(ctx
, type
)) {
1744 _mesa_error(ctx
, GL_INVALID_ENUM
, "glUseShaderProgramEXT(type)");
1748 if (ctx
->TransformFeedback
.CurrentObject
->Active
) {
1749 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1750 "glUseShaderProgramEXT(transform feedback is active)");
1755 shProg
= _mesa_lookup_shader_program_err(ctx
, program
,
1756 "glUseShaderProgramEXT");
1760 if (!shProg
->LinkStatus
) {
1761 _mesa_error(ctx
, GL_INVALID_OPERATION
,
1762 "glUseShaderProgramEXT(program not linked)");
1767 _mesa_use_shader_program(ctx
, type
, shProg
);
1771 _mesa_ActiveProgramEXT(GLuint program
)
1773 GET_CURRENT_CONTEXT(ctx
);
1774 struct gl_shader_program
*shProg
= (program
!= 0)
1775 ? _mesa_lookup_shader_program_err(ctx
, program
, "glActiveProgramEXT")
1778 _mesa_active_program(ctx
, shProg
, "glActiveProgramEXT");
1783 _mesa_CreateShaderProgramEXT(GLenum type
, const GLchar
*string
)
1785 GET_CURRENT_CONTEXT(ctx
);
1786 const GLuint shader
= create_shader(ctx
, type
);
1790 shader_source(ctx
, shader
, _mesa_strdup(string
));
1791 compile_shader(ctx
, shader
);
1793 program
= create_shader_program(ctx
);
1795 struct gl_shader_program
*shProg
;
1796 struct gl_shader
*sh
;
1797 GLint compiled
= GL_FALSE
;
1799 shProg
= _mesa_lookup_shader_program(ctx
, program
);
1800 sh
= _mesa_lookup_shader(ctx
, shader
);
1802 get_shaderiv(ctx
, shader
, GL_COMPILE_STATUS
, &compiled
);
1804 attach_shader(ctx
, program
, shader
);
1805 link_program(ctx
, program
);
1806 detach_shader(ctx
, program
, shader
);
1810 if (active
-user
-defined
-varyings
-in
-linked
-program
) {
1811 append
-error
-to
-info
-log
;
1812 shProg
->LinkStatus
= GL_FALSE
;
1817 shProg
->InfoLog
= talloc_strdup_append(shProg
->InfoLog
, sh
->InfoLog
);
1820 delete_shader(ctx
, shader
);
1827 * Plug in shader-related functions into API dispatch table.
1830 _mesa_init_shader_dispatch(struct _glapi_table
*exec
)
1833 /* GL_ARB_vertex/fragment_shader */
1834 SET_DeleteObjectARB(exec
, _mesa_DeleteObjectARB
);
1835 SET_GetHandleARB(exec
, _mesa_GetHandleARB
);
1836 SET_DetachObjectARB(exec
, _mesa_DetachObjectARB
);
1837 SET_CreateShaderObjectARB(exec
, _mesa_CreateShaderObjectARB
);
1838 SET_ShaderSourceARB(exec
, _mesa_ShaderSourceARB
);
1839 SET_CompileShaderARB(exec
, _mesa_CompileShaderARB
);
1840 SET_CreateProgramObjectARB(exec
, _mesa_CreateProgramObjectARB
);
1841 SET_AttachObjectARB(exec
, _mesa_AttachObjectARB
);
1842 SET_LinkProgramARB(exec
, _mesa_LinkProgramARB
);
1843 SET_UseProgramObjectARB(exec
, _mesa_UseProgramObjectARB
);
1844 SET_ValidateProgramARB(exec
, _mesa_ValidateProgramARB
);
1845 SET_GetObjectParameterfvARB(exec
, _mesa_GetObjectParameterfvARB
);
1846 SET_GetObjectParameterivARB(exec
, _mesa_GetObjectParameterivARB
);
1847 SET_GetInfoLogARB(exec
, _mesa_GetInfoLogARB
);
1848 SET_GetAttachedObjectsARB(exec
, _mesa_GetAttachedObjectsARB
);
1849 SET_GetShaderSourceARB(exec
, _mesa_GetShaderSourceARB
);
1852 SET_AttachShader(exec
, _mesa_AttachShader
);
1853 SET_CreateProgram(exec
, _mesa_CreateProgram
);
1854 SET_CreateShader(exec
, _mesa_CreateShader
);
1855 SET_DeleteProgram(exec
, _mesa_DeleteProgram
);
1856 SET_DeleteShader(exec
, _mesa_DeleteShader
);
1857 SET_DetachShader(exec
, _mesa_DetachShader
);
1858 SET_GetAttachedShaders(exec
, _mesa_GetAttachedShaders
);
1859 SET_GetProgramiv(exec
, _mesa_GetProgramiv
);
1860 SET_GetProgramInfoLog(exec
, _mesa_GetProgramInfoLog
);
1861 SET_GetShaderiv(exec
, _mesa_GetShaderiv
);
1862 SET_GetShaderInfoLog(exec
, _mesa_GetShaderInfoLog
);
1863 SET_IsProgram(exec
, _mesa_IsProgram
);
1864 SET_IsShader(exec
, _mesa_IsShader
);
1866 #if FEATURE_ARB_vertex_shader
1867 SET_BindAttribLocationARB(exec
, _mesa_BindAttribLocationARB
);
1868 SET_GetActiveAttribARB(exec
, _mesa_GetActiveAttribARB
);
1869 SET_GetAttribLocationARB(exec
, _mesa_GetAttribLocationARB
);
1872 #if FEATURE_ARB_geometry_shader4
1873 SET_ProgramParameteriARB(exec
, _mesa_ProgramParameteriARB
);
1876 SET_UseShaderProgramEXT(exec
, _mesa_UseShaderProgramEXT
);
1877 SET_ActiveProgramEXT(exec
, _mesa_ActiveProgramEXT
);
1878 SET_CreateShaderProgramEXT(exec
, _mesa_CreateShaderProgramEXT
);
1880 /* GL_EXT_gpu_shader4 / GL 3.0 */
1881 SET_BindFragDataLocationEXT(exec
, _mesa_BindFragDataLocation
);
1882 SET_GetFragDataLocationEXT(exec
, _mesa_GetFragDataLocation
);
1884 #endif /* FEATURE_GL */