Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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