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