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