shaderapi: don't generate not linked error on GetProgramStage in general
[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 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23 * OTHER DEALINGS IN THE SOFTWARE.
24 */
25
26 /**
27 * \file shaderapi.c
28 * \author Brian Paul
29 *
30 * Implementation of GLSL-related API functions.
31 * The glUniform* functions are in uniforms.c
32 *
33 *
34 * XXX things to do:
35 * 1. Check that the right error code is generated for all _mesa_error() calls.
36 * 2. Insert FLUSH_VERTICES calls in various places
37 */
38
39
40 #include <stdbool.h>
41 #include "main/glheader.h"
42 #include "main/context.h"
43 #include "main/dispatch.h"
44 #include "main/enums.h"
45 #include "main/hash.h"
46 #include "main/mtypes.h"
47 #include "main/pipelineobj.h"
48 #include "main/shaderapi.h"
49 #include "main/shaderobj.h"
50 #include "main/transformfeedback.h"
51 #include "main/uniforms.h"
52 #include "compiler/glsl/glsl_parser_extras.h"
53 #include "compiler/glsl/ir.h"
54 #include "compiler/glsl/ir_uniform.h"
55 #include "compiler/glsl/program.h"
56 #include "program/program.h"
57 #include "program/prog_print.h"
58 #include "program/prog_parameter.h"
59 #include "util/ralloc.h"
60 #include "util/hash_table.h"
61 #include "util/mesa-sha1.h"
62
63 #ifdef _MSC_VER
64 #include <stdlib.h>
65 #define PATH_MAX _MAX_PATH
66 #endif
67
68 /**
69 * Return mask of GLSL_x flags by examining the MESA_GLSL env var.
70 */
71 GLbitfield
72 _mesa_get_shader_flags(void)
73 {
74 GLbitfield flags = 0x0;
75 const char *env = getenv("MESA_GLSL");
76
77 if (env) {
78 if (strstr(env, "dump_on_error"))
79 flags |= GLSL_DUMP_ON_ERROR;
80 else if (strstr(env, "dump"))
81 flags |= GLSL_DUMP;
82 if (strstr(env, "log"))
83 flags |= GLSL_LOG;
84 if (strstr(env, "nopvert"))
85 flags |= GLSL_NOP_VERT;
86 if (strstr(env, "nopfrag"))
87 flags |= GLSL_NOP_FRAG;
88 if (strstr(env, "nopt"))
89 flags |= GLSL_NO_OPT;
90 else if (strstr(env, "opt"))
91 flags |= GLSL_OPT;
92 if (strstr(env, "uniform"))
93 flags |= GLSL_UNIFORMS;
94 if (strstr(env, "useprog"))
95 flags |= GLSL_USE_PROG;
96 if (strstr(env, "errors"))
97 flags |= GLSL_REPORT_ERRORS;
98 }
99
100 return flags;
101 }
102
103 /**
104 * Memoized version of getenv("MESA_SHADER_CAPTURE_PATH").
105 */
106 const char *
107 _mesa_get_shader_capture_path(void)
108 {
109 static bool read_env_var = false;
110 static const char *path = NULL;
111
112 if (!read_env_var) {
113 path = getenv("MESA_SHADER_CAPTURE_PATH");
114 read_env_var = true;
115 if (path &&
116 strlen(path) > PATH_MAX - strlen("/fp-4294967295.shader_test")) {
117 GET_CURRENT_CONTEXT(ctx);
118 _mesa_warning(ctx, "MESA_SHADER_CAPTURE_PATH too long; ignoring "
119 "request to capture shaders");
120 path = NULL;
121 }
122 }
123
124 return path;
125 }
126
127 /**
128 * Initialize context's shader state.
129 */
130 void
131 _mesa_init_shader_state(struct gl_context *ctx)
132 {
133 /* Device drivers may override these to control what kind of instructions
134 * are generated by the GLSL compiler.
135 */
136 struct gl_shader_compiler_options options;
137 gl_shader_stage sh;
138 int i;
139
140 memset(&options, 0, sizeof(options));
141 options.MaxUnrollIterations = 32;
142 options.MaxIfDepth = UINT_MAX;
143
144 for (sh = 0; sh < MESA_SHADER_STAGES; ++sh)
145 memcpy(&ctx->Const.ShaderCompilerOptions[sh], &options, sizeof(options));
146
147 ctx->Shader.Flags = _mesa_get_shader_flags();
148
149 if (ctx->Shader.Flags != 0)
150 ctx->Const.GenerateTemporaryNames = true;
151
152 /* Extended for ARB_separate_shader_objects */
153 ctx->Shader.RefCount = 1;
154 mtx_init(&ctx->Shader.Mutex, mtx_plain);
155
156 ctx->TessCtrlProgram.patch_vertices = 3;
157 for (i = 0; i < 4; ++i)
158 ctx->TessCtrlProgram.patch_default_outer_level[i] = 1.0;
159 for (i = 0; i < 2; ++i)
160 ctx->TessCtrlProgram.patch_default_inner_level[i] = 1.0;
161 }
162
163
164 /**
165 * Free the per-context shader-related state.
166 */
167 void
168 _mesa_free_shader_state(struct gl_context *ctx)
169 {
170 int i;
171 for (i = 0; i < MESA_SHADER_STAGES; i++) {
172 _mesa_reference_shader_program(ctx, &ctx->Shader.CurrentProgram[i],
173 NULL);
174 }
175 _mesa_reference_shader_program(ctx, &ctx->Shader._CurrentFragmentProgram,
176 NULL);
177 _mesa_reference_shader_program(ctx, &ctx->Shader.ActiveProgram, NULL);
178
179 /* Extended for ARB_separate_shader_objects */
180 _mesa_reference_pipeline_object(ctx, &ctx->_Shader, NULL);
181
182 assert(ctx->Shader.RefCount == 1);
183 mtx_destroy(&ctx->Shader.Mutex);
184 }
185
186
187 /**
188 * Copy string from <src> to <dst>, up to maxLength characters, returning
189 * length of <dst> in <length>.
190 * \param src the strings source
191 * \param maxLength max chars to copy
192 * \param length returns number of chars copied
193 * \param dst the string destination
194 */
195 void
196 _mesa_copy_string(GLchar *dst, GLsizei maxLength,
197 GLsizei *length, const GLchar *src)
198 {
199 GLsizei len;
200 for (len = 0; len < maxLength - 1 && src && src[len]; len++)
201 dst[len] = src[len];
202 if (maxLength > 0)
203 dst[len] = 0;
204 if (length)
205 *length = len;
206 }
207
208
209
210 /**
211 * Confirm that the a shader type is valid and supported by the implementation
212 *
213 * \param ctx Current GL context
214 * \param type Shader target
215 *
216 */
217 bool
218 _mesa_validate_shader_target(const struct gl_context *ctx, GLenum type)
219 {
220 /* Note: when building built-in GLSL functions, this function may be
221 * invoked with ctx == NULL. In that case, we can only validate that it's
222 * a shader target we recognize, not that it's supported in the current
223 * context. But that's fine--we don't need any further validation than
224 * that when building built-in GLSL functions.
225 */
226
227 switch (type) {
228 case GL_FRAGMENT_SHADER:
229 return ctx == NULL || ctx->Extensions.ARB_fragment_shader;
230 case GL_VERTEX_SHADER:
231 return ctx == NULL || ctx->Extensions.ARB_vertex_shader;
232 case GL_GEOMETRY_SHADER_ARB:
233 return ctx == NULL || _mesa_has_geometry_shaders(ctx);
234 case GL_TESS_CONTROL_SHADER:
235 case GL_TESS_EVALUATION_SHADER:
236 return ctx == NULL || _mesa_has_tessellation(ctx);
237 case GL_COMPUTE_SHADER:
238 return ctx == NULL || _mesa_has_compute_shaders(ctx);
239 default:
240 return false;
241 }
242 }
243
244
245 static GLboolean
246 is_program(struct gl_context *ctx, GLuint name)
247 {
248 struct gl_shader_program *shProg = _mesa_lookup_shader_program(ctx, name);
249 return shProg ? GL_TRUE : GL_FALSE;
250 }
251
252
253 static GLboolean
254 is_shader(struct gl_context *ctx, GLuint name)
255 {
256 struct gl_shader *shader = _mesa_lookup_shader(ctx, name);
257 return shader ? GL_TRUE : GL_FALSE;
258 }
259
260
261 /**
262 * Attach shader to a shader program.
263 */
264 static void
265 attach_shader(struct gl_context *ctx, GLuint program, GLuint shader)
266 {
267 struct gl_shader_program *shProg;
268 struct gl_shader *sh;
269 GLuint i, n;
270
271 const bool same_type_disallowed = _mesa_is_gles(ctx);
272
273 shProg = _mesa_lookup_shader_program_err(ctx, program, "glAttachShader");
274 if (!shProg)
275 return;
276
277 sh = _mesa_lookup_shader_err(ctx, shader, "glAttachShader");
278 if (!sh) {
279 return;
280 }
281
282 n = shProg->NumShaders;
283 for (i = 0; i < n; i++) {
284 if (shProg->Shaders[i] == sh) {
285 /* The shader is already attched to this program. The
286 * GL_ARB_shader_objects spec says:
287 *
288 * "The error INVALID_OPERATION is generated by AttachObjectARB
289 * if <obj> is already attached to <containerObj>."
290 */
291 _mesa_error(ctx, GL_INVALID_OPERATION, "glAttachShader");
292 return;
293 } else if (same_type_disallowed &&
294 shProg->Shaders[i]->Stage == sh->Stage) {
295 /* Shader with the same type is already attached to this program,
296 * OpenGL ES 2.0 and 3.0 specs say:
297 *
298 * "Multiple shader objects of the same type may not be attached
299 * to a single program object. [...] The error INVALID_OPERATION
300 * is generated if [...] another shader object of the same type
301 * as shader is already attached to program."
302 */
303 _mesa_error(ctx, GL_INVALID_OPERATION, "glAttachShader");
304 return;
305 }
306 }
307
308 /* grow list */
309 shProg->Shaders = realloc(shProg->Shaders,
310 (n + 1) * sizeof(struct gl_shader *));
311 if (!shProg->Shaders) {
312 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glAttachShader");
313 return;
314 }
315
316 /* append */
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++;
320 }
321
322
323 static GLuint
324 create_shader(struct gl_context *ctx, GLenum type)
325 {
326 struct gl_shader *sh;
327 GLuint name;
328
329 if (!_mesa_validate_shader_target(ctx, type)) {
330 _mesa_error(ctx, GL_INVALID_ENUM, "CreateShader(%s)",
331 _mesa_enum_to_string(type));
332 return 0;
333 }
334
335 _mesa_HashLockMutex(ctx->Shared->ShaderObjects);
336 name = _mesa_HashFindFreeKeyBlock(ctx->Shared->ShaderObjects, 1);
337 sh = _mesa_new_shader(name, _mesa_shader_enum_to_shader_stage(type));
338 sh->Type = type;
339 _mesa_HashInsertLocked(ctx->Shared->ShaderObjects, name, sh);
340 _mesa_HashUnlockMutex(ctx->Shared->ShaderObjects);
341
342 return name;
343 }
344
345
346 static GLuint
347 create_shader_program(struct gl_context *ctx)
348 {
349 GLuint name;
350 struct gl_shader_program *shProg;
351
352 _mesa_HashLockMutex(ctx->Shared->ShaderObjects);
353
354 name = _mesa_HashFindFreeKeyBlock(ctx->Shared->ShaderObjects, 1);
355
356 shProg = _mesa_new_shader_program(name);
357
358 _mesa_HashInsertLocked(ctx->Shared->ShaderObjects, name, shProg);
359
360 assert(shProg->RefCount == 1);
361
362 _mesa_HashUnlockMutex(ctx->Shared->ShaderObjects);
363
364 return name;
365 }
366
367
368 /**
369 * Delete a shader program. Actually, just decrement the program's
370 * reference count and mark it as DeletePending.
371 * Used to implement glDeleteProgram() and glDeleteObjectARB().
372 */
373 static void
374 delete_shader_program(struct gl_context *ctx, GLuint name)
375 {
376 /*
377 * NOTE: deleting shaders/programs works a bit differently than
378 * texture objects (and buffer objects, etc). Shader/program
379 * handles/IDs exist in the hash table until the object is really
380 * deleted (refcount==0). With texture objects, the handle/ID is
381 * removed from the hash table in glDeleteTextures() while the tex
382 * object itself might linger until its refcount goes to zero.
383 */
384 struct gl_shader_program *shProg;
385
386 shProg = _mesa_lookup_shader_program_err(ctx, name, "glDeleteProgram");
387 if (!shProg)
388 return;
389
390 if (!shProg->DeletePending) {
391 shProg->DeletePending = GL_TRUE;
392
393 /* effectively, decr shProg's refcount */
394 _mesa_reference_shader_program(ctx, &shProg, NULL);
395 }
396 }
397
398
399 static void
400 delete_shader(struct gl_context *ctx, GLuint shader)
401 {
402 struct gl_shader *sh;
403
404 sh = _mesa_lookup_shader_err(ctx, shader, "glDeleteShader");
405 if (!sh)
406 return;
407
408 if (!sh->DeletePending) {
409 sh->DeletePending = GL_TRUE;
410
411 /* effectively, decr sh's refcount */
412 _mesa_reference_shader(ctx, &sh, NULL);
413 }
414 }
415
416
417 static void
418 detach_shader(struct gl_context *ctx, GLuint program, GLuint shader)
419 {
420 struct gl_shader_program *shProg;
421 GLuint n;
422 GLuint i, j;
423
424 shProg = _mesa_lookup_shader_program_err(ctx, program, "glDetachShader");
425 if (!shProg)
426 return;
427
428 n = shProg->NumShaders;
429
430 for (i = 0; i < n; i++) {
431 if (shProg->Shaders[i]->Name == shader) {
432 /* found it */
433 struct gl_shader **newList;
434
435 /* release */
436 _mesa_reference_shader(ctx, &shProg->Shaders[i], NULL);
437
438 /* alloc new, smaller array */
439 newList = malloc((n - 1) * sizeof(struct gl_shader *));
440 if (!newList) {
441 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glDetachShader");
442 return;
443 }
444 /* Copy old list entries to new list, skipping removed entry at [i] */
445 for (j = 0; j < i; j++) {
446 newList[j] = shProg->Shaders[j];
447 }
448 while (++i < n) {
449 newList[j++] = shProg->Shaders[i];
450 }
451
452 /* Free old list and install new one */
453 free(shProg->Shaders);
454 shProg->Shaders = newList;
455 shProg->NumShaders = n - 1;
456
457 #ifdef DEBUG
458 /* sanity check - make sure the new list's entries are sensible */
459 for (j = 0; j < shProg->NumShaders; j++) {
460 assert(shProg->Shaders[j]->Stage == MESA_SHADER_VERTEX ||
461 shProg->Shaders[j]->Stage == MESA_SHADER_TESS_CTRL ||
462 shProg->Shaders[j]->Stage == MESA_SHADER_TESS_EVAL ||
463 shProg->Shaders[j]->Stage == MESA_SHADER_GEOMETRY ||
464 shProg->Shaders[j]->Stage == MESA_SHADER_FRAGMENT);
465 assert(shProg->Shaders[j]->RefCount > 0);
466 }
467 #endif
468
469 return;
470 }
471 }
472
473 /* not found */
474 {
475 GLenum err;
476 if (is_shader(ctx, shader) || is_program(ctx, shader))
477 err = GL_INVALID_OPERATION;
478 else
479 err = GL_INVALID_VALUE;
480 _mesa_error(ctx, err, "glDetachShader(shader)");
481 return;
482 }
483 }
484
485
486 /**
487 * Return list of shaders attached to shader program.
488 */
489 static void
490 get_attached_shaders(struct gl_context *ctx, GLuint program, GLsizei maxCount,
491 GLsizei *count, GLuint *obj)
492 {
493 struct gl_shader_program *shProg;
494
495 if (maxCount < 0) {
496 _mesa_error(ctx, GL_INVALID_VALUE, "glGetAttachedShaders(maxCount < 0)");
497 return;
498 }
499
500 shProg =
501 _mesa_lookup_shader_program_err(ctx, program, "glGetAttachedShaders");
502
503 if (shProg) {
504 GLuint i;
505 for (i = 0; i < (GLuint) maxCount && i < shProg->NumShaders; i++) {
506 obj[i] = shProg->Shaders[i]->Name;
507 }
508 if (count)
509 *count = i;
510 }
511 }
512
513
514 /**
515 * glGetHandleARB() - return ID/name of currently bound shader program.
516 */
517 static GLuint
518 get_handle(struct gl_context *ctx, GLenum pname)
519 {
520 if (pname == GL_PROGRAM_OBJECT_ARB) {
521 if (ctx->_Shader->ActiveProgram)
522 return ctx->_Shader->ActiveProgram->Name;
523 else
524 return 0;
525 }
526 else {
527 _mesa_error(ctx, GL_INVALID_ENUM, "glGetHandleARB");
528 return 0;
529 }
530 }
531
532
533 /**
534 * Check if a geometry shader query is valid at this time. If not, report an
535 * error and return false.
536 *
537 * From GL 3.2 section 6.1.16 (Shader and Program Queries):
538 *
539 * "If GEOMETRY_VERTICES_OUT, GEOMETRY_INPUT_TYPE, or GEOMETRY_OUTPUT_TYPE
540 * are queried for a program which has not been linked successfully, or
541 * which does not contain objects to form a geometry shader, then an
542 * INVALID_OPERATION error is generated."
543 */
544 static bool
545 check_gs_query(struct gl_context *ctx, const struct gl_shader_program *shProg)
546 {
547 if (shProg->LinkStatus &&
548 shProg->_LinkedShaders[MESA_SHADER_GEOMETRY] != NULL) {
549 return true;
550 }
551
552 _mesa_error(ctx, GL_INVALID_OPERATION,
553 "glGetProgramv(linked geometry shader required)");
554 return false;
555 }
556
557
558 /**
559 * Check if a tessellation control shader query is valid at this time.
560 * If not, report an error and return false.
561 *
562 * From GL 4.0 section 6.1.12 (Shader and Program Queries):
563 *
564 * "If TESS_CONTROL_OUTPUT_VERTICES is queried for a program which has
565 * not been linked successfully, or which does not contain objects to
566 * form a tessellation control shader, then an INVALID_OPERATION error is
567 * generated."
568 */
569 static bool
570 check_tcs_query(struct gl_context *ctx, const struct gl_shader_program *shProg)
571 {
572 if (shProg->LinkStatus &&
573 shProg->_LinkedShaders[MESA_SHADER_TESS_CTRL] != NULL) {
574 return true;
575 }
576
577 _mesa_error(ctx, GL_INVALID_OPERATION,
578 "glGetProgramv(linked tessellation control shader required)");
579 return false;
580 }
581
582
583 /**
584 * Check if a tessellation evaluation shader query is valid at this time.
585 * If not, report an error and return false.
586 *
587 * From GL 4.0 section 6.1.12 (Shader and Program Queries):
588 *
589 * "If any of the pname values in this paragraph are queried for a program
590 * which has not been linked successfully, or which does not contain
591 * objects to form a tessellation evaluation shader, then an
592 * INVALID_OPERATION error is generated."
593 *
594 */
595 static bool
596 check_tes_query(struct gl_context *ctx, const struct gl_shader_program *shProg)
597 {
598 if (shProg->LinkStatus &&
599 shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL] != NULL) {
600 return true;
601 }
602
603 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramv(linked tessellation "
604 "evaluation shader required)");
605 return false;
606 }
607
608
609 /**
610 * glGetProgramiv() - get shader program state.
611 * Note that this is for GLSL shader programs, not ARB vertex/fragment
612 * programs (see glGetProgramivARB).
613 */
614 static void
615 get_programiv(struct gl_context *ctx, GLuint program, GLenum pname,
616 GLint *params)
617 {
618 struct gl_shader_program *shProg
619 = _mesa_lookup_shader_program_err(ctx, program, "glGetProgramiv(program)");
620
621 /* Is transform feedback available in this context?
622 */
623 const bool has_xfb =
624 (ctx->API == API_OPENGL_COMPAT && ctx->Extensions.EXT_transform_feedback)
625 || ctx->API == API_OPENGL_CORE
626 || _mesa_is_gles3(ctx);
627
628 /* True if geometry shaders (of the form that was adopted into GLSL 1.50
629 * and GL 3.2) are available in this context
630 */
631 const bool has_core_gs = _mesa_has_geometry_shaders(ctx);
632 const bool has_tess = _mesa_has_tessellation(ctx);
633
634 /* Are uniform buffer objects available in this context?
635 */
636 const bool has_ubo =
637 (ctx->API == API_OPENGL_COMPAT &&
638 ctx->Extensions.ARB_uniform_buffer_object)
639 || ctx->API == API_OPENGL_CORE
640 || _mesa_is_gles3(ctx);
641
642 if (!shProg) {
643 return;
644 }
645
646 switch (pname) {
647 case GL_DELETE_STATUS:
648 *params = shProg->DeletePending;
649 return;
650 case GL_LINK_STATUS:
651 *params = shProg->LinkStatus;
652 return;
653 case GL_VALIDATE_STATUS:
654 *params = shProg->Validated;
655 return;
656 case GL_INFO_LOG_LENGTH:
657 *params = shProg->InfoLog ? strlen(shProg->InfoLog) + 1 : 0;
658 return;
659 case GL_ATTACHED_SHADERS:
660 *params = shProg->NumShaders;
661 return;
662 case GL_ACTIVE_ATTRIBUTES:
663 *params = _mesa_count_active_attribs(shProg);
664 return;
665 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
666 *params = _mesa_longest_attribute_name_length(shProg);
667 return;
668 case GL_ACTIVE_UNIFORMS: {
669 unsigned i;
670 const unsigned num_uniforms =
671 shProg->NumUniformStorage - shProg->NumHiddenUniforms;
672 for (*params = 0, i = 0; i < num_uniforms; i++) {
673 if (!shProg->UniformStorage[i].is_shader_storage)
674 (*params)++;
675 }
676 return;
677 }
678 case GL_ACTIVE_UNIFORM_MAX_LENGTH: {
679 unsigned i;
680 GLint max_len = 0;
681 const unsigned num_uniforms =
682 shProg->NumUniformStorage - shProg->NumHiddenUniforms;
683
684 for (i = 0; i < num_uniforms; i++) {
685 if (shProg->UniformStorage[i].is_shader_storage)
686 continue;
687
688 /* Add one for the terminating NUL character for a non-array, and
689 * 4 for the "[0]" and the NUL for an array.
690 */
691 const GLint len = strlen(shProg->UniformStorage[i].name) + 1 +
692 ((shProg->UniformStorage[i].array_elements != 0) ? 3 : 0);
693
694 if (len > max_len)
695 max_len = len;
696 }
697
698 *params = max_len;
699 return;
700 }
701 case GL_TRANSFORM_FEEDBACK_VARYINGS:
702 if (!has_xfb)
703 break;
704 *params = shProg->TransformFeedback.NumVarying;
705 return;
706 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH: {
707 unsigned i;
708 GLint max_len = 0;
709 if (!has_xfb)
710 break;
711
712 for (i = 0; i < shProg->TransformFeedback.NumVarying; i++) {
713 /* Add one for the terminating NUL character.
714 */
715 const GLint len =
716 strlen(shProg->TransformFeedback.VaryingNames[i]) + 1;
717
718 if (len > max_len)
719 max_len = len;
720 }
721
722 *params = max_len;
723 return;
724 }
725 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
726 if (!has_xfb)
727 break;
728 *params = shProg->TransformFeedback.BufferMode;
729 return;
730 case GL_GEOMETRY_VERTICES_OUT:
731 if (!has_core_gs)
732 break;
733 if (check_gs_query(ctx, shProg)) {
734 *params = shProg->_LinkedShaders[MESA_SHADER_GEOMETRY]->
735 info.Geom.VerticesOut;
736 }
737 return;
738 case GL_GEOMETRY_SHADER_INVOCATIONS:
739 if (!has_core_gs || !ctx->Extensions.ARB_gpu_shader5)
740 break;
741 if (check_gs_query(ctx, shProg)) {
742 *params = shProg->_LinkedShaders[MESA_SHADER_GEOMETRY]->
743 info.Geom.Invocations;
744 }
745 return;
746 case GL_GEOMETRY_INPUT_TYPE:
747 if (!has_core_gs)
748 break;
749 if (check_gs_query(ctx, shProg)) {
750 *params = shProg->_LinkedShaders[MESA_SHADER_GEOMETRY]->
751 info.Geom.InputType;
752 }
753 return;
754 case GL_GEOMETRY_OUTPUT_TYPE:
755 if (!has_core_gs)
756 break;
757 if (check_gs_query(ctx, shProg)) {
758 *params = shProg->_LinkedShaders[MESA_SHADER_GEOMETRY]->
759 info.Geom.OutputType;
760 }
761 return;
762 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH: {
763 unsigned i;
764 GLint max_len = 0;
765
766 if (!has_ubo)
767 break;
768
769 for (i = 0; i < shProg->NumUniformBlocks; i++) {
770 /* Add one for the terminating NUL character.
771 */
772 const GLint len = strlen(shProg->UniformBlocks[i].Name) + 1;
773
774 if (len > max_len)
775 max_len = len;
776 }
777
778 *params = max_len;
779 return;
780 }
781 case GL_ACTIVE_UNIFORM_BLOCKS:
782 if (!has_ubo)
783 break;
784
785 *params = shProg->NumUniformBlocks;
786 return;
787 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
788 /* This enum isn't part of the OES extension for OpenGL ES 2.0. It is
789 * only available with desktop OpenGL 3.0+ with the
790 * GL_ARB_get_program_binary extension or OpenGL ES 3.0.
791 *
792 * On desktop, we ignore the 3.0+ requirement because it is silly.
793 */
794 if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
795 break;
796
797 *params = shProg->BinaryRetreivableHint;
798 return;
799 case GL_PROGRAM_BINARY_LENGTH:
800 *params = 0;
801 return;
802 case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
803 if (!ctx->Extensions.ARB_shader_atomic_counters)
804 break;
805
806 *params = shProg->NumAtomicBuffers;
807 return;
808 case GL_COMPUTE_WORK_GROUP_SIZE: {
809 int i;
810 if (!_mesa_has_compute_shaders(ctx))
811 break;
812 if (!shProg->LinkStatus) {
813 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramiv(program not "
814 "linked)");
815 return;
816 }
817 if (shProg->_LinkedShaders[MESA_SHADER_COMPUTE] == NULL) {
818 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramiv(no compute "
819 "shaders)");
820 return;
821 }
822 for (i = 0; i < 3; i++)
823 params[i] = shProg->Comp.LocalSize[i];
824 return;
825 }
826 case GL_PROGRAM_SEPARABLE:
827 /* If the program has not been linked, return initial value 0. */
828 *params = (shProg->LinkStatus == GL_FALSE) ? 0 : shProg->SeparateShader;
829 return;
830
831 /* ARB_tessellation_shader */
832 case GL_TESS_CONTROL_OUTPUT_VERTICES:
833 if (!has_tess)
834 break;
835 if (check_tcs_query(ctx, shProg)) {
836 *params = shProg->_LinkedShaders[MESA_SHADER_TESS_CTRL]->
837 info.TessCtrl.VerticesOut;
838 }
839 return;
840 case GL_TESS_GEN_MODE:
841 if (!has_tess)
842 break;
843 if (check_tes_query(ctx, shProg)) {
844 *params = shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]->
845 info.TessEval.PrimitiveMode;
846 }
847 return;
848 case GL_TESS_GEN_SPACING:
849 if (!has_tess)
850 break;
851 if (check_tes_query(ctx, shProg)) {
852 *params = shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]->
853 info.TessEval.Spacing;
854 }
855 return;
856 case GL_TESS_GEN_VERTEX_ORDER:
857 if (!has_tess)
858 break;
859 if (check_tes_query(ctx, shProg)) {
860 *params = shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]->
861 info.TessEval.VertexOrder;
862 }
863 return;
864 case GL_TESS_GEN_POINT_MODE:
865 if (!has_tess)
866 break;
867 if (check_tes_query(ctx, shProg)) {
868 *params = shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]->
869 info.TessEval.PointMode;
870 }
871 return;
872 default:
873 break;
874 }
875
876 _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramiv(pname=%s)",
877 _mesa_enum_to_string(pname));
878 }
879
880
881 /**
882 * glGetShaderiv() - get GLSL shader state
883 */
884 static void
885 get_shaderiv(struct gl_context *ctx, GLuint name, GLenum pname, GLint *params)
886 {
887 struct gl_shader *shader =
888 _mesa_lookup_shader_err(ctx, name, "glGetShaderiv");
889
890 if (!shader) {
891 return;
892 }
893
894 switch (pname) {
895 case GL_SHADER_TYPE:
896 *params = shader->Type;
897 break;
898 case GL_DELETE_STATUS:
899 *params = shader->DeletePending;
900 break;
901 case GL_COMPILE_STATUS:
902 *params = shader->CompileStatus;
903 break;
904 case GL_INFO_LOG_LENGTH:
905 *params = shader->InfoLog ? strlen(shader->InfoLog) + 1 : 0;
906 break;
907 case GL_SHADER_SOURCE_LENGTH:
908 *params = shader->Source ? strlen((char *) shader->Source) + 1 : 0;
909 break;
910 default:
911 _mesa_error(ctx, GL_INVALID_ENUM, "glGetShaderiv(pname)");
912 return;
913 }
914 }
915
916
917 static void
918 get_program_info_log(struct gl_context *ctx, GLuint program, GLsizei bufSize,
919 GLsizei *length, GLchar *infoLog)
920 {
921 struct gl_shader_program *shProg;
922
923 /* Section 2.5 GL Errors (page 18) of the OpenGL ES 3.0.4 spec and
924 * section 2.3.1 (Errors) of the OpenGL 4.5 spec say:
925 *
926 * "If a negative number is provided where an argument of type sizei or
927 * sizeiptr is specified, an INVALID_VALUE error is generated."
928 */
929 if (bufSize < 0) {
930 _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramInfoLog(bufSize < 0)");
931 return;
932 }
933
934 shProg = _mesa_lookup_shader_program_err(ctx, program,
935 "glGetProgramInfoLog(program)");
936 if (!shProg) {
937 return;
938 }
939
940 _mesa_copy_string(infoLog, bufSize, length, shProg->InfoLog);
941 }
942
943
944 static void
945 get_shader_info_log(struct gl_context *ctx, GLuint shader, GLsizei bufSize,
946 GLsizei *length, GLchar *infoLog)
947 {
948 struct gl_shader *sh;
949
950 /* Section 2.5 GL Errors (page 18) of the OpenGL ES 3.0.4 spec and
951 * section 2.3.1 (Errors) of the OpenGL 4.5 spec say:
952 *
953 * "If a negative number is provided where an argument of type sizei or
954 * sizeiptr is specified, an INVALID_VALUE error is generated."
955 */
956 if (bufSize < 0) {
957 _mesa_error(ctx, GL_INVALID_VALUE, "glGetShaderInfoLog(bufSize < 0)");
958 return;
959 }
960
961 sh = _mesa_lookup_shader_err(ctx, shader, "glGetShaderInfoLog(shader)");
962 if (!sh) {
963 return;
964 }
965
966 _mesa_copy_string(infoLog, bufSize, length, sh->InfoLog);
967 }
968
969
970 /**
971 * Return shader source code.
972 */
973 static void
974 get_shader_source(struct gl_context *ctx, GLuint shader, GLsizei maxLength,
975 GLsizei *length, GLchar *sourceOut)
976 {
977 struct gl_shader *sh;
978
979 if (maxLength < 0) {
980 _mesa_error(ctx, GL_INVALID_VALUE, "glGetShaderSource(bufSize < 0)");
981 return;
982 }
983
984 sh = _mesa_lookup_shader_err(ctx, shader, "glGetShaderSource");
985 if (!sh) {
986 return;
987 }
988 _mesa_copy_string(sourceOut, maxLength, length, sh->Source);
989 }
990
991
992 /**
993 * Set/replace shader source code. A helper function used by
994 * glShaderSource[ARB].
995 */
996 static void
997 shader_source(struct gl_shader *sh, const GLchar *source)
998 {
999 assert(sh);
1000
1001 /* free old shader source string and install new one */
1002 free((void *)sh->Source);
1003 sh->Source = source;
1004 #ifdef DEBUG
1005 sh->SourceChecksum = _mesa_str_checksum(sh->Source);
1006 #endif
1007 }
1008
1009
1010 /**
1011 * Compile a shader.
1012 */
1013 void
1014 _mesa_compile_shader(struct gl_context *ctx, struct gl_shader *sh)
1015 {
1016 if (!sh)
1017 return;
1018
1019 if (!sh->Source) {
1020 /* If the user called glCompileShader without first calling
1021 * glShaderSource, we should fail to compile, but not raise a GL_ERROR.
1022 */
1023 sh->CompileStatus = GL_FALSE;
1024 } else {
1025 if (ctx->_Shader->Flags & GLSL_DUMP) {
1026 _mesa_log("GLSL source for %s shader %d:\n",
1027 _mesa_shader_stage_to_string(sh->Stage), sh->Name);
1028 _mesa_log("%s\n", sh->Source);
1029 }
1030
1031 /* this call will set the shader->CompileStatus field to indicate if
1032 * compilation was successful.
1033 */
1034 _mesa_glsl_compile_shader(ctx, sh, false, false);
1035
1036 if (ctx->_Shader->Flags & GLSL_LOG) {
1037 _mesa_write_shader_to_file(sh);
1038 }
1039
1040 if (ctx->_Shader->Flags & GLSL_DUMP) {
1041 if (sh->CompileStatus) {
1042 _mesa_log("GLSL IR for shader %d:\n", sh->Name);
1043 _mesa_print_ir(_mesa_get_log_file(), sh->ir, NULL);
1044 _mesa_log("\n\n");
1045 } else {
1046 _mesa_log("GLSL shader %d failed to compile.\n", sh->Name);
1047 }
1048 if (sh->InfoLog && sh->InfoLog[0] != 0) {
1049 _mesa_log("GLSL shader %d info log:\n", sh->Name);
1050 _mesa_log("%s\n", sh->InfoLog);
1051 }
1052 }
1053 }
1054
1055 if (!sh->CompileStatus) {
1056 if (ctx->_Shader->Flags & GLSL_DUMP_ON_ERROR) {
1057 _mesa_log("GLSL source for %s shader %d:\n",
1058 _mesa_shader_stage_to_string(sh->Stage), sh->Name);
1059 _mesa_log("%s\n", sh->Source);
1060 _mesa_log("Info Log:\n%s\n", sh->InfoLog);
1061 }
1062
1063 if (ctx->_Shader->Flags & GLSL_REPORT_ERRORS) {
1064 _mesa_debug(ctx, "Error compiling shader %u:\n%s\n",
1065 sh->Name, sh->InfoLog);
1066 }
1067 }
1068 }
1069
1070
1071 /**
1072 * Link a program's shaders.
1073 */
1074 void
1075 _mesa_link_program(struct gl_context *ctx, struct gl_shader_program *shProg)
1076 {
1077 if (!shProg)
1078 return;
1079
1080 /* From the ARB_transform_feedback2 specification:
1081 * "The error INVALID_OPERATION is generated by LinkProgram if <program> is
1082 * the name of a program being used by one or more transform feedback
1083 * objects, even if the objects are not currently bound or are paused."
1084 */
1085 if (_mesa_transform_feedback_is_using_program(ctx, shProg)) {
1086 _mesa_error(ctx, GL_INVALID_OPERATION,
1087 "glLinkProgram(transform feedback is using the program)");
1088 return;
1089 }
1090
1091 FLUSH_VERTICES(ctx, _NEW_PROGRAM);
1092
1093 _mesa_glsl_link_shader(ctx, shProg);
1094
1095 /* Capture .shader_test files. */
1096 const char *capture_path = _mesa_get_shader_capture_path();
1097 if (shProg->Name != 0 && shProg->Name != ~0 && capture_path != NULL) {
1098 FILE *file;
1099 char filename[PATH_MAX];
1100
1101 _mesa_snprintf(filename, sizeof(filename), "%s/%u.shader_test",
1102 capture_path, shProg->Name);
1103
1104 file = fopen(filename, "w");
1105 if (file) {
1106 fprintf(file, "[require]\nGLSL%s >= %u.%02u\n",
1107 shProg->IsES ? " ES" : "",
1108 shProg->Version / 100, shProg->Version % 100);
1109 if (shProg->SeparateShader)
1110 fprintf(file, "GL_ARB_separate_shader_objects\nSSO ENABLED\n");
1111 fprintf(file, "\n");
1112
1113 for (unsigned i = 0; i < shProg->NumShaders; i++) {
1114 fprintf(file, "[%s shader]\n%s\n",
1115 _mesa_shader_stage_to_string(shProg->Shaders[i]->Stage),
1116 shProg->Shaders[i]->Source);
1117 }
1118 fclose(file);
1119 } else {
1120 _mesa_warning(ctx, "Failed to open %s", filename);
1121 }
1122 }
1123
1124 if (shProg->LinkStatus == GL_FALSE &&
1125 (ctx->_Shader->Flags & GLSL_REPORT_ERRORS)) {
1126 _mesa_debug(ctx, "Error linking program %u:\n%s\n",
1127 shProg->Name, shProg->InfoLog);
1128 }
1129
1130 /* debug code */
1131 if (0) {
1132 GLuint i;
1133
1134 printf("Link %u shaders in program %u: %s\n",
1135 shProg->NumShaders, shProg->Name,
1136 shProg->LinkStatus ? "Success" : "Failed");
1137
1138 for (i = 0; i < shProg->NumShaders; i++) {
1139 printf(" shader %u, stage %u\n",
1140 shProg->Shaders[i]->Name,
1141 shProg->Shaders[i]->Stage);
1142 }
1143 }
1144 }
1145
1146
1147 /**
1148 * Print basic shader info (for debug).
1149 */
1150 static void
1151 print_shader_info(const struct gl_shader_program *shProg)
1152 {
1153 GLuint i;
1154
1155 printf("Mesa: glUseProgram(%u)\n", shProg->Name);
1156 for (i = 0; i < shProg->NumShaders; i++) {
1157 printf(" %s shader %u, checksum %u\n",
1158 _mesa_shader_stage_to_string(shProg->Shaders[i]->Stage),
1159 shProg->Shaders[i]->Name,
1160 shProg->Shaders[i]->SourceChecksum);
1161 }
1162 if (shProg->_LinkedShaders[MESA_SHADER_VERTEX])
1163 printf(" vert prog %u\n",
1164 shProg->_LinkedShaders[MESA_SHADER_VERTEX]->Program->Id);
1165 if (shProg->_LinkedShaders[MESA_SHADER_FRAGMENT])
1166 printf(" frag prog %u\n",
1167 shProg->_LinkedShaders[MESA_SHADER_FRAGMENT]->Program->Id);
1168 if (shProg->_LinkedShaders[MESA_SHADER_GEOMETRY])
1169 printf(" geom prog %u\n",
1170 shProg->_LinkedShaders[MESA_SHADER_GEOMETRY]->Program->Id);
1171 if (shProg->_LinkedShaders[MESA_SHADER_TESS_CTRL])
1172 printf(" tesc prog %u\n",
1173 shProg->_LinkedShaders[MESA_SHADER_TESS_CTRL]->Program->Id);
1174 if (shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL])
1175 printf(" tese prog %u\n",
1176 shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]->Program->Id);
1177 }
1178
1179
1180 /**
1181 * Use the named shader program for subsequent glUniform calls
1182 */
1183 void
1184 _mesa_active_program(struct gl_context *ctx, struct gl_shader_program *shProg,
1185 const char *caller)
1186 {
1187 if ((shProg != NULL) && !shProg->LinkStatus) {
1188 _mesa_error(ctx, GL_INVALID_OPERATION,
1189 "%s(program %u not linked)", caller, shProg->Name);
1190 return;
1191 }
1192
1193 if (ctx->Shader.ActiveProgram != shProg) {
1194 _mesa_reference_shader_program(ctx, &ctx->Shader.ActiveProgram, shProg);
1195 }
1196 }
1197
1198
1199 static void
1200 use_shader_program(struct gl_context *ctx, gl_shader_stage stage,
1201 struct gl_shader_program *shProg,
1202 struct gl_pipeline_object *shTarget)
1203 {
1204 struct gl_shader_program **target;
1205
1206 target = &shTarget->CurrentProgram[stage];
1207 if ((shProg != NULL) && (shProg->_LinkedShaders[stage] == NULL))
1208 shProg = NULL;
1209
1210 if (shProg)
1211 _mesa_shader_program_init_subroutine_defaults(ctx, shProg);
1212
1213 if (*target != shProg) {
1214 /* Program is current, flush it */
1215 if (shTarget == ctx->_Shader) {
1216 FLUSH_VERTICES(ctx, _NEW_PROGRAM | _NEW_PROGRAM_CONSTANTS);
1217 }
1218
1219 /* If the shader is also bound as the current rendering shader, unbind
1220 * it from that binding point as well. This ensures that the correct
1221 * semantics of glDeleteProgram are maintained.
1222 */
1223 switch (stage) {
1224 case MESA_SHADER_VERTEX:
1225 case MESA_SHADER_TESS_CTRL:
1226 case MESA_SHADER_TESS_EVAL:
1227 case MESA_SHADER_GEOMETRY:
1228 case MESA_SHADER_COMPUTE:
1229 /* Empty for now. */
1230 break;
1231 case MESA_SHADER_FRAGMENT:
1232 if (*target == ctx->_Shader->_CurrentFragmentProgram) {
1233 _mesa_reference_shader_program(ctx,
1234 &ctx->_Shader->_CurrentFragmentProgram,
1235 NULL);
1236 }
1237 break;
1238 }
1239
1240 _mesa_reference_shader_program(ctx, target, shProg);
1241 return;
1242 }
1243 }
1244
1245
1246 /**
1247 * Use the named shader program for subsequent rendering.
1248 */
1249 void
1250 _mesa_use_program(struct gl_context *ctx, struct gl_shader_program *shProg)
1251 {
1252 int i;
1253 for (i = 0; i < MESA_SHADER_STAGES; i++)
1254 use_shader_program(ctx, i, shProg, &ctx->Shader);
1255 _mesa_active_program(ctx, shProg, "glUseProgram");
1256 }
1257
1258
1259 /**
1260 * Do validation of the given shader program.
1261 * \param errMsg returns error message if validation fails.
1262 * \return GL_TRUE if valid, GL_FALSE if invalid (and set errMsg)
1263 */
1264 static GLboolean
1265 validate_shader_program(const struct gl_shader_program *shProg,
1266 char *errMsg)
1267 {
1268 if (!shProg->LinkStatus) {
1269 return GL_FALSE;
1270 }
1271
1272 /* From the GL spec, a program is invalid if any of these are true:
1273
1274 any two active samplers in the current program object are of
1275 different types, but refer to the same texture image unit,
1276
1277 any active sampler in the current program object refers to a texture
1278 image unit where fixed-function fragment processing accesses a
1279 texture target that does not match the sampler type, or
1280
1281 the sum of the number of active samplers in the program and the
1282 number of texture image units enabled for fixed-function fragment
1283 processing exceeds the combined limit on the total number of texture
1284 image units allowed.
1285 */
1286
1287 /*
1288 * Check: any two active samplers in the current program object are of
1289 * different types, but refer to the same texture image unit,
1290 */
1291 if (!_mesa_sampler_uniforms_are_valid(shProg, errMsg, 100))
1292 return GL_FALSE;
1293
1294 return GL_TRUE;
1295 }
1296
1297
1298 /**
1299 * Called via glValidateProgram()
1300 */
1301 static void
1302 validate_program(struct gl_context *ctx, GLuint program)
1303 {
1304 struct gl_shader_program *shProg;
1305 char errMsg[100] = "";
1306
1307 shProg = _mesa_lookup_shader_program_err(ctx, program, "glValidateProgram");
1308 if (!shProg) {
1309 return;
1310 }
1311
1312 shProg->Validated = validate_shader_program(shProg, errMsg);
1313 if (!shProg->Validated) {
1314 /* update info log */
1315 if (shProg->InfoLog) {
1316 ralloc_free(shProg->InfoLog);
1317 }
1318 shProg->InfoLog = ralloc_strdup(shProg, errMsg);
1319 }
1320 }
1321
1322
1323
1324 void GLAPIENTRY
1325 _mesa_AttachObjectARB(GLhandleARB program, GLhandleARB shader)
1326 {
1327 GET_CURRENT_CONTEXT(ctx);
1328 attach_shader(ctx, program, shader);
1329 }
1330
1331
1332 void GLAPIENTRY
1333 _mesa_AttachShader(GLuint program, GLuint shader)
1334 {
1335 GET_CURRENT_CONTEXT(ctx);
1336 attach_shader(ctx, program, shader);
1337 }
1338
1339
1340 void GLAPIENTRY
1341 _mesa_CompileShader(GLuint shaderObj)
1342 {
1343 GET_CURRENT_CONTEXT(ctx);
1344 if (MESA_VERBOSE & VERBOSE_API)
1345 _mesa_debug(ctx, "glCompileShader %u\n", shaderObj);
1346 _mesa_compile_shader(ctx, _mesa_lookup_shader_err(ctx, shaderObj,
1347 "glCompileShader"));
1348 }
1349
1350
1351 GLuint GLAPIENTRY
1352 _mesa_CreateShader(GLenum type)
1353 {
1354 GET_CURRENT_CONTEXT(ctx);
1355 if (MESA_VERBOSE & VERBOSE_API)
1356 _mesa_debug(ctx, "glCreateShader %s\n", _mesa_enum_to_string(type));
1357 return create_shader(ctx, type);
1358 }
1359
1360
1361 GLhandleARB GLAPIENTRY
1362 _mesa_CreateShaderObjectARB(GLenum type)
1363 {
1364 GET_CURRENT_CONTEXT(ctx);
1365 return create_shader(ctx, type);
1366 }
1367
1368
1369 GLuint GLAPIENTRY
1370 _mesa_CreateProgram(void)
1371 {
1372 GET_CURRENT_CONTEXT(ctx);
1373 if (MESA_VERBOSE & VERBOSE_API)
1374 _mesa_debug(ctx, "glCreateProgram\n");
1375 return create_shader_program(ctx);
1376 }
1377
1378
1379 GLhandleARB GLAPIENTRY
1380 _mesa_CreateProgramObjectARB(void)
1381 {
1382 GET_CURRENT_CONTEXT(ctx);
1383 return create_shader_program(ctx);
1384 }
1385
1386
1387 void GLAPIENTRY
1388 _mesa_DeleteObjectARB(GLhandleARB obj)
1389 {
1390 if (MESA_VERBOSE & VERBOSE_API) {
1391 GET_CURRENT_CONTEXT(ctx);
1392 _mesa_debug(ctx, "glDeleteObjectARB(%lu)\n", (unsigned long)obj);
1393 }
1394
1395 if (obj) {
1396 GET_CURRENT_CONTEXT(ctx);
1397 FLUSH_VERTICES(ctx, 0);
1398 if (is_program(ctx, obj)) {
1399 delete_shader_program(ctx, obj);
1400 }
1401 else if (is_shader(ctx, obj)) {
1402 delete_shader(ctx, obj);
1403 }
1404 else {
1405 /* error? */
1406 }
1407 }
1408 }
1409
1410
1411 void GLAPIENTRY
1412 _mesa_DeleteProgram(GLuint name)
1413 {
1414 if (name) {
1415 GET_CURRENT_CONTEXT(ctx);
1416 FLUSH_VERTICES(ctx, 0);
1417 delete_shader_program(ctx, name);
1418 }
1419 }
1420
1421
1422 void GLAPIENTRY
1423 _mesa_DeleteShader(GLuint name)
1424 {
1425 if (name) {
1426 GET_CURRENT_CONTEXT(ctx);
1427 FLUSH_VERTICES(ctx, 0);
1428 delete_shader(ctx, name);
1429 }
1430 }
1431
1432
1433 void GLAPIENTRY
1434 _mesa_DetachObjectARB(GLhandleARB program, GLhandleARB shader)
1435 {
1436 GET_CURRENT_CONTEXT(ctx);
1437 detach_shader(ctx, program, shader);
1438 }
1439
1440
1441 void GLAPIENTRY
1442 _mesa_DetachShader(GLuint program, GLuint shader)
1443 {
1444 GET_CURRENT_CONTEXT(ctx);
1445 detach_shader(ctx, program, shader);
1446 }
1447
1448
1449 void GLAPIENTRY
1450 _mesa_GetAttachedObjectsARB(GLhandleARB container, GLsizei maxCount,
1451 GLsizei * count, GLhandleARB * obj)
1452 {
1453 GET_CURRENT_CONTEXT(ctx);
1454 get_attached_shaders(ctx, container, maxCount, count, obj);
1455 }
1456
1457
1458 void GLAPIENTRY
1459 _mesa_GetAttachedShaders(GLuint program, GLsizei maxCount,
1460 GLsizei *count, GLuint *obj)
1461 {
1462 GET_CURRENT_CONTEXT(ctx);
1463 get_attached_shaders(ctx, program, maxCount, count, obj);
1464 }
1465
1466
1467 void GLAPIENTRY
1468 _mesa_GetInfoLogARB(GLhandleARB object, GLsizei maxLength, GLsizei * length,
1469 GLcharARB * infoLog)
1470 {
1471 GET_CURRENT_CONTEXT(ctx);
1472 if (is_program(ctx, object)) {
1473 get_program_info_log(ctx, object, maxLength, length, infoLog);
1474 }
1475 else if (is_shader(ctx, object)) {
1476 get_shader_info_log(ctx, object, maxLength, length, infoLog);
1477 }
1478 else {
1479 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetInfoLogARB");
1480 }
1481 }
1482
1483
1484 void GLAPIENTRY
1485 _mesa_GetObjectParameterivARB(GLhandleARB object, GLenum pname, GLint *params)
1486 {
1487 GET_CURRENT_CONTEXT(ctx);
1488 /* Implement in terms of GetProgramiv, GetShaderiv */
1489 if (is_program(ctx, object)) {
1490 if (pname == GL_OBJECT_TYPE_ARB) {
1491 *params = GL_PROGRAM_OBJECT_ARB;
1492 }
1493 else {
1494 get_programiv(ctx, object, pname, params);
1495 }
1496 }
1497 else if (is_shader(ctx, object)) {
1498 if (pname == GL_OBJECT_TYPE_ARB) {
1499 *params = GL_SHADER_OBJECT_ARB;
1500 }
1501 else {
1502 get_shaderiv(ctx, object, pname, params);
1503 }
1504 }
1505 else {
1506 _mesa_error(ctx, GL_INVALID_VALUE, "glGetObjectParameterivARB");
1507 }
1508 }
1509
1510
1511 void GLAPIENTRY
1512 _mesa_GetObjectParameterfvARB(GLhandleARB object, GLenum pname,
1513 GLfloat *params)
1514 {
1515 GLint iparams[1] = {0}; /* XXX is one element enough? */
1516 _mesa_GetObjectParameterivARB(object, pname, iparams);
1517 params[0] = (GLfloat) iparams[0];
1518 }
1519
1520
1521 void GLAPIENTRY
1522 _mesa_GetProgramiv(GLuint program, GLenum pname, GLint *params)
1523 {
1524 GET_CURRENT_CONTEXT(ctx);
1525 get_programiv(ctx, program, pname, params);
1526 }
1527
1528
1529 void GLAPIENTRY
1530 _mesa_GetShaderiv(GLuint shader, GLenum pname, GLint *params)
1531 {
1532 GET_CURRENT_CONTEXT(ctx);
1533 get_shaderiv(ctx, shader, pname, params);
1534 }
1535
1536
1537 void GLAPIENTRY
1538 _mesa_GetProgramInfoLog(GLuint program, GLsizei bufSize,
1539 GLsizei *length, GLchar *infoLog)
1540 {
1541 GET_CURRENT_CONTEXT(ctx);
1542 get_program_info_log(ctx, program, bufSize, length, infoLog);
1543 }
1544
1545
1546 void GLAPIENTRY
1547 _mesa_GetShaderInfoLog(GLuint shader, GLsizei bufSize,
1548 GLsizei *length, GLchar *infoLog)
1549 {
1550 GET_CURRENT_CONTEXT(ctx);
1551 get_shader_info_log(ctx, shader, bufSize, length, infoLog);
1552 }
1553
1554
1555 void GLAPIENTRY
1556 _mesa_GetShaderSource(GLuint shader, GLsizei maxLength,
1557 GLsizei *length, GLchar *sourceOut)
1558 {
1559 GET_CURRENT_CONTEXT(ctx);
1560 get_shader_source(ctx, shader, maxLength, length, sourceOut);
1561 }
1562
1563
1564 GLhandleARB GLAPIENTRY
1565 _mesa_GetHandleARB(GLenum pname)
1566 {
1567 GET_CURRENT_CONTEXT(ctx);
1568 return get_handle(ctx, pname);
1569 }
1570
1571
1572 GLboolean GLAPIENTRY
1573 _mesa_IsProgram(GLuint name)
1574 {
1575 GET_CURRENT_CONTEXT(ctx);
1576 return is_program(ctx, name);
1577 }
1578
1579
1580 GLboolean GLAPIENTRY
1581 _mesa_IsShader(GLuint name)
1582 {
1583 GET_CURRENT_CONTEXT(ctx);
1584 return is_shader(ctx, name);
1585 }
1586
1587
1588 void GLAPIENTRY
1589 _mesa_LinkProgram(GLuint programObj)
1590 {
1591 GET_CURRENT_CONTEXT(ctx);
1592 if (MESA_VERBOSE & VERBOSE_API)
1593 _mesa_debug(ctx, "glLinkProgram %u\n", programObj);
1594 _mesa_link_program(ctx, _mesa_lookup_shader_program_err(ctx, programObj,
1595 "glLinkProgram"));
1596 }
1597
1598 #if defined(HAVE_SHA1)
1599 /**
1600 * Generate a SHA-1 hash value string for given source string.
1601 */
1602 static void
1603 generate_sha1(const char *source, char sha_str[64])
1604 {
1605 unsigned char sha[20];
1606 _mesa_sha1_compute(source, strlen(source), sha);
1607 _mesa_sha1_format(sha_str, sha);
1608 }
1609
1610 /**
1611 * Construct a full path for shader replacement functionality using
1612 * following format:
1613 *
1614 * <path>/<stage prefix>_<CHECKSUM>.glsl
1615 */
1616 static void
1617 construct_name(const gl_shader_stage stage, const char *source,
1618 const char *path, char *name, unsigned length)
1619 {
1620 char sha[64];
1621 static const char *types[] = {
1622 "VS", "TC", "TE", "GS", "FS", "CS",
1623 };
1624
1625 generate_sha1(source, sha);
1626 _mesa_snprintf(name, length, "%s/%s_%s.glsl", path, types[stage],
1627 sha);
1628 }
1629
1630 /**
1631 * Write given shader source to a file in MESA_SHADER_DUMP_PATH.
1632 */
1633 static void
1634 dump_shader(const gl_shader_stage stage, const char *source)
1635 {
1636 char name[PATH_MAX];
1637 static bool path_exists = true;
1638 char *dump_path;
1639 FILE *f;
1640
1641 if (!path_exists)
1642 return;
1643
1644 dump_path = getenv("MESA_SHADER_DUMP_PATH");
1645 if (!dump_path) {
1646 path_exists = false;
1647 return;
1648 }
1649
1650 construct_name(stage, source, dump_path, name, PATH_MAX);
1651
1652 f = fopen(name, "w");
1653 if (f) {
1654 fputs(source, f);
1655 fclose(f);
1656 } else {
1657 GET_CURRENT_CONTEXT(ctx);
1658 _mesa_warning(ctx, "could not open %s for dumping shader (%s)", name,
1659 strerror(errno));
1660 }
1661 }
1662
1663 /**
1664 * Read shader source code from a file.
1665 * Useful for debugging to override an app's shader.
1666 */
1667 static GLcharARB *
1668 read_shader(const gl_shader_stage stage, const char *source)
1669 {
1670 char name[PATH_MAX];
1671 char *read_path;
1672 static bool path_exists = true;
1673 int len, shader_size = 0;
1674 GLcharARB *buffer;
1675 FILE *f;
1676
1677 if (!path_exists)
1678 return NULL;
1679
1680 read_path = getenv("MESA_SHADER_READ_PATH");
1681 if (!read_path) {
1682 path_exists = false;
1683 return NULL;
1684 }
1685
1686 construct_name(stage, source, read_path, name, PATH_MAX);
1687
1688 f = fopen(name, "r");
1689 if (!f)
1690 return NULL;
1691
1692 /* allocate enough room for the entire shader */
1693 fseek(f, 0, SEEK_END);
1694 shader_size = ftell(f);
1695 rewind(f);
1696 assert(shader_size);
1697
1698 /* add one for terminating zero */
1699 shader_size++;
1700
1701 buffer = malloc(shader_size);
1702 assert(buffer);
1703
1704 len = fread(buffer, 1, shader_size, f);
1705 buffer[len] = 0;
1706
1707 fclose(f);
1708
1709 return buffer;
1710 }
1711 #endif /* HAVE_SHA1 */
1712
1713 /**
1714 * Called via glShaderSource() and glShaderSourceARB() API functions.
1715 * Basically, concatenate the source code strings into one long string
1716 * and pass it to _mesa_shader_source().
1717 */
1718 void GLAPIENTRY
1719 _mesa_ShaderSource(GLuint shaderObj, GLsizei count,
1720 const GLchar * const * string, const GLint * length)
1721 {
1722 GET_CURRENT_CONTEXT(ctx);
1723 GLint *offsets;
1724 GLsizei i, totalLength;
1725 GLcharARB *source;
1726 struct gl_shader *sh;
1727
1728 #if defined(HAVE_SHA1)
1729 GLcharARB *replacement;
1730 #endif /* HAVE_SHA1 */
1731
1732 sh = _mesa_lookup_shader_err(ctx, shaderObj, "glShaderSourceARB");
1733 if (!sh)
1734 return;
1735
1736 if (string == NULL) {
1737 _mesa_error(ctx, GL_INVALID_VALUE, "glShaderSourceARB");
1738 return;
1739 }
1740
1741 /*
1742 * This array holds offsets of where the appropriate string ends, thus the
1743 * last element will be set to the total length of the source code.
1744 */
1745 offsets = malloc(count * sizeof(GLint));
1746 if (offsets == NULL) {
1747 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
1748 return;
1749 }
1750
1751 for (i = 0; i < count; i++) {
1752 if (string[i] == NULL) {
1753 free((GLvoid *) offsets);
1754 _mesa_error(ctx, GL_INVALID_OPERATION,
1755 "glShaderSourceARB(null string)");
1756 return;
1757 }
1758 if (length == NULL || length[i] < 0)
1759 offsets[i] = strlen(string[i]);
1760 else
1761 offsets[i] = length[i];
1762 /* accumulate string lengths */
1763 if (i > 0)
1764 offsets[i] += offsets[i - 1];
1765 }
1766
1767 /* Total length of source string is sum off all strings plus two.
1768 * One extra byte for terminating zero, another extra byte to silence
1769 * valgrind warnings in the parser/grammer code.
1770 */
1771 totalLength = offsets[count - 1] + 2;
1772 source = malloc(totalLength * sizeof(GLcharARB));
1773 if (source == NULL) {
1774 free((GLvoid *) offsets);
1775 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
1776 return;
1777 }
1778
1779 for (i = 0; i < count; i++) {
1780 GLint start = (i > 0) ? offsets[i - 1] : 0;
1781 memcpy(source + start, string[i],
1782 (offsets[i] - start) * sizeof(GLcharARB));
1783 }
1784 source[totalLength - 1] = '\0';
1785 source[totalLength - 2] = '\0';
1786
1787 #if defined(HAVE_SHA1)
1788 /* Dump original shader source to MESA_SHADER_DUMP_PATH and replace
1789 * if corresponding entry found from MESA_SHADER_READ_PATH.
1790 */
1791 dump_shader(sh->Stage, source);
1792
1793 replacement = read_shader(sh->Stage, source);
1794 if (replacement) {
1795 free(source);
1796 source = replacement;
1797 }
1798 #endif /* HAVE_SHA1 */
1799
1800 shader_source(sh, source);
1801
1802 free(offsets);
1803 }
1804
1805
1806 void GLAPIENTRY
1807 _mesa_UseProgram(GLuint program)
1808 {
1809 GET_CURRENT_CONTEXT(ctx);
1810 struct gl_shader_program *shProg;
1811
1812 if (MESA_VERBOSE & VERBOSE_API)
1813 _mesa_debug(ctx, "glUseProgram %u\n", program);
1814
1815 if (_mesa_is_xfb_active_and_unpaused(ctx)) {
1816 _mesa_error(ctx, GL_INVALID_OPERATION,
1817 "glUseProgram(transform feedback active)");
1818 return;
1819 }
1820
1821 if (program) {
1822 shProg = _mesa_lookup_shader_program_err(ctx, program, "glUseProgram");
1823 if (!shProg) {
1824 return;
1825 }
1826 if (!shProg->LinkStatus) {
1827 _mesa_error(ctx, GL_INVALID_OPERATION,
1828 "glUseProgram(program %u not linked)", program);
1829 return;
1830 }
1831
1832 /* debug code */
1833 if (ctx->_Shader->Flags & GLSL_USE_PROG) {
1834 print_shader_info(shProg);
1835 }
1836 }
1837 else {
1838 shProg = NULL;
1839 }
1840
1841 /* The ARB_separate_shader_object spec says:
1842 *
1843 * "The executable code for an individual shader stage is taken from
1844 * the current program for that stage. If there is a current program
1845 * object established by UseProgram, that program is considered current
1846 * for all stages. Otherwise, if there is a bound program pipeline
1847 * object (section 2.14.PPO), the program bound to the appropriate
1848 * stage of the pipeline object is considered current."
1849 */
1850 if (program) {
1851 /* Attach shader state to the binding point */
1852 _mesa_reference_pipeline_object(ctx, &ctx->_Shader, &ctx->Shader);
1853 /* Update the program */
1854 _mesa_use_program(ctx, shProg);
1855 } else {
1856 /* Must be done first: detach the progam */
1857 _mesa_use_program(ctx, shProg);
1858 /* Unattach shader_state binding point */
1859 _mesa_reference_pipeline_object(ctx, &ctx->_Shader, ctx->Pipeline.Default);
1860 /* If a pipeline was bound, rebind it */
1861 if (ctx->Pipeline.Current) {
1862 _mesa_BindProgramPipeline(ctx->Pipeline.Current->Name);
1863 }
1864 }
1865 }
1866
1867
1868 void GLAPIENTRY
1869 _mesa_ValidateProgram(GLuint program)
1870 {
1871 GET_CURRENT_CONTEXT(ctx);
1872 validate_program(ctx, program);
1873 }
1874
1875
1876 /**
1877 * For OpenGL ES 2.0, GL_ARB_ES2_compatibility
1878 */
1879 void GLAPIENTRY
1880 _mesa_GetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype,
1881 GLint* range, GLint* precision)
1882 {
1883 const struct gl_program_constants *limits;
1884 const struct gl_precision *p;
1885 GET_CURRENT_CONTEXT(ctx);
1886
1887 switch (shadertype) {
1888 case GL_VERTEX_SHADER:
1889 limits = &ctx->Const.Program[MESA_SHADER_VERTEX];
1890 break;
1891 case GL_FRAGMENT_SHADER:
1892 limits = &ctx->Const.Program[MESA_SHADER_FRAGMENT];
1893 break;
1894 default:
1895 _mesa_error(ctx, GL_INVALID_ENUM,
1896 "glGetShaderPrecisionFormat(shadertype)");
1897 return;
1898 }
1899
1900 switch (precisiontype) {
1901 case GL_LOW_FLOAT:
1902 p = &limits->LowFloat;
1903 break;
1904 case GL_MEDIUM_FLOAT:
1905 p = &limits->MediumFloat;
1906 break;
1907 case GL_HIGH_FLOAT:
1908 p = &limits->HighFloat;
1909 break;
1910 case GL_LOW_INT:
1911 p = &limits->LowInt;
1912 break;
1913 case GL_MEDIUM_INT:
1914 p = &limits->MediumInt;
1915 break;
1916 case GL_HIGH_INT:
1917 p = &limits->HighInt;
1918 break;
1919 default:
1920 _mesa_error(ctx, GL_INVALID_ENUM,
1921 "glGetShaderPrecisionFormat(precisiontype)");
1922 return;
1923 }
1924
1925 range[0] = p->RangeMin;
1926 range[1] = p->RangeMax;
1927 precision[0] = p->Precision;
1928 }
1929
1930
1931 /**
1932 * For OpenGL ES 2.0, GL_ARB_ES2_compatibility
1933 */
1934 void GLAPIENTRY
1935 _mesa_ReleaseShaderCompiler(void)
1936 {
1937 _mesa_destroy_shader_compiler_caches();
1938 }
1939
1940
1941 /**
1942 * For OpenGL ES 2.0, GL_ARB_ES2_compatibility
1943 */
1944 void GLAPIENTRY
1945 _mesa_ShaderBinary(GLint n, const GLuint* shaders, GLenum binaryformat,
1946 const void* binary, GLint length)
1947 {
1948 GET_CURRENT_CONTEXT(ctx);
1949 (void) shaders;
1950 (void) binaryformat;
1951 (void) binary;
1952
1953 /* Page 68, section 7.2 'Shader Binaries" of the of the OpenGL ES 3.1, and
1954 * page 88 of the OpenGL 4.5 specs state:
1955 *
1956 * "An INVALID_VALUE error is generated if count or length is negative.
1957 * An INVALID_ENUM error is generated if binaryformat is not a supported
1958 * format returned in SHADER_BINARY_FORMATS."
1959 */
1960 if (n < 0 || length < 0) {
1961 _mesa_error(ctx, GL_INVALID_VALUE, "glShaderBinary(count or length < 0)");
1962 return;
1963 }
1964
1965 _mesa_error(ctx, GL_INVALID_ENUM, "glShaderBinary(format)");
1966 }
1967
1968
1969 void GLAPIENTRY
1970 _mesa_GetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length,
1971 GLenum *binaryFormat, GLvoid *binary)
1972 {
1973 struct gl_shader_program *shProg;
1974 GLsizei length_dummy;
1975 GET_CURRENT_CONTEXT(ctx);
1976
1977 if (bufSize < 0){
1978 _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramBinary(bufSize < 0)");
1979 return;
1980 }
1981
1982 shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetProgramBinary");
1983 if (!shProg)
1984 return;
1985
1986 /* The ARB_get_program_binary spec says:
1987 *
1988 * "If <length> is NULL, then no length is returned."
1989 *
1990 * Ensure that length always points to valid storage to avoid multiple NULL
1991 * pointer checks below.
1992 */
1993 if (length == NULL)
1994 length = &length_dummy;
1995
1996
1997 /* The ARB_get_program_binary spec says:
1998 *
1999 * "When a program object's LINK_STATUS is FALSE, its program binary
2000 * length is zero, and a call to GetProgramBinary will generate an
2001 * INVALID_OPERATION error.
2002 */
2003 if (!shProg->LinkStatus) {
2004 _mesa_error(ctx, GL_INVALID_OPERATION,
2005 "glGetProgramBinary(program %u not linked)",
2006 shProg->Name);
2007 *length = 0;
2008 return;
2009 }
2010
2011 *length = 0;
2012 _mesa_error(ctx, GL_INVALID_OPERATION,
2013 "glGetProgramBinary(driver supports zero binary formats)");
2014
2015 (void) binaryFormat;
2016 (void) binary;
2017 }
2018
2019 void GLAPIENTRY
2020 _mesa_ProgramBinary(GLuint program, GLenum binaryFormat,
2021 const GLvoid *binary, GLsizei length)
2022 {
2023 struct gl_shader_program *shProg;
2024 GET_CURRENT_CONTEXT(ctx);
2025
2026 shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramBinary");
2027 if (!shProg)
2028 return;
2029
2030 (void) binaryFormat;
2031 (void) binary;
2032
2033 /* Section 2.3.1 (Errors) of the OpenGL 4.5 spec says:
2034 *
2035 * "If a negative number is provided where an argument of type sizei or
2036 * sizeiptr is specified, an INVALID_VALUE error is generated."
2037 */
2038 if (length < 0) {
2039 _mesa_error(ctx, GL_INVALID_VALUE, "glProgramBinary(length < 0)");
2040 return;
2041 }
2042
2043 /* The ARB_get_program_binary spec says:
2044 *
2045 * "<binaryFormat> and <binary> must be those returned by a previous
2046 * call to GetProgramBinary, and <length> must be the length of the
2047 * program binary as returned by GetProgramBinary or GetProgramiv with
2048 * <pname> PROGRAM_BINARY_LENGTH. Loading the program binary will fail,
2049 * setting the LINK_STATUS of <program> to FALSE, if these conditions
2050 * are not met."
2051 *
2052 * Since any value of binaryFormat passed "is not one of those specified as
2053 * allowable for [this] command, an INVALID_ENUM error is generated."
2054 */
2055 shProg->LinkStatus = GL_FALSE;
2056 _mesa_error(ctx, GL_INVALID_ENUM, "glProgramBinary");
2057 }
2058
2059
2060 void GLAPIENTRY
2061 _mesa_ProgramParameteri(GLuint program, GLenum pname, GLint value)
2062 {
2063 struct gl_shader_program *shProg;
2064 GET_CURRENT_CONTEXT(ctx);
2065
2066 shProg = _mesa_lookup_shader_program_err(ctx, program,
2067 "glProgramParameteri");
2068 if (!shProg)
2069 return;
2070
2071 switch (pname) {
2072 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
2073 /* This enum isn't part of the OES extension for OpenGL ES 2.0, but it
2074 * is part of OpenGL ES 3.0. For the ES2 case, this function shouldn't
2075 * even be in the dispatch table, so we shouldn't need to expclicitly
2076 * check here.
2077 *
2078 * On desktop, we ignore the 3.0+ requirement because it is silly.
2079 */
2080
2081 /* The ARB_get_program_binary extension spec says:
2082 *
2083 * "An INVALID_VALUE error is generated if the <value> argument to
2084 * ProgramParameteri is not TRUE or FALSE."
2085 */
2086 if (value != GL_TRUE && value != GL_FALSE) {
2087 goto invalid_value;
2088 }
2089
2090 /* No need to notify the driver. Any changes will actually take effect
2091 * the next time the shader is linked.
2092 *
2093 * The ARB_get_program_binary extension spec says:
2094 *
2095 * "To indicate that a program binary is likely to be retrieved,
2096 * ProgramParameteri should be called with <pname>
2097 * PROGRAM_BINARY_RETRIEVABLE_HINT and <value> TRUE. This setting
2098 * will not be in effect until the next time LinkProgram or
2099 * ProgramBinary has been called successfully."
2100 *
2101 * The resloution of issue 9 in the extension spec also says:
2102 *
2103 * "The application may use the PROGRAM_BINARY_RETRIEVABLE_HINT hint
2104 * to indicate to the GL implementation that this program will
2105 * likely be saved with GetProgramBinary at some point. This will
2106 * give the GL implementation the opportunity to track any state
2107 * changes made to the program before being saved such that when it
2108 * is loaded again a recompile can be avoided."
2109 */
2110 shProg->BinaryRetreivableHint = value;
2111 return;
2112
2113 case GL_PROGRAM_SEPARABLE:
2114 /* Spec imply that the behavior is the same as ARB_get_program_binary
2115 * Chapter 7.3 Program Objects
2116 */
2117 if (value != GL_TRUE && value != GL_FALSE) {
2118 goto invalid_value;
2119 }
2120 shProg->SeparateShader = value;
2121 return;
2122
2123 default:
2124 _mesa_error(ctx, GL_INVALID_ENUM, "glProgramParameteri(pname=%s)",
2125 _mesa_enum_to_string(pname));
2126 return;
2127 }
2128
2129 invalid_value:
2130 _mesa_error(ctx, GL_INVALID_VALUE,
2131 "glProgramParameteri(pname=%s, value=%d): "
2132 "value must be 0 or 1.",
2133 _mesa_enum_to_string(pname),
2134 value);
2135 }
2136
2137
2138 void
2139 _mesa_use_shader_program(struct gl_context *ctx, GLenum type,
2140 struct gl_shader_program *shProg,
2141 struct gl_pipeline_object *shTarget)
2142 {
2143 gl_shader_stage stage = _mesa_shader_enum_to_shader_stage(type);
2144 use_shader_program(ctx, stage, shProg, shTarget);
2145 }
2146
2147
2148 /**
2149 * Copy program-specific data generated by linking from the gl_shader_program
2150 * object to a specific gl_program object.
2151 */
2152 void
2153 _mesa_copy_linked_program_data(gl_shader_stage type,
2154 const struct gl_shader_program *src,
2155 struct gl_program *dst)
2156 {
2157 switch (type) {
2158 case MESA_SHADER_VERTEX:
2159 dst->ClipDistanceArraySize = src->Vert.ClipDistanceArraySize;
2160 dst->CullDistanceArraySize = src->Vert.CullDistanceArraySize;
2161 break;
2162 case MESA_SHADER_TESS_CTRL: {
2163 struct gl_tess_ctrl_program *dst_tcp =
2164 (struct gl_tess_ctrl_program *) dst;
2165 dst_tcp->VerticesOut = src->_LinkedShaders[MESA_SHADER_TESS_CTRL]->
2166 info.TessCtrl.VerticesOut;
2167 break;
2168 }
2169 case MESA_SHADER_TESS_EVAL: {
2170 struct gl_tess_eval_program *dst_tep =
2171 (struct gl_tess_eval_program *) dst;
2172 struct gl_linked_shader *tes_sh =
2173 src->_LinkedShaders[MESA_SHADER_TESS_EVAL];
2174
2175 dst_tep->PrimitiveMode = tes_sh->info.TessEval.PrimitiveMode;
2176 dst_tep->Spacing = tes_sh->info.TessEval.Spacing;
2177 dst_tep->VertexOrder = tes_sh->info.TessEval.VertexOrder;
2178 dst_tep->PointMode = tes_sh->info.TessEval.PointMode;
2179 dst->ClipDistanceArraySize = src->TessEval.ClipDistanceArraySize;
2180 dst->CullDistanceArraySize = src->TessEval.CullDistanceArraySize;
2181 break;
2182 }
2183 case MESA_SHADER_GEOMETRY: {
2184 struct gl_geometry_program *dst_gp = (struct gl_geometry_program *) dst;
2185 struct gl_linked_shader *geom_sh =
2186 src->_LinkedShaders[MESA_SHADER_GEOMETRY];
2187
2188 dst_gp->VerticesIn = src->Geom.VerticesIn;
2189 dst_gp->VerticesOut = geom_sh->info.Geom.VerticesOut;
2190 dst_gp->Invocations = geom_sh->info.Geom.Invocations;
2191 dst_gp->InputType = geom_sh->info.Geom.InputType;
2192 dst_gp->OutputType = geom_sh->info.Geom.OutputType;
2193 dst->ClipDistanceArraySize = src->Geom.ClipDistanceArraySize;
2194 dst->CullDistanceArraySize = src->Geom.CullDistanceArraySize;
2195 dst_gp->UsesEndPrimitive = src->Geom.UsesEndPrimitive;
2196 dst_gp->UsesStreams = src->Geom.UsesStreams;
2197 break;
2198 }
2199 case MESA_SHADER_FRAGMENT: {
2200 struct gl_fragment_program *dst_fp = (struct gl_fragment_program *) dst;
2201 dst_fp->FragDepthLayout = src->FragDepthLayout;
2202 break;
2203 }
2204 case MESA_SHADER_COMPUTE: {
2205 struct gl_compute_program *dst_cp = (struct gl_compute_program *) dst;
2206 int i;
2207 for (i = 0; i < 3; i++)
2208 dst_cp->LocalSize[i] = src->Comp.LocalSize[i];
2209 dst_cp->SharedSize = src->Comp.SharedSize;
2210 break;
2211 }
2212 default:
2213 break;
2214 }
2215 }
2216
2217 /**
2218 * ARB_separate_shader_objects: Compile & Link Program
2219 */
2220 GLuint GLAPIENTRY
2221 _mesa_CreateShaderProgramv(GLenum type, GLsizei count,
2222 const GLchar* const *strings)
2223 {
2224 GET_CURRENT_CONTEXT(ctx);
2225
2226 const GLuint shader = create_shader(ctx, type);
2227 GLuint program = 0;
2228
2229 /*
2230 * According to OpenGL 4.5 and OpenGL ES 3.1 standards, section 7.3:
2231 * GL_INVALID_VALUE should be generated if count < 0
2232 */
2233 if (count < 0) {
2234 _mesa_error(ctx, GL_INVALID_VALUE, "glCreateShaderProgram (count < 0)");
2235 return program;
2236 }
2237
2238 if (shader) {
2239 struct gl_shader *sh = _mesa_lookup_shader(ctx, shader);
2240
2241 _mesa_ShaderSource(shader, count, strings, NULL);
2242 _mesa_compile_shader(ctx, sh);
2243
2244 program = create_shader_program(ctx);
2245 if (program) {
2246 struct gl_shader_program *shProg;
2247 GLint compiled = GL_FALSE;
2248
2249 shProg = _mesa_lookup_shader_program(ctx, program);
2250
2251 shProg->SeparateShader = GL_TRUE;
2252
2253 get_shaderiv(ctx, shader, GL_COMPILE_STATUS, &compiled);
2254 if (compiled) {
2255 attach_shader(ctx, program, shader);
2256 _mesa_link_program(ctx, shProg);
2257 detach_shader(ctx, program, shader);
2258
2259 #if 0
2260 /* Possibly... */
2261 if (active-user-defined-varyings-in-linked-program) {
2262 append-error-to-info-log;
2263 shProg->LinkStatus = GL_FALSE;
2264 }
2265 #endif
2266 }
2267 if (sh->InfoLog)
2268 ralloc_strcat(&shProg->InfoLog, sh->InfoLog);
2269 }
2270
2271 delete_shader(ctx, shader);
2272 }
2273
2274 return program;
2275 }
2276
2277
2278 /**
2279 * For GL_ARB_tessellation_shader
2280 */
2281 extern void GLAPIENTRY
2282 _mesa_PatchParameteri(GLenum pname, GLint value)
2283 {
2284 GET_CURRENT_CONTEXT(ctx);
2285
2286 if (!_mesa_has_tessellation(ctx)) {
2287 _mesa_error(ctx, GL_INVALID_OPERATION, "glPatchParameteri");
2288 return;
2289 }
2290
2291 if (pname != GL_PATCH_VERTICES) {
2292 _mesa_error(ctx, GL_INVALID_ENUM, "glPatchParameteri");
2293 return;
2294 }
2295
2296 if (value <= 0 || value > ctx->Const.MaxPatchVertices) {
2297 _mesa_error(ctx, GL_INVALID_VALUE, "glPatchParameteri");
2298 return;
2299 }
2300
2301 ctx->TessCtrlProgram.patch_vertices = value;
2302 }
2303
2304
2305 extern void GLAPIENTRY
2306 _mesa_PatchParameterfv(GLenum pname, const GLfloat *values)
2307 {
2308 GET_CURRENT_CONTEXT(ctx);
2309
2310 if (!_mesa_has_tessellation(ctx)) {
2311 _mesa_error(ctx, GL_INVALID_OPERATION, "glPatchParameterfv");
2312 return;
2313 }
2314
2315 switch(pname) {
2316 case GL_PATCH_DEFAULT_OUTER_LEVEL:
2317 FLUSH_VERTICES(ctx, 0);
2318 memcpy(ctx->TessCtrlProgram.patch_default_outer_level, values,
2319 4 * sizeof(GLfloat));
2320 ctx->NewDriverState |= ctx->DriverFlags.NewDefaultTessLevels;
2321 return;
2322 case GL_PATCH_DEFAULT_INNER_LEVEL:
2323 FLUSH_VERTICES(ctx, 0);
2324 memcpy(ctx->TessCtrlProgram.patch_default_inner_level, values,
2325 2 * sizeof(GLfloat));
2326 ctx->NewDriverState |= ctx->DriverFlags.NewDefaultTessLevels;
2327 return;
2328 default:
2329 _mesa_error(ctx, GL_INVALID_ENUM, "glPatchParameterfv");
2330 return;
2331 }
2332 }
2333
2334 /**
2335 * ARB_shader_subroutine
2336 */
2337 GLint GLAPIENTRY
2338 _mesa_GetSubroutineUniformLocation(GLuint program, GLenum shadertype,
2339 const GLchar *name)
2340 {
2341 GET_CURRENT_CONTEXT(ctx);
2342 const char *api_name = "glGetSubroutineUniformLocation";
2343 struct gl_shader_program *shProg;
2344 GLenum resource_type;
2345 gl_shader_stage stage;
2346
2347 if (!_mesa_has_shader_subroutine(ctx)) {
2348 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2349 return -1;
2350 }
2351
2352 if (!_mesa_validate_shader_target(ctx, shadertype)) {
2353 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2354 return -1;
2355 }
2356
2357 shProg = _mesa_lookup_shader_program_err(ctx, program, api_name);
2358 if (!shProg)
2359 return -1;
2360
2361 stage = _mesa_shader_enum_to_shader_stage(shadertype);
2362 if (!shProg->_LinkedShaders[stage]) {
2363 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2364 return -1;
2365 }
2366
2367 resource_type = _mesa_shader_stage_to_subroutine_uniform(stage);
2368 return _mesa_program_resource_location(shProg, resource_type, name);
2369 }
2370
2371 GLuint GLAPIENTRY
2372 _mesa_GetSubroutineIndex(GLuint program, GLenum shadertype,
2373 const GLchar *name)
2374 {
2375 GET_CURRENT_CONTEXT(ctx);
2376 const char *api_name = "glGetSubroutineIndex";
2377 struct gl_shader_program *shProg;
2378 struct gl_program_resource *res;
2379 GLenum resource_type;
2380 gl_shader_stage stage;
2381
2382 if (!_mesa_has_shader_subroutine(ctx)) {
2383 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2384 return -1;
2385 }
2386
2387 if (!_mesa_validate_shader_target(ctx, shadertype)) {
2388 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2389 return -1;
2390 }
2391
2392 shProg = _mesa_lookup_shader_program_err(ctx, program, api_name);
2393 if (!shProg)
2394 return -1;
2395
2396 stage = _mesa_shader_enum_to_shader_stage(shadertype);
2397 if (!shProg->_LinkedShaders[stage]) {
2398 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2399 return -1;
2400 }
2401
2402 resource_type = _mesa_shader_stage_to_subroutine(stage);
2403 res = _mesa_program_resource_find_name(shProg, resource_type, name, NULL);
2404 if (!res) {
2405 return -1;
2406 }
2407
2408 return _mesa_program_resource_index(shProg, res);
2409 }
2410
2411
2412 GLvoid GLAPIENTRY
2413 _mesa_GetActiveSubroutineUniformiv(GLuint program, GLenum shadertype,
2414 GLuint index, GLenum pname, GLint *values)
2415 {
2416 GET_CURRENT_CONTEXT(ctx);
2417 const char *api_name = "glGetActiveSubroutineUniformiv";
2418 struct gl_shader_program *shProg;
2419 struct gl_linked_shader *sh;
2420 gl_shader_stage stage;
2421 struct gl_program_resource *res;
2422 const struct gl_uniform_storage *uni;
2423 GLenum resource_type;
2424 int count, i, j;
2425
2426 if (!_mesa_has_shader_subroutine(ctx)) {
2427 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2428 return;
2429 }
2430
2431 if (!_mesa_validate_shader_target(ctx, shadertype)) {
2432 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2433 return;
2434 }
2435
2436 shProg = _mesa_lookup_shader_program_err(ctx, program, api_name);
2437 if (!shProg)
2438 return;
2439
2440 stage = _mesa_shader_enum_to_shader_stage(shadertype);
2441 resource_type = _mesa_shader_stage_to_subroutine_uniform(stage);
2442
2443 sh = shProg->_LinkedShaders[stage];
2444 if (!sh) {
2445 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2446 return;
2447 }
2448
2449 if (index >= sh->NumSubroutineUniforms) {
2450 _mesa_error(ctx, GL_INVALID_VALUE, "%s: invalid index greater than GL_ACTIVE_SUBROUTINE_UNIFORMS", api_name);
2451 return;
2452 }
2453
2454 switch (pname) {
2455 case GL_NUM_COMPATIBLE_SUBROUTINES: {
2456 res = _mesa_program_resource_find_index(shProg, resource_type, index);
2457 if (res) {
2458 uni = res->Data;
2459 values[0] = uni->num_compatible_subroutines;
2460 }
2461 break;
2462 }
2463 case GL_COMPATIBLE_SUBROUTINES: {
2464 res = _mesa_program_resource_find_index(shProg, resource_type, index);
2465 if (res) {
2466 uni = res->Data;
2467 count = 0;
2468 for (i = 0; i < sh->NumSubroutineFunctions; i++) {
2469 struct gl_subroutine_function *fn = &sh->SubroutineFunctions[i];
2470 for (j = 0; j < fn->num_compat_types; j++) {
2471 if (fn->types[j] == uni->type) {
2472 values[count++] = i;
2473 break;
2474 }
2475 }
2476 }
2477 }
2478 break;
2479 }
2480 case GL_UNIFORM_SIZE:
2481 res = _mesa_program_resource_find_index(shProg, resource_type, index);
2482 if (res) {
2483 uni = res->Data;
2484 values[0] = uni->array_elements ? uni->array_elements : 1;
2485 }
2486 break;
2487 case GL_UNIFORM_NAME_LENGTH:
2488 res = _mesa_program_resource_find_index(shProg, resource_type, index);
2489 if (res) {
2490 values[0] = strlen(_mesa_program_resource_name(res)) + 1
2491 + ((_mesa_program_resource_array_size(res) != 0) ? 3 : 0);
2492 }
2493 break;
2494 default:
2495 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2496 return;
2497 }
2498 }
2499
2500
2501 GLvoid GLAPIENTRY
2502 _mesa_GetActiveSubroutineUniformName(GLuint program, GLenum shadertype,
2503 GLuint index, GLsizei bufsize,
2504 GLsizei *length, GLchar *name)
2505 {
2506 GET_CURRENT_CONTEXT(ctx);
2507 const char *api_name = "glGetActiveSubroutineUniformName";
2508 struct gl_shader_program *shProg;
2509 GLenum resource_type;
2510 gl_shader_stage stage;
2511
2512 if (!_mesa_has_shader_subroutine(ctx)) {
2513 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2514 return;
2515 }
2516
2517 if (!_mesa_validate_shader_target(ctx, shadertype)) {
2518 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2519 return;
2520 }
2521
2522 shProg = _mesa_lookup_shader_program_err(ctx, program, api_name);
2523 if (!shProg)
2524 return;
2525
2526 stage = _mesa_shader_enum_to_shader_stage(shadertype);
2527 if (!shProg->_LinkedShaders[stage]) {
2528 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2529 return;
2530 }
2531
2532 resource_type = _mesa_shader_stage_to_subroutine_uniform(stage);
2533 /* get program resource name */
2534 _mesa_get_program_resource_name(shProg, resource_type,
2535 index, bufsize,
2536 length, name, api_name);
2537 }
2538
2539
2540 GLvoid GLAPIENTRY
2541 _mesa_GetActiveSubroutineName(GLuint program, GLenum shadertype,
2542 GLuint index, GLsizei bufsize,
2543 GLsizei *length, GLchar *name)
2544 {
2545 GET_CURRENT_CONTEXT(ctx);
2546 const char *api_name = "glGetActiveSubroutineName";
2547 struct gl_shader_program *shProg;
2548 GLenum resource_type;
2549 gl_shader_stage stage;
2550
2551 if (!_mesa_has_shader_subroutine(ctx)) {
2552 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2553 return;
2554 }
2555
2556 if (!_mesa_validate_shader_target(ctx, shadertype)) {
2557 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2558 return;
2559 }
2560
2561 shProg = _mesa_lookup_shader_program_err(ctx, program, api_name);
2562 if (!shProg)
2563 return;
2564
2565 stage = _mesa_shader_enum_to_shader_stage(shadertype);
2566 if (!shProg->_LinkedShaders[stage]) {
2567 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2568 return;
2569 }
2570 resource_type = _mesa_shader_stage_to_subroutine(stage);
2571 _mesa_get_program_resource_name(shProg, resource_type,
2572 index, bufsize,
2573 length, name, api_name);
2574 }
2575
2576 GLvoid GLAPIENTRY
2577 _mesa_UniformSubroutinesuiv(GLenum shadertype, GLsizei count,
2578 const GLuint *indices)
2579 {
2580 GET_CURRENT_CONTEXT(ctx);
2581 const char *api_name = "glUniformSubroutinesuiv";
2582 struct gl_shader_program *shProg;
2583 struct gl_linked_shader *sh;
2584 gl_shader_stage stage;
2585 int i;
2586
2587 if (!_mesa_has_shader_subroutine(ctx)) {
2588 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2589 return;
2590 }
2591
2592 if (!_mesa_validate_shader_target(ctx, shadertype)) {
2593 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2594 return;
2595 }
2596
2597 stage = _mesa_shader_enum_to_shader_stage(shadertype);
2598 shProg = ctx->_Shader->CurrentProgram[stage];
2599 if (!shProg) {
2600 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2601 return;
2602 }
2603
2604 sh = shProg->_LinkedShaders[stage];
2605 if (!sh) {
2606 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2607 return;
2608 }
2609
2610 if (count != sh->NumSubroutineUniformRemapTable) {
2611 _mesa_error(ctx, GL_INVALID_VALUE, "%s", api_name);
2612 return;
2613 }
2614
2615 i = 0;
2616 do {
2617 struct gl_uniform_storage *uni = sh->SubroutineUniformRemapTable[i];
2618 if (uni == NULL) {
2619 i++;
2620 continue;
2621 }
2622
2623 int uni_count = uni->array_elements ? uni->array_elements : 1;
2624 int j, k, f;
2625
2626 for (j = i; j < i + uni_count; j++) {
2627 struct gl_subroutine_function *subfn = NULL;
2628 if (indices[j] > sh->MaxSubroutineFunctionIndex) {
2629 _mesa_error(ctx, GL_INVALID_VALUE, "%s", api_name);
2630 return;
2631 }
2632
2633 for (f = 0; f < sh->NumSubroutineFunctions; f++) {
2634 if (sh->SubroutineFunctions[f].index == indices[j])
2635 subfn = &sh->SubroutineFunctions[f];
2636 }
2637
2638 if (!subfn) {
2639 continue;
2640 }
2641
2642 for (k = 0; k < subfn->num_compat_types; k++) {
2643 if (subfn->types[k] == uni->type)
2644 break;
2645 }
2646 if (k == subfn->num_compat_types) {
2647 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2648 return;
2649 }
2650
2651 ctx->SubroutineIndex[sh->Stage].IndexPtr[j] = indices[j];
2652 }
2653 i += uni_count;
2654 } while(i < count);
2655
2656 FLUSH_VERTICES(ctx, _NEW_PROGRAM_CONSTANTS);
2657 }
2658
2659
2660 GLvoid GLAPIENTRY
2661 _mesa_GetUniformSubroutineuiv(GLenum shadertype, GLint location,
2662 GLuint *params)
2663 {
2664 GET_CURRENT_CONTEXT(ctx);
2665 const char *api_name = "glGetUniformSubroutineuiv";
2666 struct gl_shader_program *shProg;
2667 struct gl_linked_shader *sh;
2668 gl_shader_stage stage;
2669
2670 if (!_mesa_has_shader_subroutine(ctx)) {
2671 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2672 return;
2673 }
2674
2675 if (!_mesa_validate_shader_target(ctx, shadertype)) {
2676 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2677 return;
2678 }
2679
2680 stage = _mesa_shader_enum_to_shader_stage(shadertype);
2681 shProg = ctx->_Shader->CurrentProgram[stage];
2682 if (!shProg) {
2683 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2684 return;
2685 }
2686
2687 sh = shProg->_LinkedShaders[stage];
2688 if (!sh) {
2689 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2690 return;
2691 }
2692
2693 if (location >= sh->NumSubroutineUniformRemapTable) {
2694 _mesa_error(ctx, GL_INVALID_VALUE, "%s", api_name);
2695 return;
2696 }
2697
2698 *params = ctx->SubroutineIndex[sh->Stage].IndexPtr[location];
2699 }
2700
2701
2702 GLvoid GLAPIENTRY
2703 _mesa_GetProgramStageiv(GLuint program, GLenum shadertype,
2704 GLenum pname, GLint *values)
2705 {
2706 GET_CURRENT_CONTEXT(ctx);
2707 const char *api_name = "glGetProgramStageiv";
2708 struct gl_shader_program *shProg;
2709 struct gl_linked_shader *sh;
2710 gl_shader_stage stage;
2711
2712 if (!_mesa_has_shader_subroutine(ctx)) {
2713 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2714 return;
2715 }
2716
2717 if (!_mesa_validate_shader_target(ctx, shadertype)) {
2718 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2719 return;
2720 }
2721
2722 shProg = _mesa_lookup_shader_program_err(ctx, program, api_name);
2723 if (!shProg)
2724 return;
2725
2726 stage = _mesa_shader_enum_to_shader_stage(shadertype);
2727 sh = shProg->_LinkedShaders[stage];
2728
2729 /* ARB_shader_subroutine doesn't ask the program to be linked, or list any
2730 * INVALID_OPERATION in the case of not be linked.
2731 *
2732 * And for some pnames, like GL_ACTIVE_SUBROUTINE_UNIFORMS, you can ask the
2733 * same info using other specs (ARB_program_interface_query), without the
2734 * need of the program to be linked, being the value for that case 0.
2735 *
2736 * But at the same time, some other methods require the program to be
2737 * linked for pname related to locations, so it would be inconsistent to
2738 * not do the same here. So we are:
2739 * * Return GL_INVALID_OPERATION if not linked only for locations.
2740 * * Setting a default value of 0, to be returned if not linked.
2741 */
2742 if (!sh) {
2743 values[0] = 0;
2744 if (pname == GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS) {
2745 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
2746 }
2747 return;
2748 }
2749
2750 switch (pname) {
2751 case GL_ACTIVE_SUBROUTINES:
2752 values[0] = sh->NumSubroutineFunctions;
2753 break;
2754 case GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS:
2755 values[0] = sh->NumSubroutineUniformRemapTable;
2756 break;
2757 case GL_ACTIVE_SUBROUTINE_UNIFORMS:
2758 values[0] = sh->NumSubroutineUniforms;
2759 break;
2760 case GL_ACTIVE_SUBROUTINE_MAX_LENGTH:
2761 {
2762 unsigned i;
2763 GLint max_len = 0;
2764 GLenum resource_type;
2765 struct gl_program_resource *res;
2766
2767 resource_type = _mesa_shader_stage_to_subroutine(stage);
2768 for (i = 0; i < sh->NumSubroutineFunctions; i++) {
2769 res = _mesa_program_resource_find_index(shProg, resource_type, i);
2770 if (res) {
2771 const GLint len = strlen(_mesa_program_resource_name(res)) + 1;
2772 if (len > max_len)
2773 max_len = len;
2774 }
2775 }
2776 values[0] = max_len;
2777 break;
2778 }
2779 case GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH:
2780 {
2781 unsigned i;
2782 GLint max_len = 0;
2783 GLenum resource_type;
2784 struct gl_program_resource *res;
2785
2786 resource_type = _mesa_shader_stage_to_subroutine_uniform(stage);
2787 for (i = 0; i < sh->NumSubroutineUniformRemapTable; i++) {
2788 res = _mesa_program_resource_find_index(shProg, resource_type, i);
2789 if (res) {
2790 const GLint len = strlen(_mesa_program_resource_name(res)) + 1
2791 + ((_mesa_program_resource_array_size(res) != 0) ? 3 : 0);
2792
2793 if (len > max_len)
2794 max_len = len;
2795 }
2796 }
2797 values[0] = max_len;
2798 break;
2799 }
2800 default:
2801 _mesa_error(ctx, GL_INVALID_ENUM, "%s", api_name);
2802 values[0] = -1;
2803 break;
2804 }
2805 }
2806
2807 static int
2808 find_compat_subroutine(struct gl_linked_shader *sh,
2809 const struct glsl_type *type)
2810 {
2811 int i, j;
2812
2813 for (i = 0; i < sh->NumSubroutineFunctions; i++) {
2814 struct gl_subroutine_function *fn = &sh->SubroutineFunctions[i];
2815 for (j = 0; j < fn->num_compat_types; j++) {
2816 if (fn->types[j] == type)
2817 return i;
2818 }
2819 }
2820 return 0;
2821 }
2822
2823 static void
2824 _mesa_shader_write_subroutine_index(struct gl_context *ctx,
2825 struct gl_linked_shader *sh)
2826 {
2827 int i, j;
2828
2829 if (sh->NumSubroutineUniformRemapTable == 0)
2830 return;
2831
2832 i = 0;
2833 do {
2834 struct gl_uniform_storage *uni = sh->SubroutineUniformRemapTable[i];
2835 int uni_count;
2836 int val;
2837
2838 if (!uni) {
2839 i++;
2840 continue;
2841 }
2842
2843 uni_count = uni->array_elements ? uni->array_elements : 1;
2844 for (j = 0; j < uni_count; j++) {
2845 val = ctx->SubroutineIndex[sh->Stage].IndexPtr[i + j];
2846 memcpy(&uni->storage[j], &val, sizeof(int));
2847 }
2848
2849 _mesa_propagate_uniforms_to_driver_storage(uni, 0, uni_count);
2850 i += uni_count;
2851 } while(i < sh->NumSubroutineUniformRemapTable);
2852 }
2853
2854 void
2855 _mesa_shader_write_subroutine_indices(struct gl_context *ctx,
2856 gl_shader_stage stage)
2857 {
2858 if (ctx->_Shader->CurrentProgram[stage] &&
2859 ctx->_Shader->CurrentProgram[stage]->_LinkedShaders[stage])
2860 _mesa_shader_write_subroutine_index(ctx,
2861 ctx->_Shader->CurrentProgram[stage]->_LinkedShaders[stage]);
2862 }
2863
2864 static void
2865 _mesa_shader_init_subroutine_defaults(struct gl_context *ctx,
2866 struct gl_linked_shader *sh)
2867 {
2868 int i;
2869 struct gl_subroutine_index_binding *binding = &ctx->SubroutineIndex[sh->Stage];
2870 if (binding->NumIndex != sh->NumSubroutineUniformRemapTable) {
2871 binding->IndexPtr = realloc(binding->IndexPtr,
2872 sh->NumSubroutineUniformRemapTable * (sizeof(GLuint)));
2873 binding->NumIndex = sh->NumSubroutineUniformRemapTable;
2874 }
2875
2876 for (i = 0; i < sh->NumSubroutineUniformRemapTable; i++) {
2877 struct gl_uniform_storage *uni = sh->SubroutineUniformRemapTable[i];
2878
2879 if (!uni)
2880 continue;
2881
2882 binding->IndexPtr[i] = find_compat_subroutine(sh, uni->type);
2883 }
2884 }
2885
2886 void
2887 _mesa_shader_program_init_subroutine_defaults(struct gl_context *ctx,
2888 struct gl_shader_program *shProg)
2889 {
2890 int i;
2891
2892 if (!shProg)
2893 return;
2894
2895 for (i = 0; i < MESA_SHADER_STAGES; i++) {
2896 if (!shProg->_LinkedShaders[i])
2897 continue;
2898
2899 _mesa_shader_init_subroutine_defaults(ctx, shProg->_LinkedShaders[i]);
2900 }
2901 }