mesa: Allow sampling from units >= MAX_TEXTURE_UNITS in shaders.
[mesa.git] / src / mesa / main / shaderapi.c
1 /*
2 * Mesa 3-D graphics library
3 *
4 * Copyright (C) 2004-2008 Brian Paul All Rights Reserved.
5 * Copyright (C) 2009-2010 VMware, Inc. All Rights Reserved.
6 *
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:
13 *
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
16 *
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.
23 */
24
25 /**
26 * \file shaderapi.c
27 * \author Brian Paul
28 *
29 * Implementation of GLSL-related API functions.
30 * The glUniform* functions are in uniforms.c
31 *
32 *
33 * XXX things to do:
34 * 1. Check that the right error code is generated for all _mesa_error() calls.
35 * 2. Insert FLUSH_VERTICES calls in various places
36 */
37
38
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"
51 #include "ralloc.h"
52 #include <stdbool.h>
53 #include "../glsl/glsl_parser_extras.h"
54
55 /** Define this to enable shader substitution (see below) */
56 #define SHADER_SUBST 0
57
58
59 /**
60 * Return mask of GLSL_x flags by examining the MESA_GLSL env var.
61 */
62 static GLbitfield
63 get_shader_flags(void)
64 {
65 GLbitfield flags = 0x0;
66 const char *env = _mesa_getenv("MESA_GLSL");
67
68 if (env) {
69 if (strstr(env, "dump"))
70 flags |= GLSL_DUMP;
71 if (strstr(env, "log"))
72 flags |= GLSL_LOG;
73 if (strstr(env, "nopvert"))
74 flags |= GLSL_NOP_VERT;
75 if (strstr(env, "nopfrag"))
76 flags |= GLSL_NOP_FRAG;
77 if (strstr(env, "nopt"))
78 flags |= GLSL_NO_OPT;
79 else if (strstr(env, "opt"))
80 flags |= GLSL_OPT;
81 if (strstr(env, "uniform"))
82 flags |= GLSL_UNIFORMS;
83 if (strstr(env, "useprog"))
84 flags |= GLSL_USE_PROG;
85 }
86
87 return flags;
88 }
89
90
91 /**
92 * Initialize context's shader state.
93 */
94 void
95 _mesa_init_shader_state(struct gl_context *ctx)
96 {
97 /* Device drivers may override these to control what kind of instructions
98 * are generated by the GLSL compiler.
99 */
100 struct gl_shader_compiler_options options;
101 gl_shader_type sh;
102
103 memset(&options, 0, sizeof(options));
104 options.MaxUnrollIterations = 32;
105
106 /* Default pragma settings */
107 options.DefaultPragmas.Optimize = GL_TRUE;
108
109 for (sh = 0; sh < MESA_SHADER_TYPES; ++sh)
110 memcpy(&ctx->ShaderCompilerOptions[sh], &options, sizeof(options));
111
112 ctx->Shader.Flags = get_shader_flags();
113 }
114
115
116 /**
117 * Free the per-context shader-related state.
118 */
119 void
120 _mesa_free_shader_state(struct gl_context *ctx)
121 {
122 _mesa_reference_shader_program(ctx, &ctx->Shader.CurrentVertexProgram, NULL);
123 _mesa_reference_shader_program(ctx, &ctx->Shader.CurrentGeometryProgram,
124 NULL);
125 _mesa_reference_shader_program(ctx, &ctx->Shader.CurrentFragmentProgram,
126 NULL);
127 _mesa_reference_shader_program(ctx, &ctx->Shader.ActiveProgram, NULL);
128 }
129
130
131 /**
132 * Return the size of the given GLSL datatype, in floats (components).
133 */
134 GLint
135 _mesa_sizeof_glsl_type(GLenum type)
136 {
137 switch (type) {
138 case GL_FLOAT:
139 case GL_INT:
140 case GL_BOOL:
141 case GL_SAMPLER_1D:
142 case GL_SAMPLER_2D:
143 case GL_SAMPLER_3D:
144 case GL_SAMPLER_CUBE:
145 case GL_SAMPLER_1D_SHADOW:
146 case GL_SAMPLER_2D_SHADOW:
147 case GL_SAMPLER_2D_RECT_ARB:
148 case GL_SAMPLER_2D_RECT_SHADOW_ARB:
149 case GL_SAMPLER_1D_ARRAY_EXT:
150 case GL_SAMPLER_2D_ARRAY_EXT:
151 case GL_SAMPLER_1D_ARRAY_SHADOW_EXT:
152 case GL_SAMPLER_2D_ARRAY_SHADOW_EXT:
153 case GL_SAMPLER_CUBE_SHADOW_EXT:
154 return 1;
155 case GL_FLOAT_VEC2:
156 case GL_INT_VEC2:
157 case GL_UNSIGNED_INT_VEC2:
158 case GL_BOOL_VEC2:
159 return 2;
160 case GL_FLOAT_VEC3:
161 case GL_INT_VEC3:
162 case GL_UNSIGNED_INT_VEC3:
163 case GL_BOOL_VEC3:
164 return 3;
165 case GL_FLOAT_VEC4:
166 case GL_INT_VEC4:
167 case GL_UNSIGNED_INT_VEC4:
168 case GL_BOOL_VEC4:
169 return 4;
170 case GL_FLOAT_MAT2:
171 case GL_FLOAT_MAT2x3:
172 case GL_FLOAT_MAT2x4:
173 return 8; /* two float[4] vectors */
174 case GL_FLOAT_MAT3:
175 case GL_FLOAT_MAT3x2:
176 case GL_FLOAT_MAT3x4:
177 return 12; /* three float[4] vectors */
178 case GL_FLOAT_MAT4:
179 case GL_FLOAT_MAT4x2:
180 case GL_FLOAT_MAT4x3:
181 return 16; /* four float[4] vectors */
182 default:
183 _mesa_problem(NULL, "Invalid type in _mesa_sizeof_glsl_type()");
184 return 1;
185 }
186 }
187
188
189 /**
190 * Copy string from <src> to <dst>, up to maxLength characters, returning
191 * length of <dst> in <length>.
192 * \param src the strings source
193 * \param maxLength max chars to copy
194 * \param length returns number of chars copied
195 * \param dst the string destination
196 */
197 void
198 _mesa_copy_string(GLchar *dst, GLsizei maxLength,
199 GLsizei *length, const GLchar *src)
200 {
201 GLsizei len;
202 for (len = 0; len < maxLength - 1 && src && src[len]; len++)
203 dst[len] = src[len];
204 if (maxLength > 0)
205 dst[len] = 0;
206 if (length)
207 *length = len;
208 }
209
210
211
212 /**
213 * Confirm that the a shader type is valid and supported by the implementation
214 *
215 * \param ctx Current GL context
216 * \param type Shader target
217 *
218 */
219 static bool
220 validate_shader_target(const struct gl_context *ctx, GLenum type)
221 {
222 switch (type) {
223 #if FEATURE_ARB_fragment_shader
224 case GL_FRAGMENT_SHADER:
225 return ctx->Extensions.ARB_fragment_shader;
226 #endif
227 #if FEATURE_ARB_vertex_shader
228 case GL_VERTEX_SHADER:
229 return ctx->Extensions.ARB_vertex_shader;
230 #endif
231 #if FEATURE_ARB_geometry_shader4
232 case GL_GEOMETRY_SHADER_ARB:
233 return ctx->Extensions.ARB_geometry_shader4;
234 #endif
235 default:
236 return false;
237 }
238 }
239
240
241 /**
242 * Find the length of the longest transform feedback varying name
243 * which was specified with glTransformFeedbackVaryings().
244 */
245 static GLint
246 longest_feedback_varying_name(const struct gl_shader_program *shProg)
247 {
248 GLuint i;
249 GLint max = 0;
250 for (i = 0; i < shProg->TransformFeedback.NumVarying; i++) {
251 GLint len = strlen(shProg->TransformFeedback.VaryingNames[i]);
252 if (len > max)
253 max = len;
254 }
255 return max;
256 }
257
258
259
260 static GLboolean
261 is_program(struct gl_context *ctx, GLuint name)
262 {
263 struct gl_shader_program *shProg = _mesa_lookup_shader_program(ctx, name);
264 return shProg ? GL_TRUE : GL_FALSE;
265 }
266
267
268 static GLboolean
269 is_shader(struct gl_context *ctx, GLuint name)
270 {
271 struct gl_shader *shader = _mesa_lookup_shader(ctx, name);
272 return shader ? GL_TRUE : GL_FALSE;
273 }
274
275
276 /**
277 * Attach shader to a shader program.
278 */
279 static void
280 attach_shader(struct gl_context *ctx, GLuint program, GLuint shader)
281 {
282 struct gl_shader_program *shProg;
283 struct gl_shader *sh;
284 GLuint i, n;
285
286 shProg = _mesa_lookup_shader_program_err(ctx, program, "glAttachShader");
287 if (!shProg)
288 return;
289
290 sh = _mesa_lookup_shader_err(ctx, shader, "glAttachShader");
291 if (!sh) {
292 return;
293 }
294
295 n = shProg->NumShaders;
296 for (i = 0; i < n; i++) {
297 if (shProg->Shaders[i] == sh) {
298 /* The shader is already attched to this program. The
299 * GL_ARB_shader_objects spec says:
300 *
301 * "The error INVALID_OPERATION is generated by AttachObjectARB
302 * if <obj> is already attached to <containerObj>."
303 */
304 _mesa_error(ctx, GL_INVALID_OPERATION, "glAttachShader");
305 return;
306 }
307 }
308
309 /* grow list */
310 shProg->Shaders = (struct gl_shader **)
311 _mesa_realloc(shProg->Shaders,
312 n * sizeof(struct gl_shader *),
313 (n + 1) * sizeof(struct gl_shader *));
314 if (!shProg->Shaders) {
315 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glAttachShader");
316 return;
317 }
318
319 /* append */
320 shProg->Shaders[n] = NULL; /* since realloc() didn't zero the new space */
321 _mesa_reference_shader(ctx, &shProg->Shaders[n], sh);
322 shProg->NumShaders++;
323 }
324
325
326 static GLint
327 get_attrib_location(struct gl_context *ctx, GLuint program, const GLchar *name)
328 {
329 struct gl_shader_program *shProg
330 = _mesa_lookup_shader_program_err(ctx, program, "glGetAttribLocation");
331
332 if (!shProg) {
333 return -1;
334 }
335
336 if (!shProg->LinkStatus) {
337 _mesa_error(ctx, GL_INVALID_OPERATION,
338 "glGetAttribLocation(program not linked)");
339 return -1;
340 }
341
342 if (!name)
343 return -1;
344
345 if (shProg->VertexProgram) {
346 const struct gl_program_parameter_list *attribs =
347 shProg->VertexProgram->Base.Attributes;
348 if (attribs) {
349 GLint i = _mesa_lookup_parameter_index(attribs, -1, name);
350 if (i >= 0) {
351 return attribs->Parameters[i].StateIndexes[0];
352 }
353 }
354 }
355 return -1;
356 }
357
358
359 static void
360 bind_attrib_location(struct gl_context *ctx, GLuint program, GLuint index,
361 const GLchar *name)
362 {
363 struct gl_shader_program *shProg;
364 const GLint size = -1; /* unknown size */
365 GLint i;
366 GLenum datatype = GL_FLOAT_VEC4;
367
368 shProg = _mesa_lookup_shader_program_err(ctx, program,
369 "glBindAttribLocation");
370 if (!shProg) {
371 return;
372 }
373
374 if (!name)
375 return;
376
377 if (strncmp(name, "gl_", 3) == 0) {
378 _mesa_error(ctx, GL_INVALID_OPERATION,
379 "glBindAttribLocation(illegal name)");
380 return;
381 }
382
383 if (index >= ctx->Const.VertexProgram.MaxAttribs) {
384 _mesa_error(ctx, GL_INVALID_VALUE, "glBindAttribLocation(index)");
385 return;
386 }
387
388 /* this will replace the current value if it's already in the list */
389 i = _mesa_add_attribute(shProg->Attributes, name, size, datatype, index);
390 if (i < 0) {
391 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindAttribLocation");
392 return;
393 }
394
395 /*
396 * Note that this attribute binding won't go into effect until
397 * glLinkProgram is called again.
398 */
399 }
400
401
402 static void
403 bind_frag_data_location(struct gl_context *ctx, GLuint program,
404 GLuint colorNumber, const GLchar *name)
405 {
406 _mesa_problem(ctx, "bind_frag_data_location() not implemented yet");
407 }
408
409
410 static GLuint
411 create_shader(struct gl_context *ctx, GLenum type)
412 {
413 struct gl_shader *sh;
414 GLuint name;
415
416 if (!validate_shader_target(ctx, type)) {
417 _mesa_error(ctx, GL_INVALID_ENUM, "CreateShader(type)");
418 return 0;
419 }
420
421 name = _mesa_HashFindFreeKeyBlock(ctx->Shared->ShaderObjects, 1);
422 sh = ctx->Driver.NewShader(ctx, name, type);
423 _mesa_HashInsert(ctx->Shared->ShaderObjects, name, sh);
424
425 return name;
426 }
427
428
429 static GLuint
430 create_shader_program(struct gl_context *ctx)
431 {
432 GLuint name;
433 struct gl_shader_program *shProg;
434
435 name = _mesa_HashFindFreeKeyBlock(ctx->Shared->ShaderObjects, 1);
436
437 shProg = ctx->Driver.NewShaderProgram(ctx, name);
438
439 _mesa_HashInsert(ctx->Shared->ShaderObjects, name, shProg);
440
441 assert(shProg->RefCount == 1);
442
443 return name;
444 }
445
446
447 /**
448 * Named w/ "2" to indicate OpenGL 2.x vs GL_ARB_fragment_programs's
449 * DeleteProgramARB.
450 */
451 static void
452 delete_shader_program(struct gl_context *ctx, GLuint name)
453 {
454 /*
455 * NOTE: deleting shaders/programs works a bit differently than
456 * texture objects (and buffer objects, etc). Shader/program
457 * handles/IDs exist in the hash table until the object is really
458 * deleted (refcount==0). With texture objects, the handle/ID is
459 * removed from the hash table in glDeleteTextures() while the tex
460 * object itself might linger until its refcount goes to zero.
461 */
462 struct gl_shader_program *shProg;
463
464 shProg = _mesa_lookup_shader_program_err(ctx, name, "glDeleteProgram");
465 if (!shProg)
466 return;
467
468 shProg->DeletePending = GL_TRUE;
469
470 /* effectively, decr shProg's refcount */
471 _mesa_reference_shader_program(ctx, &shProg, NULL);
472 }
473
474
475 static void
476 delete_shader(struct gl_context *ctx, GLuint shader)
477 {
478 struct gl_shader *sh;
479
480 sh = _mesa_lookup_shader_err(ctx, shader, "glDeleteShader");
481 if (!sh)
482 return;
483
484 sh->DeletePending = GL_TRUE;
485
486 /* effectively, decr sh's refcount */
487 _mesa_reference_shader(ctx, &sh, NULL);
488 }
489
490
491 static void
492 detach_shader(struct gl_context *ctx, GLuint program, GLuint shader)
493 {
494 struct gl_shader_program *shProg;
495 GLuint n;
496 GLuint i, j;
497
498 shProg = _mesa_lookup_shader_program_err(ctx, program, "glDetachShader");
499 if (!shProg)
500 return;
501
502 n = shProg->NumShaders;
503
504 for (i = 0; i < n; i++) {
505 if (shProg->Shaders[i]->Name == shader) {
506 /* found it */
507 struct gl_shader **newList;
508
509 /* release */
510 _mesa_reference_shader(ctx, &shProg->Shaders[i], NULL);
511
512 /* alloc new, smaller array */
513 newList = (struct gl_shader **)
514 malloc((n - 1) * sizeof(struct gl_shader *));
515 if (!newList) {
516 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glDetachShader");
517 return;
518 }
519 for (j = 0; j < i; j++) {
520 newList[j] = shProg->Shaders[j];
521 }
522 while (++i < n)
523 newList[j++] = shProg->Shaders[i];
524 free(shProg->Shaders);
525
526 shProg->Shaders = newList;
527 shProg->NumShaders = n - 1;
528
529 #ifdef DEBUG
530 /* sanity check */
531 {
532 for (j = 0; j < shProg->NumShaders; j++) {
533 assert(shProg->Shaders[j]->Type == GL_VERTEX_SHADER ||
534 shProg->Shaders[j]->Type == GL_FRAGMENT_SHADER);
535 assert(shProg->Shaders[j]->RefCount > 0);
536 }
537 }
538 #endif
539
540 return;
541 }
542 }
543
544 /* not found */
545 {
546 GLenum err;
547 if (is_shader(ctx, shader))
548 err = GL_INVALID_OPERATION;
549 else if (is_program(ctx, shader))
550 err = GL_INVALID_OPERATION;
551 else
552 err = GL_INVALID_VALUE;
553 _mesa_error(ctx, err, "glDetachProgram(shader)");
554 return;
555 }
556 }
557
558
559 static void
560 get_active_attrib(struct gl_context *ctx, GLuint program, GLuint index,
561 GLsizei maxLength, GLsizei *length, GLint *size,
562 GLenum *type, GLchar *nameOut)
563 {
564 const struct gl_program_parameter_list *attribs = NULL;
565 struct gl_shader_program *shProg;
566
567 shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetActiveAttrib");
568 if (!shProg)
569 return;
570
571 if (shProg->VertexProgram)
572 attribs = shProg->VertexProgram->Base.Attributes;
573
574 if (!attribs || index >= attribs->NumParameters) {
575 _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttrib(index)");
576 return;
577 }
578
579 _mesa_copy_string(nameOut, maxLength, length,
580 attribs->Parameters[index].Name);
581
582 if (size)
583 *size = attribs->Parameters[index].Size
584 / _mesa_sizeof_glsl_type(attribs->Parameters[index].DataType);
585
586 if (type)
587 *type = attribs->Parameters[index].DataType;
588 }
589
590
591 /**
592 * Return list of shaders attached to shader program.
593 */
594 static void
595 get_attached_shaders(struct gl_context *ctx, GLuint program, GLsizei maxCount,
596 GLsizei *count, GLuint *obj)
597 {
598 struct gl_shader_program *shProg =
599 _mesa_lookup_shader_program_err(ctx, program, "glGetAttachedShaders");
600 if (shProg) {
601 GLuint i;
602 for (i = 0; i < (GLuint) maxCount && i < shProg->NumShaders; i++) {
603 obj[i] = shProg->Shaders[i]->Name;
604 }
605 if (count)
606 *count = i;
607 }
608 }
609
610
611 static GLint
612 get_frag_data_location(struct gl_context *ctx, GLuint program,
613 const GLchar *name)
614 {
615 _mesa_problem(ctx, "get_frag_data_location() not implemented yet");
616 return -1;
617 }
618
619
620
621 /**
622 * glGetHandleARB() - return ID/name of currently bound shader program.
623 */
624 static GLuint
625 get_handle(struct gl_context *ctx, GLenum pname)
626 {
627 if (pname == GL_PROGRAM_OBJECT_ARB) {
628 if (ctx->Shader.ActiveProgram)
629 return ctx->Shader.ActiveProgram->Name;
630 else
631 return 0;
632 }
633 else {
634 _mesa_error(ctx, GL_INVALID_ENUM, "glGetHandleARB");
635 return 0;
636 }
637 }
638
639
640 /**
641 * glGetProgramiv() - get shader program state.
642 * Note that this is for GLSL shader programs, not ARB vertex/fragment
643 * programs (see glGetProgramivARB).
644 */
645 static void
646 get_programiv(struct gl_context *ctx, GLuint program, GLenum pname, GLint *params)
647 {
648 const struct gl_program_parameter_list *attribs;
649 struct gl_shader_program *shProg
650 = _mesa_lookup_shader_program(ctx, program);
651
652 if (!shProg) {
653 _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramiv(program)");
654 return;
655 }
656
657 if (shProg->VertexProgram)
658 attribs = shProg->VertexProgram->Base.Attributes;
659 else
660 attribs = NULL;
661
662 switch (pname) {
663 case GL_DELETE_STATUS:
664 *params = shProg->DeletePending;
665 break;
666 case GL_LINK_STATUS:
667 *params = shProg->LinkStatus;
668 break;
669 case GL_VALIDATE_STATUS:
670 *params = shProg->Validated;
671 break;
672 case GL_INFO_LOG_LENGTH:
673 *params = shProg->InfoLog ? strlen(shProg->InfoLog) + 1 : 0;
674 break;
675 case GL_ATTACHED_SHADERS:
676 *params = shProg->NumShaders;
677 break;
678 case GL_ACTIVE_ATTRIBUTES:
679 *params = attribs ? attribs->NumParameters : 0;
680 break;
681 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
682 *params = _mesa_longest_parameter_name(attribs, PROGRAM_INPUT) + 1;
683 break;
684 case GL_ACTIVE_UNIFORMS:
685 *params = shProg->Uniforms ? shProg->Uniforms->NumUniforms : 0;
686 break;
687 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
688 *params = _mesa_longest_uniform_name(shProg->Uniforms);
689 if (*params > 0)
690 (*params)++; /* add one for terminating zero */
691 break;
692 case GL_PROGRAM_BINARY_LENGTH_OES:
693 *params = 0;
694 break;
695 #if FEATURE_EXT_transform_feedback
696 case GL_TRANSFORM_FEEDBACK_VARYINGS:
697 *params = shProg->TransformFeedback.NumVarying;
698 break;
699 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
700 *params = longest_feedback_varying_name(shProg) + 1;
701 break;
702 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
703 *params = shProg->TransformFeedback.BufferMode;
704 break;
705 #endif
706 #if FEATURE_ARB_geometry_shader4
707 case GL_GEOMETRY_VERTICES_OUT_ARB:
708 *params = shProg->Geom.VerticesOut;
709 break;
710 case GL_GEOMETRY_INPUT_TYPE_ARB:
711 *params = shProg->Geom.InputType;
712 break;
713 case GL_GEOMETRY_OUTPUT_TYPE_ARB:
714 *params = shProg->Geom.OutputType;
715 break;
716 #endif
717 default:
718 _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramiv(pname)");
719 return;
720 }
721 }
722
723
724 /**
725 * glGetShaderiv() - get GLSL shader state
726 */
727 static void
728 get_shaderiv(struct gl_context *ctx, GLuint name, GLenum pname, GLint *params)
729 {
730 struct gl_shader *shader =
731 _mesa_lookup_shader_err(ctx, name, "glGetShaderiv");
732
733 if (!shader) {
734 return;
735 }
736
737 switch (pname) {
738 case GL_SHADER_TYPE:
739 *params = shader->Type;
740 break;
741 case GL_DELETE_STATUS:
742 *params = shader->DeletePending;
743 break;
744 case GL_COMPILE_STATUS:
745 *params = shader->CompileStatus;
746 break;
747 case GL_INFO_LOG_LENGTH:
748 *params = shader->InfoLog ? strlen(shader->InfoLog) + 1 : 0;
749 break;
750 case GL_SHADER_SOURCE_LENGTH:
751 *params = shader->Source ? strlen((char *) shader->Source) + 1 : 0;
752 break;
753 default:
754 _mesa_error(ctx, GL_INVALID_ENUM, "glGetShaderiv(pname)");
755 return;
756 }
757 }
758
759
760 static void
761 get_program_info_log(struct gl_context *ctx, GLuint program, GLsizei bufSize,
762 GLsizei *length, GLchar *infoLog)
763 {
764 struct gl_shader_program *shProg
765 = _mesa_lookup_shader_program(ctx, program);
766 if (!shProg) {
767 _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramInfoLog(program)");
768 return;
769 }
770 _mesa_copy_string(infoLog, bufSize, length, shProg->InfoLog);
771 }
772
773
774 static void
775 get_shader_info_log(struct gl_context *ctx, GLuint shader, GLsizei bufSize,
776 GLsizei *length, GLchar *infoLog)
777 {
778 struct gl_shader *sh = _mesa_lookup_shader(ctx, shader);
779 if (!sh) {
780 _mesa_error(ctx, GL_INVALID_VALUE, "glGetShaderInfoLog(shader)");
781 return;
782 }
783 _mesa_copy_string(infoLog, bufSize, length, sh->InfoLog);
784 }
785
786
787 /**
788 * Return shader source code.
789 */
790 static void
791 get_shader_source(struct gl_context *ctx, GLuint shader, GLsizei maxLength,
792 GLsizei *length, GLchar *sourceOut)
793 {
794 struct gl_shader *sh;
795 sh = _mesa_lookup_shader_err(ctx, shader, "glGetShaderSource");
796 if (!sh) {
797 return;
798 }
799 _mesa_copy_string(sourceOut, maxLength, length, sh->Source);
800 }
801
802
803 /**
804 * Set/replace shader source code.
805 */
806 static void
807 shader_source(struct gl_context *ctx, GLuint shader, const GLchar *source)
808 {
809 struct gl_shader *sh;
810
811 sh = _mesa_lookup_shader_err(ctx, shader, "glShaderSource");
812 if (!sh)
813 return;
814
815 /* free old shader source string and install new one */
816 if (sh->Source) {
817 free((void *) sh->Source);
818 }
819 sh->Source = source;
820 sh->CompileStatus = GL_FALSE;
821 #ifdef DEBUG
822 sh->SourceChecksum = _mesa_str_checksum(sh->Source);
823 #endif
824 }
825
826
827 /**
828 * Compile a shader.
829 */
830 static void
831 compile_shader(struct gl_context *ctx, GLuint shaderObj)
832 {
833 struct gl_shader *sh;
834 struct gl_shader_compiler_options *options;
835
836 sh = _mesa_lookup_shader_err(ctx, shaderObj, "glCompileShader");
837 if (!sh)
838 return;
839
840 options = &ctx->ShaderCompilerOptions[_mesa_shader_type_to_index(sh->Type)];
841
842 /* set default pragma state for shader */
843 sh->Pragmas = options->DefaultPragmas;
844
845 /* this call will set the sh->CompileStatus field to indicate if
846 * compilation was successful.
847 */
848 _mesa_glsl_compile_shader(ctx, sh);
849 }
850
851
852 /**
853 * Link a program's shaders.
854 */
855 static void
856 link_program(struct gl_context *ctx, GLuint program)
857 {
858 struct gl_shader_program *shProg;
859 struct gl_transform_feedback_object *obj =
860 ctx->TransformFeedback.CurrentObject;
861
862 shProg = _mesa_lookup_shader_program_err(ctx, program, "glLinkProgram");
863 if (!shProg)
864 return;
865
866 if (obj->Active
867 && (shProg == ctx->Shader.CurrentVertexProgram
868 || shProg == ctx->Shader.CurrentGeometryProgram
869 || shProg == ctx->Shader.CurrentFragmentProgram)) {
870 _mesa_error(ctx, GL_INVALID_OPERATION,
871 "glLinkProgram(transform feedback active");
872 return;
873 }
874
875 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
876
877 _mesa_glsl_link_shader(ctx, shProg);
878
879 /* debug code */
880 if (0) {
881 GLuint i;
882
883 printf("Link %u shaders in program %u: %s\n",
884 shProg->NumShaders, shProg->Name,
885 shProg->LinkStatus ? "Success" : "Failed");
886
887 for (i = 0; i < shProg->NumShaders; i++) {
888 printf(" shader %u, type 0x%x\n",
889 shProg->Shaders[i]->Name,
890 shProg->Shaders[i]->Type);
891 }
892 }
893 }
894
895
896 /**
897 * Print basic shader info (for debug).
898 */
899 static void
900 print_shader_info(const struct gl_shader_program *shProg)
901 {
902 GLuint i;
903
904 printf("Mesa: glUseProgram(%u)\n", shProg->Name);
905 for (i = 0; i < shProg->NumShaders; i++) {
906 const char *s;
907 switch (shProg->Shaders[i]->Type) {
908 case GL_VERTEX_SHADER:
909 s = "vertex";
910 break;
911 case GL_FRAGMENT_SHADER:
912 s = "fragment";
913 break;
914 case GL_GEOMETRY_SHADER:
915 s = "geometry";
916 break;
917 default:
918 s = "";
919 }
920 printf(" %s shader %u, checksum %u\n", s,
921 shProg->Shaders[i]->Name,
922 shProg->Shaders[i]->SourceChecksum);
923 }
924 if (shProg->VertexProgram)
925 printf(" vert prog %u\n", shProg->VertexProgram->Base.Id);
926 if (shProg->FragmentProgram)
927 printf(" frag prog %u\n", shProg->FragmentProgram->Base.Id);
928 if (shProg->GeometryProgram)
929 printf(" geom prog %u\n", shProg->GeometryProgram->Base.Id);
930 }
931
932
933 /**
934 * Use the named shader program for subsequent glUniform calls
935 */
936 void
937 _mesa_active_program(struct gl_context *ctx, struct gl_shader_program *shProg,
938 const char *caller)
939 {
940 if ((shProg != NULL) && !shProg->LinkStatus) {
941 _mesa_error(ctx, GL_INVALID_OPERATION,
942 "%s(program %u not linked)", caller, shProg->Name);
943 return;
944 }
945
946 if (ctx->Shader.ActiveProgram != shProg) {
947 _mesa_reference_shader_program(ctx, &ctx->Shader.ActiveProgram, shProg);
948 }
949 }
950
951 /**
952 */
953 static bool
954 use_shader_program(struct gl_context *ctx, GLenum type,
955 struct gl_shader_program *shProg)
956 {
957 struct gl_shader_program **target;
958
959 switch (type) {
960 #if FEATURE_ARB_vertex_shader
961 case GL_VERTEX_SHADER:
962 target = &ctx->Shader.CurrentVertexProgram;
963 if ((shProg == NULL)
964 || (shProg->_LinkedShaders[MESA_SHADER_VERTEX] == NULL)) {
965 shProg = NULL;
966 }
967 break;
968 #endif
969 #if FEATURE_ARB_geometry_shader4
970 case GL_GEOMETRY_SHADER_ARB:
971 target = &ctx->Shader.CurrentGeometryProgram;
972 if ((shProg == NULL)
973 || (shProg->_LinkedShaders[MESA_SHADER_GEOMETRY] == NULL)) {
974 shProg = NULL;
975 }
976 break;
977 #endif
978 #if FEATURE_ARB_fragment_shader
979 case GL_FRAGMENT_SHADER:
980 target = &ctx->Shader.CurrentFragmentProgram;
981 if ((shProg == NULL)
982 || (shProg->_LinkedShaders[MESA_SHADER_FRAGMENT] == NULL)) {
983 shProg = NULL;
984 }
985 break;
986 #endif
987 default:
988 return false;
989 }
990
991 if (*target != shProg) {
992 FLUSH_VERTICES(ctx, _NEW_PROGRAM | _NEW_PROGRAM_CONSTANTS);
993 _mesa_reference_shader_program(ctx, target, shProg);
994 return true;
995 }
996
997 return false;
998 }
999
1000 /**
1001 * Use the named shader program for subsequent rendering.
1002 */
1003 void
1004 _mesa_use_program(struct gl_context *ctx, struct gl_shader_program *shProg)
1005 {
1006 use_shader_program(ctx, GL_VERTEX_SHADER, shProg);
1007 use_shader_program(ctx, GL_GEOMETRY_SHADER_ARB, shProg);
1008 use_shader_program(ctx, GL_FRAGMENT_SHADER, shProg);
1009 _mesa_active_program(ctx, shProg, "glUseProgram");
1010
1011 if (ctx->Driver.UseProgram)
1012 ctx->Driver.UseProgram(ctx, shProg);
1013 }
1014
1015
1016 /**
1017 * Validate a program's samplers.
1018 * Specifically, check that there aren't two samplers of different types
1019 * pointing to the same texture unit.
1020 * \return GL_TRUE if valid, GL_FALSE if invalid
1021 */
1022 static GLboolean
1023 validate_samplers(const struct gl_program *prog, char *errMsg)
1024 {
1025 static const char *targetName[] = {
1026 "TEXTURE_BUFFER",
1027 "TEXTURE_2D_ARRAY",
1028 "TEXTURE_1D_ARRAY",
1029 "TEXTURE_CUBE",
1030 "TEXTURE_3D",
1031 "TEXTURE_RECT",
1032 "TEXTURE_2D",
1033 "TEXTURE_1D",
1034 };
1035 GLint targetUsed[MAX_COMBINED_TEXTURE_IMAGE_UNITS];
1036 GLbitfield samplersUsed = prog->SamplersUsed;
1037 GLuint i;
1038
1039 assert(Elements(targetName) == NUM_TEXTURE_TARGETS);
1040
1041 if (samplersUsed == 0x0)
1042 return GL_TRUE;
1043
1044 for (i = 0; i < Elements(targetUsed); i++)
1045 targetUsed[i] = -1;
1046
1047 /* walk over bits which are set in 'samplers' */
1048 while (samplersUsed) {
1049 GLuint unit;
1050 gl_texture_index target;
1051 GLint sampler = _mesa_ffs(samplersUsed) - 1;
1052 assert(sampler >= 0);
1053 assert(sampler < MAX_TEXTURE_IMAGE_UNITS);
1054 unit = prog->SamplerUnits[sampler];
1055 target = prog->SamplerTargets[sampler];
1056 if (targetUsed[unit] != -1 && targetUsed[unit] != (int) target) {
1057 _mesa_snprintf(errMsg, 100,
1058 "Texture unit %d is accessed both as %s and %s",
1059 unit, targetName[targetUsed[unit]], targetName[target]);
1060 return GL_FALSE;
1061 }
1062 targetUsed[unit] = target;
1063 samplersUsed ^= (1 << sampler);
1064 }
1065
1066 return GL_TRUE;
1067 }
1068
1069
1070 /**
1071 * Do validation of the given shader program.
1072 * \param errMsg returns error message if validation fails.
1073 * \return GL_TRUE if valid, GL_FALSE if invalid (and set errMsg)
1074 */
1075 static GLboolean
1076 validate_shader_program(const struct gl_shader_program *shProg,
1077 char *errMsg)
1078 {
1079 const struct gl_vertex_program *vp = shProg->VertexProgram;
1080 const struct gl_geometry_program *gp = shProg->GeometryProgram;
1081 const struct gl_fragment_program *fp = shProg->FragmentProgram;
1082
1083 if (!shProg->LinkStatus) {
1084 return GL_FALSE;
1085 }
1086
1087 /* From the GL spec, a program is invalid if any of these are true:
1088
1089 any two active samplers in the current program object are of
1090 different types, but refer to the same texture image unit,
1091
1092 any active sampler in the current program object refers to a texture
1093 image unit where fixed-function fragment processing accesses a
1094 texture target that does not match the sampler type, or
1095
1096 the sum of the number of active samplers in the program and the
1097 number of texture image units enabled for fixed-function fragment
1098 processing exceeds the combined limit on the total number of texture
1099 image units allowed.
1100 */
1101
1102
1103 /*
1104 * Check: any two active samplers in the current program object are of
1105 * different types, but refer to the same texture image unit,
1106 */
1107 if (vp && !validate_samplers(&vp->Base, errMsg)) {
1108 return GL_FALSE;
1109 }
1110 if (gp && !validate_samplers(&gp->Base, errMsg)) {
1111 return GL_FALSE;
1112 }
1113 if (fp && !validate_samplers(&fp->Base, errMsg)) {
1114 return GL_FALSE;
1115 }
1116
1117 return GL_TRUE;
1118 }
1119
1120
1121 /**
1122 * Called via glValidateProgram()
1123 */
1124 static void
1125 validate_program(struct gl_context *ctx, GLuint program)
1126 {
1127 struct gl_shader_program *shProg;
1128 char errMsg[100];
1129
1130 shProg = _mesa_lookup_shader_program_err(ctx, program, "glValidateProgram");
1131 if (!shProg) {
1132 return;
1133 }
1134
1135 shProg->Validated = validate_shader_program(shProg, errMsg);
1136 if (!shProg->Validated) {
1137 /* update info log */
1138 if (shProg->InfoLog) {
1139 ralloc_free(shProg->InfoLog);
1140 }
1141 shProg->InfoLog = ralloc_strdup(shProg, errMsg);
1142 }
1143 }
1144
1145
1146
1147 void GLAPIENTRY
1148 _mesa_AttachObjectARB(GLhandleARB program, GLhandleARB shader)
1149 {
1150 GET_CURRENT_CONTEXT(ctx);
1151 attach_shader(ctx, program, shader);
1152 }
1153
1154
1155 void GLAPIENTRY
1156 _mesa_AttachShader(GLuint program, GLuint shader)
1157 {
1158 GET_CURRENT_CONTEXT(ctx);
1159 attach_shader(ctx, program, shader);
1160 }
1161
1162
1163 void GLAPIENTRY
1164 _mesa_BindAttribLocationARB(GLhandleARB program, GLuint index,
1165 const GLcharARB *name)
1166 {
1167 GET_CURRENT_CONTEXT(ctx);
1168 bind_attrib_location(ctx, program, index, name);
1169 }
1170
1171
1172 /* GL_EXT_gpu_shader4, GL3 */
1173 void GLAPIENTRY
1174 _mesa_BindFragDataLocation(GLuint program, GLuint colorNumber,
1175 const GLchar *name)
1176 {
1177 GET_CURRENT_CONTEXT(ctx);
1178 bind_frag_data_location(ctx, program, colorNumber, name);
1179 }
1180
1181
1182 void GLAPIENTRY
1183 _mesa_CompileShaderARB(GLhandleARB shaderObj)
1184 {
1185 GET_CURRENT_CONTEXT(ctx);
1186 if (MESA_VERBOSE & VERBOSE_API)
1187 _mesa_debug(ctx, "glCompileShader %u\n", shaderObj);
1188 compile_shader(ctx, shaderObj);
1189 }
1190
1191
1192 GLuint GLAPIENTRY
1193 _mesa_CreateShader(GLenum type)
1194 {
1195 GET_CURRENT_CONTEXT(ctx);
1196 if (MESA_VERBOSE & VERBOSE_API)
1197 _mesa_debug(ctx, "glCreateShader %s\n", _mesa_lookup_enum_by_nr(type));
1198 return create_shader(ctx, type);
1199 }
1200
1201
1202 GLhandleARB GLAPIENTRY
1203 _mesa_CreateShaderObjectARB(GLenum type)
1204 {
1205 GET_CURRENT_CONTEXT(ctx);
1206 return create_shader(ctx, type);
1207 }
1208
1209
1210 GLuint GLAPIENTRY
1211 _mesa_CreateProgram(void)
1212 {
1213 GET_CURRENT_CONTEXT(ctx);
1214 if (MESA_VERBOSE & VERBOSE_API)
1215 _mesa_debug(ctx, "glCreateProgram\n");
1216 return create_shader_program(ctx);
1217 }
1218
1219
1220 GLhandleARB GLAPIENTRY
1221 _mesa_CreateProgramObjectARB(void)
1222 {
1223 GET_CURRENT_CONTEXT(ctx);
1224 return create_shader_program(ctx);
1225 }
1226
1227
1228 void GLAPIENTRY
1229 _mesa_DeleteObjectARB(GLhandleARB obj)
1230 {
1231 if (MESA_VERBOSE & VERBOSE_API) {
1232 GET_CURRENT_CONTEXT(ctx);
1233 _mesa_debug(ctx, "glDeleteObjectARB(%u)\n", obj);
1234 }
1235
1236 if (obj) {
1237 GET_CURRENT_CONTEXT(ctx);
1238 FLUSH_VERTICES(ctx, 0);
1239 if (is_program(ctx, obj)) {
1240 delete_shader_program(ctx, obj);
1241 }
1242 else if (is_shader(ctx, obj)) {
1243 delete_shader(ctx, obj);
1244 }
1245 else {
1246 /* error? */
1247 }
1248 }
1249 }
1250
1251
1252 void GLAPIENTRY
1253 _mesa_DeleteProgram(GLuint name)
1254 {
1255 if (name) {
1256 GET_CURRENT_CONTEXT(ctx);
1257 FLUSH_VERTICES(ctx, 0);
1258 delete_shader_program(ctx, name);
1259 }
1260 }
1261
1262
1263 void GLAPIENTRY
1264 _mesa_DeleteShader(GLuint name)
1265 {
1266 if (name) {
1267 GET_CURRENT_CONTEXT(ctx);
1268 FLUSH_VERTICES(ctx, 0);
1269 delete_shader(ctx, name);
1270 }
1271 }
1272
1273
1274 void GLAPIENTRY
1275 _mesa_DetachObjectARB(GLhandleARB program, GLhandleARB shader)
1276 {
1277 GET_CURRENT_CONTEXT(ctx);
1278 detach_shader(ctx, program, shader);
1279 }
1280
1281
1282 void GLAPIENTRY
1283 _mesa_DetachShader(GLuint program, GLuint shader)
1284 {
1285 GET_CURRENT_CONTEXT(ctx);
1286 detach_shader(ctx, program, shader);
1287 }
1288
1289
1290 void GLAPIENTRY
1291 _mesa_GetActiveAttribARB(GLhandleARB program, GLuint index,
1292 GLsizei maxLength, GLsizei * length, GLint * size,
1293 GLenum * type, GLcharARB * name)
1294 {
1295 GET_CURRENT_CONTEXT(ctx);
1296 get_active_attrib(ctx, program, index, maxLength, length, size, type, name);
1297 }
1298
1299
1300 void GLAPIENTRY
1301 _mesa_GetAttachedObjectsARB(GLhandleARB container, GLsizei maxCount,
1302 GLsizei * count, GLhandleARB * obj)
1303 {
1304 GET_CURRENT_CONTEXT(ctx);
1305 get_attached_shaders(ctx, container, maxCount, count, obj);
1306 }
1307
1308
1309 void GLAPIENTRY
1310 _mesa_GetAttachedShaders(GLuint program, GLsizei maxCount,
1311 GLsizei *count, GLuint *obj)
1312 {
1313 GET_CURRENT_CONTEXT(ctx);
1314 get_attached_shaders(ctx, program, maxCount, count, obj);
1315 }
1316
1317
1318 GLint GLAPIENTRY
1319 _mesa_GetAttribLocationARB(GLhandleARB program, const GLcharARB * name)
1320 {
1321 GET_CURRENT_CONTEXT(ctx);
1322 return get_attrib_location(ctx, program, name);
1323 }
1324
1325
1326 /* GL_EXT_gpu_shader4, GL3 */
1327 GLint GLAPIENTRY
1328 _mesa_GetFragDataLocation(GLuint program, const GLchar *name)
1329 {
1330 GET_CURRENT_CONTEXT(ctx);
1331 return get_frag_data_location(ctx, program, name);
1332 }
1333
1334
1335
1336 void GLAPIENTRY
1337 _mesa_GetInfoLogARB(GLhandleARB object, GLsizei maxLength, GLsizei * length,
1338 GLcharARB * infoLog)
1339 {
1340 GET_CURRENT_CONTEXT(ctx);
1341 if (is_program(ctx, object)) {
1342 get_program_info_log(ctx, object, maxLength, length, infoLog);
1343 }
1344 else if (is_shader(ctx, object)) {
1345 get_shader_info_log(ctx, object, maxLength, length, infoLog);
1346 }
1347 else {
1348 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetInfoLogARB");
1349 }
1350 }
1351
1352
1353 void GLAPIENTRY
1354 _mesa_GetObjectParameterivARB(GLhandleARB object, GLenum pname, GLint *params)
1355 {
1356 GET_CURRENT_CONTEXT(ctx);
1357 /* Implement in terms of GetProgramiv, GetShaderiv */
1358 if (is_program(ctx, object)) {
1359 if (pname == GL_OBJECT_TYPE_ARB) {
1360 *params = GL_PROGRAM_OBJECT_ARB;
1361 }
1362 else {
1363 get_programiv(ctx, object, pname, params);
1364 }
1365 }
1366 else if (is_shader(ctx, object)) {
1367 if (pname == GL_OBJECT_TYPE_ARB) {
1368 *params = GL_SHADER_OBJECT_ARB;
1369 }
1370 else {
1371 get_shaderiv(ctx, object, pname, params);
1372 }
1373 }
1374 else {
1375 _mesa_error(ctx, GL_INVALID_VALUE, "glGetObjectParameterivARB");
1376 }
1377 }
1378
1379
1380 void GLAPIENTRY
1381 _mesa_GetObjectParameterfvARB(GLhandleARB object, GLenum pname,
1382 GLfloat *params)
1383 {
1384 GLint iparams[1]; /* XXX is one element enough? */
1385 _mesa_GetObjectParameterivARB(object, pname, iparams);
1386 params[0] = (GLfloat) iparams[0];
1387 }
1388
1389
1390 void GLAPIENTRY
1391 _mesa_GetProgramiv(GLuint program, GLenum pname, GLint *params)
1392 {
1393 GET_CURRENT_CONTEXT(ctx);
1394 get_programiv(ctx, program, pname, params);
1395 }
1396
1397
1398 void GLAPIENTRY
1399 _mesa_GetShaderiv(GLuint shader, GLenum pname, GLint *params)
1400 {
1401 GET_CURRENT_CONTEXT(ctx);
1402 get_shaderiv(ctx, shader, pname, params);
1403 }
1404
1405
1406 void GLAPIENTRY
1407 _mesa_GetProgramInfoLog(GLuint program, GLsizei bufSize,
1408 GLsizei *length, GLchar *infoLog)
1409 {
1410 GET_CURRENT_CONTEXT(ctx);
1411 get_program_info_log(ctx, program, bufSize, length, infoLog);
1412 }
1413
1414
1415 void GLAPIENTRY
1416 _mesa_GetShaderInfoLog(GLuint shader, GLsizei bufSize,
1417 GLsizei *length, GLchar *infoLog)
1418 {
1419 GET_CURRENT_CONTEXT(ctx);
1420 get_shader_info_log(ctx, shader, bufSize, length, infoLog);
1421 }
1422
1423
1424 void GLAPIENTRY
1425 _mesa_GetShaderSourceARB(GLhandleARB shader, GLsizei maxLength,
1426 GLsizei *length, GLcharARB *sourceOut)
1427 {
1428 GET_CURRENT_CONTEXT(ctx);
1429 get_shader_source(ctx, shader, maxLength, length, sourceOut);
1430 }
1431
1432
1433 GLhandleARB GLAPIENTRY
1434 _mesa_GetHandleARB(GLenum pname)
1435 {
1436 GET_CURRENT_CONTEXT(ctx);
1437 return get_handle(ctx, pname);
1438 }
1439
1440
1441 GLboolean GLAPIENTRY
1442 _mesa_IsProgram(GLuint name)
1443 {
1444 GET_CURRENT_CONTEXT(ctx);
1445 return is_program(ctx, name);
1446 }
1447
1448
1449 GLboolean GLAPIENTRY
1450 _mesa_IsShader(GLuint name)
1451 {
1452 GET_CURRENT_CONTEXT(ctx);
1453 return is_shader(ctx, name);
1454 }
1455
1456
1457 void GLAPIENTRY
1458 _mesa_LinkProgramARB(GLhandleARB programObj)
1459 {
1460 GET_CURRENT_CONTEXT(ctx);
1461 link_program(ctx, programObj);
1462 }
1463
1464
1465
1466 /**
1467 * Read shader source code from a file.
1468 * Useful for debugging to override an app's shader.
1469 */
1470 static GLcharARB *
1471 read_shader(const char *fname)
1472 {
1473 const int max = 50*1000;
1474 FILE *f = fopen(fname, "r");
1475 GLcharARB *buffer, *shader;
1476 int len;
1477
1478 if (!f) {
1479 return NULL;
1480 }
1481
1482 buffer = (char *) malloc(max);
1483 len = fread(buffer, 1, max, f);
1484 buffer[len] = 0;
1485
1486 fclose(f);
1487
1488 shader = _mesa_strdup(buffer);
1489 free(buffer);
1490
1491 return shader;
1492 }
1493
1494
1495 /**
1496 * Called via glShaderSource() and glShaderSourceARB() API functions.
1497 * Basically, concatenate the source code strings into one long string
1498 * and pass it to _mesa_shader_source().
1499 */
1500 void GLAPIENTRY
1501 _mesa_ShaderSourceARB(GLhandleARB shaderObj, GLsizei count,
1502 const GLcharARB ** string, const GLint * length)
1503 {
1504 GET_CURRENT_CONTEXT(ctx);
1505 GLint *offsets;
1506 GLsizei i, totalLength;
1507 GLcharARB *source;
1508 GLuint checksum;
1509
1510 if (!shaderObj || string == NULL) {
1511 _mesa_error(ctx, GL_INVALID_VALUE, "glShaderSourceARB");
1512 return;
1513 }
1514
1515 /*
1516 * This array holds offsets of where the appropriate string ends, thus the
1517 * last element will be set to the total length of the source code.
1518 */
1519 offsets = (GLint *) malloc(count * sizeof(GLint));
1520 if (offsets == NULL) {
1521 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
1522 return;
1523 }
1524
1525 for (i = 0; i < count; i++) {
1526 if (string[i] == NULL) {
1527 free((GLvoid *) offsets);
1528 _mesa_error(ctx, GL_INVALID_OPERATION,
1529 "glShaderSourceARB(null string)");
1530 return;
1531 }
1532 if (length == NULL || length[i] < 0)
1533 offsets[i] = strlen(string[i]);
1534 else
1535 offsets[i] = length[i];
1536 /* accumulate string lengths */
1537 if (i > 0)
1538 offsets[i] += offsets[i - 1];
1539 }
1540
1541 /* Total length of source string is sum off all strings plus two.
1542 * One extra byte for terminating zero, another extra byte to silence
1543 * valgrind warnings in the parser/grammer code.
1544 */
1545 totalLength = offsets[count - 1] + 2;
1546 source = (GLcharARB *) malloc(totalLength * sizeof(GLcharARB));
1547 if (source == NULL) {
1548 free((GLvoid *) offsets);
1549 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
1550 return;
1551 }
1552
1553 for (i = 0; i < count; i++) {
1554 GLint start = (i > 0) ? offsets[i - 1] : 0;
1555 memcpy(source + start, string[i],
1556 (offsets[i] - start) * sizeof(GLcharARB));
1557 }
1558 source[totalLength - 1] = '\0';
1559 source[totalLength - 2] = '\0';
1560
1561 if (SHADER_SUBST) {
1562 /* Compute the shader's source code checksum then try to open a file
1563 * named newshader_<CHECKSUM>. If it exists, use it in place of the
1564 * original shader source code. For debugging.
1565 */
1566 char filename[100];
1567 GLcharARB *newSource;
1568
1569 checksum = _mesa_str_checksum(source);
1570
1571 _mesa_snprintf(filename, sizeof(filename), "newshader_%d", checksum);
1572
1573 newSource = read_shader(filename);
1574 if (newSource) {
1575 fprintf(stderr, "Mesa: Replacing shader %u chksum=%d with %s\n",
1576 shaderObj, checksum, filename);
1577 free(source);
1578 source = newSource;
1579 }
1580 }
1581
1582 shader_source(ctx, shaderObj, source);
1583
1584 if (SHADER_SUBST) {
1585 struct gl_shader *sh = _mesa_lookup_shader(ctx, shaderObj);
1586 if (sh)
1587 sh->SourceChecksum = checksum; /* save original checksum */
1588 }
1589
1590 free(offsets);
1591 }
1592
1593
1594 void GLAPIENTRY
1595 _mesa_UseProgramObjectARB(GLhandleARB program)
1596 {
1597 GET_CURRENT_CONTEXT(ctx);
1598 struct gl_shader_program *shProg;
1599 struct gl_transform_feedback_object *obj =
1600 ctx->TransformFeedback.CurrentObject;
1601
1602 ASSERT_OUTSIDE_BEGIN_END(ctx);
1603
1604 if (obj->Active) {
1605 _mesa_error(ctx, GL_INVALID_OPERATION,
1606 "glUseProgram(transform feedback active)");
1607 return;
1608 }
1609
1610 if (program) {
1611 shProg = _mesa_lookup_shader_program_err(ctx, program, "glUseProgram");
1612 if (!shProg) {
1613 return;
1614 }
1615 if (!shProg->LinkStatus) {
1616 _mesa_error(ctx, GL_INVALID_OPERATION,
1617 "glUseProgram(program %u not linked)", program);
1618 return;
1619 }
1620
1621 /* debug code */
1622 if (ctx->Shader.Flags & GLSL_USE_PROG) {
1623 print_shader_info(shProg);
1624 }
1625 }
1626 else {
1627 shProg = NULL;
1628 }
1629
1630 _mesa_use_program(ctx, shProg);
1631 }
1632
1633
1634 void GLAPIENTRY
1635 _mesa_ValidateProgramARB(GLhandleARB program)
1636 {
1637 GET_CURRENT_CONTEXT(ctx);
1638 validate_program(ctx, program);
1639 }
1640
1641 #ifdef FEATURE_ES2
1642
1643 void GLAPIENTRY
1644 _mesa_GetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype,
1645 GLint* range, GLint* precision)
1646 {
1647 const struct gl_program_constants *limits;
1648 const struct gl_precision *p;
1649 GET_CURRENT_CONTEXT(ctx);
1650
1651 switch (shadertype) {
1652 case GL_VERTEX_SHADER:
1653 limits = &ctx->Const.VertexProgram;
1654 break;
1655 case GL_FRAGMENT_SHADER:
1656 limits = &ctx->Const.FragmentProgram;
1657 break;
1658 default:
1659 _mesa_error(ctx, GL_INVALID_ENUM,
1660 "glGetShaderPrecisionFormat(shadertype)");
1661 return;
1662 }
1663
1664 switch (precisiontype) {
1665 case GL_LOW_FLOAT:
1666 p = &limits->LowFloat;
1667 break;
1668 case GL_MEDIUM_FLOAT:
1669 p = &limits->MediumFloat;
1670 break;
1671 case GL_HIGH_FLOAT:
1672 p = &limits->HighFloat;
1673 break;
1674 case GL_LOW_INT:
1675 p = &limits->LowInt;
1676 break;
1677 case GL_MEDIUM_INT:
1678 p = &limits->MediumInt;
1679 break;
1680 case GL_HIGH_INT:
1681 p = &limits->HighInt;
1682 break;
1683 default:
1684 _mesa_error(ctx, GL_INVALID_ENUM,
1685 "glGetShaderPrecisionFormat(precisiontype)");
1686 return;
1687 }
1688
1689 range[0] = p->RangeMin;
1690 range[1] = p->RangeMax;
1691 precision[0] = p->Precision;
1692 }
1693
1694
1695 void GLAPIENTRY
1696 _mesa_ReleaseShaderCompiler(void)
1697 {
1698 _mesa_destroy_shader_compiler_caches();
1699 }
1700
1701
1702 void GLAPIENTRY
1703 _mesa_ShaderBinary(GLint n, const GLuint* shaders, GLenum binaryformat,
1704 const void* binary, GLint length)
1705 {
1706 GET_CURRENT_CONTEXT(ctx);
1707 (void) n;
1708 (void) shaders;
1709 (void) binaryformat;
1710 (void) binary;
1711 (void) length;
1712 _mesa_error(ctx, GL_INVALID_OPERATION, __FUNCTION__);
1713 }
1714
1715 #endif /* FEATURE_ES2 */
1716
1717
1718 #if FEATURE_ARB_geometry_shader4
1719
1720 void GLAPIENTRY
1721 _mesa_ProgramParameteriARB(GLuint program, GLenum pname, GLint value)
1722 {
1723 struct gl_shader_program *shProg;
1724 GET_CURRENT_CONTEXT(ctx);
1725
1726 ASSERT_OUTSIDE_BEGIN_END(ctx);
1727
1728 shProg = _mesa_lookup_shader_program_err(ctx, program,
1729 "glProgramParameteri");
1730 if (!shProg)
1731 return;
1732
1733 switch (pname) {
1734 case GL_GEOMETRY_VERTICES_OUT_ARB:
1735 if (value < 1 ||
1736 (unsigned) value > ctx->Const.MaxGeometryOutputVertices) {
1737 _mesa_error(ctx, GL_INVALID_VALUE,
1738 "glProgramParameteri(GL_GEOMETRY_VERTICES_OUT_ARB=%d",
1739 value);
1740 return;
1741 }
1742 shProg->Geom.VerticesOut = value;
1743 break;
1744 case GL_GEOMETRY_INPUT_TYPE_ARB:
1745 switch (value) {
1746 case GL_POINTS:
1747 case GL_LINES:
1748 case GL_LINES_ADJACENCY_ARB:
1749 case GL_TRIANGLES:
1750 case GL_TRIANGLES_ADJACENCY_ARB:
1751 shProg->Geom.InputType = value;
1752 break;
1753 default:
1754 _mesa_error(ctx, GL_INVALID_VALUE,
1755 "glProgramParameteri(geometry input type = %s",
1756 _mesa_lookup_enum_by_nr(value));
1757 return;
1758 }
1759 break;
1760 case GL_GEOMETRY_OUTPUT_TYPE_ARB:
1761 switch (value) {
1762 case GL_POINTS:
1763 case GL_LINE_STRIP:
1764 case GL_TRIANGLE_STRIP:
1765 shProg->Geom.OutputType = value;
1766 break;
1767 default:
1768 _mesa_error(ctx, GL_INVALID_VALUE,
1769 "glProgramParameteri(geometry output type = %s",
1770 _mesa_lookup_enum_by_nr(value));
1771 return;
1772 }
1773 break;
1774 default:
1775 _mesa_error(ctx, GL_INVALID_ENUM, "glProgramParameteriARB(pname=%s)",
1776 _mesa_lookup_enum_by_nr(pname));
1777 break;
1778 }
1779 }
1780
1781 #endif
1782
1783 void
1784 _mesa_use_shader_program(struct gl_context *ctx, GLenum type,
1785 struct gl_shader_program *shProg)
1786 {
1787 use_shader_program(ctx, type, shProg);
1788
1789 if (ctx->Driver.UseProgram)
1790 ctx->Driver.UseProgram(ctx, shProg);
1791 }
1792
1793 void GLAPIENTRY
1794 _mesa_UseShaderProgramEXT(GLenum type, GLuint program)
1795 {
1796 GET_CURRENT_CONTEXT(ctx);
1797 struct gl_shader_program *shProg = NULL;
1798
1799 ASSERT_OUTSIDE_BEGIN_END(ctx);
1800
1801 if (!validate_shader_target(ctx, type)) {
1802 _mesa_error(ctx, GL_INVALID_ENUM, "glUseShaderProgramEXT(type)");
1803 return;
1804 }
1805
1806 if (ctx->TransformFeedback.CurrentObject->Active) {
1807 _mesa_error(ctx, GL_INVALID_OPERATION,
1808 "glUseShaderProgramEXT(transform feedback is active)");
1809 return;
1810 }
1811
1812 if (program) {
1813 shProg = _mesa_lookup_shader_program_err(ctx, program,
1814 "glUseShaderProgramEXT");
1815 if (shProg == NULL)
1816 return;
1817
1818 if (!shProg->LinkStatus) {
1819 _mesa_error(ctx, GL_INVALID_OPERATION,
1820 "glUseShaderProgramEXT(program not linked)");
1821 return;
1822 }
1823 }
1824
1825 _mesa_use_shader_program(ctx, type, shProg);
1826 }
1827
1828 void GLAPIENTRY
1829 _mesa_ActiveProgramEXT(GLuint program)
1830 {
1831 GET_CURRENT_CONTEXT(ctx);
1832 struct gl_shader_program *shProg = (program != 0)
1833 ? _mesa_lookup_shader_program_err(ctx, program, "glActiveProgramEXT")
1834 : NULL;
1835
1836 _mesa_active_program(ctx, shProg, "glActiveProgramEXT");
1837 return;
1838 }
1839
1840 GLuint GLAPIENTRY
1841 _mesa_CreateShaderProgramEXT(GLenum type, const GLchar *string)
1842 {
1843 GET_CURRENT_CONTEXT(ctx);
1844 const GLuint shader = create_shader(ctx, type);
1845 GLuint program = 0;
1846
1847 if (shader) {
1848 shader_source(ctx, shader, _mesa_strdup(string));
1849 compile_shader(ctx, shader);
1850
1851 program = create_shader_program(ctx);
1852 if (program) {
1853 struct gl_shader_program *shProg;
1854 struct gl_shader *sh;
1855 GLint compiled = GL_FALSE;
1856
1857 shProg = _mesa_lookup_shader_program(ctx, program);
1858 sh = _mesa_lookup_shader(ctx, shader);
1859
1860 get_shaderiv(ctx, shader, GL_COMPILE_STATUS, &compiled);
1861 if (compiled) {
1862 attach_shader(ctx, program, shader);
1863 link_program(ctx, program);
1864 detach_shader(ctx, program, shader);
1865
1866 #if 0
1867 /* Possibly... */
1868 if (active-user-defined-varyings-in-linked-program) {
1869 append-error-to-info-log;
1870 shProg->LinkStatus = GL_FALSE;
1871 }
1872 #endif
1873 }
1874
1875 ralloc_strcat(&shProg->InfoLog, sh->InfoLog);
1876 }
1877
1878 delete_shader(ctx, shader);
1879 }
1880
1881 return program;
1882 }
1883
1884 /**
1885 * Plug in shader-related functions into API dispatch table.
1886 */
1887 void
1888 _mesa_init_shader_dispatch(struct _glapi_table *exec)
1889 {
1890 #if FEATURE_GL
1891 /* GL_ARB_vertex/fragment_shader */
1892 SET_DeleteObjectARB(exec, _mesa_DeleteObjectARB);
1893 SET_GetHandleARB(exec, _mesa_GetHandleARB);
1894 SET_DetachObjectARB(exec, _mesa_DetachObjectARB);
1895 SET_CreateShaderObjectARB(exec, _mesa_CreateShaderObjectARB);
1896 SET_ShaderSourceARB(exec, _mesa_ShaderSourceARB);
1897 SET_CompileShaderARB(exec, _mesa_CompileShaderARB);
1898 SET_CreateProgramObjectARB(exec, _mesa_CreateProgramObjectARB);
1899 SET_AttachObjectARB(exec, _mesa_AttachObjectARB);
1900 SET_LinkProgramARB(exec, _mesa_LinkProgramARB);
1901 SET_UseProgramObjectARB(exec, _mesa_UseProgramObjectARB);
1902 SET_ValidateProgramARB(exec, _mesa_ValidateProgramARB);
1903 SET_GetObjectParameterfvARB(exec, _mesa_GetObjectParameterfvARB);
1904 SET_GetObjectParameterivARB(exec, _mesa_GetObjectParameterivARB);
1905 SET_GetInfoLogARB(exec, _mesa_GetInfoLogARB);
1906 SET_GetAttachedObjectsARB(exec, _mesa_GetAttachedObjectsARB);
1907 SET_GetShaderSourceARB(exec, _mesa_GetShaderSourceARB);
1908
1909 /* OpenGL 2.0 */
1910 SET_AttachShader(exec, _mesa_AttachShader);
1911 SET_CreateProgram(exec, _mesa_CreateProgram);
1912 SET_CreateShader(exec, _mesa_CreateShader);
1913 SET_DeleteProgram(exec, _mesa_DeleteProgram);
1914 SET_DeleteShader(exec, _mesa_DeleteShader);
1915 SET_DetachShader(exec, _mesa_DetachShader);
1916 SET_GetAttachedShaders(exec, _mesa_GetAttachedShaders);
1917 SET_GetProgramiv(exec, _mesa_GetProgramiv);
1918 SET_GetProgramInfoLog(exec, _mesa_GetProgramInfoLog);
1919 SET_GetShaderiv(exec, _mesa_GetShaderiv);
1920 SET_GetShaderInfoLog(exec, _mesa_GetShaderInfoLog);
1921 SET_IsProgram(exec, _mesa_IsProgram);
1922 SET_IsShader(exec, _mesa_IsShader);
1923
1924 #if FEATURE_ARB_vertex_shader
1925 SET_BindAttribLocationARB(exec, _mesa_BindAttribLocationARB);
1926 SET_GetActiveAttribARB(exec, _mesa_GetActiveAttribARB);
1927 SET_GetAttribLocationARB(exec, _mesa_GetAttribLocationARB);
1928 #endif
1929
1930 #if FEATURE_ARB_geometry_shader4
1931 SET_ProgramParameteriARB(exec, _mesa_ProgramParameteriARB);
1932 #endif
1933
1934 SET_UseShaderProgramEXT(exec, _mesa_UseShaderProgramEXT);
1935 SET_ActiveProgramEXT(exec, _mesa_ActiveProgramEXT);
1936 SET_CreateShaderProgramEXT(exec, _mesa_CreateShaderProgramEXT);
1937
1938 /* GL_EXT_gpu_shader4 / GL 3.0 */
1939 SET_BindFragDataLocationEXT(exec, _mesa_BindFragDataLocation);
1940 SET_GetFragDataLocationEXT(exec, _mesa_GetFragDataLocation);
1941
1942 /* GL_ARB_ES2_compatibility */
1943 SET_ReleaseShaderCompiler(exec, _mesa_ReleaseShaderCompiler);
1944 SET_GetShaderPrecisionFormat(exec, _mesa_GetShaderPrecisionFormat);
1945
1946 #endif /* FEATURE_GL */
1947 }
1948