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