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