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