• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright © 2010 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  * DEALINGS IN THE SOFTWARE.
22  */
23 
24 /**
25  * \file linker.cpp
26  * GLSL linker implementation
27  *
28  * Given a set of shaders that are to be linked to generate a final program,
29  * there are three distinct stages.
30  *
31  * In the first stage shaders are partitioned into groups based on the shader
32  * type.  All shaders of a particular type (e.g., vertex shaders) are linked
33  * together.
34  *
35  *   - Undefined references in each shader are resolve to definitions in
36  *     another shader.
37  *   - Types and qualifiers of uniforms, outputs, and global variables defined
38  *     in multiple shaders with the same name are verified to be the same.
39  *   - Initializers for uniforms and global variables defined
40  *     in multiple shaders with the same name are verified to be the same.
41  *
42  * The result, in the terminology of the GLSL spec, is a set of shader
43  * executables for each processing unit.
44  *
45  * After the first stage is complete, a series of semantic checks are performed
46  * on each of the shader executables.
47  *
48  *   - Each shader executable must define a \c main function.
49  *   - Each vertex shader executable must write to \c gl_Position.
50  *   - Each fragment shader executable must write to either \c gl_FragData or
51  *     \c gl_FragColor.
52  *
53  * In the final stage individual shader executables are linked to create a
54  * complete exectuable.
55  *
56  *   - Types of uniforms defined in multiple shader stages with the same name
57  *     are verified to be the same.
58  *   - Initializers for uniforms defined in multiple shader stages with the
59  *     same name are verified to be the same.
60  *   - Types and qualifiers of outputs defined in one stage are verified to
61  *     be the same as the types and qualifiers of inputs defined with the same
62  *     name in a later stage.
63  *
64  * \author Ian Romanick <ian.d.romanick@intel.com>
65  */
66 
67 #include "main/core.h"
68 #include "glsl_symbol_table.h"
69 #include "ir.h"
70 #include "program.h"
71 #include "program/hash_table.h"
72 #include "linker.h"
73 #include "ir_optimization.h"
74 
75 extern "C" {
76 #include "main/shaderobj.h"
77 }
78 
79 /**
80  * Visitor that determines whether or not a variable is ever written.
81  */
82 class find_assignment_visitor : public ir_hierarchical_visitor {
83 public:
find_assignment_visitor(const char * name)84    find_assignment_visitor(const char *name)
85       : name(name), found(false)
86    {
87       /* empty */
88    }
89 
visit_enter(ir_assignment * ir)90    virtual ir_visitor_status visit_enter(ir_assignment *ir)
91    {
92       ir_variable *const var = ir->lhs->variable_referenced();
93 
94       if (strcmp(name, var->name) == 0) {
95 	 found = true;
96 	 return visit_stop;
97       }
98 
99       return visit_continue_with_parent;
100    }
101 
visit_enter(ir_call * ir)102    virtual ir_visitor_status visit_enter(ir_call *ir)
103    {
104       exec_list_iterator sig_iter = ir->callee->parameters.iterator();
105       foreach_iter(exec_list_iterator, iter, *ir) {
106 	 ir_rvalue *param_rval = (ir_rvalue *)iter.get();
107 	 ir_variable *sig_param = (ir_variable *)sig_iter.get();
108 
109 	 if (sig_param->mode == ir_var_out ||
110 	     sig_param->mode == ir_var_inout) {
111 	    ir_variable *var = param_rval->variable_referenced();
112 	    if (var && strcmp(name, var->name) == 0) {
113 	       found = true;
114 	       return visit_stop;
115 	    }
116 	 }
117 	 sig_iter.next();
118       }
119 
120       if (ir->return_deref != NULL) {
121 	 ir_variable *const var = ir->return_deref->variable_referenced();
122 
123 	 if (strcmp(name, var->name) == 0) {
124 	    found = true;
125 	    return visit_stop;
126 	 }
127       }
128 
129       return visit_continue_with_parent;
130    }
131 
variable_found()132    bool variable_found()
133    {
134       return found;
135    }
136 
137 private:
138    const char *name;       /**< Find writes to a variable with this name. */
139    bool found;             /**< Was a write to the variable found? */
140 };
141 
142 
143 /**
144  * Visitor that determines whether or not a variable is ever read.
145  */
146 class find_deref_visitor : public ir_hierarchical_visitor {
147 public:
find_deref_visitor(const char * name)148    find_deref_visitor(const char *name)
149       : name(name), found(false)
150    {
151       /* empty */
152    }
153 
visit(ir_dereference_variable * ir)154    virtual ir_visitor_status visit(ir_dereference_variable *ir)
155    {
156       if (strcmp(this->name, ir->var->name) == 0) {
157 	 this->found = true;
158 	 return visit_stop;
159       }
160 
161       return visit_continue;
162    }
163 
variable_found() const164    bool variable_found() const
165    {
166       return this->found;
167    }
168 
169 private:
170    const char *name;       /**< Find writes to a variable with this name. */
171    bool found;             /**< Was a write to the variable found? */
172 };
173 
174 
175 void
linker_error(gl_shader_program * prog,const char * fmt,...)176 linker_error(gl_shader_program *prog, const char *fmt, ...)
177 {
178    va_list ap;
179 
180    ralloc_strcat(&prog->InfoLog, "error: ");
181    va_start(ap, fmt);
182    ralloc_vasprintf_append(&prog->InfoLog, fmt, ap);
183    va_end(ap);
184 
185    prog->LinkStatus = false;
186 }
187 
188 
189 void
linker_warning(gl_shader_program * prog,const char * fmt,...)190 linker_warning(gl_shader_program *prog, const char *fmt, ...)
191 {
192    va_list ap;
193 
194    ralloc_strcat(&prog->InfoLog, "error: ");
195    va_start(ap, fmt);
196    ralloc_vasprintf_append(&prog->InfoLog, fmt, ap);
197    va_end(ap);
198 
199 }
200 
201 
202 void
link_invalidate_variable_locations(gl_shader * sh,enum ir_variable_mode mode,int generic_base)203 link_invalidate_variable_locations(gl_shader *sh, enum ir_variable_mode mode,
204 				   int generic_base)
205 {
206    foreach_list(node, sh->ir) {
207       ir_variable *const var = ((ir_instruction *) node)->as_variable();
208 
209       if ((var == NULL) || (var->mode != (unsigned) mode))
210 	 continue;
211 
212       /* Only assign locations for generic attributes / varyings / etc.
213        */
214       if ((var->location >= generic_base) && !var->explicit_location)
215 	  var->location = -1;
216    }
217 }
218 
219 
220 /**
221  * Determine the number of attribute slots required for a particular type
222  *
223  * This code is here because it implements the language rules of a specific
224  * GLSL version.  Since it's a property of the language and not a property of
225  * types in general, it doesn't really belong in glsl_type.
226  */
227 unsigned
count_attribute_slots(const glsl_type * t)228 count_attribute_slots(const glsl_type *t)
229 {
230    /* From page 31 (page 37 of the PDF) of the GLSL 1.50 spec:
231     *
232     *     "A scalar input counts the same amount against this limit as a vec4,
233     *     so applications may want to consider packing groups of four
234     *     unrelated float inputs together into a vector to better utilize the
235     *     capabilities of the underlying hardware. A matrix input will use up
236     *     multiple locations.  The number of locations used will equal the
237     *     number of columns in the matrix."
238     *
239     * The spec does not explicitly say how arrays are counted.  However, it
240     * should be safe to assume the total number of slots consumed by an array
241     * is the number of entries in the array multiplied by the number of slots
242     * consumed by a single element of the array.
243     */
244 
245    if (t->is_array())
246       return t->array_size() * count_attribute_slots(t->element_type());
247 
248    if (t->is_matrix())
249       return t->matrix_columns;
250 
251    return 1;
252 }
253 
254 
255 /**
256  * Verify that a vertex shader executable meets all semantic requirements.
257  *
258  * Also sets prog->Vert.UsesClipDistance and prog->Vert.ClipDistanceArraySize
259  * as a side effect.
260  *
261  * \param shader  Vertex shader executable to be verified
262  */
263 bool
validate_vertex_shader_executable(struct gl_shader_program * prog,struct gl_shader * shader)264 validate_vertex_shader_executable(struct gl_shader_program *prog,
265 				  struct gl_shader *shader)
266 {
267    if (shader == NULL)
268       return true;
269 
270    /* From the GLSL 1.10 spec, page 48:
271     *
272     *     "The variable gl_Position is available only in the vertex
273     *      language and is intended for writing the homogeneous vertex
274     *      position. All executions of a well-formed vertex shader
275     *      executable must write a value into this variable. [...] The
276     *      variable gl_Position is available only in the vertex
277     *      language and is intended for writing the homogeneous vertex
278     *      position. All executions of a well-formed vertex shader
279     *      executable must write a value into this variable."
280     *
281     * while in GLSL 1.40 this text is changed to:
282     *
283     *     "The variable gl_Position is available only in the vertex
284     *      language and is intended for writing the homogeneous vertex
285     *      position. It can be written at any time during shader
286     *      execution. It may also be read back by a vertex shader
287     *      after being written. This value will be used by primitive
288     *      assembly, clipping, culling, and other fixed functionality
289     *      operations, if present, that operate on primitives after
290     *      vertex processing has occurred. Its value is undefined if
291     *      the vertex shader executable does not write gl_Position."
292     */
293    if (prog->Version < 140) {
294       find_assignment_visitor find("gl_Position");
295       find.run(shader->ir);
296       if (!find.variable_found()) {
297 	 linker_error(prog, "vertex shader does not write to `gl_Position'\n");
298 	 return false;
299       }
300    }
301 
302    prog->Vert.ClipDistanceArraySize = 0;
303 
304    if (prog->Version >= 130) {
305       /* From section 7.1 (Vertex Shader Special Variables) of the
306        * GLSL 1.30 spec:
307        *
308        *   "It is an error for a shader to statically write both
309        *   gl_ClipVertex and gl_ClipDistance."
310        */
311       find_assignment_visitor clip_vertex("gl_ClipVertex");
312       find_assignment_visitor clip_distance("gl_ClipDistance");
313 
314       clip_vertex.run(shader->ir);
315       clip_distance.run(shader->ir);
316       if (clip_vertex.variable_found() && clip_distance.variable_found()) {
317          linker_error(prog, "vertex shader writes to both `gl_ClipVertex' "
318                       "and `gl_ClipDistance'\n");
319          return false;
320       }
321       prog->Vert.UsesClipDistance = clip_distance.variable_found();
322       ir_variable *clip_distance_var =
323          shader->symbols->get_variable("gl_ClipDistance");
324       if (clip_distance_var)
325          prog->Vert.ClipDistanceArraySize = clip_distance_var->type->length;
326    }
327 
328    return true;
329 }
330 
331 
332 /**
333  * Verify that a fragment shader executable meets all semantic requirements
334  *
335  * \param shader  Fragment shader executable to be verified
336  */
337 bool
validate_fragment_shader_executable(struct gl_shader_program * prog,struct gl_shader * shader)338 validate_fragment_shader_executable(struct gl_shader_program *prog,
339 				    struct gl_shader *shader)
340 {
341    if (shader == NULL)
342       return true;
343 
344    find_assignment_visitor frag_color("gl_FragColor");
345    find_assignment_visitor frag_data("gl_FragData");
346 
347    frag_color.run(shader->ir);
348    frag_data.run(shader->ir);
349 
350    if (frag_color.variable_found() && frag_data.variable_found()) {
351       linker_error(prog,  "fragment shader writes to both "
352 		   "`gl_FragColor' and `gl_FragData'\n");
353       return false;
354    }
355 
356    return true;
357 }
358 
359 
360 /**
361  * Generate a string describing the mode of a variable
362  */
363 static const char *
mode_string(const ir_variable * var)364 mode_string(const ir_variable *var)
365 {
366    switch (var->mode) {
367    case ir_var_auto:
368       return (var->read_only) ? "global constant" : "global variable";
369 
370    case ir_var_uniform: return "uniform";
371    case ir_var_in:      return "shader input";
372    case ir_var_out:     return "shader output";
373    case ir_var_inout:   return "shader inout";
374 
375    case ir_var_const_in:
376    case ir_var_temporary:
377    default:
378       assert(!"Should not get here.");
379       return "invalid variable";
380    }
381 }
382 
383 
384 /**
385  * Perform validation of global variables used across multiple shaders
386  */
387 bool
cross_validate_globals(struct gl_shader_program * prog,struct gl_shader ** shader_list,unsigned num_shaders,bool uniforms_only)388 cross_validate_globals(struct gl_shader_program *prog,
389 		       struct gl_shader **shader_list,
390 		       unsigned num_shaders,
391 		       bool uniforms_only)
392 {
393    /* Examine all of the uniforms in all of the shaders and cross validate
394     * them.
395     */
396    glsl_symbol_table variables;
397    for (unsigned i = 0; i < num_shaders; i++) {
398       if (shader_list[i] == NULL)
399 	 continue;
400 
401       foreach_list(node, shader_list[i]->ir) {
402 	 ir_variable *const var = ((ir_instruction *) node)->as_variable();
403 
404 	 if (var == NULL)
405 	    continue;
406 
407 	 if (uniforms_only && (var->mode != ir_var_uniform))
408 	    continue;
409 
410 	 /* Don't cross validate temporaries that are at global scope.  These
411 	  * will eventually get pulled into the shaders 'main'.
412 	  */
413 	 if (var->mode == ir_var_temporary)
414 	    continue;
415 
416 	 /* If a global with this name has already been seen, verify that the
417 	  * new instance has the same type.  In addition, if the globals have
418 	  * initializers, the values of the initializers must be the same.
419 	  */
420 	 ir_variable *const existing = variables.get_variable(var->name);
421 	 if (existing != NULL) {
422 	    if (var->type != existing->type) {
423 	       /* Consider the types to be "the same" if both types are arrays
424 		* of the same type and one of the arrays is implicitly sized.
425 		* In addition, set the type of the linked variable to the
426 		* explicitly sized array.
427 		*/
428 	       if (var->type->is_array()
429 		   && existing->type->is_array()
430 		   && (var->type->fields.array == existing->type->fields.array)
431 		   && ((var->type->length == 0)
432 		       || (existing->type->length == 0))) {
433 		  if (var->type->length != 0) {
434 		     existing->type = var->type;
435 		  }
436 	       } else {
437 		  linker_error(prog, "%s `%s' declared as type "
438 			       "`%s' and type `%s'\n",
439 			       mode_string(var),
440 			       var->name, var->type->name,
441 			       existing->type->name);
442 		  return false;
443 	       }
444 	    }
445 
446 	    if (var->explicit_location) {
447 	       if (existing->explicit_location
448 		   && (var->location != existing->location)) {
449 		     linker_error(prog, "explicit locations for %s "
450 				  "`%s' have differing values\n",
451 				  mode_string(var), var->name);
452 		     return false;
453 	       }
454 
455 	       existing->location = var->location;
456 	       existing->explicit_location = true;
457 	    }
458 
459 	    /* Validate layout qualifiers for gl_FragDepth.
460 	     *
461 	     * From the AMD/ARB_conservative_depth specs:
462 	     *
463 	     *    "If gl_FragDepth is redeclared in any fragment shader in a
464 	     *    program, it must be redeclared in all fragment shaders in
465 	     *    that program that have static assignments to
466 	     *    gl_FragDepth. All redeclarations of gl_FragDepth in all
467 	     *    fragment shaders in a single program must have the same set
468 	     *    of qualifiers."
469 	     */
470 	    if (strcmp(var->name, "gl_FragDepth") == 0) {
471 	       bool layout_declared = var->depth_layout != ir_depth_layout_none;
472 	       bool layout_differs =
473 		  var->depth_layout != existing->depth_layout;
474 
475 	       if (layout_declared && layout_differs) {
476 		  linker_error(prog,
477 			       "All redeclarations of gl_FragDepth in all "
478 			       "fragment shaders in a single program must have "
479 			       "the same set of qualifiers.");
480 	       }
481 
482 	       if (var->used && layout_differs) {
483 		  linker_error(prog,
484 			       "If gl_FragDepth is redeclared with a layout "
485 			       "qualifier in any fragment shader, it must be "
486 			       "redeclared with the same layout qualifier in "
487 			       "all fragment shaders that have assignments to "
488 			       "gl_FragDepth");
489 	       }
490 	    }
491 
492 	    /* Page 35 (page 41 of the PDF) of the GLSL 4.20 spec says:
493 	     *
494 	     *     "If a shared global has multiple initializers, the
495 	     *     initializers must all be constant expressions, and they
496 	     *     must all have the same value. Otherwise, a link error will
497 	     *     result. (A shared global having only one initializer does
498 	     *     not require that initializer to be a constant expression.)"
499 	     *
500 	     * Previous to 4.20 the GLSL spec simply said that initializers
501 	     * must have the same value.  In this case of non-constant
502 	     * initializers, this was impossible to determine.  As a result,
503 	     * no vendor actually implemented that behavior.  The 4.20
504 	     * behavior matches the implemented behavior of at least one other
505 	     * vendor, so we'll implement that for all GLSL versions.
506 	     */
507 	    if (var->constant_initializer != NULL) {
508 	       if (existing->constant_initializer != NULL) {
509 		  if (!var->constant_initializer->has_value(existing->constant_initializer)) {
510 		     linker_error(prog, "initializers for %s "
511 				  "`%s' have differing values\n",
512 				  mode_string(var), var->name);
513 		     return false;
514 		  }
515 	       } else {
516 		  /* If the first-seen instance of a particular uniform did not
517 		   * have an initializer but a later instance does, copy the
518 		   * initializer to the version stored in the symbol table.
519 		   */
520 		  /* FINISHME: This is wrong.  The constant_value field should
521 		   * FINISHME: not be modified!  Imagine a case where a shader
522 		   * FINISHME: without an initializer is linked in two different
523 		   * FINISHME: programs with shaders that have differing
524 		   * FINISHME: initializers.  Linking with the first will
525 		   * FINISHME: modify the shader, and linking with the second
526 		   * FINISHME: will fail.
527 		   */
528 		  existing->constant_initializer =
529 		     var->constant_initializer->clone(ralloc_parent(existing),
530 						      NULL);
531 	       }
532 	    }
533 
534 	    if (var->has_initializer) {
535 	       if (existing->has_initializer
536 		   && (var->constant_initializer == NULL
537 		       || existing->constant_initializer == NULL)) {
538 		  linker_error(prog,
539 			       "shared global variable `%s' has multiple "
540 			       "non-constant initializers.\n",
541 			       var->name);
542 		  return false;
543 	       }
544 
545 	       /* Some instance had an initializer, so keep track of that.  In
546 		* this location, all sorts of initializers (constant or
547 		* otherwise) will propagate the existence to the variable
548 		* stored in the symbol table.
549 		*/
550 	       existing->has_initializer = true;
551 	    }
552 
553 	    if (existing->invariant != var->invariant) {
554 	       linker_error(prog, "declarations for %s `%s' have "
555 			    "mismatching invariant qualifiers\n",
556 			    mode_string(var), var->name);
557 	       return false;
558 	    }
559             if (existing->centroid != var->centroid) {
560                linker_error(prog, "declarations for %s `%s' have "
561 			    "mismatching centroid qualifiers\n",
562 			    mode_string(var), var->name);
563                return false;
564             }
565 	 } else
566 	    variables.add_variable(var);
567       }
568    }
569 
570    return true;
571 }
572 
573 
574 /**
575  * Perform validation of uniforms used across multiple shader stages
576  */
577 bool
cross_validate_uniforms(struct gl_shader_program * prog)578 cross_validate_uniforms(struct gl_shader_program *prog)
579 {
580    return cross_validate_globals(prog, prog->_LinkedShaders,
581 				 MESA_SHADER_TYPES, true);
582 }
583 
584 /**
585  * Accumulates the array of prog->UniformBlocks and checks that all
586  * definitons of blocks agree on their contents.
587  */
588 static bool
interstage_cross_validate_uniform_blocks(struct gl_shader_program * prog)589 interstage_cross_validate_uniform_blocks(struct gl_shader_program *prog)
590 {
591    unsigned max_num_uniform_blocks = 0;
592    for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) {
593       if (prog->_LinkedShaders[i])
594 	 max_num_uniform_blocks += prog->_LinkedShaders[i]->NumUniformBlocks;
595    }
596 
597    for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) {
598       struct gl_shader *sh = prog->_LinkedShaders[i];
599 
600       prog->UniformBlockStageIndex[i] = ralloc_array(prog, int,
601 						     max_num_uniform_blocks);
602       for (unsigned int j = 0; j < max_num_uniform_blocks; j++)
603 	 prog->UniformBlockStageIndex[i][j] = -1;
604 
605       if (sh == NULL)
606 	 continue;
607 
608       for (unsigned int j = 0; j < sh->NumUniformBlocks; j++) {
609 	 int index = link_cross_validate_uniform_block(prog,
610 						       &prog->UniformBlocks,
611 						       &prog->NumUniformBlocks,
612 						       &sh->UniformBlocks[j]);
613 
614 	 if (index == -1) {
615 	    linker_error(prog, "uniform block `%s' has mismatching definitions",
616 			 sh->UniformBlocks[j].Name);
617 	    return false;
618 	 }
619 
620 	 prog->UniformBlockStageIndex[i][index] = j;
621       }
622    }
623 
624    return true;
625 }
626 
627 /**
628  * Validate that outputs from one stage match inputs of another
629  */
630 bool
cross_validate_outputs_to_inputs(struct gl_shader_program * prog,gl_shader * producer,gl_shader * consumer)631 cross_validate_outputs_to_inputs(struct gl_shader_program *prog,
632 				 gl_shader *producer, gl_shader *consumer)
633 {
634    glsl_symbol_table parameters;
635    /* FINISHME: Figure these out dynamically. */
636    const char *const producer_stage = "vertex";
637    const char *const consumer_stage = "fragment";
638 
639    /* Find all shader outputs in the "producer" stage.
640     */
641    foreach_list(node, producer->ir) {
642       ir_variable *const var = ((ir_instruction *) node)->as_variable();
643 
644       /* FINISHME: For geometry shaders, this should also look for inout
645        * FINISHME: variables.
646        */
647       if ((var == NULL) || (var->mode != ir_var_out))
648 	 continue;
649 
650       parameters.add_variable(var);
651    }
652 
653 
654    /* Find all shader inputs in the "consumer" stage.  Any variables that have
655     * matching outputs already in the symbol table must have the same type and
656     * qualifiers.
657     */
658    foreach_list(node, consumer->ir) {
659       ir_variable *const input = ((ir_instruction *) node)->as_variable();
660 
661       /* FINISHME: For geometry shaders, this should also look for inout
662        * FINISHME: variables.
663        */
664       if ((input == NULL) || (input->mode != ir_var_in))
665 	 continue;
666 
667       ir_variable *const output = parameters.get_variable(input->name);
668       if (output != NULL) {
669 	 /* Check that the types match between stages.
670 	  */
671 	 if (input->type != output->type) {
672 	    /* There is a bit of a special case for gl_TexCoord.  This
673 	     * built-in is unsized by default.  Applications that variable
674 	     * access it must redeclare it with a size.  There is some
675 	     * language in the GLSL spec that implies the fragment shader
676 	     * and vertex shader do not have to agree on this size.  Other
677 	     * driver behave this way, and one or two applications seem to
678 	     * rely on it.
679 	     *
680 	     * Neither declaration needs to be modified here because the array
681 	     * sizes are fixed later when update_array_sizes is called.
682 	     *
683 	     * From page 48 (page 54 of the PDF) of the GLSL 1.10 spec:
684 	     *
685 	     *     "Unlike user-defined varying variables, the built-in
686 	     *     varying variables don't have a strict one-to-one
687 	     *     correspondence between the vertex language and the
688 	     *     fragment language."
689 	     */
690 	    if (!output->type->is_array()
691 		|| (strncmp("gl_", output->name, 3) != 0)) {
692 	       linker_error(prog,
693 			    "%s shader output `%s' declared as type `%s', "
694 			    "but %s shader input declared as type `%s'\n",
695 			    producer_stage, output->name,
696 			    output->type->name,
697 			    consumer_stage, input->type->name);
698 	       return false;
699 	    }
700 	 }
701 
702 	 /* Check that all of the qualifiers match between stages.
703 	  */
704 	 if (input->centroid != output->centroid) {
705 	    linker_error(prog,
706 			 "%s shader output `%s' %s centroid qualifier, "
707 			 "but %s shader input %s centroid qualifier\n",
708 			 producer_stage,
709 			 output->name,
710 			 (output->centroid) ? "has" : "lacks",
711 			 consumer_stage,
712 			 (input->centroid) ? "has" : "lacks");
713 	    return false;
714 	 }
715 
716 	 if (input->invariant != output->invariant) {
717 	    linker_error(prog,
718 			 "%s shader output `%s' %s invariant qualifier, "
719 			 "but %s shader input %s invariant qualifier\n",
720 			 producer_stage,
721 			 output->name,
722 			 (output->invariant) ? "has" : "lacks",
723 			 consumer_stage,
724 			 (input->invariant) ? "has" : "lacks");
725 	    return false;
726 	 }
727 
728 	 if (input->interpolation != output->interpolation) {
729 	    linker_error(prog,
730 			 "%s shader output `%s' specifies %s "
731 			 "interpolation qualifier, "
732 			 "but %s shader input specifies %s "
733 			 "interpolation qualifier\n",
734 			 producer_stage,
735 			 output->name,
736 			 output->interpolation_string(),
737 			 consumer_stage,
738 			 input->interpolation_string());
739 	    return false;
740 	 }
741       }
742    }
743 
744    return true;
745 }
746 
747 
748 /**
749  * Populates a shaders symbol table with all global declarations
750  */
751 static void
populate_symbol_table(gl_shader * sh)752 populate_symbol_table(gl_shader *sh)
753 {
754    sh->symbols = new(sh) glsl_symbol_table;
755 
756    foreach_list(node, sh->ir) {
757       ir_instruction *const inst = (ir_instruction *) node;
758       ir_variable *var;
759       ir_function *func;
760 
761       if ((func = inst->as_function()) != NULL) {
762 	 sh->symbols->add_function(func);
763       } else if ((var = inst->as_variable()) != NULL) {
764 	 sh->symbols->add_variable(var);
765       }
766    }
767 }
768 
769 
770 /**
771  * Remap variables referenced in an instruction tree
772  *
773  * This is used when instruction trees are cloned from one shader and placed in
774  * another.  These trees will contain references to \c ir_variable nodes that
775  * do not exist in the target shader.  This function finds these \c ir_variable
776  * references and replaces the references with matching variables in the target
777  * shader.
778  *
779  * If there is no matching variable in the target shader, a clone of the
780  * \c ir_variable is made and added to the target shader.  The new variable is
781  * added to \b both the instruction stream and the symbol table.
782  *
783  * \param inst         IR tree that is to be processed.
784  * \param symbols      Symbol table containing global scope symbols in the
785  *                     linked shader.
786  * \param instructions Instruction stream where new variable declarations
787  *                     should be added.
788  */
789 void
remap_variables(ir_instruction * inst,struct gl_shader * target,hash_table * temps)790 remap_variables(ir_instruction *inst, struct gl_shader *target,
791 		hash_table *temps)
792 {
793    class remap_visitor : public ir_hierarchical_visitor {
794    public:
795 	 remap_visitor(struct gl_shader *target,
796 		    hash_table *temps)
797       {
798 	 this->target = target;
799 	 this->symbols = target->symbols;
800 	 this->instructions = target->ir;
801 	 this->temps = temps;
802       }
803 
804       virtual ir_visitor_status visit(ir_dereference_variable *ir)
805       {
806 	 if (ir->var->mode == ir_var_temporary) {
807 	    ir_variable *var = (ir_variable *) hash_table_find(temps, ir->var);
808 
809 	    assert(var != NULL);
810 	    ir->var = var;
811 	    return visit_continue;
812 	 }
813 
814 	 ir_variable *const existing =
815 	    this->symbols->get_variable(ir->var->name);
816 	 if (existing != NULL)
817 	    ir->var = existing;
818 	 else {
819 	    ir_variable *copy = ir->var->clone(this->target, NULL);
820 
821 	    this->symbols->add_variable(copy);
822 	    this->instructions->push_head(copy);
823 	    ir->var = copy;
824 	 }
825 
826 	 return visit_continue;
827       }
828 
829    private:
830       struct gl_shader *target;
831       glsl_symbol_table *symbols;
832       exec_list *instructions;
833       hash_table *temps;
834    };
835 
836    remap_visitor v(target, temps);
837 
838    inst->accept(&v);
839 }
840 
841 
842 /**
843  * Move non-declarations from one instruction stream to another
844  *
845  * The intended usage pattern of this function is to pass the pointer to the
846  * head sentinel of a list (i.e., a pointer to the list cast to an \c exec_node
847  * pointer) for \c last and \c false for \c make_copies on the first
848  * call.  Successive calls pass the return value of the previous call for
849  * \c last and \c true for \c make_copies.
850  *
851  * \param instructions Source instruction stream
852  * \param last         Instruction after which new instructions should be
853  *                     inserted in the target instruction stream
854  * \param make_copies  Flag selecting whether instructions in \c instructions
855  *                     should be copied (via \c ir_instruction::clone) into the
856  *                     target list or moved.
857  *
858  * \return
859  * The new "last" instruction in the target instruction stream.  This pointer
860  * is suitable for use as the \c last parameter of a later call to this
861  * function.
862  */
863 exec_node *
move_non_declarations(exec_list * instructions,exec_node * last,bool make_copies,gl_shader * target)864 move_non_declarations(exec_list *instructions, exec_node *last,
865 		      bool make_copies, gl_shader *target)
866 {
867    hash_table *temps = NULL;
868 
869    if (make_copies)
870       temps = hash_table_ctor(0, hash_table_pointer_hash,
871 			      hash_table_pointer_compare);
872 
873    foreach_list_safe(node, instructions) {
874       ir_instruction *inst = (ir_instruction *) node;
875 
876       if (inst->as_function())
877 	 continue;
878 
879       ir_variable *var = inst->as_variable();
880       if ((var != NULL) && (var->mode != ir_var_temporary))
881 	 continue;
882 
883       assert(inst->as_assignment()
884              || inst->as_call()
885              || inst->as_if() /* for initializers with the ?: operator */
886 	     || ((var != NULL) && (var->mode == ir_var_temporary)));
887 
888       if (make_copies) {
889 	 inst = inst->clone(target, NULL);
890 
891 	 if (var != NULL)
892 	    hash_table_insert(temps, inst, var);
893 	 else
894 	    remap_variables(inst, target, temps);
895       } else {
896 	 inst->remove();
897       }
898 
899       last->insert_after(inst);
900       last = inst;
901    }
902 
903    if (make_copies)
904       hash_table_dtor(temps);
905 
906    return last;
907 }
908 
909 /**
910  * Get the function signature for main from a shader
911  */
912 static ir_function_signature *
get_main_function_signature(gl_shader * sh)913 get_main_function_signature(gl_shader *sh)
914 {
915    ir_function *const f = sh->symbols->get_function("main");
916    if (f != NULL) {
917       exec_list void_parameters;
918 
919       /* Look for the 'void main()' signature and ensure that it's defined.
920        * This keeps the linker from accidentally pick a shader that just
921        * contains a prototype for main.
922        *
923        * We don't have to check for multiple definitions of main (in multiple
924        * shaders) because that would have already been caught above.
925        */
926       ir_function_signature *sig = f->matching_signature(&void_parameters);
927       if ((sig != NULL) && sig->is_defined) {
928 	 return sig;
929       }
930    }
931 
932    return NULL;
933 }
934 
935 
936 /**
937  * This class is only used in link_intrastage_shaders() below but declaring
938  * it inside that function leads to compiler warnings with some versions of
939  * gcc.
940  */
941 class array_sizing_visitor : public ir_hierarchical_visitor {
942 public:
visit(ir_variable * var)943    virtual ir_visitor_status visit(ir_variable *var)
944    {
945       if (var->type->is_array() && (var->type->length == 0)) {
946          const glsl_type *type =
947             glsl_type::get_array_instance(var->type->fields.array,
948                                           var->max_array_access + 1);
949          assert(type != NULL);
950          var->type = type;
951       }
952       return visit_continue;
953    }
954 };
955 
956 /**
957  * Combine a group of shaders for a single stage to generate a linked shader
958  *
959  * \note
960  * If this function is supplied a single shader, it is cloned, and the new
961  * shader is returned.
962  */
963 static struct gl_shader *
link_intrastage_shaders(void * mem_ctx,struct gl_context * ctx,struct gl_shader_program * prog,struct gl_shader ** shader_list,unsigned num_shaders)964 link_intrastage_shaders(void *mem_ctx,
965 			struct gl_context *ctx,
966 			struct gl_shader_program *prog,
967 			struct gl_shader **shader_list,
968 			unsigned num_shaders)
969 {
970    struct gl_uniform_block *uniform_blocks = NULL;
971    unsigned num_uniform_blocks = 0;
972 
973    /* Check that global variables defined in multiple shaders are consistent.
974     */
975    if (!cross_validate_globals(prog, shader_list, num_shaders, false))
976       return NULL;
977 
978    /* Check that uniform blocks between shaders for a stage agree. */
979    for (unsigned i = 0; i < num_shaders; i++) {
980       struct gl_shader *sh = shader_list[i];
981 
982       for (unsigned j = 0; j < shader_list[i]->NumUniformBlocks; j++) {
983 	 link_assign_uniform_block_offsets(shader_list[i]);
984 
985 	 int index = link_cross_validate_uniform_block(mem_ctx,
986 						       &uniform_blocks,
987 						       &num_uniform_blocks,
988 						       &sh->UniformBlocks[j]);
989 	 if (index == -1) {
990 	    linker_error(prog, "uniform block `%s' has mismatching definitions",
991 			 sh->UniformBlocks[j].Name);
992 	    return NULL;
993 	 }
994       }
995    }
996 
997    /* Check that there is only a single definition of each function signature
998     * across all shaders.
999     */
1000    for (unsigned i = 0; i < (num_shaders - 1); i++) {
1001       foreach_list(node, shader_list[i]->ir) {
1002 	 ir_function *const f = ((ir_instruction *) node)->as_function();
1003 
1004 	 if (f == NULL)
1005 	    continue;
1006 
1007 	 for (unsigned j = i + 1; j < num_shaders; j++) {
1008 	    ir_function *const other =
1009 	       shader_list[j]->symbols->get_function(f->name);
1010 
1011 	    /* If the other shader has no function (and therefore no function
1012 	     * signatures) with the same name, skip to the next shader.
1013 	     */
1014 	    if (other == NULL)
1015 	       continue;
1016 
1017 	    foreach_iter (exec_list_iterator, iter, *f) {
1018 	       ir_function_signature *sig =
1019 		  (ir_function_signature *) iter.get();
1020 
1021 	       if (!sig->is_defined || sig->is_builtin)
1022 		  continue;
1023 
1024 	       ir_function_signature *other_sig =
1025 		  other->exact_matching_signature(& sig->parameters);
1026 
1027 	       if ((other_sig != NULL) && other_sig->is_defined
1028 		   && !other_sig->is_builtin) {
1029 		  linker_error(prog, "function `%s' is multiply defined",
1030 			       f->name);
1031 		  return NULL;
1032 	       }
1033 	    }
1034 	 }
1035       }
1036    }
1037 
1038    /* Find the shader that defines main, and make a clone of it.
1039     *
1040     * Starting with the clone, search for undefined references.  If one is
1041     * found, find the shader that defines it.  Clone the reference and add
1042     * it to the shader.  Repeat until there are no undefined references or
1043     * until a reference cannot be resolved.
1044     */
1045    gl_shader *main = NULL;
1046    for (unsigned i = 0; i < num_shaders; i++) {
1047       if (get_main_function_signature(shader_list[i]) != NULL) {
1048 	 main = shader_list[i];
1049 	 break;
1050       }
1051    }
1052 
1053    if (main == NULL) {
1054       linker_error(prog, "%s shader lacks `main'\n",
1055 		   (shader_list[0]->Type == GL_VERTEX_SHADER)
1056 		   ? "vertex" : "fragment");
1057       return NULL;
1058    }
1059 
1060    gl_shader *linked = ctx->Driver.NewShader(NULL, 0, main->Type);
1061    linked->ir = new(linked) exec_list;
1062    clone_ir_list(mem_ctx, linked->ir, main->ir);
1063 
1064    linked->UniformBlocks = uniform_blocks;
1065    linked->NumUniformBlocks = num_uniform_blocks;
1066    ralloc_steal(linked, linked->UniformBlocks);
1067 
1068    populate_symbol_table(linked);
1069 
1070    /* The a pointer to the main function in the final linked shader (i.e., the
1071     * copy of the original shader that contained the main function).
1072     */
1073    ir_function_signature *const main_sig = get_main_function_signature(linked);
1074 
1075    /* Move any instructions other than variable declarations or function
1076     * declarations into main.
1077     */
1078    exec_node *insertion_point =
1079       move_non_declarations(linked->ir, (exec_node *) &main_sig->body, false,
1080 			    linked);
1081 
1082    for (unsigned i = 0; i < num_shaders; i++) {
1083       if (shader_list[i] == main)
1084 	 continue;
1085 
1086       insertion_point = move_non_declarations(shader_list[i]->ir,
1087 					      insertion_point, true, linked);
1088    }
1089 
1090    /* Resolve initializers for global variables in the linked shader.
1091     */
1092    unsigned num_linking_shaders = num_shaders;
1093    for (unsigned i = 0; i < num_shaders; i++)
1094       num_linking_shaders += shader_list[i]->num_builtins_to_link;
1095 
1096    gl_shader **linking_shaders =
1097       (gl_shader **) calloc(num_linking_shaders, sizeof(gl_shader *));
1098 
1099    memcpy(linking_shaders, shader_list,
1100 	  sizeof(linking_shaders[0]) * num_shaders);
1101 
1102    unsigned idx = num_shaders;
1103    for (unsigned i = 0; i < num_shaders; i++) {
1104       memcpy(&linking_shaders[idx], shader_list[i]->builtins_to_link,
1105 	     sizeof(linking_shaders[0]) * shader_list[i]->num_builtins_to_link);
1106       idx += shader_list[i]->num_builtins_to_link;
1107    }
1108 
1109    assert(idx == num_linking_shaders);
1110 
1111    if (!link_function_calls(prog, linked, linking_shaders,
1112 			    num_linking_shaders)) {
1113       ctx->Driver.DeleteShader(ctx, linked);
1114       linked = NULL;
1115    }
1116 
1117    free(linking_shaders);
1118 
1119 #ifdef DEBUG
1120    /* At this point linked should contain all of the linked IR, so
1121     * validate it to make sure nothing went wrong.
1122     */
1123    if (linked)
1124       validate_ir_tree(linked->ir);
1125 #endif
1126 
1127    /* Make a pass over all variable declarations to ensure that arrays with
1128     * unspecified sizes have a size specified.  The size is inferred from the
1129     * max_array_access field.
1130     */
1131    if (linked != NULL) {
1132       array_sizing_visitor v;
1133 
1134       v.run(linked->ir);
1135    }
1136 
1137    return linked;
1138 }
1139 
1140 /**
1141  * Update the sizes of linked shader uniform arrays to the maximum
1142  * array index used.
1143  *
1144  * From page 81 (page 95 of the PDF) of the OpenGL 2.1 spec:
1145  *
1146  *     If one or more elements of an array are active,
1147  *     GetActiveUniform will return the name of the array in name,
1148  *     subject to the restrictions listed above. The type of the array
1149  *     is returned in type. The size parameter contains the highest
1150  *     array element index used, plus one. The compiler or linker
1151  *     determines the highest index used.  There will be only one
1152  *     active uniform reported by the GL per uniform array.
1153 
1154  */
1155 static void
update_array_sizes(struct gl_shader_program * prog)1156 update_array_sizes(struct gl_shader_program *prog)
1157 {
1158    for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) {
1159 	 if (prog->_LinkedShaders[i] == NULL)
1160 	    continue;
1161 
1162       foreach_list(node, prog->_LinkedShaders[i]->ir) {
1163 	 ir_variable *const var = ((ir_instruction *) node)->as_variable();
1164 
1165 	 if ((var == NULL) || (var->mode != ir_var_uniform &&
1166 			       var->mode != ir_var_in &&
1167 			       var->mode != ir_var_out) ||
1168 	     !var->type->is_array())
1169 	    continue;
1170 
1171 	 /* GL_ARB_uniform_buffer_object says that std140 uniforms
1172 	  * will not be eliminated.  Since we always do std140, just
1173 	  * don't resize arrays in UBOs.
1174 	  */
1175 	 if (var->uniform_block != -1)
1176 	    continue;
1177 
1178 	 unsigned int size = var->max_array_access;
1179 	 for (unsigned j = 0; j < MESA_SHADER_TYPES; j++) {
1180 	       if (prog->_LinkedShaders[j] == NULL)
1181 		  continue;
1182 
1183 	    foreach_list(node2, prog->_LinkedShaders[j]->ir) {
1184 	       ir_variable *other_var = ((ir_instruction *) node2)->as_variable();
1185 	       if (!other_var)
1186 		  continue;
1187 
1188 	       if (strcmp(var->name, other_var->name) == 0 &&
1189 		   other_var->max_array_access > size) {
1190 		  size = other_var->max_array_access;
1191 	       }
1192 	    }
1193 	 }
1194 
1195 	 if (size + 1 != var->type->fields.array->length) {
1196 	    /* If this is a built-in uniform (i.e., it's backed by some
1197 	     * fixed-function state), adjust the number of state slots to
1198 	     * match the new array size.  The number of slots per array entry
1199 	     * is not known.  It seems safe to assume that the total number of
1200 	     * slots is an integer multiple of the number of array elements.
1201 	     * Determine the number of slots per array element by dividing by
1202 	     * the old (total) size.
1203 	     */
1204 	    if (var->num_state_slots > 0) {
1205 	       var->num_state_slots = (size + 1)
1206 		  * (var->num_state_slots / var->type->length);
1207 	    }
1208 
1209 	    var->type = glsl_type::get_array_instance(var->type->fields.array,
1210 						      size + 1);
1211 	    /* FINISHME: We should update the types of array
1212 	     * dereferences of this variable now.
1213 	     */
1214 	 }
1215       }
1216    }
1217 }
1218 
1219 /**
1220  * Find a contiguous set of available bits in a bitmask.
1221  *
1222  * \param used_mask     Bits representing used (1) and unused (0) locations
1223  * \param needed_count  Number of contiguous bits needed.
1224  *
1225  * \return
1226  * Base location of the available bits on success or -1 on failure.
1227  */
1228 int
find_available_slots(unsigned used_mask,unsigned needed_count)1229 find_available_slots(unsigned used_mask, unsigned needed_count)
1230 {
1231    unsigned needed_mask = (1 << needed_count) - 1;
1232    const int max_bit_to_test = (8 * sizeof(used_mask)) - needed_count;
1233 
1234    /* The comparison to 32 is redundant, but without it GCC emits "warning:
1235     * cannot optimize possibly infinite loops" for the loop below.
1236     */
1237    if ((needed_count == 0) || (max_bit_to_test < 0) || (max_bit_to_test > 32))
1238       return -1;
1239 
1240    for (int i = 0; i <= max_bit_to_test; i++) {
1241       if ((needed_mask & ~used_mask) == needed_mask)
1242 	 return i;
1243 
1244       needed_mask <<= 1;
1245    }
1246 
1247    return -1;
1248 }
1249 
1250 
1251 /**
1252  * Assign locations for either VS inputs for FS outputs
1253  *
1254  * \param prog          Shader program whose variables need locations assigned
1255  * \param target_index  Selector for the program target to receive location
1256  *                      assignmnets.  Must be either \c MESA_SHADER_VERTEX or
1257  *                      \c MESA_SHADER_FRAGMENT.
1258  * \param max_index     Maximum number of generic locations.  This corresponds
1259  *                      to either the maximum number of draw buffers or the
1260  *                      maximum number of generic attributes.
1261  *
1262  * \return
1263  * If locations are successfully assigned, true is returned.  Otherwise an
1264  * error is emitted to the shader link log and false is returned.
1265  */
1266 bool
assign_attribute_or_color_locations(gl_shader_program * prog,unsigned target_index,unsigned max_index)1267 assign_attribute_or_color_locations(gl_shader_program *prog,
1268 				    unsigned target_index,
1269 				    unsigned max_index)
1270 {
1271    /* Mark invalid locations as being used.
1272     */
1273    unsigned used_locations = (max_index >= 32)
1274       ? ~0 : ~((1 << max_index) - 1);
1275 
1276    assert((target_index == MESA_SHADER_VERTEX)
1277 	  || (target_index == MESA_SHADER_FRAGMENT));
1278 
1279    gl_shader *const sh = prog->_LinkedShaders[target_index];
1280    if (sh == NULL)
1281       return true;
1282 
1283    /* Operate in a total of four passes.
1284     *
1285     * 1. Invalidate the location assignments for all vertex shader inputs.
1286     *
1287     * 2. Assign locations for inputs that have user-defined (via
1288     *    glBindVertexAttribLocation) locations and outputs that have
1289     *    user-defined locations (via glBindFragDataLocation).
1290     *
1291     * 3. Sort the attributes without assigned locations by number of slots
1292     *    required in decreasing order.  Fragmentation caused by attribute
1293     *    locations assigned by the application may prevent large attributes
1294     *    from having enough contiguous space.
1295     *
1296     * 4. Assign locations to any inputs without assigned locations.
1297     */
1298 
1299    const int generic_base = (target_index == MESA_SHADER_VERTEX)
1300       ? (int) VERT_ATTRIB_GENERIC0 : (int) FRAG_RESULT_DATA0;
1301 
1302    const enum ir_variable_mode direction =
1303       (target_index == MESA_SHADER_VERTEX) ? ir_var_in : ir_var_out;
1304 
1305 
1306    link_invalidate_variable_locations(sh, direction, generic_base);
1307 
1308    /* Temporary storage for the set of attributes that need locations assigned.
1309     */
1310    struct temp_attr {
1311       unsigned slots;
1312       ir_variable *var;
1313 
1314       /* Used below in the call to qsort. */
1315       static int compare(const void *a, const void *b)
1316       {
1317 	 const temp_attr *const l = (const temp_attr *) a;
1318 	 const temp_attr *const r = (const temp_attr *) b;
1319 
1320 	 /* Reversed because we want a descending order sort below. */
1321 	 return r->slots - l->slots;
1322       }
1323    } to_assign[16];
1324 
1325    unsigned num_attr = 0;
1326 
1327    foreach_list(node, sh->ir) {
1328       ir_variable *const var = ((ir_instruction *) node)->as_variable();
1329 
1330       if ((var == NULL) || (var->mode != (unsigned) direction))
1331 	 continue;
1332 
1333       if (var->explicit_location) {
1334 	 if ((var->location >= (int)(max_index + generic_base))
1335 	     || (var->location < 0)) {
1336 	    linker_error(prog,
1337 			 "invalid explicit location %d specified for `%s'\n",
1338 			 (var->location < 0)
1339 			 ? var->location : var->location - generic_base,
1340 			 var->name);
1341 	    return false;
1342 	 }
1343       } else if (target_index == MESA_SHADER_VERTEX) {
1344 	 unsigned binding;
1345 
1346 	 if (prog->AttributeBindings->get(binding, var->name)) {
1347 	    assert(binding >= VERT_ATTRIB_GENERIC0);
1348 	    var->location = binding;
1349 	 }
1350       } else if (target_index == MESA_SHADER_FRAGMENT) {
1351 	 unsigned binding;
1352 	 unsigned index;
1353 
1354 	 if (prog->FragDataBindings->get(binding, var->name)) {
1355 	    assert(binding >= FRAG_RESULT_DATA0);
1356 	    var->location = binding;
1357 
1358 	    if (prog->FragDataIndexBindings->get(index, var->name)) {
1359 	       var->index = index;
1360 	    }
1361 	 }
1362       }
1363 
1364       /* If the variable is not a built-in and has a location statically
1365        * assigned in the shader (presumably via a layout qualifier), make sure
1366        * that it doesn't collide with other assigned locations.  Otherwise,
1367        * add it to the list of variables that need linker-assigned locations.
1368        */
1369       const unsigned slots = count_attribute_slots(var->type);
1370       if (var->location != -1) {
1371 	 if (var->location >= generic_base && var->index < 1) {
1372 	    /* From page 61 of the OpenGL 4.0 spec:
1373 	     *
1374 	     *     "LinkProgram will fail if the attribute bindings assigned
1375 	     *     by BindAttribLocation do not leave not enough space to
1376 	     *     assign a location for an active matrix attribute or an
1377 	     *     active attribute array, both of which require multiple
1378 	     *     contiguous generic attributes."
1379 	     *
1380 	     * Previous versions of the spec contain similar language but omit
1381 	     * the bit about attribute arrays.
1382 	     *
1383 	     * Page 61 of the OpenGL 4.0 spec also says:
1384 	     *
1385 	     *     "It is possible for an application to bind more than one
1386 	     *     attribute name to the same location. This is referred to as
1387 	     *     aliasing. This will only work if only one of the aliased
1388 	     *     attributes is active in the executable program, or if no
1389 	     *     path through the shader consumes more than one attribute of
1390 	     *     a set of attributes aliased to the same location. A link
1391 	     *     error can occur if the linker determines that every path
1392 	     *     through the shader consumes multiple aliased attributes,
1393 	     *     but implementations are not required to generate an error
1394 	     *     in this case."
1395 	     *
1396 	     * These two paragraphs are either somewhat contradictory, or I
1397 	     * don't fully understand one or both of them.
1398 	     */
1399 	    /* FINISHME: The code as currently written does not support
1400 	     * FINISHME: attribute location aliasing (see comment above).
1401 	     */
1402 	    /* Mask representing the contiguous slots that will be used by
1403 	     * this attribute.
1404 	     */
1405 	    const unsigned attr = var->location - generic_base;
1406 	    const unsigned use_mask = (1 << slots) - 1;
1407 
1408 	    /* Generate a link error if the set of bits requested for this
1409 	     * attribute overlaps any previously allocated bits.
1410 	     */
1411 	    if ((~(use_mask << attr) & used_locations) != used_locations) {
1412 	       const char *const string = (target_index == MESA_SHADER_VERTEX)
1413 		  ? "vertex shader input" : "fragment shader output";
1414 	       linker_error(prog,
1415 			    "insufficient contiguous locations "
1416 			    "available for %s `%s' %d %d %d", string,
1417 			    var->name, used_locations, use_mask, attr);
1418 	       return false;
1419 	    }
1420 
1421 	    used_locations |= (use_mask << attr);
1422 	 }
1423 
1424 	 continue;
1425       }
1426 
1427       to_assign[num_attr].slots = slots;
1428       to_assign[num_attr].var = var;
1429       num_attr++;
1430    }
1431 
1432    /* If all of the attributes were assigned locations by the application (or
1433     * are built-in attributes with fixed locations), return early.  This should
1434     * be the common case.
1435     */
1436    if (num_attr == 0)
1437       return true;
1438 
1439    qsort(to_assign, num_attr, sizeof(to_assign[0]), temp_attr::compare);
1440 
1441    if (target_index == MESA_SHADER_VERTEX) {
1442       /* VERT_ATTRIB_GENERIC0 is a pseudo-alias for VERT_ATTRIB_POS.  It can
1443        * only be explicitly assigned by via glBindAttribLocation.  Mark it as
1444        * reserved to prevent it from being automatically allocated below.
1445        */
1446       find_deref_visitor find("gl_Vertex");
1447       find.run(sh->ir);
1448       if (find.variable_found())
1449 	 used_locations |= (1 << 0);
1450    }
1451 
1452    for (unsigned i = 0; i < num_attr; i++) {
1453       /* Mask representing the contiguous slots that will be used by this
1454        * attribute.
1455        */
1456       const unsigned use_mask = (1 << to_assign[i].slots) - 1;
1457 
1458       int location = find_available_slots(used_locations, to_assign[i].slots);
1459 
1460       if (location < 0) {
1461 	 const char *const string = (target_index == MESA_SHADER_VERTEX)
1462 	    ? "vertex shader input" : "fragment shader output";
1463 
1464 	 linker_error(prog,
1465 		      "insufficient contiguous locations "
1466 		      "available for %s `%s'",
1467 		      string, to_assign[i].var->name);
1468 	 return false;
1469       }
1470 
1471       to_assign[i].var->location = generic_base + location;
1472       used_locations |= (use_mask << location);
1473    }
1474 
1475    return true;
1476 }
1477 
1478 
1479 /**
1480  * Demote shader inputs and outputs that are not used in other stages
1481  */
1482 void
demote_shader_inputs_and_outputs(gl_shader * sh,enum ir_variable_mode mode)1483 demote_shader_inputs_and_outputs(gl_shader *sh, enum ir_variable_mode mode)
1484 {
1485    foreach_list(node, sh->ir) {
1486       ir_variable *const var = ((ir_instruction *) node)->as_variable();
1487 
1488       if ((var == NULL) || (var->mode != int(mode)))
1489 	 continue;
1490 
1491       /* A shader 'in' or 'out' variable is only really an input or output if
1492        * its value is used by other shader stages.  This will cause the variable
1493        * to have a location assigned.
1494        */
1495       if (var->location == -1) {
1496 	 var->mode = ir_var_auto;
1497       }
1498    }
1499 }
1500 
1501 
1502 /**
1503  * Data structure tracking information about a transform feedback declaration
1504  * during linking.
1505  */
1506 class tfeedback_decl
1507 {
1508 public:
1509    bool init(struct gl_context *ctx, struct gl_shader_program *prog,
1510              const void *mem_ctx, const char *input);
1511    static bool is_same(const tfeedback_decl &x, const tfeedback_decl &y);
1512    bool assign_location(struct gl_context *ctx, struct gl_shader_program *prog,
1513                         ir_variable *output_var);
1514    bool accumulate_num_outputs(struct gl_shader_program *prog, unsigned *count);
1515    bool store(struct gl_context *ctx, struct gl_shader_program *prog,
1516               struct gl_transform_feedback_info *info, unsigned buffer,
1517               const unsigned max_outputs) const;
1518 
1519    /**
1520     * True if assign_location() has been called for this object.
1521     */
is_assigned() const1522    bool is_assigned() const
1523    {
1524       return this->location != -1;
1525    }
1526 
is_next_buffer_separator() const1527    bool is_next_buffer_separator() const
1528    {
1529       return this->next_buffer_separator;
1530    }
1531 
is_varying() const1532    bool is_varying() const
1533    {
1534       return !this->next_buffer_separator && !this->skip_components;
1535    }
1536 
1537    /**
1538     * Determine whether this object refers to the variable var.
1539     */
matches_var(ir_variable * var) const1540    bool matches_var(ir_variable *var) const
1541    {
1542       if (this->is_clip_distance_mesa)
1543          return strcmp(var->name, "gl_ClipDistanceMESA") == 0;
1544       else
1545          return strcmp(var->name, this->var_name) == 0;
1546    }
1547 
1548    /**
1549     * The total number of varying components taken up by this variable.  Only
1550     * valid if is_assigned() is true.
1551     */
num_components() const1552    unsigned num_components() const
1553    {
1554       if (this->is_clip_distance_mesa)
1555          return this->size;
1556       else
1557          return this->vector_elements * this->matrix_columns * this->size;
1558    }
1559 
1560 private:
1561    /**
1562     * The name that was supplied to glTransformFeedbackVaryings.  Used for
1563     * error reporting and glGetTransformFeedbackVarying().
1564     */
1565    const char *orig_name;
1566 
1567    /**
1568     * The name of the variable, parsed from orig_name.
1569     */
1570    const char *var_name;
1571 
1572    /**
1573     * True if the declaration in orig_name represents an array.
1574     */
1575    bool is_subscripted;
1576 
1577    /**
1578     * If is_subscripted is true, the subscript that was specified in orig_name.
1579     */
1580    unsigned array_subscript;
1581 
1582    /**
1583     * True if the variable is gl_ClipDistance and the driver lowers
1584     * gl_ClipDistance to gl_ClipDistanceMESA.
1585     */
1586    bool is_clip_distance_mesa;
1587 
1588    /**
1589     * The vertex shader output location that the linker assigned for this
1590     * variable.  -1 if a location hasn't been assigned yet.
1591     */
1592    int location;
1593 
1594    /**
1595     * If location != -1, the number of vector elements in this variable, or 1
1596     * if this variable is a scalar.
1597     */
1598    unsigned vector_elements;
1599 
1600    /**
1601     * If location != -1, the number of matrix columns in this variable, or 1
1602     * if this variable is not a matrix.
1603     */
1604    unsigned matrix_columns;
1605 
1606    /** Type of the varying returned by glGetTransformFeedbackVarying() */
1607    GLenum type;
1608 
1609    /**
1610     * If location != -1, the size that should be returned by
1611     * glGetTransformFeedbackVarying().
1612     */
1613    unsigned size;
1614 
1615    /**
1616     * How many components to skip. If non-zero, this is
1617     * gl_SkipComponents{1,2,3,4} from ARB_transform_feedback3.
1618     */
1619    unsigned skip_components;
1620 
1621    /**
1622     * Whether this is gl_NextBuffer from ARB_transform_feedback3.
1623     */
1624    bool next_buffer_separator;
1625 };
1626 
1627 
1628 /**
1629  * Initialize this object based on a string that was passed to
1630  * glTransformFeedbackVaryings.  If there is a parse error, the error is
1631  * reported using linker_error(), and false is returned.
1632  */
1633 bool
init(struct gl_context * ctx,struct gl_shader_program * prog,const void * mem_ctx,const char * input)1634 tfeedback_decl::init(struct gl_context *ctx, struct gl_shader_program *prog,
1635                      const void *mem_ctx, const char *input)
1636 {
1637    /* We don't have to be pedantic about what is a valid GLSL variable name,
1638     * because any variable with an invalid name can't exist in the IR anyway.
1639     */
1640 
1641    this->location = -1;
1642    this->orig_name = input;
1643    this->is_clip_distance_mesa = false;
1644    this->skip_components = 0;
1645    this->next_buffer_separator = false;
1646 
1647    if (ctx->Extensions.ARB_transform_feedback3) {
1648       /* Parse gl_NextBuffer. */
1649       if (strcmp(input, "gl_NextBuffer") == 0) {
1650          this->next_buffer_separator = true;
1651          return true;
1652       }
1653 
1654       /* Parse gl_SkipComponents. */
1655       if (strcmp(input, "gl_SkipComponents1") == 0)
1656          this->skip_components = 1;
1657       else if (strcmp(input, "gl_SkipComponents2") == 0)
1658          this->skip_components = 2;
1659       else if (strcmp(input, "gl_SkipComponents3") == 0)
1660          this->skip_components = 3;
1661       else if (strcmp(input, "gl_SkipComponents4") == 0)
1662          this->skip_components = 4;
1663 
1664       if (this->skip_components)
1665          return true;
1666    }
1667 
1668    /* Parse a declaration. */
1669    const char *bracket = strrchr(input, '[');
1670 
1671    if (bracket) {
1672       this->var_name = ralloc_strndup(mem_ctx, input, bracket - input);
1673       if (sscanf(bracket, "[%u]", &this->array_subscript) != 1) {
1674          linker_error(prog, "Cannot parse transform feedback varying %s", input);
1675          return false;
1676       }
1677       this->is_subscripted = true;
1678    } else {
1679       this->var_name = ralloc_strdup(mem_ctx, input);
1680       this->is_subscripted = false;
1681    }
1682 
1683    /* For drivers that lower gl_ClipDistance to gl_ClipDistanceMESA, this
1684     * class must behave specially to account for the fact that gl_ClipDistance
1685     * is converted from a float[8] to a vec4[2].
1686     */
1687    if (ctx->ShaderCompilerOptions[MESA_SHADER_VERTEX].LowerClipDistance &&
1688        strcmp(this->var_name, "gl_ClipDistance") == 0) {
1689       this->is_clip_distance_mesa = true;
1690    }
1691 
1692    return true;
1693 }
1694 
1695 
1696 /**
1697  * Determine whether two tfeedback_decl objects refer to the same variable and
1698  * array index (if applicable).
1699  */
1700 bool
is_same(const tfeedback_decl & x,const tfeedback_decl & y)1701 tfeedback_decl::is_same(const tfeedback_decl &x, const tfeedback_decl &y)
1702 {
1703    assert(x.is_varying() && y.is_varying());
1704 
1705    if (strcmp(x.var_name, y.var_name) != 0)
1706       return false;
1707    if (x.is_subscripted != y.is_subscripted)
1708       return false;
1709    if (x.is_subscripted && x.array_subscript != y.array_subscript)
1710       return false;
1711    return true;
1712 }
1713 
1714 
1715 /**
1716  * Assign a location for this tfeedback_decl object based on the location
1717  * assignment in output_var.
1718  *
1719  * If an error occurs, the error is reported through linker_error() and false
1720  * is returned.
1721  */
1722 bool
assign_location(struct gl_context * ctx,struct gl_shader_program * prog,ir_variable * output_var)1723 tfeedback_decl::assign_location(struct gl_context *ctx,
1724                                 struct gl_shader_program *prog,
1725                                 ir_variable *output_var)
1726 {
1727    assert(this->is_varying());
1728 
1729    if (output_var->type->is_array()) {
1730       /* Array variable */
1731       const unsigned matrix_cols =
1732          output_var->type->fields.array->matrix_columns;
1733       unsigned actual_array_size = this->is_clip_distance_mesa ?
1734          prog->Vert.ClipDistanceArraySize : output_var->type->array_size();
1735 
1736       if (this->is_subscripted) {
1737          /* Check array bounds. */
1738          if (this->array_subscript >= actual_array_size) {
1739             linker_error(prog, "Transform feedback varying %s has index "
1740                          "%i, but the array size is %u.",
1741                          this->orig_name, this->array_subscript,
1742                          actual_array_size);
1743             return false;
1744          }
1745          if (this->is_clip_distance_mesa) {
1746             this->location =
1747                output_var->location + this->array_subscript / 4;
1748          } else {
1749             this->location =
1750                output_var->location + this->array_subscript * matrix_cols;
1751          }
1752          this->size = 1;
1753       } else {
1754          this->location = output_var->location;
1755          this->size = actual_array_size;
1756       }
1757       this->vector_elements = output_var->type->fields.array->vector_elements;
1758       this->matrix_columns = matrix_cols;
1759       if (this->is_clip_distance_mesa)
1760          this->type = GL_FLOAT;
1761       else
1762          this->type = output_var->type->fields.array->gl_type;
1763    } else {
1764       /* Regular variable (scalar, vector, or matrix) */
1765       if (this->is_subscripted) {
1766          linker_error(prog, "Transform feedback varying %s requested, "
1767                       "but %s is not an array.",
1768                       this->orig_name, this->var_name);
1769          return false;
1770       }
1771       this->location = output_var->location;
1772       this->size = 1;
1773       this->vector_elements = output_var->type->vector_elements;
1774       this->matrix_columns = output_var->type->matrix_columns;
1775       this->type = output_var->type->gl_type;
1776    }
1777 
1778    /* From GL_EXT_transform_feedback:
1779     *   A program will fail to link if:
1780     *
1781     *   * the total number of components to capture in any varying
1782     *     variable in <varyings> is greater than the constant
1783     *     MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT and the
1784     *     buffer mode is SEPARATE_ATTRIBS_EXT;
1785     */
1786    if (prog->TransformFeedback.BufferMode == GL_SEPARATE_ATTRIBS &&
1787        this->num_components() >
1788        ctx->Const.MaxTransformFeedbackSeparateComponents) {
1789       linker_error(prog, "Transform feedback varying %s exceeds "
1790                    "MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS.",
1791                    this->orig_name);
1792       return false;
1793    }
1794 
1795    return true;
1796 }
1797 
1798 
1799 bool
accumulate_num_outputs(struct gl_shader_program * prog,unsigned * count)1800 tfeedback_decl::accumulate_num_outputs(struct gl_shader_program *prog,
1801                                        unsigned *count)
1802 {
1803    if (!this->is_varying()) {
1804       return true;
1805    }
1806 
1807    if (!this->is_assigned()) {
1808       /* From GL_EXT_transform_feedback:
1809        *   A program will fail to link if:
1810        *
1811        *   * any variable name specified in the <varyings> array is not
1812        *     declared as an output in the geometry shader (if present) or
1813        *     the vertex shader (if no geometry shader is present);
1814        */
1815       linker_error(prog, "Transform feedback varying %s undeclared.",
1816                    this->orig_name);
1817       return false;
1818    }
1819 
1820    unsigned translated_size = this->size;
1821    if (this->is_clip_distance_mesa)
1822       translated_size = (translated_size + 3) / 4;
1823 
1824    *count += translated_size * this->matrix_columns;
1825 
1826    return true;
1827 }
1828 
1829 
1830 /**
1831  * Update gl_transform_feedback_info to reflect this tfeedback_decl.
1832  *
1833  * If an error occurs, the error is reported through linker_error() and false
1834  * is returned.
1835  */
1836 bool
store(struct gl_context * ctx,struct gl_shader_program * prog,struct gl_transform_feedback_info * info,unsigned buffer,const unsigned max_outputs) const1837 tfeedback_decl::store(struct gl_context *ctx, struct gl_shader_program *prog,
1838                       struct gl_transform_feedback_info *info,
1839                       unsigned buffer, const unsigned max_outputs) const
1840 {
1841    assert(!this->next_buffer_separator);
1842 
1843    /* Handle gl_SkipComponents. */
1844    if (this->skip_components) {
1845       info->BufferStride[buffer] += this->skip_components;
1846       return true;
1847    }
1848 
1849    /* From GL_EXT_transform_feedback:
1850     *   A program will fail to link if:
1851     *
1852     *     * the total number of components to capture is greater than
1853     *       the constant MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT
1854     *       and the buffer mode is INTERLEAVED_ATTRIBS_EXT.
1855     */
1856    if (prog->TransformFeedback.BufferMode == GL_INTERLEAVED_ATTRIBS &&
1857        info->BufferStride[buffer] + this->num_components() >
1858        ctx->Const.MaxTransformFeedbackInterleavedComponents) {
1859       linker_error(prog, "The MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS "
1860                    "limit has been exceeded.");
1861       return false;
1862    }
1863 
1864    unsigned translated_size = this->size;
1865    if (this->is_clip_distance_mesa)
1866       translated_size = (translated_size + 3) / 4;
1867    unsigned components_so_far = 0;
1868    for (unsigned index = 0; index < translated_size; ++index) {
1869       for (unsigned v = 0; v < this->matrix_columns; ++v) {
1870          unsigned num_components = this->vector_elements;
1871          assert(info->NumOutputs < max_outputs);
1872          info->Outputs[info->NumOutputs].ComponentOffset = 0;
1873          if (this->is_clip_distance_mesa) {
1874             if (this->is_subscripted) {
1875                num_components = 1;
1876                info->Outputs[info->NumOutputs].ComponentOffset =
1877                   this->array_subscript % 4;
1878             } else {
1879                num_components = MIN2(4, this->size - components_so_far);
1880             }
1881          }
1882          info->Outputs[info->NumOutputs].OutputRegister =
1883             this->location + v + index * this->matrix_columns;
1884          info->Outputs[info->NumOutputs].NumComponents = num_components;
1885          info->Outputs[info->NumOutputs].OutputBuffer = buffer;
1886          info->Outputs[info->NumOutputs].DstOffset = info->BufferStride[buffer];
1887          ++info->NumOutputs;
1888          info->BufferStride[buffer] += num_components;
1889          components_so_far += num_components;
1890       }
1891    }
1892    assert(components_so_far == this->num_components());
1893 
1894    info->Varyings[info->NumVarying].Name = ralloc_strdup(prog, this->orig_name);
1895    info->Varyings[info->NumVarying].Type = this->type;
1896    info->Varyings[info->NumVarying].Size = this->size;
1897    info->NumVarying++;
1898 
1899    return true;
1900 }
1901 
1902 
1903 /**
1904  * Parse all the transform feedback declarations that were passed to
1905  * glTransformFeedbackVaryings() and store them in tfeedback_decl objects.
1906  *
1907  * If an error occurs, the error is reported through linker_error() and false
1908  * is returned.
1909  */
1910 static bool
parse_tfeedback_decls(struct gl_context * ctx,struct gl_shader_program * prog,const void * mem_ctx,unsigned num_names,char ** varying_names,tfeedback_decl * decls)1911 parse_tfeedback_decls(struct gl_context *ctx, struct gl_shader_program *prog,
1912                       const void *mem_ctx, unsigned num_names,
1913                       char **varying_names, tfeedback_decl *decls)
1914 {
1915    for (unsigned i = 0; i < num_names; ++i) {
1916       if (!decls[i].init(ctx, prog, mem_ctx, varying_names[i]))
1917          return false;
1918 
1919       if (!decls[i].is_varying())
1920          continue;
1921 
1922       /* From GL_EXT_transform_feedback:
1923        *   A program will fail to link if:
1924        *
1925        *   * any two entries in the <varyings> array specify the same varying
1926        *     variable;
1927        *
1928        * We interpret this to mean "any two entries in the <varyings> array
1929        * specify the same varying variable and array index", since transform
1930        * feedback of arrays would be useless otherwise.
1931        */
1932       for (unsigned j = 0; j < i; ++j) {
1933          if (!decls[j].is_varying())
1934             continue;
1935 
1936          if (tfeedback_decl::is_same(decls[i], decls[j])) {
1937             linker_error(prog, "Transform feedback varying %s specified "
1938                          "more than once.", varying_names[i]);
1939             return false;
1940          }
1941       }
1942    }
1943    return true;
1944 }
1945 
1946 
1947 /**
1948  * Assign a location for a variable that is produced in one pipeline stage
1949  * (the "producer") and consumed in the next stage (the "consumer").
1950  *
1951  * \param input_var is the input variable declaration in the consumer.
1952  *
1953  * \param output_var is the output variable declaration in the producer.
1954  *
1955  * \param input_index is the counter that keeps track of assigned input
1956  *        locations in the consumer.
1957  *
1958  * \param output_index is the counter that keeps track of assigned output
1959  *        locations in the producer.
1960  *
1961  * It is permissible for \c input_var to be NULL (this happens if a variable
1962  * is output by the producer and consumed by transform feedback, but not
1963  * consumed by the consumer).
1964  *
1965  * If the variable has already been assigned a location, this function has no
1966  * effect.
1967  */
1968 void
assign_varying_location(ir_variable * input_var,ir_variable * output_var,unsigned * input_index,unsigned * output_index)1969 assign_varying_location(ir_variable *input_var, ir_variable *output_var,
1970                         unsigned *input_index, unsigned *output_index)
1971 {
1972    if (output_var->location != -1) {
1973       /* Location already assigned. */
1974       return;
1975    }
1976 
1977    if (input_var) {
1978       assert(input_var->location == -1);
1979       input_var->location = *input_index;
1980    }
1981 
1982    output_var->location = *output_index;
1983 
1984    /* FINISHME: Support for "varying" records in GLSL 1.50. */
1985    assert(!output_var->type->is_record());
1986 
1987    if (output_var->type->is_array()) {
1988       const unsigned slots = output_var->type->length
1989          * output_var->type->fields.array->matrix_columns;
1990 
1991       *output_index += slots;
1992       *input_index += slots;
1993    } else {
1994       const unsigned slots = output_var->type->matrix_columns;
1995 
1996       *output_index += slots;
1997       *input_index += slots;
1998    }
1999 }
2000 
2001 
2002 /**
2003  * Is the given variable a varying variable to be counted against the
2004  * limit in ctx->Const.MaxVarying?
2005  * This includes variables such as texcoords, colors and generic
2006  * varyings, but excludes variables such as gl_FrontFacing and gl_FragCoord.
2007  */
2008 static bool
is_varying_var(GLenum shaderType,const ir_variable * var)2009 is_varying_var(GLenum shaderType, const ir_variable *var)
2010 {
2011    /* Only fragment shaders will take a varying variable as an input */
2012    if (shaderType == GL_FRAGMENT_SHADER &&
2013        var->mode == ir_var_in &&
2014        var->explicit_location) {
2015       switch (var->location) {
2016       case FRAG_ATTRIB_WPOS:
2017       case FRAG_ATTRIB_FACE:
2018       case FRAG_ATTRIB_PNTC:
2019          return false;
2020       default:
2021          return true;
2022       }
2023    }
2024    return false;
2025 }
2026 
2027 
2028 /**
2029  * Assign locations for all variables that are produced in one pipeline stage
2030  * (the "producer") and consumed in the next stage (the "consumer").
2031  *
2032  * Variables produced by the producer may also be consumed by transform
2033  * feedback.
2034  *
2035  * \param num_tfeedback_decls is the number of declarations indicating
2036  *        variables that may be consumed by transform feedback.
2037  *
2038  * \param tfeedback_decls is a pointer to an array of tfeedback_decl objects
2039  *        representing the result of parsing the strings passed to
2040  *        glTransformFeedbackVaryings().  assign_location() will be called for
2041  *        each of these objects that matches one of the outputs of the
2042  *        producer.
2043  *
2044  * When num_tfeedback_decls is nonzero, it is permissible for the consumer to
2045  * be NULL.  In this case, varying locations are assigned solely based on the
2046  * requirements of transform feedback.
2047  */
2048 bool
assign_varying_locations(struct gl_context * ctx,struct gl_shader_program * prog,gl_shader * producer,gl_shader * consumer,unsigned num_tfeedback_decls,tfeedback_decl * tfeedback_decls)2049 assign_varying_locations(struct gl_context *ctx,
2050 			 struct gl_shader_program *prog,
2051 			 gl_shader *producer, gl_shader *consumer,
2052                          unsigned num_tfeedback_decls,
2053                          tfeedback_decl *tfeedback_decls)
2054 {
2055    /* FINISHME: Set dynamically when geometry shader support is added. */
2056    unsigned output_index = VERT_RESULT_VAR0;
2057    unsigned input_index = FRAG_ATTRIB_VAR0;
2058 
2059    /* Operate in a total of three passes.
2060     *
2061     * 1. Assign locations for any matching inputs and outputs.
2062     *
2063     * 2. Mark output variables in the producer that do not have locations as
2064     *    not being outputs.  This lets the optimizer eliminate them.
2065     *
2066     * 3. Mark input variables in the consumer that do not have locations as
2067     *    not being inputs.  This lets the optimizer eliminate them.
2068     */
2069 
2070    link_invalidate_variable_locations(producer, ir_var_out, VERT_RESULT_VAR0);
2071    if (consumer)
2072       link_invalidate_variable_locations(consumer, ir_var_in, FRAG_ATTRIB_VAR0);
2073 
2074    foreach_list(node, producer->ir) {
2075       ir_variable *const output_var = ((ir_instruction *) node)->as_variable();
2076 
2077       if ((output_var == NULL) || (output_var->mode != ir_var_out))
2078 	 continue;
2079 
2080       ir_variable *input_var =
2081 	 consumer ? consumer->symbols->get_variable(output_var->name) : NULL;
2082 
2083       if (input_var && input_var->mode != ir_var_in)
2084          input_var = NULL;
2085 
2086       if (input_var) {
2087          assign_varying_location(input_var, output_var, &input_index,
2088                                  &output_index);
2089       }
2090 
2091       for (unsigned i = 0; i < num_tfeedback_decls; ++i) {
2092          if (!tfeedback_decls[i].is_varying())
2093             continue;
2094 
2095          if (!tfeedback_decls[i].is_assigned() &&
2096              tfeedback_decls[i].matches_var(output_var)) {
2097             if (output_var->location == -1) {
2098                assign_varying_location(input_var, output_var, &input_index,
2099                                        &output_index);
2100             }
2101             if (!tfeedback_decls[i].assign_location(ctx, prog, output_var))
2102                return false;
2103          }
2104       }
2105    }
2106 
2107    unsigned varying_vectors = 0;
2108 
2109    if (consumer) {
2110       foreach_list(node, consumer->ir) {
2111          ir_variable *const var = ((ir_instruction *) node)->as_variable();
2112 
2113          if ((var == NULL) || (var->mode != ir_var_in))
2114             continue;
2115 
2116          if (var->location == -1) {
2117             if (prog->Version <= 120) {
2118                /* On page 25 (page 31 of the PDF) of the GLSL 1.20 spec:
2119                 *
2120                 *     Only those varying variables used (i.e. read) in
2121                 *     the fragment shader executable must be written to
2122                 *     by the vertex shader executable; declaring
2123                 *     superfluous varying variables in a vertex shader is
2124                 *     permissible.
2125                 *
2126                 * We interpret this text as meaning that the VS must
2127                 * write the variable for the FS to read it.  See
2128                 * "glsl1-varying read but not written" in piglit.
2129                 */
2130 
2131                linker_error(prog, "fragment shader varying %s not written "
2132                             "by vertex shader\n.", var->name);
2133             }
2134 
2135             /* An 'in' variable is only really a shader input if its
2136              * value is written by the previous stage.
2137              */
2138             var->mode = ir_var_auto;
2139          } else if (is_varying_var(consumer->Type, var)) {
2140             /* The packing rules are used for vertex shader inputs are also
2141              * used for fragment shader inputs.
2142              */
2143             varying_vectors += count_attribute_slots(var->type);
2144          }
2145       }
2146    }
2147 
2148    if (ctx->API == API_OPENGLES2 || prog->Version == 100) {
2149       if (varying_vectors > ctx->Const.MaxVarying) {
2150          if (ctx->Const.GLSLSkipStrictMaxVaryingLimitCheck) {
2151             linker_warning(prog, "shader uses too many varying vectors "
2152                            "(%u > %u), but the driver will try to optimize "
2153                            "them out; this is non-portable out-of-spec "
2154                            "behavior\n",
2155                            varying_vectors, ctx->Const.MaxVarying);
2156          } else {
2157             linker_error(prog, "shader uses too many varying vectors "
2158                          "(%u > %u)\n",
2159                          varying_vectors, ctx->Const.MaxVarying);
2160             return false;
2161          }
2162       }
2163    } else {
2164       const unsigned float_components = varying_vectors * 4;
2165       if (float_components > ctx->Const.MaxVarying * 4) {
2166          if (ctx->Const.GLSLSkipStrictMaxVaryingLimitCheck) {
2167             linker_warning(prog, "shader uses too many varying components "
2168                            "(%u > %u), but the driver will try to optimize "
2169                            "them out; this is non-portable out-of-spec "
2170                            "behavior\n",
2171                            float_components, ctx->Const.MaxVarying * 4);
2172          } else {
2173             linker_error(prog, "shader uses too many varying components "
2174                          "(%u > %u)\n",
2175                          float_components, ctx->Const.MaxVarying * 4);
2176             return false;
2177          }
2178       }
2179    }
2180 
2181    return true;
2182 }
2183 
2184 
2185 /**
2186  * Store transform feedback location assignments into
2187  * prog->LinkedTransformFeedback based on the data stored in tfeedback_decls.
2188  *
2189  * If an error occurs, the error is reported through linker_error() and false
2190  * is returned.
2191  */
2192 static bool
store_tfeedback_info(struct gl_context * ctx,struct gl_shader_program * prog,unsigned num_tfeedback_decls,tfeedback_decl * tfeedback_decls)2193 store_tfeedback_info(struct gl_context *ctx, struct gl_shader_program *prog,
2194                      unsigned num_tfeedback_decls,
2195                      tfeedback_decl *tfeedback_decls)
2196 {
2197    bool separate_attribs_mode =
2198       prog->TransformFeedback.BufferMode == GL_SEPARATE_ATTRIBS;
2199 
2200    ralloc_free(prog->LinkedTransformFeedback.Varyings);
2201    ralloc_free(prog->LinkedTransformFeedback.Outputs);
2202 
2203    memset(&prog->LinkedTransformFeedback, 0,
2204           sizeof(prog->LinkedTransformFeedback));
2205 
2206    prog->LinkedTransformFeedback.Varyings =
2207       rzalloc_array(prog,
2208 		    struct gl_transform_feedback_varying_info,
2209 		    num_tfeedback_decls);
2210 
2211    unsigned num_outputs = 0;
2212    for (unsigned i = 0; i < num_tfeedback_decls; ++i)
2213       if (!tfeedback_decls[i].accumulate_num_outputs(prog, &num_outputs))
2214          return false;
2215 
2216    prog->LinkedTransformFeedback.Outputs =
2217       rzalloc_array(prog,
2218                     struct gl_transform_feedback_output,
2219                     num_outputs);
2220 
2221    unsigned num_buffers = 0;
2222 
2223    if (separate_attribs_mode) {
2224       /* GL_SEPARATE_ATTRIBS */
2225       for (unsigned i = 0; i < num_tfeedback_decls; ++i) {
2226          if (!tfeedback_decls[i].store(ctx, prog, &prog->LinkedTransformFeedback,
2227                                        num_buffers, num_outputs))
2228             return false;
2229 
2230          num_buffers++;
2231       }
2232    }
2233    else {
2234       /* GL_INVERLEAVED_ATTRIBS */
2235       for (unsigned i = 0; i < num_tfeedback_decls; ++i) {
2236          if (tfeedback_decls[i].is_next_buffer_separator()) {
2237             num_buffers++;
2238             continue;
2239          }
2240 
2241          if (!tfeedback_decls[i].store(ctx, prog,
2242                                        &prog->LinkedTransformFeedback,
2243                                        num_buffers, num_outputs))
2244             return false;
2245       }
2246       num_buffers++;
2247    }
2248 
2249    assert(prog->LinkedTransformFeedback.NumOutputs == num_outputs);
2250 
2251    prog->LinkedTransformFeedback.NumBuffers = num_buffers;
2252    return true;
2253 }
2254 
2255 /**
2256  * Store the gl_FragDepth layout in the gl_shader_program struct.
2257  */
2258 static void
store_fragdepth_layout(struct gl_shader_program * prog)2259 store_fragdepth_layout(struct gl_shader_program *prog)
2260 {
2261    if (prog->_LinkedShaders[MESA_SHADER_FRAGMENT] == NULL) {
2262       return;
2263    }
2264 
2265    struct exec_list *ir = prog->_LinkedShaders[MESA_SHADER_FRAGMENT]->ir;
2266 
2267    /* We don't look up the gl_FragDepth symbol directly because if
2268     * gl_FragDepth is not used in the shader, it's removed from the IR.
2269     * However, the symbol won't be removed from the symbol table.
2270     *
2271     * We're only interested in the cases where the variable is NOT removed
2272     * from the IR.
2273     */
2274    foreach_list(node, ir) {
2275       ir_variable *const var = ((ir_instruction *) node)->as_variable();
2276 
2277       if (var == NULL || var->mode != ir_var_out) {
2278          continue;
2279       }
2280 
2281       if (strcmp(var->name, "gl_FragDepth") == 0) {
2282          switch (var->depth_layout) {
2283          case ir_depth_layout_none:
2284             prog->FragDepthLayout = FRAG_DEPTH_LAYOUT_NONE;
2285             return;
2286          case ir_depth_layout_any:
2287             prog->FragDepthLayout = FRAG_DEPTH_LAYOUT_ANY;
2288             return;
2289          case ir_depth_layout_greater:
2290             prog->FragDepthLayout = FRAG_DEPTH_LAYOUT_GREATER;
2291             return;
2292          case ir_depth_layout_less:
2293             prog->FragDepthLayout = FRAG_DEPTH_LAYOUT_LESS;
2294             return;
2295          case ir_depth_layout_unchanged:
2296             prog->FragDepthLayout = FRAG_DEPTH_LAYOUT_UNCHANGED;
2297             return;
2298          default:
2299             assert(0);
2300             return;
2301          }
2302       }
2303    }
2304 }
2305 
2306 /**
2307  * Validate the resources used by a program versus the implementation limits
2308  */
2309 static bool
check_resources(struct gl_context * ctx,struct gl_shader_program * prog)2310 check_resources(struct gl_context *ctx, struct gl_shader_program *prog)
2311 {
2312    static const char *const shader_names[MESA_SHADER_TYPES] = {
2313       "vertex", "fragment", "geometry"
2314    };
2315 
2316    const unsigned max_samplers[MESA_SHADER_TYPES] = {
2317       ctx->Const.MaxVertexTextureImageUnits,
2318       ctx->Const.MaxTextureImageUnits,
2319       ctx->Const.MaxGeometryTextureImageUnits
2320    };
2321 
2322    const unsigned max_uniform_components[MESA_SHADER_TYPES] = {
2323       ctx->Const.VertexProgram.MaxUniformComponents,
2324       ctx->Const.FragmentProgram.MaxUniformComponents,
2325       0          /* FINISHME: Geometry shaders. */
2326    };
2327 
2328    const unsigned max_uniform_blocks[MESA_SHADER_TYPES] = {
2329       ctx->Const.VertexProgram.MaxUniformBlocks,
2330       ctx->Const.FragmentProgram.MaxUniformBlocks,
2331       ctx->Const.GeometryProgram.MaxUniformBlocks,
2332    };
2333 
2334    for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) {
2335       struct gl_shader *sh = prog->_LinkedShaders[i];
2336 
2337       if (sh == NULL)
2338 	 continue;
2339 
2340       if (sh->num_samplers > max_samplers[i]) {
2341 	 linker_error(prog, "Too many %s shader texture samplers",
2342 		      shader_names[i]);
2343       }
2344 
2345       if (sh->num_uniform_components > max_uniform_components[i]) {
2346          if (ctx->Const.GLSLSkipStrictMaxUniformLimitCheck) {
2347             linker_warning(prog, "Too many %s shader uniform components, "
2348                            "but the driver will try to optimize them out; "
2349                            "this is non-portable out-of-spec behavior\n",
2350                            shader_names[i]);
2351          } else {
2352             linker_error(prog, "Too many %s shader uniform components",
2353                          shader_names[i]);
2354          }
2355       }
2356    }
2357 
2358    unsigned blocks[MESA_SHADER_TYPES] = {0};
2359    unsigned total_uniform_blocks = 0;
2360 
2361    for (unsigned i = 0; i < prog->NumUniformBlocks; i++) {
2362       for (unsigned j = 0; j < MESA_SHADER_TYPES; j++) {
2363 	 if (prog->UniformBlockStageIndex[j][i] != -1) {
2364 	    blocks[j]++;
2365 	    total_uniform_blocks++;
2366 	 }
2367       }
2368 
2369       if (total_uniform_blocks > ctx->Const.MaxCombinedUniformBlocks) {
2370 	 linker_error(prog, "Too many combined uniform blocks (%d/%d)",
2371 		      prog->NumUniformBlocks,
2372 		      ctx->Const.MaxCombinedUniformBlocks);
2373       } else {
2374 	 for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) {
2375 	    if (blocks[i] > max_uniform_blocks[i]) {
2376 	       linker_error(prog, "Too many %s uniform blocks (%d/%d)",
2377 			    shader_names[i],
2378 			    blocks[i],
2379 			    max_uniform_blocks[i]);
2380 	       break;
2381 	    }
2382 	 }
2383       }
2384    }
2385 
2386    return prog->LinkStatus;
2387 }
2388 
2389 void
link_shaders(struct gl_context * ctx,struct gl_shader_program * prog)2390 link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
2391 {
2392    tfeedback_decl *tfeedback_decls = NULL;
2393    unsigned num_tfeedback_decls = prog->TransformFeedback.NumVarying;
2394 
2395    void *mem_ctx = ralloc_context(NULL); // temporary linker context
2396 
2397    prog->LinkStatus = false;
2398    prog->Validated = false;
2399    prog->_Used = false;
2400 
2401    ralloc_free(prog->InfoLog);
2402    prog->InfoLog = ralloc_strdup(NULL, "");
2403 
2404    ralloc_free(prog->UniformBlocks);
2405    prog->UniformBlocks = NULL;
2406    prog->NumUniformBlocks = 0;
2407    for (int i = 0; i < MESA_SHADER_TYPES; i++) {
2408       ralloc_free(prog->UniformBlockStageIndex[i]);
2409       prog->UniformBlockStageIndex[i] = NULL;
2410    }
2411 
2412    /* Separate the shaders into groups based on their type.
2413     */
2414    struct gl_shader **vert_shader_list;
2415    unsigned num_vert_shaders = 0;
2416    struct gl_shader **frag_shader_list;
2417    unsigned num_frag_shaders = 0;
2418 
2419    vert_shader_list = (struct gl_shader **)
2420       calloc(2 * prog->NumShaders, sizeof(struct gl_shader *));
2421    frag_shader_list =  &vert_shader_list[prog->NumShaders];
2422 
2423    unsigned min_version = UINT_MAX;
2424    unsigned max_version = 0;
2425    for (unsigned i = 0; i < prog->NumShaders; i++) {
2426       min_version = MIN2(min_version, prog->Shaders[i]->Version);
2427       max_version = MAX2(max_version, prog->Shaders[i]->Version);
2428 
2429       switch (prog->Shaders[i]->Type) {
2430       case GL_VERTEX_SHADER:
2431 	 vert_shader_list[num_vert_shaders] = prog->Shaders[i];
2432 	 num_vert_shaders++;
2433 	 break;
2434       case GL_FRAGMENT_SHADER:
2435 	 frag_shader_list[num_frag_shaders] = prog->Shaders[i];
2436 	 num_frag_shaders++;
2437 	 break;
2438       case GL_GEOMETRY_SHADER:
2439 	 /* FINISHME: Support geometry shaders. */
2440 	 assert(prog->Shaders[i]->Type != GL_GEOMETRY_SHADER);
2441 	 break;
2442       }
2443    }
2444 
2445    /* Previous to GLSL version 1.30, different compilation units could mix and
2446     * match shading language versions.  With GLSL 1.30 and later, the versions
2447     * of all shaders must match.
2448     */
2449    assert(min_version >= 100);
2450    assert(max_version <= 140);
2451    if ((max_version >= 130 || min_version == 100)
2452        && min_version != max_version) {
2453       linker_error(prog, "all shaders must use same shading "
2454 		   "language version\n");
2455       goto done;
2456    }
2457 
2458    prog->Version = max_version;
2459 
2460    for (unsigned int i = 0; i < MESA_SHADER_TYPES; i++) {
2461       if (prog->_LinkedShaders[i] != NULL)
2462 	 ctx->Driver.DeleteShader(ctx, prog->_LinkedShaders[i]);
2463 
2464       prog->_LinkedShaders[i] = NULL;
2465    }
2466 
2467    /* Link all shaders for a particular stage and validate the result.
2468     */
2469    if (num_vert_shaders > 0) {
2470       gl_shader *const sh =
2471 	 link_intrastage_shaders(mem_ctx, ctx, prog, vert_shader_list,
2472 				 num_vert_shaders);
2473 
2474       if (sh == NULL)
2475 	 goto done;
2476 
2477       if (!validate_vertex_shader_executable(prog, sh))
2478 	 goto done;
2479 
2480       _mesa_reference_shader(ctx, &prog->_LinkedShaders[MESA_SHADER_VERTEX],
2481 			     sh);
2482    }
2483 
2484    if (num_frag_shaders > 0) {
2485       gl_shader *const sh =
2486 	 link_intrastage_shaders(mem_ctx, ctx, prog, frag_shader_list,
2487 				 num_frag_shaders);
2488 
2489       if (sh == NULL)
2490 	 goto done;
2491 
2492       if (!validate_fragment_shader_executable(prog, sh))
2493 	 goto done;
2494 
2495       _mesa_reference_shader(ctx, &prog->_LinkedShaders[MESA_SHADER_FRAGMENT],
2496 			     sh);
2497    }
2498 
2499    /* Here begins the inter-stage linking phase.  Some initial validation is
2500     * performed, then locations are assigned for uniforms, attributes, and
2501     * varyings.
2502     */
2503    if (cross_validate_uniforms(prog)) {
2504       unsigned prev;
2505 
2506       for (prev = 0; prev < MESA_SHADER_TYPES; prev++) {
2507 	 if (prog->_LinkedShaders[prev] != NULL)
2508 	    break;
2509       }
2510 
2511       /* Validate the inputs of each stage with the output of the preceding
2512        * stage.
2513        */
2514       for (unsigned i = prev + 1; i < MESA_SHADER_TYPES; i++) {
2515 	 if (prog->_LinkedShaders[i] == NULL)
2516 	    continue;
2517 
2518 	 if (!cross_validate_outputs_to_inputs(prog,
2519 					       prog->_LinkedShaders[prev],
2520 					       prog->_LinkedShaders[i]))
2521 	    goto done;
2522 
2523 	 prev = i;
2524       }
2525 
2526       prog->LinkStatus = true;
2527    }
2528 
2529    /* Implement the GLSL 1.30+ rule for discard vs infinite loops Do
2530     * it before optimization because we want most of the checks to get
2531     * dropped thanks to constant propagation.
2532     */
2533    if (max_version >= 130) {
2534       struct gl_shader *sh = prog->_LinkedShaders[MESA_SHADER_FRAGMENT];
2535       if (sh) {
2536 	 lower_discard_flow(sh->ir);
2537       }
2538    }
2539 
2540    if (!interstage_cross_validate_uniform_blocks(prog))
2541       goto done;
2542 
2543    /* Do common optimization before assigning storage for attributes,
2544     * uniforms, and varyings.  Later optimization could possibly make
2545     * some of that unused.
2546     */
2547    for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) {
2548       if (prog->_LinkedShaders[i] == NULL)
2549 	 continue;
2550 
2551       detect_recursion_linked(prog, prog->_LinkedShaders[i]->ir);
2552       if (!prog->LinkStatus)
2553 	 goto done;
2554 
2555       if (ctx->ShaderCompilerOptions[i].LowerClipDistance)
2556          lower_clip_distance(prog->_LinkedShaders[i]->ir);
2557 
2558       unsigned max_unroll = ctx->ShaderCompilerOptions[i].MaxUnrollIterations;
2559 
2560       while (do_common_optimization(prog->_LinkedShaders[i]->ir, true, false, max_unroll))
2561 	 ;
2562    }
2563 
2564    /* FINISHME: The value of the max_attribute_index parameter is
2565     * FINISHME: implementation dependent based on the value of
2566     * FINISHME: GL_MAX_VERTEX_ATTRIBS.  GL_MAX_VERTEX_ATTRIBS must be
2567     * FINISHME: at least 16, so hardcode 16 for now.
2568     */
2569    if (!assign_attribute_or_color_locations(prog, MESA_SHADER_VERTEX, 16)) {
2570       goto done;
2571    }
2572 
2573    if (!assign_attribute_or_color_locations(prog, MESA_SHADER_FRAGMENT, MAX2(ctx->Const.MaxDrawBuffers, ctx->Const.MaxDualSourceDrawBuffers))) {
2574       goto done;
2575    }
2576 
2577    unsigned prev;
2578    for (prev = 0; prev < MESA_SHADER_TYPES; prev++) {
2579       if (prog->_LinkedShaders[prev] != NULL)
2580 	 break;
2581    }
2582 
2583    if (num_tfeedback_decls != 0) {
2584       /* From GL_EXT_transform_feedback:
2585        *   A program will fail to link if:
2586        *
2587        *   * the <count> specified by TransformFeedbackVaryingsEXT is
2588        *     non-zero, but the program object has no vertex or geometry
2589        *     shader;
2590        */
2591       if (prev >= MESA_SHADER_FRAGMENT) {
2592          linker_error(prog, "Transform feedback varyings specified, but "
2593                       "no vertex or geometry shader is present.");
2594          goto done;
2595       }
2596 
2597       tfeedback_decls = ralloc_array(mem_ctx, tfeedback_decl,
2598                                      prog->TransformFeedback.NumVarying);
2599       if (!parse_tfeedback_decls(ctx, prog, mem_ctx, num_tfeedback_decls,
2600                                  prog->TransformFeedback.VaryingNames,
2601                                  tfeedback_decls))
2602          goto done;
2603    }
2604 
2605    for (unsigned i = prev + 1; i < MESA_SHADER_TYPES; i++) {
2606       if (prog->_LinkedShaders[i] == NULL)
2607 	 continue;
2608 
2609       if (!assign_varying_locations(
2610              ctx, prog, prog->_LinkedShaders[prev], prog->_LinkedShaders[i],
2611              i == MESA_SHADER_FRAGMENT ? num_tfeedback_decls : 0,
2612              tfeedback_decls))
2613 	 goto done;
2614 
2615       prev = i;
2616    }
2617 
2618    if (prev != MESA_SHADER_FRAGMENT && num_tfeedback_decls != 0) {
2619       /* There was no fragment shader, but we still have to assign varying
2620        * locations for use by transform feedback.
2621        */
2622       if (!assign_varying_locations(
2623              ctx, prog, prog->_LinkedShaders[prev], NULL, num_tfeedback_decls,
2624              tfeedback_decls))
2625          goto done;
2626    }
2627 
2628    if (!store_tfeedback_info(ctx, prog, num_tfeedback_decls, tfeedback_decls))
2629       goto done;
2630 
2631    if (prog->_LinkedShaders[MESA_SHADER_VERTEX] != NULL) {
2632       demote_shader_inputs_and_outputs(prog->_LinkedShaders[MESA_SHADER_VERTEX],
2633 				       ir_var_out);
2634 
2635       /* Eliminate code that is now dead due to unused vertex outputs being
2636        * demoted.
2637        */
2638       while (do_dead_code(prog->_LinkedShaders[MESA_SHADER_VERTEX]->ir, false))
2639 	 ;
2640    }
2641 
2642    if (prog->_LinkedShaders[MESA_SHADER_GEOMETRY] != NULL) {
2643       gl_shader *const sh = prog->_LinkedShaders[MESA_SHADER_GEOMETRY];
2644 
2645       demote_shader_inputs_and_outputs(sh, ir_var_in);
2646       demote_shader_inputs_and_outputs(sh, ir_var_inout);
2647       demote_shader_inputs_and_outputs(sh, ir_var_out);
2648 
2649       /* Eliminate code that is now dead due to unused geometry outputs being
2650        * demoted.
2651        */
2652       while (do_dead_code(prog->_LinkedShaders[MESA_SHADER_GEOMETRY]->ir, false))
2653 	 ;
2654    }
2655 
2656    if (prog->_LinkedShaders[MESA_SHADER_FRAGMENT] != NULL) {
2657       gl_shader *const sh = prog->_LinkedShaders[MESA_SHADER_FRAGMENT];
2658 
2659       demote_shader_inputs_and_outputs(sh, ir_var_in);
2660 
2661       /* Eliminate code that is now dead due to unused fragment inputs being
2662        * demoted.  This shouldn't actually do anything other than remove
2663        * declarations of the (now unused) global variables.
2664        */
2665       while (do_dead_code(prog->_LinkedShaders[MESA_SHADER_FRAGMENT]->ir, false))
2666 	 ;
2667    }
2668 
2669    update_array_sizes(prog);
2670    link_assign_uniform_locations(prog);
2671    store_fragdepth_layout(prog);
2672 
2673    if (!check_resources(ctx, prog))
2674       goto done;
2675 
2676    /* OpenGL ES requires that a vertex shader and a fragment shader both be
2677     * present in a linked program.  By checking for use of shading language
2678     * version 1.00, we also catch the GL_ARB_ES2_compatibility case.
2679     */
2680    if (!prog->InternalSeparateShader &&
2681        (ctx->API == API_OPENGLES2 || prog->Version == 100)) {
2682       if (prog->_LinkedShaders[MESA_SHADER_VERTEX] == NULL) {
2683 	 linker_error(prog, "program lacks a vertex shader\n");
2684       } else if (prog->_LinkedShaders[MESA_SHADER_FRAGMENT] == NULL) {
2685 	 linker_error(prog, "program lacks a fragment shader\n");
2686       }
2687    }
2688 
2689    /* FINISHME: Assign fragment shader output locations. */
2690 
2691 done:
2692    free(vert_shader_list);
2693 
2694    for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) {
2695       if (prog->_LinkedShaders[i] == NULL)
2696 	 continue;
2697 
2698       /* Retain any live IR, but trash the rest. */
2699       reparent_ir(prog->_LinkedShaders[i]->ir, prog->_LinkedShaders[i]->ir);
2700 
2701       /* The symbol table in the linked shaders may contain references to
2702        * variables that were removed (e.g., unused uniforms).  Since it may
2703        * contain junk, there is no possible valid use.  Delete it and set the
2704        * pointer to NULL.
2705        */
2706       delete prog->_LinkedShaders[i]->symbols;
2707       prog->_LinkedShaders[i]->symbols = NULL;
2708    }
2709 
2710    ralloc_free(mem_ctx);
2711 }
2712