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