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