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