glsl: Track in each ir_variable whether it was ever assigned.
[mesa.git] / src / glsl / ir.h
1 /* -*- c++ -*- */
2 /*
3 * Copyright © 2010 Intel Corporation
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
14 * Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 */
24
25 #pragma once
26 #ifndef IR_H
27 #define IR_H
28
29 #include <stdio.h>
30 #include <stdlib.h>
31
32 #include "ralloc.h"
33 #include "glsl_types.h"
34 #include "list.h"
35 #include "ir_visitor.h"
36 #include "ir_hierarchical_visitor.h"
37 #include "main/mtypes.h"
38
39 /**
40 * \defgroup IR Intermediate representation nodes
41 *
42 * @{
43 */
44
45 /**
46 * Class tags
47 *
48 * Each concrete class derived from \c ir_instruction has a value in this
49 * enumerant. The value for the type is stored in \c ir_instruction::ir_type
50 * by the constructor. While using type tags is not very C++, it is extremely
51 * convenient. For example, during debugging you can simply inspect
52 * \c ir_instruction::ir_type to find out the actual type of the object.
53 *
54 * In addition, it is possible to use a switch-statement based on \c
55 * \c ir_instruction::ir_type to select different behavior for different object
56 * types. For functions that have only slight differences for several object
57 * types, this allows writing very straightforward, readable code.
58 */
59 enum ir_node_type {
60 /**
61 * Zero is unused so that the IR validator can detect cases where
62 * \c ir_instruction::ir_type has not been initialized.
63 */
64 ir_type_unset,
65 ir_type_variable,
66 ir_type_assignment,
67 ir_type_call,
68 ir_type_constant,
69 ir_type_dereference_array,
70 ir_type_dereference_record,
71 ir_type_dereference_variable,
72 ir_type_discard,
73 ir_type_expression,
74 ir_type_function,
75 ir_type_function_signature,
76 ir_type_if,
77 ir_type_loop,
78 ir_type_loop_jump,
79 ir_type_return,
80 ir_type_swizzle,
81 ir_type_texture,
82 ir_type_max /**< maximum ir_type enum number, for validation */
83 };
84
85 /**
86 * Base class of all IR instructions
87 */
88 class ir_instruction : public exec_node {
89 public:
90 enum ir_node_type ir_type;
91
92 /** ir_print_visitor helper for debugging. */
93 void print(void) const;
94
95 virtual void accept(ir_visitor *) = 0;
96 virtual ir_visitor_status accept(ir_hierarchical_visitor *) = 0;
97 virtual ir_instruction *clone(void *mem_ctx,
98 struct hash_table *ht) const = 0;
99
100 /**
101 * \name IR instruction downcast functions
102 *
103 * These functions either cast the object to a derived class or return
104 * \c NULL if the object's type does not match the specified derived class.
105 * Additional downcast functions will be added as needed.
106 */
107 /*@{*/
108 virtual class ir_variable * as_variable() { return NULL; }
109 virtual class ir_function * as_function() { return NULL; }
110 virtual class ir_dereference * as_dereference() { return NULL; }
111 virtual class ir_dereference_array * as_dereference_array() { return NULL; }
112 virtual class ir_dereference_variable *as_dereference_variable() { return NULL; }
113 virtual class ir_expression * as_expression() { return NULL; }
114 virtual class ir_rvalue * as_rvalue() { return NULL; }
115 virtual class ir_loop * as_loop() { return NULL; }
116 virtual class ir_assignment * as_assignment() { return NULL; }
117 virtual class ir_call * as_call() { return NULL; }
118 virtual class ir_return * as_return() { return NULL; }
119 virtual class ir_if * as_if() { return NULL; }
120 virtual class ir_swizzle * as_swizzle() { return NULL; }
121 virtual class ir_constant * as_constant() { return NULL; }
122 virtual class ir_discard * as_discard() { return NULL; }
123 /*@}*/
124
125 protected:
126 ir_instruction()
127 {
128 ir_type = ir_type_unset;
129 }
130 };
131
132
133 /**
134 * The base class for all "values"/expression trees.
135 */
136 class ir_rvalue : public ir_instruction {
137 public:
138 const struct glsl_type *type;
139
140 virtual ir_rvalue *clone(void *mem_ctx, struct hash_table *) const;
141
142 virtual void accept(ir_visitor *v)
143 {
144 v->visit(this);
145 }
146
147 virtual ir_visitor_status accept(ir_hierarchical_visitor *);
148
149 virtual ir_constant *constant_expression_value();
150
151 virtual ir_rvalue * as_rvalue()
152 {
153 return this;
154 }
155
156 ir_rvalue *as_rvalue_to_saturate();
157
158 virtual bool is_lvalue() const
159 {
160 return false;
161 }
162
163 /**
164 * Get the variable that is ultimately referenced by an r-value
165 */
166 virtual ir_variable *variable_referenced() const
167 {
168 return NULL;
169 }
170
171
172 /**
173 * If an r-value is a reference to a whole variable, get that variable
174 *
175 * \return
176 * Pointer to a variable that is completely dereferenced by the r-value. If
177 * the r-value is not a dereference or the dereference does not access the
178 * entire variable (i.e., it's just one array element, struct field), \c NULL
179 * is returned.
180 */
181 virtual ir_variable *whole_variable_referenced()
182 {
183 return NULL;
184 }
185
186 /**
187 * Determine if an r-value has the value zero
188 *
189 * The base implementation of this function always returns \c false. The
190 * \c ir_constant class over-rides this function to return \c true \b only
191 * for vector and scalar types that have all elements set to the value
192 * zero (or \c false for booleans).
193 *
194 * \sa ir_constant::has_value, ir_rvalue::is_one, ir_rvalue::is_negative_one
195 */
196 virtual bool is_zero() const;
197
198 /**
199 * Determine if an r-value has the value one
200 *
201 * The base implementation of this function always returns \c false. The
202 * \c ir_constant class over-rides this function to return \c true \b only
203 * for vector and scalar types that have all elements set to the value
204 * one (or \c true for booleans).
205 *
206 * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_negative_one
207 */
208 virtual bool is_one() const;
209
210 /**
211 * Determine if an r-value has the value negative one
212 *
213 * The base implementation of this function always returns \c false. The
214 * \c ir_constant class over-rides this function to return \c true \b only
215 * for vector and scalar types that have all elements set to the value
216 * negative one. For boolean times, the result is always \c false.
217 *
218 * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_one
219 */
220 virtual bool is_negative_one() const;
221
222
223 /**
224 * Return a generic value of error_type.
225 *
226 * Allocation will be performed with 'mem_ctx' as ralloc owner.
227 */
228 static ir_rvalue *error_value(void *mem_ctx);
229
230 protected:
231 ir_rvalue();
232 };
233
234
235 /**
236 * Variable storage classes
237 */
238 enum ir_variable_mode {
239 ir_var_auto = 0, /**< Function local variables and globals. */
240 ir_var_uniform, /**< Variable declared as a uniform. */
241 ir_var_in,
242 ir_var_out,
243 ir_var_inout,
244 ir_var_const_in, /**< "in" param that must be a constant expression */
245 ir_var_system_value, /**< Ex: front-face, instance-id, etc. */
246 ir_var_temporary /**< Temporary variable generated during compilation. */
247 };
248
249 /**
250 * \brief Layout qualifiers for gl_FragDepth.
251 *
252 * The AMD/ARB_conservative_depth extensions allow gl_FragDepth to be redeclared
253 * with a layout qualifier.
254 */
255 enum ir_depth_layout {
256 ir_depth_layout_none, /**< No depth layout is specified. */
257 ir_depth_layout_any,
258 ir_depth_layout_greater,
259 ir_depth_layout_less,
260 ir_depth_layout_unchanged
261 };
262
263 /**
264 * \brief Convert depth layout qualifier to string.
265 */
266 const char*
267 depth_layout_string(ir_depth_layout layout);
268
269 /**
270 * Description of built-in state associated with a uniform
271 *
272 * \sa ir_variable::state_slots
273 */
274 struct ir_state_slot {
275 int tokens[5];
276 int swizzle;
277 };
278
279 class ir_variable : public ir_instruction {
280 public:
281 ir_variable(const struct glsl_type *, const char *, ir_variable_mode);
282
283 virtual ir_variable *clone(void *mem_ctx, struct hash_table *ht) const;
284
285 virtual ir_variable *as_variable()
286 {
287 return this;
288 }
289
290 virtual void accept(ir_visitor *v)
291 {
292 v->visit(this);
293 }
294
295 virtual ir_visitor_status accept(ir_hierarchical_visitor *);
296
297
298 /**
299 * Get the string value for the interpolation qualifier
300 *
301 * \return The string that would be used in a shader to specify \c
302 * mode will be returned.
303 *
304 * This function is used to generate error messages of the form "shader
305 * uses %s interpolation qualifier", so in the case where there is no
306 * interpolation qualifier, it returns "no".
307 *
308 * This function should only be used on a shader input or output variable.
309 */
310 const char *interpolation_string() const;
311
312 /**
313 * Determine how this variable should be interpolated based on its
314 * interpolation qualifier (if present), whether it is gl_Color or
315 * gl_SecondaryColor, and whether flatshading is enabled in the current GL
316 * state.
317 *
318 * The return value will always be either INTERP_QUALIFIER_SMOOTH,
319 * INTERP_QUALIFIER_NOPERSPECTIVE, or INTERP_QUALIFIER_FLAT.
320 */
321 glsl_interp_qualifier determine_interpolation_mode(bool flat_shade);
322
323 /**
324 * Declared type of the variable
325 */
326 const struct glsl_type *type;
327
328 /**
329 * Delcared name of the variable
330 */
331 const char *name;
332
333 /**
334 * Highest element accessed with a constant expression array index
335 *
336 * Not used for non-array variables.
337 */
338 unsigned max_array_access;
339
340 /**
341 * Is the variable read-only?
342 *
343 * This is set for variables declared as \c const, shader inputs,
344 * and uniforms.
345 */
346 unsigned read_only:1;
347 unsigned centroid:1;
348 unsigned invariant:1;
349
350 /**
351 * Has this variable been used for reading or writing?
352 *
353 * Several GLSL semantic checks require knowledge of whether or not a
354 * variable has been used. For example, it is an error to redeclare a
355 * variable as invariant after it has been used.
356 *
357 * This is only maintained in the ast_to_hir.cpp path, not in
358 * Mesa's fixed function or ARB program paths.
359 */
360 unsigned used:1;
361
362 /**
363 * Has this variable been statically assigned?
364 *
365 * This answers whether the variable was assigned in any path of
366 * the shader during ast_to_hir. This doesn't answer whether it is
367 * still written after dead code removal, nor is it maintained in
368 * non-ast_to_hir.cpp (GLSL parsing) paths.
369 */
370 unsigned assigned:1;
371
372 /**
373 * Storage class of the variable.
374 *
375 * \sa ir_variable_mode
376 */
377 unsigned mode:3;
378
379 /**
380 * Interpolation mode for shader inputs / outputs
381 *
382 * \sa ir_variable_interpolation
383 */
384 unsigned interpolation:2;
385
386 /**
387 * \name ARB_fragment_coord_conventions
388 * @{
389 */
390 unsigned origin_upper_left:1;
391 unsigned pixel_center_integer:1;
392 /*@}*/
393
394 /**
395 * Was the location explicitly set in the shader?
396 *
397 * If the location is explicitly set in the shader, it \b cannot be changed
398 * by the linker or by the API (e.g., calls to \c glBindAttribLocation have
399 * no effect).
400 */
401 unsigned explicit_location:1;
402 unsigned explicit_index:1;
403
404 /**
405 * Does this variable have an initializer?
406 *
407 * This is used by the linker to cross-validiate initializers of global
408 * variables.
409 */
410 unsigned has_initializer:1;
411
412 /**
413 * \brief Layout qualifier for gl_FragDepth.
414 *
415 * This is not equal to \c ir_depth_layout_none if and only if this
416 * variable is \c gl_FragDepth and a layout qualifier is specified.
417 */
418 ir_depth_layout depth_layout;
419
420 /**
421 * Storage location of the base of this variable
422 *
423 * The precise meaning of this field depends on the nature of the variable.
424 *
425 * - Vertex shader input: one of the values from \c gl_vert_attrib.
426 * - Vertex shader output: one of the values from \c gl_vert_result.
427 * - Fragment shader input: one of the values from \c gl_frag_attrib.
428 * - Fragment shader output: one of the values from \c gl_frag_result.
429 * - Uniforms: Per-stage uniform slot number.
430 * - Other: This field is not currently used.
431 *
432 * If the variable is a uniform, shader input, or shader output, and the
433 * slot has not been assigned, the value will be -1.
434 */
435 int location;
436
437 /**
438 * output index for dual source blending.
439 */
440 int index;
441
442 /**
443 * Built-in state that backs this uniform
444 *
445 * Once set at variable creation, \c state_slots must remain invariant.
446 * This is because, ideally, this array would be shared by all clones of
447 * this variable in the IR tree. In other words, we'd really like for it
448 * to be a fly-weight.
449 *
450 * If the variable is not a uniform, \c num_state_slots will be zero and
451 * \c state_slots will be \c NULL.
452 */
453 /*@{*/
454 unsigned num_state_slots; /**< Number of state slots used */
455 ir_state_slot *state_slots; /**< State descriptors. */
456 /*@}*/
457
458 /**
459 * Emit a warning if this variable is accessed.
460 */
461 const char *warn_extension;
462
463 /**
464 * Value assigned in the initializer of a variable declared "const"
465 */
466 ir_constant *constant_value;
467
468 /**
469 * Constant expression assigned in the initializer of the variable
470 *
471 * \warning
472 * This field and \c ::constant_value are distinct. Even if the two fields
473 * refer to constants with the same value, they must point to separate
474 * objects.
475 */
476 ir_constant *constant_initializer;
477 };
478
479
480 /*@{*/
481 /**
482 * The representation of a function instance; may be the full definition or
483 * simply a prototype.
484 */
485 class ir_function_signature : public ir_instruction {
486 /* An ir_function_signature will be part of the list of signatures in
487 * an ir_function.
488 */
489 public:
490 ir_function_signature(const glsl_type *return_type);
491
492 virtual ir_function_signature *clone(void *mem_ctx,
493 struct hash_table *ht) const;
494 ir_function_signature *clone_prototype(void *mem_ctx,
495 struct hash_table *ht) const;
496
497 virtual void accept(ir_visitor *v)
498 {
499 v->visit(this);
500 }
501
502 virtual ir_visitor_status accept(ir_hierarchical_visitor *);
503
504 /**
505 * Attempt to evaluate this function as a constant expression, given
506 * a list of the actual parameters. Returns NULL for non-built-ins.
507 */
508 ir_constant *constant_expression_value(exec_list *actual_parameters);
509
510 /**
511 * Get the name of the function for which this is a signature
512 */
513 const char *function_name() const;
514
515 /**
516 * Get a handle to the function for which this is a signature
517 *
518 * There is no setter function, this function returns a \c const pointer,
519 * and \c ir_function_signature::_function is private for a reason. The
520 * only way to make a connection between a function and function signature
521 * is via \c ir_function::add_signature. This helps ensure that certain
522 * invariants (i.e., a function signature is in the list of signatures for
523 * its \c _function) are met.
524 *
525 * \sa ir_function::add_signature
526 */
527 inline const class ir_function *function() const
528 {
529 return this->_function;
530 }
531
532 /**
533 * Check whether the qualifiers match between this signature's parameters
534 * and the supplied parameter list. If not, returns the name of the first
535 * parameter with mismatched qualifiers (for use in error messages).
536 */
537 const char *qualifiers_match(exec_list *params);
538
539 /**
540 * Replace the current parameter list with the given one. This is useful
541 * if the current information came from a prototype, and either has invalid
542 * or missing parameter names.
543 */
544 void replace_parameters(exec_list *new_params);
545
546 /**
547 * Function return type.
548 *
549 * \note This discards the optional precision qualifier.
550 */
551 const struct glsl_type *return_type;
552
553 /**
554 * List of ir_variable of function parameters.
555 *
556 * This represents the storage. The paramaters passed in a particular
557 * call will be in ir_call::actual_paramaters.
558 */
559 struct exec_list parameters;
560
561 /** Whether or not this function has a body (which may be empty). */
562 unsigned is_defined:1;
563
564 /** Whether or not this function signature is a built-in. */
565 unsigned is_builtin:1;
566
567 /** Body of instructions in the function. */
568 struct exec_list body;
569
570 private:
571 /** Function of which this signature is one overload. */
572 class ir_function *_function;
573
574 friend class ir_function;
575 };
576
577
578 /**
579 * Header for tracking multiple overloaded functions with the same name.
580 * Contains a list of ir_function_signatures representing each of the
581 * actual functions.
582 */
583 class ir_function : public ir_instruction {
584 public:
585 ir_function(const char *name);
586
587 virtual ir_function *clone(void *mem_ctx, struct hash_table *ht) const;
588
589 virtual ir_function *as_function()
590 {
591 return this;
592 }
593
594 virtual void accept(ir_visitor *v)
595 {
596 v->visit(this);
597 }
598
599 virtual ir_visitor_status accept(ir_hierarchical_visitor *);
600
601 void add_signature(ir_function_signature *sig)
602 {
603 sig->_function = this;
604 this->signatures.push_tail(sig);
605 }
606
607 /**
608 * Get an iterator for the set of function signatures
609 */
610 exec_list_iterator iterator()
611 {
612 return signatures.iterator();
613 }
614
615 /**
616 * Find a signature that matches a set of actual parameters, taking implicit
617 * conversions into account. Also flags whether the match was exact.
618 */
619 ir_function_signature *matching_signature(const exec_list *actual_param,
620 bool *match_is_exact);
621
622 /**
623 * Find a signature that matches a set of actual parameters, taking implicit
624 * conversions into account.
625 */
626 ir_function_signature *matching_signature(const exec_list *actual_param);
627
628 /**
629 * Find a signature that exactly matches a set of actual parameters without
630 * any implicit type conversions.
631 */
632 ir_function_signature *exact_matching_signature(const exec_list *actual_ps);
633
634 /**
635 * Name of the function.
636 */
637 const char *name;
638
639 /** Whether or not this function has a signature that isn't a built-in. */
640 bool has_user_signature();
641
642 /**
643 * List of ir_function_signature for each overloaded function with this name.
644 */
645 struct exec_list signatures;
646 };
647
648 inline const char *ir_function_signature::function_name() const
649 {
650 return this->_function->name;
651 }
652 /*@}*/
653
654
655 /**
656 * IR instruction representing high-level if-statements
657 */
658 class ir_if : public ir_instruction {
659 public:
660 ir_if(ir_rvalue *condition)
661 : condition(condition)
662 {
663 ir_type = ir_type_if;
664 }
665
666 virtual ir_if *clone(void *mem_ctx, struct hash_table *ht) const;
667
668 virtual ir_if *as_if()
669 {
670 return this;
671 }
672
673 virtual void accept(ir_visitor *v)
674 {
675 v->visit(this);
676 }
677
678 virtual ir_visitor_status accept(ir_hierarchical_visitor *);
679
680 ir_rvalue *condition;
681 /** List of ir_instruction for the body of the then branch */
682 exec_list then_instructions;
683 /** List of ir_instruction for the body of the else branch */
684 exec_list else_instructions;
685 };
686
687
688 /**
689 * IR instruction representing a high-level loop structure.
690 */
691 class ir_loop : public ir_instruction {
692 public:
693 ir_loop();
694
695 virtual ir_loop *clone(void *mem_ctx, struct hash_table *ht) const;
696
697 virtual void accept(ir_visitor *v)
698 {
699 v->visit(this);
700 }
701
702 virtual ir_visitor_status accept(ir_hierarchical_visitor *);
703
704 virtual ir_loop *as_loop()
705 {
706 return this;
707 }
708
709 /**
710 * Get an iterator for the instructions of the loop body
711 */
712 exec_list_iterator iterator()
713 {
714 return body_instructions.iterator();
715 }
716
717 /** List of ir_instruction that make up the body of the loop. */
718 exec_list body_instructions;
719
720 /**
721 * \name Loop counter and controls
722 *
723 * Represents a loop like a FORTRAN \c do-loop.
724 *
725 * \note
726 * If \c from and \c to are the same value, the loop will execute once.
727 */
728 /*@{*/
729 ir_rvalue *from; /** Value of the loop counter on the first
730 * iteration of the loop.
731 */
732 ir_rvalue *to; /** Value of the loop counter on the last
733 * iteration of the loop.
734 */
735 ir_rvalue *increment;
736 ir_variable *counter;
737
738 /**
739 * Comparison operation in the loop terminator.
740 *
741 * If any of the loop control fields are non-\c NULL, this field must be
742 * one of \c ir_binop_less, \c ir_binop_greater, \c ir_binop_lequal,
743 * \c ir_binop_gequal, \c ir_binop_equal, or \c ir_binop_nequal.
744 */
745 int cmp;
746 /*@}*/
747 };
748
749
750 class ir_assignment : public ir_instruction {
751 public:
752 ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition = NULL);
753
754 /**
755 * Construct an assignment with an explicit write mask
756 *
757 * \note
758 * Since a write mask is supplied, the LHS must already be a bare
759 * \c ir_dereference. The cannot be any swizzles in the LHS.
760 */
761 ir_assignment(ir_dereference *lhs, ir_rvalue *rhs, ir_rvalue *condition,
762 unsigned write_mask);
763
764 virtual ir_assignment *clone(void *mem_ctx, struct hash_table *ht) const;
765
766 virtual ir_constant *constant_expression_value();
767
768 virtual void accept(ir_visitor *v)
769 {
770 v->visit(this);
771 }
772
773 virtual ir_visitor_status accept(ir_hierarchical_visitor *);
774
775 virtual ir_assignment * as_assignment()
776 {
777 return this;
778 }
779
780 /**
781 * Get a whole variable written by an assignment
782 *
783 * If the LHS of the assignment writes a whole variable, the variable is
784 * returned. Otherwise \c NULL is returned. Examples of whole-variable
785 * assignment are:
786 *
787 * - Assigning to a scalar
788 * - Assigning to all components of a vector
789 * - Whole array (or matrix) assignment
790 * - Whole structure assignment
791 */
792 ir_variable *whole_variable_written();
793
794 /**
795 * Set the LHS of an assignment
796 */
797 void set_lhs(ir_rvalue *lhs);
798
799 /**
800 * Left-hand side of the assignment.
801 *
802 * This should be treated as read only. If you need to set the LHS of an
803 * assignment, use \c ir_assignment::set_lhs.
804 */
805 ir_dereference *lhs;
806
807 /**
808 * Value being assigned
809 */
810 ir_rvalue *rhs;
811
812 /**
813 * Optional condition for the assignment.
814 */
815 ir_rvalue *condition;
816
817
818 /**
819 * Component mask written
820 *
821 * For non-vector types in the LHS, this field will be zero. For vector
822 * types, a bit will be set for each component that is written. Note that
823 * for \c vec2 and \c vec3 types only the lower bits will ever be set.
824 *
825 * A partially-set write mask means that each enabled channel gets
826 * the value from a consecutive channel of the rhs. For example,
827 * to write just .xyw of gl_FrontColor with color:
828 *
829 * (assign (constant bool (1)) (xyw)
830 * (var_ref gl_FragColor)
831 * (swiz xyw (var_ref color)))
832 */
833 unsigned write_mask:4;
834 };
835
836 /* Update ir_expression::num_operands() and operator_strs when
837 * updating this list.
838 */
839 enum ir_expression_operation {
840 ir_unop_bit_not,
841 ir_unop_logic_not,
842 ir_unop_neg,
843 ir_unop_abs,
844 ir_unop_sign,
845 ir_unop_rcp,
846 ir_unop_rsq,
847 ir_unop_sqrt,
848 ir_unop_exp, /**< Log base e on gentype */
849 ir_unop_log, /**< Natural log on gentype */
850 ir_unop_exp2,
851 ir_unop_log2,
852 ir_unop_f2i, /**< Float-to-integer conversion. */
853 ir_unop_i2f, /**< Integer-to-float conversion. */
854 ir_unop_f2b, /**< Float-to-boolean conversion */
855 ir_unop_b2f, /**< Boolean-to-float conversion */
856 ir_unop_i2b, /**< int-to-boolean conversion */
857 ir_unop_b2i, /**< Boolean-to-int conversion */
858 ir_unop_u2f, /**< Unsigned-to-float conversion. */
859 ir_unop_i2u, /**< Integer-to-unsigned conversion. */
860 ir_unop_u2i, /**< Unsigned-to-integer conversion. */
861 ir_unop_any,
862
863 /**
864 * \name Unary floating-point rounding operations.
865 */
866 /*@{*/
867 ir_unop_trunc,
868 ir_unop_ceil,
869 ir_unop_floor,
870 ir_unop_fract,
871 ir_unop_round_even,
872 /*@}*/
873
874 /**
875 * \name Trigonometric operations.
876 */
877 /*@{*/
878 ir_unop_sin,
879 ir_unop_cos,
880 ir_unop_sin_reduced, /**< Reduced range sin. [-pi, pi] */
881 ir_unop_cos_reduced, /**< Reduced range cos. [-pi, pi] */
882 /*@}*/
883
884 /**
885 * \name Partial derivatives.
886 */
887 /*@{*/
888 ir_unop_dFdx,
889 ir_unop_dFdy,
890 /*@}*/
891
892 ir_unop_noise,
893
894 /**
895 * A sentinel marking the last of the unary operations.
896 */
897 ir_last_unop = ir_unop_noise,
898
899 ir_binop_add,
900 ir_binop_sub,
901 ir_binop_mul,
902 ir_binop_div,
903
904 /**
905 * Takes one of two combinations of arguments:
906 *
907 * - mod(vecN, vecN)
908 * - mod(vecN, float)
909 *
910 * Does not take integer types.
911 */
912 ir_binop_mod,
913
914 /**
915 * \name Binary comparison operators which return a boolean vector.
916 * The type of both operands must be equal.
917 */
918 /*@{*/
919 ir_binop_less,
920 ir_binop_greater,
921 ir_binop_lequal,
922 ir_binop_gequal,
923 ir_binop_equal,
924 ir_binop_nequal,
925 /**
926 * Returns single boolean for whether all components of operands[0]
927 * equal the components of operands[1].
928 */
929 ir_binop_all_equal,
930 /**
931 * Returns single boolean for whether any component of operands[0]
932 * is not equal to the corresponding component of operands[1].
933 */
934 ir_binop_any_nequal,
935 /*@}*/
936
937 /**
938 * \name Bit-wise binary operations.
939 */
940 /*@{*/
941 ir_binop_lshift,
942 ir_binop_rshift,
943 ir_binop_bit_and,
944 ir_binop_bit_xor,
945 ir_binop_bit_or,
946 /*@}*/
947
948 ir_binop_logic_and,
949 ir_binop_logic_xor,
950 ir_binop_logic_or,
951
952 ir_binop_dot,
953 ir_binop_min,
954 ir_binop_max,
955
956 ir_binop_pow,
957
958 /**
959 * A sentinel marking the last of the binary operations.
960 */
961 ir_last_binop = ir_binop_pow,
962
963 ir_quadop_vector,
964
965 /**
966 * A sentinel marking the last of all operations.
967 */
968 ir_last_opcode = ir_last_binop
969 };
970
971 class ir_expression : public ir_rvalue {
972 public:
973 /**
974 * Constructor for unary operation expressions
975 */
976 ir_expression(int op, const struct glsl_type *type, ir_rvalue *);
977 ir_expression(int op, ir_rvalue *);
978
979 /**
980 * Constructor for binary operation expressions
981 */
982 ir_expression(int op, const struct glsl_type *type,
983 ir_rvalue *, ir_rvalue *);
984 ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1);
985
986 /**
987 * Constructor for quad operator expressions
988 */
989 ir_expression(int op, const struct glsl_type *type,
990 ir_rvalue *, ir_rvalue *, ir_rvalue *, ir_rvalue *);
991
992 virtual ir_expression *as_expression()
993 {
994 return this;
995 }
996
997 virtual ir_expression *clone(void *mem_ctx, struct hash_table *ht) const;
998
999 /**
1000 * Attempt to constant-fold the expression
1001 *
1002 * If the expression cannot be constant folded, this method will return
1003 * \c NULL.
1004 */
1005 virtual ir_constant *constant_expression_value();
1006
1007 /**
1008 * Determine the number of operands used by an expression
1009 */
1010 static unsigned int get_num_operands(ir_expression_operation);
1011
1012 /**
1013 * Determine the number of operands used by an expression
1014 */
1015 unsigned int get_num_operands() const
1016 {
1017 return (this->operation == ir_quadop_vector)
1018 ? this->type->vector_elements : get_num_operands(operation);
1019 }
1020
1021 /**
1022 * Return a string representing this expression's operator.
1023 */
1024 const char *operator_string();
1025
1026 /**
1027 * Return a string representing this expression's operator.
1028 */
1029 static const char *operator_string(ir_expression_operation);
1030
1031
1032 /**
1033 * Do a reverse-lookup to translate the given string into an operator.
1034 */
1035 static ir_expression_operation get_operator(const char *);
1036
1037 virtual void accept(ir_visitor *v)
1038 {
1039 v->visit(this);
1040 }
1041
1042 virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1043
1044 ir_expression_operation operation;
1045 ir_rvalue *operands[4];
1046 };
1047
1048
1049 /**
1050 * HIR instruction representing a high-level function call, containing a list
1051 * of parameters and returning a value in the supplied temporary.
1052 */
1053 class ir_call : public ir_instruction {
1054 public:
1055 ir_call(ir_function_signature *callee,
1056 ir_dereference_variable *return_deref,
1057 exec_list *actual_parameters)
1058 : return_deref(return_deref), callee(callee)
1059 {
1060 ir_type = ir_type_call;
1061 assert(callee->return_type != NULL);
1062 actual_parameters->move_nodes_to(& this->actual_parameters);
1063 this->use_builtin = callee->is_builtin;
1064 }
1065
1066 virtual ir_call *clone(void *mem_ctx, struct hash_table *ht) const;
1067
1068 virtual ir_constant *constant_expression_value();
1069
1070 virtual ir_call *as_call()
1071 {
1072 return this;
1073 }
1074
1075 virtual void accept(ir_visitor *v)
1076 {
1077 v->visit(this);
1078 }
1079
1080 virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1081
1082 /**
1083 * Get an iterator for the set of acutal parameters
1084 */
1085 exec_list_iterator iterator()
1086 {
1087 return actual_parameters.iterator();
1088 }
1089
1090 /**
1091 * Get the name of the function being called.
1092 */
1093 const char *callee_name() const
1094 {
1095 return callee->function_name();
1096 }
1097
1098 /**
1099 * Generates an inline version of the function before @ir,
1100 * storing the return value in return_deref.
1101 */
1102 void generate_inline(ir_instruction *ir);
1103
1104 /**
1105 * Storage for the function's return value.
1106 * This must be NULL if the return type is void.
1107 */
1108 ir_dereference_variable *return_deref;
1109
1110 /**
1111 * The specific function signature being called.
1112 */
1113 ir_function_signature *callee;
1114
1115 /* List of ir_rvalue of paramaters passed in this call. */
1116 exec_list actual_parameters;
1117
1118 /** Should this call only bind to a built-in function? */
1119 bool use_builtin;
1120 };
1121
1122
1123 /**
1124 * \name Jump-like IR instructions.
1125 *
1126 * These include \c break, \c continue, \c return, and \c discard.
1127 */
1128 /*@{*/
1129 class ir_jump : public ir_instruction {
1130 protected:
1131 ir_jump()
1132 {
1133 ir_type = ir_type_unset;
1134 }
1135 };
1136
1137 class ir_return : public ir_jump {
1138 public:
1139 ir_return()
1140 : value(NULL)
1141 {
1142 this->ir_type = ir_type_return;
1143 }
1144
1145 ir_return(ir_rvalue *value)
1146 : value(value)
1147 {
1148 this->ir_type = ir_type_return;
1149 }
1150
1151 virtual ir_return *clone(void *mem_ctx, struct hash_table *) const;
1152
1153 virtual ir_return *as_return()
1154 {
1155 return this;
1156 }
1157
1158 ir_rvalue *get_value() const
1159 {
1160 return value;
1161 }
1162
1163 virtual void accept(ir_visitor *v)
1164 {
1165 v->visit(this);
1166 }
1167
1168 virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1169
1170 ir_rvalue *value;
1171 };
1172
1173
1174 /**
1175 * Jump instructions used inside loops
1176 *
1177 * These include \c break and \c continue. The \c break within a loop is
1178 * different from the \c break within a switch-statement.
1179 *
1180 * \sa ir_switch_jump
1181 */
1182 class ir_loop_jump : public ir_jump {
1183 public:
1184 enum jump_mode {
1185 jump_break,
1186 jump_continue
1187 };
1188
1189 ir_loop_jump(jump_mode mode)
1190 {
1191 this->ir_type = ir_type_loop_jump;
1192 this->mode = mode;
1193 this->loop = loop;
1194 }
1195
1196 virtual ir_loop_jump *clone(void *mem_ctx, struct hash_table *) const;
1197
1198 virtual void accept(ir_visitor *v)
1199 {
1200 v->visit(this);
1201 }
1202
1203 virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1204
1205 bool is_break() const
1206 {
1207 return mode == jump_break;
1208 }
1209
1210 bool is_continue() const
1211 {
1212 return mode == jump_continue;
1213 }
1214
1215 /** Mode selector for the jump instruction. */
1216 enum jump_mode mode;
1217 private:
1218 /** Loop containing this break instruction. */
1219 ir_loop *loop;
1220 };
1221
1222 /**
1223 * IR instruction representing discard statements.
1224 */
1225 class ir_discard : public ir_jump {
1226 public:
1227 ir_discard()
1228 {
1229 this->ir_type = ir_type_discard;
1230 this->condition = NULL;
1231 }
1232
1233 ir_discard(ir_rvalue *cond)
1234 {
1235 this->ir_type = ir_type_discard;
1236 this->condition = cond;
1237 }
1238
1239 virtual ir_discard *clone(void *mem_ctx, struct hash_table *ht) const;
1240
1241 virtual void accept(ir_visitor *v)
1242 {
1243 v->visit(this);
1244 }
1245
1246 virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1247
1248 virtual ir_discard *as_discard()
1249 {
1250 return this;
1251 }
1252
1253 ir_rvalue *condition;
1254 };
1255 /*@}*/
1256
1257
1258 /**
1259 * Texture sampling opcodes used in ir_texture
1260 */
1261 enum ir_texture_opcode {
1262 ir_tex, /**< Regular texture look-up */
1263 ir_txb, /**< Texture look-up with LOD bias */
1264 ir_txl, /**< Texture look-up with explicit LOD */
1265 ir_txd, /**< Texture look-up with partial derivatvies */
1266 ir_txf, /**< Texel fetch with explicit LOD */
1267 ir_txs /**< Texture size */
1268 };
1269
1270
1271 /**
1272 * IR instruction to sample a texture
1273 *
1274 * The specific form of the IR instruction depends on the \c mode value
1275 * selected from \c ir_texture_opcodes. In the printed IR, these will
1276 * appear as:
1277 *
1278 * Texel offset (0 or an expression)
1279 * | Projection divisor
1280 * | | Shadow comparitor
1281 * | | |
1282 * v v v
1283 * (tex <type> <sampler> <coordinate> 0 1 ( ))
1284 * (txb <type> <sampler> <coordinate> 0 1 ( ) <bias>)
1285 * (txl <type> <sampler> <coordinate> 0 1 ( ) <lod>)
1286 * (txd <type> <sampler> <coordinate> 0 1 ( ) (dPdx dPdy))
1287 * (txf <type> <sampler> <coordinate> 0 <lod>)
1288 * (txs <type> <sampler> <lod>)
1289 */
1290 class ir_texture : public ir_rvalue {
1291 public:
1292 ir_texture(enum ir_texture_opcode op)
1293 : op(op), projector(NULL), shadow_comparitor(NULL), offset(NULL)
1294 {
1295 this->ir_type = ir_type_texture;
1296 }
1297
1298 virtual ir_texture *clone(void *mem_ctx, struct hash_table *) const;
1299
1300 virtual ir_constant *constant_expression_value();
1301
1302 virtual void accept(ir_visitor *v)
1303 {
1304 v->visit(this);
1305 }
1306
1307 virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1308
1309 /**
1310 * Return a string representing the ir_texture_opcode.
1311 */
1312 const char *opcode_string();
1313
1314 /** Set the sampler and type. */
1315 void set_sampler(ir_dereference *sampler, const glsl_type *type);
1316
1317 /**
1318 * Do a reverse-lookup to translate a string into an ir_texture_opcode.
1319 */
1320 static ir_texture_opcode get_opcode(const char *);
1321
1322 enum ir_texture_opcode op;
1323
1324 /** Sampler to use for the texture access. */
1325 ir_dereference *sampler;
1326
1327 /** Texture coordinate to sample */
1328 ir_rvalue *coordinate;
1329
1330 /**
1331 * Value used for projective divide.
1332 *
1333 * If there is no projective divide (the common case), this will be
1334 * \c NULL. Optimization passes should check for this to point to a constant
1335 * of 1.0 and replace that with \c NULL.
1336 */
1337 ir_rvalue *projector;
1338
1339 /**
1340 * Coordinate used for comparison on shadow look-ups.
1341 *
1342 * If there is no shadow comparison, this will be \c NULL. For the
1343 * \c ir_txf opcode, this *must* be \c NULL.
1344 */
1345 ir_rvalue *shadow_comparitor;
1346
1347 /** Texel offset. */
1348 ir_rvalue *offset;
1349
1350 union {
1351 ir_rvalue *lod; /**< Floating point LOD */
1352 ir_rvalue *bias; /**< Floating point LOD bias */
1353 struct {
1354 ir_rvalue *dPdx; /**< Partial derivative of coordinate wrt X */
1355 ir_rvalue *dPdy; /**< Partial derivative of coordinate wrt Y */
1356 } grad;
1357 } lod_info;
1358 };
1359
1360
1361 struct ir_swizzle_mask {
1362 unsigned x:2;
1363 unsigned y:2;
1364 unsigned z:2;
1365 unsigned w:2;
1366
1367 /**
1368 * Number of components in the swizzle.
1369 */
1370 unsigned num_components:3;
1371
1372 /**
1373 * Does the swizzle contain duplicate components?
1374 *
1375 * L-value swizzles cannot contain duplicate components.
1376 */
1377 unsigned has_duplicates:1;
1378 };
1379
1380
1381 class ir_swizzle : public ir_rvalue {
1382 public:
1383 ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w,
1384 unsigned count);
1385
1386 ir_swizzle(ir_rvalue *val, const unsigned *components, unsigned count);
1387
1388 ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask);
1389
1390 virtual ir_swizzle *clone(void *mem_ctx, struct hash_table *) const;
1391
1392 virtual ir_constant *constant_expression_value();
1393
1394 virtual ir_swizzle *as_swizzle()
1395 {
1396 return this;
1397 }
1398
1399 /**
1400 * Construct an ir_swizzle from the textual representation. Can fail.
1401 */
1402 static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length);
1403
1404 virtual void accept(ir_visitor *v)
1405 {
1406 v->visit(this);
1407 }
1408
1409 virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1410
1411 bool is_lvalue() const
1412 {
1413 return val->is_lvalue() && !mask.has_duplicates;
1414 }
1415
1416 /**
1417 * Get the variable that is ultimately referenced by an r-value
1418 */
1419 virtual ir_variable *variable_referenced() const;
1420
1421 ir_rvalue *val;
1422 ir_swizzle_mask mask;
1423
1424 private:
1425 /**
1426 * Initialize the mask component of a swizzle
1427 *
1428 * This is used by the \c ir_swizzle constructors.
1429 */
1430 void init_mask(const unsigned *components, unsigned count);
1431 };
1432
1433
1434 class ir_dereference : public ir_rvalue {
1435 public:
1436 virtual ir_dereference *clone(void *mem_ctx, struct hash_table *) const = 0;
1437
1438 virtual ir_dereference *as_dereference()
1439 {
1440 return this;
1441 }
1442
1443 bool is_lvalue() const;
1444
1445 /**
1446 * Get the variable that is ultimately referenced by an r-value
1447 */
1448 virtual ir_variable *variable_referenced() const = 0;
1449 };
1450
1451
1452 class ir_dereference_variable : public ir_dereference {
1453 public:
1454 ir_dereference_variable(ir_variable *var);
1455
1456 virtual ir_dereference_variable *clone(void *mem_ctx,
1457 struct hash_table *) const;
1458
1459 virtual ir_constant *constant_expression_value();
1460
1461 virtual ir_dereference_variable *as_dereference_variable()
1462 {
1463 return this;
1464 }
1465
1466 /**
1467 * Get the variable that is ultimately referenced by an r-value
1468 */
1469 virtual ir_variable *variable_referenced() const
1470 {
1471 return this->var;
1472 }
1473
1474 virtual ir_variable *whole_variable_referenced()
1475 {
1476 /* ir_dereference_variable objects always dereference the entire
1477 * variable. However, if this dereference is dereferenced by anything
1478 * else, the complete deferefernce chain is not a whole-variable
1479 * dereference. This method should only be called on the top most
1480 * ir_rvalue in a dereference chain.
1481 */
1482 return this->var;
1483 }
1484
1485 virtual void accept(ir_visitor *v)
1486 {
1487 v->visit(this);
1488 }
1489
1490 virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1491
1492 /**
1493 * Object being dereferenced.
1494 */
1495 ir_variable *var;
1496 };
1497
1498
1499 class ir_dereference_array : public ir_dereference {
1500 public:
1501 ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index);
1502
1503 ir_dereference_array(ir_variable *var, ir_rvalue *array_index);
1504
1505 virtual ir_dereference_array *clone(void *mem_ctx,
1506 struct hash_table *) const;
1507
1508 virtual ir_constant *constant_expression_value();
1509
1510 virtual ir_dereference_array *as_dereference_array()
1511 {
1512 return this;
1513 }
1514
1515 /**
1516 * Get the variable that is ultimately referenced by an r-value
1517 */
1518 virtual ir_variable *variable_referenced() const
1519 {
1520 return this->array->variable_referenced();
1521 }
1522
1523 virtual void accept(ir_visitor *v)
1524 {
1525 v->visit(this);
1526 }
1527
1528 virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1529
1530 ir_rvalue *array;
1531 ir_rvalue *array_index;
1532
1533 private:
1534 void set_array(ir_rvalue *value);
1535 };
1536
1537
1538 class ir_dereference_record : public ir_dereference {
1539 public:
1540 ir_dereference_record(ir_rvalue *value, const char *field);
1541
1542 ir_dereference_record(ir_variable *var, const char *field);
1543
1544 virtual ir_dereference_record *clone(void *mem_ctx,
1545 struct hash_table *) const;
1546
1547 virtual ir_constant *constant_expression_value();
1548
1549 /**
1550 * Get the variable that is ultimately referenced by an r-value
1551 */
1552 virtual ir_variable *variable_referenced() const
1553 {
1554 return this->record->variable_referenced();
1555 }
1556
1557 virtual void accept(ir_visitor *v)
1558 {
1559 v->visit(this);
1560 }
1561
1562 virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1563
1564 ir_rvalue *record;
1565 const char *field;
1566 };
1567
1568
1569 /**
1570 * Data stored in an ir_constant
1571 */
1572 union ir_constant_data {
1573 unsigned u[16];
1574 int i[16];
1575 float f[16];
1576 bool b[16];
1577 };
1578
1579
1580 class ir_constant : public ir_rvalue {
1581 public:
1582 ir_constant(const struct glsl_type *type, const ir_constant_data *data);
1583 ir_constant(bool b);
1584 ir_constant(unsigned int u);
1585 ir_constant(int i);
1586 ir_constant(float f);
1587
1588 /**
1589 * Construct an ir_constant from a list of ir_constant values
1590 */
1591 ir_constant(const struct glsl_type *type, exec_list *values);
1592
1593 /**
1594 * Construct an ir_constant from a scalar component of another ir_constant
1595 *
1596 * The new \c ir_constant inherits the type of the component from the
1597 * source constant.
1598 *
1599 * \note
1600 * In the case of a matrix constant, the new constant is a scalar, \b not
1601 * a vector.
1602 */
1603 ir_constant(const ir_constant *c, unsigned i);
1604
1605 /**
1606 * Return a new ir_constant of the specified type containing all zeros.
1607 */
1608 static ir_constant *zero(void *mem_ctx, const glsl_type *type);
1609
1610 virtual ir_constant *clone(void *mem_ctx, struct hash_table *) const;
1611
1612 virtual ir_constant *constant_expression_value();
1613
1614 virtual ir_constant *as_constant()
1615 {
1616 return this;
1617 }
1618
1619 virtual void accept(ir_visitor *v)
1620 {
1621 v->visit(this);
1622 }
1623
1624 virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1625
1626 /**
1627 * Get a particular component of a constant as a specific type
1628 *
1629 * This is useful, for example, to get a value from an integer constant
1630 * as a float or bool. This appears frequently when constructors are
1631 * called with all constant parameters.
1632 */
1633 /*@{*/
1634 bool get_bool_component(unsigned i) const;
1635 float get_float_component(unsigned i) const;
1636 int get_int_component(unsigned i) const;
1637 unsigned get_uint_component(unsigned i) const;
1638 /*@}*/
1639
1640 ir_constant *get_array_element(unsigned i) const;
1641
1642 ir_constant *get_record_field(const char *name);
1643
1644 /**
1645 * Determine whether a constant has the same value as another constant
1646 *
1647 * \sa ir_constant::is_zero, ir_constant::is_one,
1648 * ir_constant::is_negative_one
1649 */
1650 bool has_value(const ir_constant *) const;
1651
1652 virtual bool is_zero() const;
1653 virtual bool is_one() const;
1654 virtual bool is_negative_one() const;
1655
1656 /**
1657 * Value of the constant.
1658 *
1659 * The field used to back the values supplied by the constant is determined
1660 * by the type associated with the \c ir_instruction. Constants may be
1661 * scalars, vectors, or matrices.
1662 */
1663 union ir_constant_data value;
1664
1665 /* Array elements */
1666 ir_constant **array_elements;
1667
1668 /* Structure fields */
1669 exec_list components;
1670
1671 private:
1672 /**
1673 * Parameterless constructor only used by the clone method
1674 */
1675 ir_constant(void);
1676 };
1677
1678 /*@}*/
1679
1680 /**
1681 * Apply a visitor to each IR node in a list
1682 */
1683 void
1684 visit_exec_list(exec_list *list, ir_visitor *visitor);
1685
1686 /**
1687 * Validate invariants on each IR node in a list
1688 */
1689 void validate_ir_tree(exec_list *instructions);
1690
1691 struct _mesa_glsl_parse_state;
1692 struct gl_shader_program;
1693
1694 /**
1695 * Detect whether an unlinked shader contains static recursion
1696 *
1697 * If the list of instructions is determined to contain static recursion,
1698 * \c _mesa_glsl_error will be called to emit error messages for each function
1699 * that is in the recursion cycle.
1700 */
1701 void
1702 detect_recursion_unlinked(struct _mesa_glsl_parse_state *state,
1703 exec_list *instructions);
1704
1705 /**
1706 * Detect whether a linked shader contains static recursion
1707 *
1708 * If the list of instructions is determined to contain static recursion,
1709 * \c link_error_printf will be called to emit error messages for each function
1710 * that is in the recursion cycle. In addition,
1711 * \c gl_shader_program::LinkStatus will be set to false.
1712 */
1713 void
1714 detect_recursion_linked(struct gl_shader_program *prog,
1715 exec_list *instructions);
1716
1717 /**
1718 * Make a clone of each IR instruction in a list
1719 *
1720 * \param in List of IR instructions that are to be cloned
1721 * \param out List to hold the cloned instructions
1722 */
1723 void
1724 clone_ir_list(void *mem_ctx, exec_list *out, const exec_list *in);
1725
1726 extern void
1727 _mesa_glsl_initialize_variables(exec_list *instructions,
1728 struct _mesa_glsl_parse_state *state);
1729
1730 extern void
1731 _mesa_glsl_initialize_functions(_mesa_glsl_parse_state *state);
1732
1733 extern void
1734 _mesa_glsl_release_functions(void);
1735
1736 extern void
1737 reparent_ir(exec_list *list, void *mem_ctx);
1738
1739 struct glsl_symbol_table;
1740
1741 extern void
1742 import_prototypes(const exec_list *source, exec_list *dest,
1743 struct glsl_symbol_table *symbols, void *mem_ctx);
1744
1745 extern bool
1746 ir_has_call(ir_instruction *ir);
1747
1748 extern void
1749 do_set_program_inouts(exec_list *instructions, struct gl_program *prog,
1750 bool is_fragment_shader);
1751
1752 extern char *
1753 prototype_string(const glsl_type *return_type, const char *name,
1754 exec_list *parameters);
1755
1756 #endif /* IR_H */