Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright © 2014 Connor Abbott
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a
  5.  * copy of this software and associated documentation files (the "Software"),
  6.  * to deal in the Software without restriction, including without limitation
  7.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8.  * and/or sell copies of the Software, and to permit persons to whom the
  9.  * Software is furnished to do so, subject to the following conditions:
  10.  *
  11.  * The above copyright notice and this permission notice (including the next
  12.  * paragraph) shall be included in all copies or substantial portions of the
  13.  * Software.
  14.  *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  21.  * IN THE SOFTWARE.
  22.  *
  23.  * Authors:
  24.  *    Connor Abbott (cwabbott0@gmail.com)
  25.  *
  26.  */
  27.  
  28. #pragma once
  29.  
  30. #include "util/hash_table.h"
  31. #include "../list.h"
  32. #include "GL/gl.h" /* GLenum */
  33. #include "util/list.h"
  34. #include "util/ralloc.h"
  35. #include "util/set.h"
  36. #include "util/bitset.h"
  37. #include "nir_types.h"
  38. #include "glsl/shader_enums.h"
  39. #include <stdio.h>
  40.  
  41. #include "nir_opcodes.h"
  42.  
  43. #ifdef __cplusplus
  44. extern "C" {
  45. #endif
  46.  
  47. struct gl_program;
  48. struct gl_shader_program;
  49.  
  50. #define NIR_FALSE 0u
  51. #define NIR_TRUE (~0u)
  52.  
  53. /** Defines a cast function
  54.  *
  55.  * This macro defines a cast function from in_type to out_type where
  56.  * out_type is some structure type that contains a field of type out_type.
  57.  *
  58.  * Note that you have to be a bit careful as the generated cast function
  59.  * destroys constness.
  60.  */
  61. #define NIR_DEFINE_CAST(name, in_type, out_type, field)  \
  62. static inline out_type *                                 \
  63. name(const in_type *parent)                              \
  64. {                                                        \
  65.    return exec_node_data(out_type, parent, field);       \
  66. }
  67.  
  68. struct nir_function_overload;
  69. struct nir_function;
  70. struct nir_shader;
  71. struct nir_instr;
  72.  
  73.  
  74. /**
  75.  * Description of built-in state associated with a uniform
  76.  *
  77.  * \sa nir_variable::state_slots
  78.  */
  79. typedef struct {
  80.    int tokens[5];
  81.    int swizzle;
  82. } nir_state_slot;
  83.  
  84. typedef enum {
  85.    nir_var_shader_in,
  86.    nir_var_shader_out,
  87.    nir_var_global,
  88.    nir_var_local,
  89.    nir_var_uniform,
  90.    nir_var_system_value
  91. } nir_variable_mode;
  92.  
  93. /**
  94.  * Data stored in an nir_constant
  95.  */
  96. union nir_constant_data {
  97.    unsigned u[16];
  98.    int i[16];
  99.    float f[16];
  100.    bool b[16];
  101. };
  102.  
  103. typedef struct nir_constant {
  104.    /**
  105.     * Value of the constant.
  106.     *
  107.     * The field used to back the values supplied by the constant is determined
  108.     * by the type associated with the \c nir_variable.  Constants may be
  109.     * scalars, vectors, or matrices.
  110.     */
  111.    union nir_constant_data value;
  112.  
  113.    /* Array elements / Structure Fields */
  114.    struct nir_constant **elements;
  115. } nir_constant;
  116.  
  117. /**
  118.  * \brief Layout qualifiers for gl_FragDepth.
  119.  *
  120.  * The AMD/ARB_conservative_depth extensions allow gl_FragDepth to be redeclared
  121.  * with a layout qualifier.
  122.  */
  123. typedef enum {
  124.     nir_depth_layout_none, /**< No depth layout is specified. */
  125.     nir_depth_layout_any,
  126.     nir_depth_layout_greater,
  127.     nir_depth_layout_less,
  128.     nir_depth_layout_unchanged
  129. } nir_depth_layout;
  130.  
  131. /**
  132.  * Either a uniform, global variable, shader input, or shader output. Based on
  133.  * ir_variable - it should be easy to translate between the two.
  134.  */
  135.  
  136. typedef struct {
  137.    struct exec_node node;
  138.  
  139.    /**
  140.     * Declared type of the variable
  141.     */
  142.    const struct glsl_type *type;
  143.  
  144.    /**
  145.     * Declared name of the variable
  146.     */
  147.    char *name;
  148.  
  149.    /**
  150.     * For variables which satisfy the is_interface_instance() predicate, this
  151.     * points to an array of integers such that if the ith member of the
  152.     * interface block is an array, max_ifc_array_access[i] is the maximum
  153.     * array element of that member that has been accessed.  If the ith member
  154.     * of the interface block is not an array, max_ifc_array_access[i] is
  155.     * unused.
  156.     *
  157.     * For variables whose type is not an interface block, this pointer is
  158.     * NULL.
  159.     */
  160.    unsigned *max_ifc_array_access;
  161.  
  162.    struct nir_variable_data {
  163.  
  164.       /**
  165.        * Is the variable read-only?
  166.        *
  167.        * This is set for variables declared as \c const, shader inputs,
  168.        * and uniforms.
  169.        */
  170.       unsigned read_only:1;
  171.       unsigned centroid:1;
  172.       unsigned sample:1;
  173.       unsigned invariant:1;
  174.  
  175.       /**
  176.        * Storage class of the variable.
  177.        *
  178.        * \sa nir_variable_mode
  179.        */
  180.       nir_variable_mode mode:4;
  181.  
  182.       /**
  183.        * Interpolation mode for shader inputs / outputs
  184.        *
  185.        * \sa glsl_interp_qualifier
  186.        */
  187.       unsigned interpolation:2;
  188.  
  189.       /**
  190.        * \name ARB_fragment_coord_conventions
  191.        * @{
  192.        */
  193.       unsigned origin_upper_left:1;
  194.       unsigned pixel_center_integer:1;
  195.       /*@}*/
  196.  
  197.       /**
  198.        * Was the location explicitly set in the shader?
  199.        *
  200.        * If the location is explicitly set in the shader, it \b cannot be changed
  201.        * by the linker or by the API (e.g., calls to \c glBindAttribLocation have
  202.        * no effect).
  203.        */
  204.       unsigned explicit_location:1;
  205.       unsigned explicit_index:1;
  206.  
  207.       /**
  208.        * Was an initial binding explicitly set in the shader?
  209.        *
  210.        * If so, constant_initializer contains an integer nir_constant
  211.        * representing the initial binding point.
  212.        */
  213.       unsigned explicit_binding:1;
  214.  
  215.       /**
  216.        * Does this variable have an initializer?
  217.        *
  218.        * This is used by the linker to cross-validiate initializers of global
  219.        * variables.
  220.        */
  221.       unsigned has_initializer:1;
  222.  
  223.       /**
  224.        * Is this variable a generic output or input that has not yet been matched
  225.        * up to a variable in another stage of the pipeline?
  226.        *
  227.        * This is used by the linker as scratch storage while assigning locations
  228.        * to generic inputs and outputs.
  229.        */
  230.       unsigned is_unmatched_generic_inout:1;
  231.  
  232.       /**
  233.        * If non-zero, then this variable may be packed along with other variables
  234.        * into a single varying slot, so this offset should be applied when
  235.        * accessing components.  For example, an offset of 1 means that the x
  236.        * component of this variable is actually stored in component y of the
  237.        * location specified by \c location.
  238.        */
  239.       unsigned location_frac:2;
  240.  
  241.       /**
  242.        * Non-zero if this variable was created by lowering a named interface
  243.        * block which was not an array.
  244.        *
  245.        * Note that this variable and \c from_named_ifc_block_array will never
  246.        * both be non-zero.
  247.        */
  248.       unsigned from_named_ifc_block_nonarray:1;
  249.  
  250.       /**
  251.        * Non-zero if this variable was created by lowering a named interface
  252.        * block which was an array.
  253.        *
  254.        * Note that this variable and \c from_named_ifc_block_nonarray will never
  255.        * both be non-zero.
  256.        */
  257.       unsigned from_named_ifc_block_array:1;
  258.  
  259.       /**
  260.        * \brief Layout qualifier for gl_FragDepth.
  261.        *
  262.        * This is not equal to \c ir_depth_layout_none if and only if this
  263.        * variable is \c gl_FragDepth and a layout qualifier is specified.
  264.        */
  265.       nir_depth_layout depth_layout;
  266.  
  267.       /**
  268.        * Storage location of the base of this variable
  269.        *
  270.        * The precise meaning of this field depends on the nature of the variable.
  271.        *
  272.        *   - Vertex shader input: one of the values from \c gl_vert_attrib.
  273.        *   - Vertex shader output: one of the values from \c gl_varying_slot.
  274.        *   - Geometry shader input: one of the values from \c gl_varying_slot.
  275.        *   - Geometry shader output: one of the values from \c gl_varying_slot.
  276.        *   - Fragment shader input: one of the values from \c gl_varying_slot.
  277.        *   - Fragment shader output: one of the values from \c gl_frag_result.
  278.        *   - Uniforms: Per-stage uniform slot number for default uniform block.
  279.        *   - Uniforms: Index within the uniform block definition for UBO members.
  280.        *   - Other: This field is not currently used.
  281.        *
  282.        * If the variable is a uniform, shader input, or shader output, and the
  283.        * slot has not been assigned, the value will be -1.
  284.        */
  285.       int location;
  286.  
  287.       /**
  288.        * The actual location of the variable in the IR. Only valid for inputs
  289.        * and outputs.
  290.        */
  291.       unsigned int driver_location;
  292.  
  293.       /**
  294.        * output index for dual source blending.
  295.        */
  296.       int index;
  297.  
  298.       /**
  299.        * Initial binding point for a sampler or UBO.
  300.        *
  301.        * For array types, this represents the binding point for the first element.
  302.        */
  303.       int binding;
  304.  
  305.       /**
  306.        * Location an atomic counter is stored at.
  307.        */
  308.       struct {
  309.          unsigned buffer_index;
  310.          unsigned offset;
  311.       } atomic;
  312.  
  313.       /**
  314.        * ARB_shader_image_load_store qualifiers.
  315.        */
  316.       struct {
  317.          bool read_only; /**< "readonly" qualifier. */
  318.          bool write_only; /**< "writeonly" qualifier. */
  319.          bool coherent;
  320.          bool _volatile;
  321.          bool restrict_flag;
  322.  
  323.          /** Image internal format if specified explicitly, otherwise GL_NONE. */
  324.          GLenum format;
  325.       } image;
  326.  
  327.       /**
  328.        * Highest element accessed with a constant expression array index
  329.        *
  330.        * Not used for non-array variables.
  331.        */
  332.       unsigned max_array_access;
  333.  
  334.    } data;
  335.  
  336.    /**
  337.     * Built-in state that backs this uniform
  338.     *
  339.     * Once set at variable creation, \c state_slots must remain invariant.
  340.     * This is because, ideally, this array would be shared by all clones of
  341.     * this variable in the IR tree.  In other words, we'd really like for it
  342.     * to be a fly-weight.
  343.     *
  344.     * If the variable is not a uniform, \c num_state_slots will be zero and
  345.     * \c state_slots will be \c NULL.
  346.     */
  347.    /*@{*/
  348.    unsigned num_state_slots;    /**< Number of state slots used */
  349.    nir_state_slot *state_slots;  /**< State descriptors. */
  350.    /*@}*/
  351.  
  352.    /**
  353.     * Constant expression assigned in the initializer of the variable
  354.     */
  355.    nir_constant *constant_initializer;
  356.  
  357.    /**
  358.     * For variables that are in an interface block or are an instance of an
  359.     * interface block, this is the \c GLSL_TYPE_INTERFACE type for that block.
  360.     *
  361.     * \sa ir_variable::location
  362.     */
  363.    const struct glsl_type *interface_type;
  364. } nir_variable;
  365.  
  366. typedef struct {
  367.    struct exec_node node;
  368.  
  369.    unsigned num_components; /** < number of vector components */
  370.    unsigned num_array_elems; /** < size of array (0 for no array) */
  371.  
  372.    /** generic register index. */
  373.    unsigned index;
  374.  
  375.    /** only for debug purposes, can be NULL */
  376.    const char *name;
  377.  
  378.    /** whether this register is local (per-function) or global (per-shader) */
  379.    bool is_global;
  380.  
  381.    /**
  382.     * If this flag is set to true, then accessing channels >= num_components
  383.     * is well-defined, and simply spills over to the next array element. This
  384.     * is useful for backends that can do per-component accessing, in
  385.     * particular scalar backends. By setting this flag and making
  386.     * num_components equal to 1, structures can be packed tightly into
  387.     * registers and then registers can be accessed per-component to get to
  388.     * each structure member, even if it crosses vec4 boundaries.
  389.     */
  390.    bool is_packed;
  391.  
  392.    /**
  393.     * If this pointer is non-NULL then this register has exactly one
  394.     * definition and that definition dominates all of its uses.  This is
  395.     * set by the out-of-SSA pass so that backends can get SSA-like
  396.     * information even once they have gone out of SSA.
  397.     */
  398.    struct nir_instr *parent_instr;
  399.  
  400.    /** set of nir_instr's where this register is used (read from) */
  401.    struct list_head uses;
  402.  
  403.    /** set of nir_instr's where this register is defined (written to) */
  404.    struct list_head defs;
  405.  
  406.    /** set of nir_if's where this register is used as a condition */
  407.    struct list_head if_uses;
  408. } nir_register;
  409.  
  410. typedef enum {
  411.    nir_instr_type_alu,
  412.    nir_instr_type_call,
  413.    nir_instr_type_tex,
  414.    nir_instr_type_intrinsic,
  415.    nir_instr_type_load_const,
  416.    nir_instr_type_jump,
  417.    nir_instr_type_ssa_undef,
  418.    nir_instr_type_phi,
  419.    nir_instr_type_parallel_copy,
  420. } nir_instr_type;
  421.  
  422. typedef struct nir_instr {
  423.    struct exec_node node;
  424.    nir_instr_type type;
  425.    struct nir_block *block;
  426.  
  427.    /* A temporary for optimization and analysis passes to use for storing
  428.     * flags.  For instance, DCE uses this to store the "dead/live" info.
  429.     */
  430.    uint8_t pass_flags;
  431. } nir_instr;
  432.  
  433. static inline nir_instr *
  434. nir_instr_next(nir_instr *instr)
  435. {
  436.    struct exec_node *next = exec_node_get_next(&instr->node);
  437.    if (exec_node_is_tail_sentinel(next))
  438.       return NULL;
  439.    else
  440.       return exec_node_data(nir_instr, next, node);
  441. }
  442.  
  443. static inline nir_instr *
  444. nir_instr_prev(nir_instr *instr)
  445. {
  446.    struct exec_node *prev = exec_node_get_prev(&instr->node);
  447.    if (exec_node_is_head_sentinel(prev))
  448.       return NULL;
  449.    else
  450.       return exec_node_data(nir_instr, prev, node);
  451. }
  452.  
  453. typedef struct {
  454.    /** for debugging only, can be NULL */
  455.    const char* name;
  456.  
  457.    /** generic SSA definition index. */
  458.    unsigned index;
  459.  
  460.    /** Index into the live_in and live_out bitfields */
  461.    unsigned live_index;
  462.  
  463.    nir_instr *parent_instr;
  464.  
  465.    /** set of nir_instr's where this register is used (read from) */
  466.    struct list_head uses;
  467.  
  468.    /** set of nir_if's where this register is used as a condition */
  469.    struct list_head if_uses;
  470.  
  471.    uint8_t num_components;
  472. } nir_ssa_def;
  473.  
  474. struct nir_src;
  475.  
  476. typedef struct {
  477.    nir_register *reg;
  478.    struct nir_src *indirect; /** < NULL for no indirect offset */
  479.    unsigned base_offset;
  480.  
  481.    /* TODO use-def chain goes here */
  482. } nir_reg_src;
  483.  
  484. typedef struct {
  485.    nir_instr *parent_instr;
  486.    struct list_head def_link;
  487.  
  488.    nir_register *reg;
  489.    struct nir_src *indirect; /** < NULL for no indirect offset */
  490.    unsigned base_offset;
  491.  
  492.    /* TODO def-use chain goes here */
  493. } nir_reg_dest;
  494.  
  495. struct nir_if;
  496.  
  497. typedef struct nir_src {
  498.    union {
  499.       nir_instr *parent_instr;
  500.       struct nir_if *parent_if;
  501.    };
  502.  
  503.    struct list_head use_link;
  504.  
  505.    union {
  506.       nir_reg_src reg;
  507.       nir_ssa_def *ssa;
  508.    };
  509.  
  510.    bool is_ssa;
  511. } nir_src;
  512.  
  513. #define NIR_SRC_INIT (nir_src) { { NULL } }
  514.  
  515. #define nir_foreach_use(reg_or_ssa_def, src) \
  516.    list_for_each_entry(nir_src, src, &(reg_or_ssa_def)->uses, use_link)
  517.  
  518. #define nir_foreach_use_safe(reg_or_ssa_def, src) \
  519.    list_for_each_entry_safe(nir_src, src, &(reg_or_ssa_def)->uses, use_link)
  520.  
  521. #define nir_foreach_if_use(reg_or_ssa_def, src) \
  522.    list_for_each_entry(nir_src, src, &(reg_or_ssa_def)->if_uses, use_link)
  523.  
  524. #define nir_foreach_if_use_safe(reg_or_ssa_def, src) \
  525.    list_for_each_entry_safe(nir_src, src, &(reg_or_ssa_def)->if_uses, use_link)
  526.  
  527. typedef struct {
  528.    union {
  529.       nir_reg_dest reg;
  530.       nir_ssa_def ssa;
  531.    };
  532.  
  533.    bool is_ssa;
  534. } nir_dest;
  535.  
  536. #define NIR_DEST_INIT (nir_dest) { { { NULL } } }
  537.  
  538. #define nir_foreach_def(reg, dest) \
  539.    list_for_each_entry(nir_dest, dest, &(reg)->defs, reg.def_link)
  540.  
  541. #define nir_foreach_def_safe(reg, dest) \
  542.    list_for_each_entry_safe(nir_dest, dest, &(reg)->defs, reg.def_link)
  543.  
  544. static inline nir_src
  545. nir_src_for_ssa(nir_ssa_def *def)
  546. {
  547.    nir_src src = NIR_SRC_INIT;
  548.  
  549.    src.is_ssa = true;
  550.    src.ssa = def;
  551.  
  552.    return src;
  553. }
  554.  
  555. static inline nir_src
  556. nir_src_for_reg(nir_register *reg)
  557. {
  558.    nir_src src = NIR_SRC_INIT;
  559.  
  560.    src.is_ssa = false;
  561.    src.reg.reg = reg;
  562.    src.reg.indirect = NULL;
  563.    src.reg.base_offset = 0;
  564.  
  565.    return src;
  566. }
  567.  
  568. static inline nir_instr *
  569. nir_src_get_parent_instr(const nir_src *src)
  570. {
  571.    if (src->is_ssa) {
  572.       return src->ssa->parent_instr;
  573.    } else {
  574.       return src->reg.reg->parent_instr;
  575.    }
  576. }
  577.  
  578. static inline nir_dest
  579. nir_dest_for_reg(nir_register *reg)
  580. {
  581.    nir_dest dest = NIR_DEST_INIT;
  582.  
  583.    dest.reg.reg = reg;
  584.  
  585.    return dest;
  586. }
  587.  
  588. void nir_src_copy(nir_src *dest, const nir_src *src, void *mem_ctx);
  589. void nir_dest_copy(nir_dest *dest, const nir_dest *src, void *mem_ctx);
  590.  
  591. typedef struct {
  592.    nir_src src;
  593.  
  594.    /**
  595.     * \name input modifiers
  596.     */
  597.    /*@{*/
  598.    /**
  599.     * For inputs interpreted as floating point, flips the sign bit. For
  600.     * inputs interpreted as integers, performs the two's complement negation.
  601.     */
  602.    bool negate;
  603.  
  604.    /**
  605.     * Clears the sign bit for floating point values, and computes the integer
  606.     * absolute value for integers. Note that the negate modifier acts after
  607.     * the absolute value modifier, therefore if both are set then all inputs
  608.     * will become negative.
  609.     */
  610.    bool abs;
  611.    /*@}*/
  612.  
  613.    /**
  614.     * For each input component, says which component of the register it is
  615.     * chosen from. Note that which elements of the swizzle are used and which
  616.     * are ignored are based on the write mask for most opcodes - for example,
  617.     * a statement like "foo.xzw = bar.zyx" would have a writemask of 1101b and
  618.     * a swizzle of {2, x, 1, 0} where x means "don't care."
  619.     */
  620.    uint8_t swizzle[4];
  621. } nir_alu_src;
  622.  
  623. typedef struct {
  624.    nir_dest dest;
  625.  
  626.    /**
  627.     * \name saturate output modifier
  628.     *
  629.     * Only valid for opcodes that output floating-point numbers. Clamps the
  630.     * output to between 0.0 and 1.0 inclusive.
  631.     */
  632.  
  633.    bool saturate;
  634.  
  635.    unsigned write_mask : 4; /* ignored if dest.is_ssa is true */
  636. } nir_alu_dest;
  637.  
  638. void nir_alu_src_copy(nir_alu_src *dest, const nir_alu_src *src, void *mem_ctx);
  639. void nir_alu_dest_copy(nir_alu_dest *dest, const nir_alu_dest *src,
  640.                        void *mem_ctx);
  641.  
  642. typedef enum {
  643.    nir_type_invalid = 0, /* Not a valid type */
  644.    nir_type_float,
  645.    nir_type_int,
  646.    nir_type_unsigned,
  647.    nir_type_bool
  648. } nir_alu_type;
  649.  
  650. typedef enum {
  651.    NIR_OP_IS_COMMUTATIVE = (1 << 0),
  652.    NIR_OP_IS_ASSOCIATIVE = (1 << 1),
  653. } nir_op_algebraic_property;
  654.  
  655. typedef struct {
  656.    const char *name;
  657.  
  658.    unsigned num_inputs;
  659.  
  660.    /**
  661.     * The number of components in the output
  662.     *
  663.     * If non-zero, this is the size of the output and input sizes are
  664.     * explicitly given; swizzle and writemask are still in effect, but if
  665.     * the output component is masked out, then the input component may
  666.     * still be in use.
  667.     *
  668.     * If zero, the opcode acts in the standard, per-component manner; the
  669.     * operation is performed on each component (except the ones that are
  670.     * masked out) with the input being taken from the input swizzle for
  671.     * that component.
  672.     *
  673.     * The size of some of the inputs may be given (i.e. non-zero) even
  674.     * though output_size is zero; in that case, the inputs with a zero
  675.     * size act per-component, while the inputs with non-zero size don't.
  676.     */
  677.    unsigned output_size;
  678.  
  679.    /**
  680.     * The type of vector that the instruction outputs. Note that the
  681.     * staurate modifier is only allowed on outputs with the float type.
  682.     */
  683.  
  684.    nir_alu_type output_type;
  685.  
  686.    /**
  687.     * The number of components in each input
  688.     */
  689.    unsigned input_sizes[4];
  690.  
  691.    /**
  692.     * The type of vector that each input takes. Note that negate and
  693.     * absolute value are only allowed on inputs with int or float type and
  694.     * behave differently on the two.
  695.     */
  696.    nir_alu_type input_types[4];
  697.  
  698.    nir_op_algebraic_property algebraic_properties;
  699. } nir_op_info;
  700.  
  701. extern const nir_op_info nir_op_infos[nir_num_opcodes];
  702.  
  703. typedef struct nir_alu_instr {
  704.    nir_instr instr;
  705.    nir_op op;
  706.    nir_alu_dest dest;
  707.    nir_alu_src src[];
  708. } nir_alu_instr;
  709.  
  710. /* is this source channel used? */
  711. static inline bool
  712. nir_alu_instr_channel_used(nir_alu_instr *instr, unsigned src, unsigned channel)
  713. {
  714.    if (nir_op_infos[instr->op].input_sizes[src] > 0)
  715.       return channel < nir_op_infos[instr->op].input_sizes[src];
  716.  
  717.    return (instr->dest.write_mask >> channel) & 1;
  718. }
  719.  
  720. /*
  721.  * For instructions whose destinations are SSA, get the number of channels
  722.  * used for a source
  723.  */
  724. static inline unsigned
  725. nir_ssa_alu_instr_src_components(nir_alu_instr *instr, unsigned src)
  726. {
  727.    assert(instr->dest.dest.is_ssa);
  728.  
  729.    if (nir_op_infos[instr->op].input_sizes[src] > 0)
  730.       return nir_op_infos[instr->op].input_sizes[src];
  731.  
  732.    return instr->dest.dest.ssa.num_components;
  733. }
  734.  
  735. typedef enum {
  736.    nir_deref_type_var,
  737.    nir_deref_type_array,
  738.    nir_deref_type_struct
  739. } nir_deref_type;
  740.  
  741. typedef struct nir_deref {
  742.    nir_deref_type deref_type;
  743.    struct nir_deref *child;
  744.    const struct glsl_type *type;
  745. } nir_deref;
  746.  
  747. typedef struct {
  748.    nir_deref deref;
  749.  
  750.    nir_variable *var;
  751. } nir_deref_var;
  752.  
  753. /* This enum describes how the array is referenced.  If the deref is
  754.  * direct then the base_offset is used.  If the deref is indirect then then
  755.  * offset is given by base_offset + indirect.  If the deref is a wildcard
  756.  * then the deref refers to all of the elements of the array at the same
  757.  * time.  Wildcard dereferences are only ever allowed in copy_var
  758.  * intrinsics and the source and destination derefs must have matching
  759.  * wildcards.
  760.  */
  761. typedef enum {
  762.    nir_deref_array_type_direct,
  763.    nir_deref_array_type_indirect,
  764.    nir_deref_array_type_wildcard,
  765. } nir_deref_array_type;
  766.  
  767. typedef struct {
  768.    nir_deref deref;
  769.  
  770.    nir_deref_array_type deref_array_type;
  771.    unsigned base_offset;
  772.    nir_src indirect;
  773. } nir_deref_array;
  774.  
  775. typedef struct {
  776.    nir_deref deref;
  777.  
  778.    unsigned index;
  779. } nir_deref_struct;
  780.  
  781. NIR_DEFINE_CAST(nir_deref_as_var, nir_deref, nir_deref_var, deref)
  782. NIR_DEFINE_CAST(nir_deref_as_array, nir_deref, nir_deref_array, deref)
  783. NIR_DEFINE_CAST(nir_deref_as_struct, nir_deref, nir_deref_struct, deref)
  784.  
  785. typedef struct {
  786.    nir_instr instr;
  787.  
  788.    unsigned num_params;
  789.    nir_deref_var **params;
  790.    nir_deref_var *return_deref;
  791.  
  792.    struct nir_function_overload *callee;
  793. } nir_call_instr;
  794.  
  795. #define INTRINSIC(name, num_srcs, src_components, has_dest, dest_components, \
  796.                   num_variables, num_indices, flags) \
  797.    nir_intrinsic_##name,
  798.  
  799. #define LAST_INTRINSIC(name) nir_last_intrinsic = nir_intrinsic_##name,
  800.  
  801. typedef enum {
  802. #include "nir_intrinsics.h"
  803.    nir_num_intrinsics = nir_last_intrinsic + 1
  804. } nir_intrinsic_op;
  805.  
  806. #undef INTRINSIC
  807. #undef LAST_INTRINSIC
  808.  
  809. /** Represents an intrinsic
  810.  *
  811.  * An intrinsic is an instruction type for handling things that are
  812.  * more-or-less regular operations but don't just consume and produce SSA
  813.  * values like ALU operations do.  Intrinsics are not for things that have
  814.  * special semantic meaning such as phi nodes and parallel copies.
  815.  * Examples of intrinsics include variable load/store operations, system
  816.  * value loads, and the like.  Even though texturing more-or-less falls
  817.  * under this category, texturing is its own instruction type because
  818.  * trying to represent texturing with intrinsics would lead to a
  819.  * combinatorial explosion of intrinsic opcodes.
  820.  *
  821.  * By having a single instruction type for handling a lot of different
  822.  * cases, optimization passes can look for intrinsics and, for the most
  823.  * part, completely ignore them.  Each intrinsic type also has a few
  824.  * possible flags that govern whether or not they can be reordered or
  825.  * eliminated.  That way passes like dead code elimination can still work
  826.  * on intrisics without understanding the meaning of each.
  827.  *
  828.  * Each intrinsic has some number of constant indices, some number of
  829.  * variables, and some number of sources.  What these sources, variables,
  830.  * and indices mean depends on the intrinsic and is documented with the
  831.  * intrinsic declaration in nir_intrinsics.h.  Intrinsics and texture
  832.  * instructions are the only types of instruction that can operate on
  833.  * variables.
  834.  */
  835. typedef struct {
  836.    nir_instr instr;
  837.  
  838.    nir_intrinsic_op intrinsic;
  839.  
  840.    nir_dest dest;
  841.  
  842.    /** number of components if this is a vectorized intrinsic
  843.     *
  844.     * Similarly to ALU operations, some intrinsics are vectorized.
  845.     * An intrinsic is vectorized if nir_intrinsic_infos.dest_components == 0.
  846.     * For vectorized intrinsics, the num_components field specifies the
  847.     * number of destination components and the number of source components
  848.     * for all sources with nir_intrinsic_infos.src_components[i] == 0.
  849.     */
  850.    uint8_t num_components;
  851.  
  852.    int const_index[3];
  853.  
  854.    nir_deref_var *variables[2];
  855.  
  856.    nir_src src[];
  857. } nir_intrinsic_instr;
  858.  
  859. /**
  860.  * \name NIR intrinsics semantic flags
  861.  *
  862.  * information about what the compiler can do with the intrinsics.
  863.  *
  864.  * \sa nir_intrinsic_info::flags
  865.  */
  866. typedef enum {
  867.    /**
  868.     * whether the intrinsic can be safely eliminated if none of its output
  869.     * value is not being used.
  870.     */
  871.    NIR_INTRINSIC_CAN_ELIMINATE = (1 << 0),
  872.  
  873.    /**
  874.     * Whether the intrinsic can be reordered with respect to any other
  875.     * intrinsic, i.e. whether the only reordering dependencies of the
  876.     * intrinsic are due to the register reads/writes.
  877.     */
  878.    NIR_INTRINSIC_CAN_REORDER = (1 << 1),
  879. } nir_intrinsic_semantic_flag;
  880.  
  881. #define NIR_INTRINSIC_MAX_INPUTS 4
  882.  
  883. typedef struct {
  884.    const char *name;
  885.  
  886.    unsigned num_srcs; /** < number of register/SSA inputs */
  887.  
  888.    /** number of components of each input register
  889.     *
  890.     * If this value is 0, the number of components is given by the
  891.     * num_components field of nir_intrinsic_instr.
  892.     */
  893.    unsigned src_components[NIR_INTRINSIC_MAX_INPUTS];
  894.  
  895.    bool has_dest;
  896.  
  897.    /** number of components of the output register
  898.     *
  899.     * If this value is 0, the number of components is given by the
  900.     * num_components field of nir_intrinsic_instr.
  901.     */
  902.    unsigned dest_components;
  903.  
  904.    /** the number of inputs/outputs that are variables */
  905.    unsigned num_variables;
  906.  
  907.    /** the number of constant indices used by the intrinsic */
  908.    unsigned num_indices;
  909.  
  910.    /** semantic flags for calls to this intrinsic */
  911.    nir_intrinsic_semantic_flag flags;
  912. } nir_intrinsic_info;
  913.  
  914. extern const nir_intrinsic_info nir_intrinsic_infos[nir_num_intrinsics];
  915.  
  916. /**
  917.  * \group texture information
  918.  *
  919.  * This gives semantic information about textures which is useful to the
  920.  * frontend, the backend, and lowering passes, but not the optimizer.
  921.  */
  922.  
  923. typedef enum {
  924.    nir_tex_src_coord,
  925.    nir_tex_src_projector,
  926.    nir_tex_src_comparitor, /* shadow comparitor */
  927.    nir_tex_src_offset,
  928.    nir_tex_src_bias,
  929.    nir_tex_src_lod,
  930.    nir_tex_src_ms_index, /* MSAA sample index */
  931.    nir_tex_src_ddx,
  932.    nir_tex_src_ddy,
  933.    nir_tex_src_sampler_offset, /* < dynamically uniform indirect offset */
  934.    nir_num_tex_src_types
  935. } nir_tex_src_type;
  936.  
  937. typedef struct {
  938.    nir_src src;
  939.    nir_tex_src_type src_type;
  940. } nir_tex_src;
  941.  
  942. typedef enum {
  943.    nir_texop_tex,                /**< Regular texture look-up */
  944.    nir_texop_txb,                /**< Texture look-up with LOD bias */
  945.    nir_texop_txl,                /**< Texture look-up with explicit LOD */
  946.    nir_texop_txd,                /**< Texture look-up with partial derivatvies */
  947.    nir_texop_txf,                /**< Texel fetch with explicit LOD */
  948.    nir_texop_txf_ms,                /**< Multisample texture fetch */
  949.    nir_texop_txs,                /**< Texture size */
  950.    nir_texop_lod,                /**< Texture lod query */
  951.    nir_texop_tg4,                /**< Texture gather */
  952.    nir_texop_query_levels       /**< Texture levels query */
  953. } nir_texop;
  954.  
  955. typedef struct {
  956.    nir_instr instr;
  957.  
  958.    enum glsl_sampler_dim sampler_dim;
  959.    nir_alu_type dest_type;
  960.  
  961.    nir_texop op;
  962.    nir_dest dest;
  963.    nir_tex_src *src;
  964.    unsigned num_srcs, coord_components;
  965.    bool is_array, is_shadow;
  966.  
  967.    /**
  968.     * If is_shadow is true, whether this is the old-style shadow that outputs 4
  969.     * components or the new-style shadow that outputs 1 component.
  970.     */
  971.    bool is_new_style_shadow;
  972.  
  973.    /* constant offset - must be 0 if the offset source is used */
  974.    int const_offset[4];
  975.  
  976.    /* gather component selector */
  977.    unsigned component : 2;
  978.  
  979.    /** The sampler index
  980.     *
  981.     * If this texture instruction has a nir_tex_src_sampler_offset source,
  982.     * then the sampler index is given by sampler_index + sampler_offset.
  983.     */
  984.    unsigned sampler_index;
  985.  
  986.    /** The size of the sampler array or 0 if it's not an array */
  987.    unsigned sampler_array_size;
  988.  
  989.    nir_deref_var *sampler; /* if this is NULL, use sampler_index instead */
  990. } nir_tex_instr;
  991.  
  992. static inline unsigned
  993. nir_tex_instr_dest_size(nir_tex_instr *instr)
  994. {
  995.    switch (instr->op) {
  996.    case nir_texop_txs: {
  997.       unsigned ret;
  998.       switch (instr->sampler_dim) {
  999.          case GLSL_SAMPLER_DIM_1D:
  1000.          case GLSL_SAMPLER_DIM_BUF:
  1001.             ret = 1;
  1002.             break;
  1003.          case GLSL_SAMPLER_DIM_2D:
  1004.          case GLSL_SAMPLER_DIM_CUBE:
  1005.          case GLSL_SAMPLER_DIM_MS:
  1006.          case GLSL_SAMPLER_DIM_RECT:
  1007.          case GLSL_SAMPLER_DIM_EXTERNAL:
  1008.             ret = 2;
  1009.             break;
  1010.          case GLSL_SAMPLER_DIM_3D:
  1011.             ret = 3;
  1012.             break;
  1013.          default:
  1014.             unreachable("not reached");
  1015.       }
  1016.       if (instr->is_array)
  1017.          ret++;
  1018.       return ret;
  1019.    }
  1020.  
  1021.    case nir_texop_lod:
  1022.       return 2;
  1023.  
  1024.    case nir_texop_query_levels:
  1025.       return 1;
  1026.  
  1027.    default:
  1028.       if (instr->is_shadow && instr->is_new_style_shadow)
  1029.          return 1;
  1030.  
  1031.       return 4;
  1032.    }
  1033. }
  1034.  
  1035. static inline unsigned
  1036. nir_tex_instr_src_size(nir_tex_instr *instr, unsigned src)
  1037. {
  1038.    if (instr->src[src].src_type == nir_tex_src_coord)
  1039.       return instr->coord_components;
  1040.  
  1041.  
  1042.    if (instr->src[src].src_type == nir_tex_src_offset ||
  1043.        instr->src[src].src_type == nir_tex_src_ddx ||
  1044.        instr->src[src].src_type == nir_tex_src_ddy) {
  1045.       if (instr->is_array)
  1046.          return instr->coord_components - 1;
  1047.       else
  1048.          return instr->coord_components;
  1049.    }
  1050.  
  1051.    return 1;
  1052. }
  1053.  
  1054. static inline int
  1055. nir_tex_instr_src_index(nir_tex_instr *instr, nir_tex_src_type type)
  1056. {
  1057.    for (unsigned i = 0; i < instr->num_srcs; i++)
  1058.       if (instr->src[i].src_type == type)
  1059.          return (int) i;
  1060.  
  1061.    return -1;
  1062. }
  1063.  
  1064. typedef struct {
  1065.    union {
  1066.       float f[4];
  1067.       int32_t i[4];
  1068.       uint32_t u[4];
  1069.    };
  1070. } nir_const_value;
  1071.  
  1072. typedef struct {
  1073.    nir_instr instr;
  1074.  
  1075.    nir_const_value value;
  1076.  
  1077.    nir_ssa_def def;
  1078. } nir_load_const_instr;
  1079.  
  1080. typedef enum {
  1081.    nir_jump_return,
  1082.    nir_jump_break,
  1083.    nir_jump_continue,
  1084. } nir_jump_type;
  1085.  
  1086. typedef struct {
  1087.    nir_instr instr;
  1088.    nir_jump_type type;
  1089. } nir_jump_instr;
  1090.  
  1091. /* creates a new SSA variable in an undefined state */
  1092.  
  1093. typedef struct {
  1094.    nir_instr instr;
  1095.    nir_ssa_def def;
  1096. } nir_ssa_undef_instr;
  1097.  
  1098. typedef struct {
  1099.    struct exec_node node;
  1100.  
  1101.    /* The predecessor block corresponding to this source */
  1102.    struct nir_block *pred;
  1103.  
  1104.    nir_src src;
  1105. } nir_phi_src;
  1106.  
  1107. #define nir_foreach_phi_src(phi, entry) \
  1108.    foreach_list_typed(nir_phi_src, entry, node, &(phi)->srcs)
  1109.  
  1110. typedef struct {
  1111.    nir_instr instr;
  1112.  
  1113.    struct exec_list srcs; /** < list of nir_phi_src */
  1114.  
  1115.    nir_dest dest;
  1116. } nir_phi_instr;
  1117.  
  1118. typedef struct {
  1119.    struct exec_node node;
  1120.    nir_src src;
  1121.    nir_dest dest;
  1122. } nir_parallel_copy_entry;
  1123.  
  1124. #define nir_foreach_parallel_copy_entry(pcopy, entry) \
  1125.    foreach_list_typed(nir_parallel_copy_entry, entry, node, &(pcopy)->entries)
  1126.  
  1127. typedef struct {
  1128.    nir_instr instr;
  1129.  
  1130.    /* A list of nir_parallel_copy_entry's.  The sources of all of the
  1131.     * entries are copied to the corresponding destinations "in parallel".
  1132.     * In other words, if we have two entries: a -> b and b -> a, the values
  1133.     * get swapped.
  1134.     */
  1135.    struct exec_list entries;
  1136. } nir_parallel_copy_instr;
  1137.  
  1138. NIR_DEFINE_CAST(nir_instr_as_alu, nir_instr, nir_alu_instr, instr)
  1139. NIR_DEFINE_CAST(nir_instr_as_call, nir_instr, nir_call_instr, instr)
  1140. NIR_DEFINE_CAST(nir_instr_as_jump, nir_instr, nir_jump_instr, instr)
  1141. NIR_DEFINE_CAST(nir_instr_as_tex, nir_instr, nir_tex_instr, instr)
  1142. NIR_DEFINE_CAST(nir_instr_as_intrinsic, nir_instr, nir_intrinsic_instr, instr)
  1143. NIR_DEFINE_CAST(nir_instr_as_load_const, nir_instr, nir_load_const_instr, instr)
  1144. NIR_DEFINE_CAST(nir_instr_as_ssa_undef, nir_instr, nir_ssa_undef_instr, instr)
  1145. NIR_DEFINE_CAST(nir_instr_as_phi, nir_instr, nir_phi_instr, instr)
  1146. NIR_DEFINE_CAST(nir_instr_as_parallel_copy, nir_instr,
  1147.                 nir_parallel_copy_instr, instr)
  1148.  
  1149. /*
  1150.  * Control flow
  1151.  *
  1152.  * Control flow consists of a tree of control flow nodes, which include
  1153.  * if-statements and loops. The leaves of the tree are basic blocks, lists of
  1154.  * instructions that always run start-to-finish. Each basic block also keeps
  1155.  * track of its successors (blocks which may run immediately after the current
  1156.  * block) and predecessors (blocks which could have run immediately before the
  1157.  * current block). Each function also has a start block and an end block which
  1158.  * all return statements point to (which is always empty). Together, all the
  1159.  * blocks with their predecessors and successors make up the control flow
  1160.  * graph (CFG) of the function. There are helpers that modify the tree of
  1161.  * control flow nodes while modifying the CFG appropriately; these should be
  1162.  * used instead of modifying the tree directly.
  1163.  */
  1164.  
  1165. typedef enum {
  1166.    nir_cf_node_block,
  1167.    nir_cf_node_if,
  1168.    nir_cf_node_loop,
  1169.    nir_cf_node_function
  1170. } nir_cf_node_type;
  1171.  
  1172. typedef struct nir_cf_node {
  1173.    struct exec_node node;
  1174.    nir_cf_node_type type;
  1175.    struct nir_cf_node *parent;
  1176. } nir_cf_node;
  1177.  
  1178. typedef struct nir_block {
  1179.    nir_cf_node cf_node;
  1180.  
  1181.    struct exec_list instr_list; /** < list of nir_instr */
  1182.  
  1183.    /** generic block index; generated by nir_index_blocks */
  1184.    unsigned index;
  1185.  
  1186.    /*
  1187.     * Each block can only have up to 2 successors, so we put them in a simple
  1188.     * array - no need for anything more complicated.
  1189.     */
  1190.    struct nir_block *successors[2];
  1191.  
  1192.    /* Set of nir_block predecessors in the CFG */
  1193.    struct set *predecessors;
  1194.  
  1195.    /*
  1196.     * this node's immediate dominator in the dominance tree - set to NULL for
  1197.     * the start block.
  1198.     */
  1199.    struct nir_block *imm_dom;
  1200.  
  1201.    /* This node's children in the dominance tree */
  1202.    unsigned num_dom_children;
  1203.    struct nir_block **dom_children;
  1204.  
  1205.    /* Set of nir_block's on the dominance frontier of this block */
  1206.    struct set *dom_frontier;
  1207.  
  1208.    /*
  1209.     * These two indices have the property that dom_{pre,post}_index for each
  1210.     * child of this block in the dominance tree will always be between
  1211.     * dom_pre_index and dom_post_index for this block, which makes testing if
  1212.     * a given block is dominated by another block an O(1) operation.
  1213.     */
  1214.    unsigned dom_pre_index, dom_post_index;
  1215.  
  1216.    /* live in and out for this block; used for liveness analysis */
  1217.    BITSET_WORD *live_in;
  1218.    BITSET_WORD *live_out;
  1219. } nir_block;
  1220.  
  1221. static inline nir_instr *
  1222. nir_block_first_instr(nir_block *block)
  1223. {
  1224.    struct exec_node *head = exec_list_get_head(&block->instr_list);
  1225.    return exec_node_data(nir_instr, head, node);
  1226. }
  1227.  
  1228. static inline nir_instr *
  1229. nir_block_last_instr(nir_block *block)
  1230. {
  1231.    struct exec_node *tail = exec_list_get_tail(&block->instr_list);
  1232.    return exec_node_data(nir_instr, tail, node);
  1233. }
  1234.  
  1235. #define nir_foreach_instr(block, instr) \
  1236.    foreach_list_typed(nir_instr, instr, node, &(block)->instr_list)
  1237. #define nir_foreach_instr_reverse(block, instr) \
  1238.    foreach_list_typed_reverse(nir_instr, instr, node, &(block)->instr_list)
  1239. #define nir_foreach_instr_safe(block, instr) \
  1240.    foreach_list_typed_safe(nir_instr, instr, node, &(block)->instr_list)
  1241.  
  1242. typedef struct nir_if {
  1243.    nir_cf_node cf_node;
  1244.    nir_src condition;
  1245.  
  1246.    struct exec_list then_list; /** < list of nir_cf_node */
  1247.    struct exec_list else_list; /** < list of nir_cf_node */
  1248. } nir_if;
  1249.  
  1250. static inline nir_cf_node *
  1251. nir_if_first_then_node(nir_if *if_stmt)
  1252. {
  1253.    struct exec_node *head = exec_list_get_head(&if_stmt->then_list);
  1254.    return exec_node_data(nir_cf_node, head, node);
  1255. }
  1256.  
  1257. static inline nir_cf_node *
  1258. nir_if_last_then_node(nir_if *if_stmt)
  1259. {
  1260.    struct exec_node *tail = exec_list_get_tail(&if_stmt->then_list);
  1261.    return exec_node_data(nir_cf_node, tail, node);
  1262. }
  1263.  
  1264. static inline nir_cf_node *
  1265. nir_if_first_else_node(nir_if *if_stmt)
  1266. {
  1267.    struct exec_node *head = exec_list_get_head(&if_stmt->else_list);
  1268.    return exec_node_data(nir_cf_node, head, node);
  1269. }
  1270.  
  1271. static inline nir_cf_node *
  1272. nir_if_last_else_node(nir_if *if_stmt)
  1273. {
  1274.    struct exec_node *tail = exec_list_get_tail(&if_stmt->else_list);
  1275.    return exec_node_data(nir_cf_node, tail, node);
  1276. }
  1277.  
  1278. typedef struct {
  1279.    nir_cf_node cf_node;
  1280.  
  1281.    struct exec_list body; /** < list of nir_cf_node */
  1282. } nir_loop;
  1283.  
  1284. static inline nir_cf_node *
  1285. nir_loop_first_cf_node(nir_loop *loop)
  1286. {
  1287.    return exec_node_data(nir_cf_node, exec_list_get_head(&loop->body), node);
  1288. }
  1289.  
  1290. static inline nir_cf_node *
  1291. nir_loop_last_cf_node(nir_loop *loop)
  1292. {
  1293.    return exec_node_data(nir_cf_node, exec_list_get_tail(&loop->body), node);
  1294. }
  1295.  
  1296. /**
  1297.  * Various bits of metadata that can may be created or required by
  1298.  * optimization and analysis passes
  1299.  */
  1300. typedef enum {
  1301.    nir_metadata_none = 0x0,
  1302.    nir_metadata_block_index = 0x1,
  1303.    nir_metadata_dominance = 0x2,
  1304.    nir_metadata_live_variables = 0x4,
  1305. } nir_metadata;
  1306.  
  1307. typedef struct {
  1308.    nir_cf_node cf_node;
  1309.  
  1310.    /** pointer to the overload of which this is an implementation */
  1311.    struct nir_function_overload *overload;
  1312.  
  1313.    struct exec_list body; /** < list of nir_cf_node */
  1314.  
  1315.    nir_block *start_block, *end_block;
  1316.  
  1317.    /** list for all local variables in the function */
  1318.    struct exec_list locals;
  1319.  
  1320.    /** array of variables used as parameters */
  1321.    unsigned num_params;
  1322.    nir_variable **params;
  1323.  
  1324.    /** variable used to hold the result of the function */
  1325.    nir_variable *return_var;
  1326.  
  1327.    /** list of local registers in the function */
  1328.    struct exec_list registers;
  1329.  
  1330.    /** next available local register index */
  1331.    unsigned reg_alloc;
  1332.  
  1333.    /** next available SSA value index */
  1334.    unsigned ssa_alloc;
  1335.  
  1336.    /* total number of basic blocks, only valid when block_index_dirty = false */
  1337.    unsigned num_blocks;
  1338.  
  1339.    nir_metadata valid_metadata;
  1340. } nir_function_impl;
  1341.  
  1342. static inline nir_cf_node *
  1343. nir_cf_node_next(nir_cf_node *node)
  1344. {
  1345.    struct exec_node *next = exec_node_get_next(&node->node);
  1346.    if (exec_node_is_tail_sentinel(next))
  1347.       return NULL;
  1348.    else
  1349.       return exec_node_data(nir_cf_node, next, node);
  1350. }
  1351.  
  1352. static inline nir_cf_node *
  1353. nir_cf_node_prev(nir_cf_node *node)
  1354. {
  1355.    struct exec_node *prev = exec_node_get_prev(&node->node);
  1356.    if (exec_node_is_head_sentinel(prev))
  1357.       return NULL;
  1358.    else
  1359.       return exec_node_data(nir_cf_node, prev, node);
  1360. }
  1361.  
  1362. static inline bool
  1363. nir_cf_node_is_first(const nir_cf_node *node)
  1364. {
  1365.    return exec_node_is_head_sentinel(node->node.prev);
  1366. }
  1367.  
  1368. static inline bool
  1369. nir_cf_node_is_last(const nir_cf_node *node)
  1370. {
  1371.    return exec_node_is_tail_sentinel(node->node.next);
  1372. }
  1373.  
  1374. NIR_DEFINE_CAST(nir_cf_node_as_block, nir_cf_node, nir_block, cf_node)
  1375. NIR_DEFINE_CAST(nir_cf_node_as_if, nir_cf_node, nir_if, cf_node)
  1376. NIR_DEFINE_CAST(nir_cf_node_as_loop, nir_cf_node, nir_loop, cf_node)
  1377. NIR_DEFINE_CAST(nir_cf_node_as_function, nir_cf_node, nir_function_impl, cf_node)
  1378.  
  1379. typedef enum {
  1380.    nir_parameter_in,
  1381.    nir_parameter_out,
  1382.    nir_parameter_inout,
  1383. } nir_parameter_type;
  1384.  
  1385. typedef struct {
  1386.    nir_parameter_type param_type;
  1387.    const struct glsl_type *type;
  1388. } nir_parameter;
  1389.  
  1390. typedef struct nir_function_overload {
  1391.    struct exec_node node;
  1392.  
  1393.    unsigned num_params;
  1394.    nir_parameter *params;
  1395.    const struct glsl_type *return_type;
  1396.  
  1397.    nir_function_impl *impl; /** < NULL if the overload is only declared yet */
  1398.  
  1399.    /** pointer to the function of which this is an overload */
  1400.    struct nir_function *function;
  1401. } nir_function_overload;
  1402.  
  1403. typedef struct nir_function {
  1404.    struct exec_node node;
  1405.  
  1406.    struct exec_list overload_list; /** < list of nir_function_overload */
  1407.    const char *name;
  1408.    struct nir_shader *shader;
  1409. } nir_function;
  1410.  
  1411. #define nir_function_first_overload(func) \
  1412.    exec_node_data(nir_function_overload, \
  1413.                   exec_list_get_head(&(func)->overload_list), node)
  1414.  
  1415. typedef struct nir_shader_compiler_options {
  1416.    bool lower_ffma;
  1417.    bool lower_flrp;
  1418.    bool lower_fpow;
  1419.    bool lower_fsat;
  1420.    bool lower_fsqrt;
  1421.    /** lowers fneg and ineg to fsub and isub. */
  1422.    bool lower_negate;
  1423.    /** lowers fsub and isub to fadd+fneg and iadd+ineg. */
  1424.    bool lower_sub;
  1425.  
  1426.    /* lower {slt,sge,seq,sne} to {flt,fge,feq,fne} + b2f: */
  1427.    bool lower_scmp;
  1428.  
  1429.    /**
  1430.     * Does the driver support real 32-bit integers?  (Otherwise, integers
  1431.     * are simulated by floats.)
  1432.     */
  1433.    bool native_integers;
  1434. } nir_shader_compiler_options;
  1435.  
  1436. typedef struct nir_shader {
  1437.    /** hash table of name -> uniform nir_variable */
  1438.    struct exec_list uniforms;
  1439.  
  1440.    /** hash table of name -> input nir_variable */
  1441.    struct exec_list inputs;
  1442.  
  1443.    /** hash table of name -> output nir_variable */
  1444.    struct exec_list outputs;
  1445.  
  1446.    /** Set of driver-specific options for the shader.
  1447.     *
  1448.     * The memory for the options is expected to be kept in a single static
  1449.     * copy by the driver.
  1450.     */
  1451.    const struct nir_shader_compiler_options *options;
  1452.  
  1453.    /** list of global variables in the shader */
  1454.    struct exec_list globals;
  1455.  
  1456.    /** list of system value variables in the shader */
  1457.    struct exec_list system_values;
  1458.  
  1459.    struct exec_list functions; /** < list of nir_function */
  1460.  
  1461.    /** list of global register in the shader */
  1462.    struct exec_list registers;
  1463.  
  1464.    /** next available global register index */
  1465.    unsigned reg_alloc;
  1466.  
  1467.    /**
  1468.     * the highest index a load_input_*, load_uniform_*, etc. intrinsic can
  1469.     * access plus one
  1470.     */
  1471.    unsigned num_inputs, num_uniforms, num_outputs;
  1472.  
  1473.    /** the number of uniforms that are only accessed directly */
  1474.    unsigned num_direct_uniforms;
  1475. } nir_shader;
  1476.  
  1477. #define nir_foreach_overload(shader, overload)                        \
  1478.    foreach_list_typed(nir_function, func, node, &(shader)->functions) \
  1479.       foreach_list_typed(nir_function_overload, overload, node, \
  1480.                          &(func)->overload_list)
  1481.  
  1482. nir_shader *nir_shader_create(void *mem_ctx,
  1483.                               const nir_shader_compiler_options *options);
  1484.  
  1485. /** creates a register, including assigning it an index and adding it to the list */
  1486. nir_register *nir_global_reg_create(nir_shader *shader);
  1487.  
  1488. nir_register *nir_local_reg_create(nir_function_impl *impl);
  1489.  
  1490. void nir_reg_remove(nir_register *reg);
  1491.  
  1492. /** creates a function and adds it to the shader's list of functions */
  1493. nir_function *nir_function_create(nir_shader *shader, const char *name);
  1494.  
  1495. /** creates a null function returning null */
  1496. nir_function_overload *nir_function_overload_create(nir_function *func);
  1497.  
  1498. nir_function_impl *nir_function_impl_create(nir_function_overload *func);
  1499.  
  1500. nir_block *nir_block_create(void *mem_ctx);
  1501. nir_if *nir_if_create(void *mem_ctx);
  1502. nir_loop *nir_loop_create(void *mem_ctx);
  1503.  
  1504. nir_function_impl *nir_cf_node_get_function(nir_cf_node *node);
  1505.  
  1506. /** puts a control flow node immediately after another control flow node */
  1507. void nir_cf_node_insert_after(nir_cf_node *node, nir_cf_node *after);
  1508.  
  1509. /** puts a control flow node immediately before another control flow node */
  1510. void nir_cf_node_insert_before(nir_cf_node *node, nir_cf_node *before);
  1511.  
  1512. /** puts a control flow node at the beginning of a list from an if, loop, or function */
  1513. void nir_cf_node_insert_begin(struct exec_list *list, nir_cf_node *node);
  1514.  
  1515. /** puts a control flow node at the end of a list from an if, loop, or function */
  1516. void nir_cf_node_insert_end(struct exec_list *list, nir_cf_node *node);
  1517.  
  1518. /** removes a control flow node, doing any cleanup necessary */
  1519. void nir_cf_node_remove(nir_cf_node *node);
  1520.  
  1521. /** requests that the given pieces of metadata be generated */
  1522. void nir_metadata_require(nir_function_impl *impl, nir_metadata required);
  1523. /** dirties all but the preserved metadata */
  1524. void nir_metadata_preserve(nir_function_impl *impl, nir_metadata preserved);
  1525.  
  1526. /** creates an instruction with default swizzle/writemask/etc. with NULL registers */
  1527. nir_alu_instr *nir_alu_instr_create(nir_shader *shader, nir_op op);
  1528.  
  1529. nir_jump_instr *nir_jump_instr_create(nir_shader *shader, nir_jump_type type);
  1530.  
  1531. nir_load_const_instr *nir_load_const_instr_create(nir_shader *shader,
  1532.                                                   unsigned num_components);
  1533.  
  1534. nir_intrinsic_instr *nir_intrinsic_instr_create(nir_shader *shader,
  1535.                                                 nir_intrinsic_op op);
  1536.  
  1537. nir_call_instr *nir_call_instr_create(nir_shader *shader,
  1538.                                       nir_function_overload *callee);
  1539.  
  1540. nir_tex_instr *nir_tex_instr_create(nir_shader *shader, unsigned num_srcs);
  1541.  
  1542. nir_phi_instr *nir_phi_instr_create(nir_shader *shader);
  1543.  
  1544. nir_parallel_copy_instr *nir_parallel_copy_instr_create(nir_shader *shader);
  1545.  
  1546. nir_ssa_undef_instr *nir_ssa_undef_instr_create(nir_shader *shader,
  1547.                                                 unsigned num_components);
  1548.  
  1549. nir_deref_var *nir_deref_var_create(void *mem_ctx, nir_variable *var);
  1550. nir_deref_array *nir_deref_array_create(void *mem_ctx);
  1551. nir_deref_struct *nir_deref_struct_create(void *mem_ctx, unsigned field_index);
  1552.  
  1553. nir_deref *nir_copy_deref(void *mem_ctx, nir_deref *deref);
  1554.  
  1555. nir_load_const_instr *
  1556. nir_deref_get_const_initializer_load(nir_shader *shader, nir_deref_var *deref);
  1557.  
  1558. void nir_instr_insert_before(nir_instr *instr, nir_instr *before);
  1559. void nir_instr_insert_after(nir_instr *instr, nir_instr *after);
  1560.  
  1561. void nir_instr_insert_before_block(nir_block *block, nir_instr *before);
  1562. void nir_instr_insert_after_block(nir_block *block, nir_instr *after);
  1563.  
  1564. void nir_instr_insert_before_cf(nir_cf_node *node, nir_instr *before);
  1565. void nir_instr_insert_after_cf(nir_cf_node *node, nir_instr *after);
  1566.  
  1567. void nir_instr_insert_before_cf_list(struct exec_list *list, nir_instr *before);
  1568. void nir_instr_insert_after_cf_list(struct exec_list *list, nir_instr *after);
  1569.  
  1570. void nir_instr_remove(nir_instr *instr);
  1571.  
  1572. typedef bool (*nir_foreach_ssa_def_cb)(nir_ssa_def *def, void *state);
  1573. typedef bool (*nir_foreach_dest_cb)(nir_dest *dest, void *state);
  1574. typedef bool (*nir_foreach_src_cb)(nir_src *src, void *state);
  1575. bool nir_foreach_ssa_def(nir_instr *instr, nir_foreach_ssa_def_cb cb,
  1576.                          void *state);
  1577. bool nir_foreach_dest(nir_instr *instr, nir_foreach_dest_cb cb, void *state);
  1578. bool nir_foreach_src(nir_instr *instr, nir_foreach_src_cb cb, void *state);
  1579.  
  1580. nir_const_value *nir_src_as_const_value(nir_src src);
  1581. bool nir_srcs_equal(nir_src src1, nir_src src2);
  1582. void nir_instr_rewrite_src(nir_instr *instr, nir_src *src, nir_src new_src);
  1583. void nir_instr_move_src(nir_instr *dest_instr, nir_src *dest, nir_src *src);
  1584. void nir_if_rewrite_condition(nir_if *if_stmt, nir_src new_src);
  1585.  
  1586. void nir_ssa_dest_init(nir_instr *instr, nir_dest *dest,
  1587.                        unsigned num_components, const char *name);
  1588. void nir_ssa_def_init(nir_instr *instr, nir_ssa_def *def,
  1589.                       unsigned num_components, const char *name);
  1590. void nir_ssa_def_rewrite_uses(nir_ssa_def *def, nir_src new_src, void *mem_ctx);
  1591.  
  1592. /* visits basic blocks in source-code order */
  1593. typedef bool (*nir_foreach_block_cb)(nir_block *block, void *state);
  1594. bool nir_foreach_block(nir_function_impl *impl, nir_foreach_block_cb cb,
  1595.                        void *state);
  1596. bool nir_foreach_block_reverse(nir_function_impl *impl, nir_foreach_block_cb cb,
  1597.                                void *state);
  1598.  
  1599. /* If the following CF node is an if, this function returns that if.
  1600.  * Otherwise, it returns NULL.
  1601.  */
  1602. nir_if *nir_block_get_following_if(nir_block *block);
  1603.  
  1604. void nir_index_local_regs(nir_function_impl *impl);
  1605. void nir_index_global_regs(nir_shader *shader);
  1606. void nir_index_ssa_defs(nir_function_impl *impl);
  1607.  
  1608. void nir_index_blocks(nir_function_impl *impl);
  1609.  
  1610. void nir_print_shader(nir_shader *shader, FILE *fp);
  1611. void nir_print_instr(const nir_instr *instr, FILE *fp);
  1612.  
  1613. #ifdef DEBUG
  1614. void nir_validate_shader(nir_shader *shader);
  1615. #else
  1616. static inline void nir_validate_shader(nir_shader *shader) { (void) shader; }
  1617. #endif /* DEBUG */
  1618.  
  1619. void nir_calc_dominance_impl(nir_function_impl *impl);
  1620. void nir_calc_dominance(nir_shader *shader);
  1621.  
  1622. nir_block *nir_dominance_lca(nir_block *b1, nir_block *b2);
  1623. bool nir_block_dominates(nir_block *parent, nir_block *child);
  1624.  
  1625. void nir_dump_dom_tree_impl(nir_function_impl *impl, FILE *fp);
  1626. void nir_dump_dom_tree(nir_shader *shader, FILE *fp);
  1627.  
  1628. void nir_dump_dom_frontier_impl(nir_function_impl *impl, FILE *fp);
  1629. void nir_dump_dom_frontier(nir_shader *shader, FILE *fp);
  1630.  
  1631. void nir_dump_cfg_impl(nir_function_impl *impl, FILE *fp);
  1632. void nir_dump_cfg(nir_shader *shader, FILE *fp);
  1633.  
  1634. void nir_split_var_copies(nir_shader *shader);
  1635.  
  1636. void nir_lower_var_copy_instr(nir_intrinsic_instr *copy, void *mem_ctx);
  1637. void nir_lower_var_copies(nir_shader *shader);
  1638.  
  1639. void nir_lower_global_vars_to_local(nir_shader *shader);
  1640.  
  1641. void nir_lower_locals_to_regs(nir_shader *shader);
  1642.  
  1643. void nir_assign_var_locations_scalar(struct exec_list *var_list,
  1644.                                      unsigned *size);
  1645. void nir_assign_var_locations_scalar_direct_first(nir_shader *shader,
  1646.                                                   struct exec_list *var_list,
  1647.                                                   unsigned *direct_size,
  1648.                                                   unsigned *size);
  1649.  
  1650. void nir_lower_io(nir_shader *shader);
  1651.  
  1652. void nir_lower_vars_to_ssa(nir_shader *shader);
  1653.  
  1654. void nir_remove_dead_variables(nir_shader *shader);
  1655.  
  1656. void nir_lower_vec_to_movs(nir_shader *shader);
  1657. void nir_lower_alu_to_scalar(nir_shader *shader);
  1658.  
  1659. void nir_lower_phis_to_scalar(nir_shader *shader);
  1660.  
  1661. void nir_lower_samplers(nir_shader *shader,
  1662.                         const struct gl_shader_program *shader_program,
  1663.                         gl_shader_stage stage);
  1664.  
  1665. void nir_lower_system_values(nir_shader *shader);
  1666. void nir_lower_tex_projector(nir_shader *shader);
  1667. void nir_lower_idiv(nir_shader *shader);
  1668.  
  1669. void nir_lower_atomics(nir_shader *shader);
  1670. void nir_lower_to_source_mods(nir_shader *shader);
  1671.  
  1672. void nir_normalize_cubemap_coords(nir_shader *shader);
  1673.  
  1674. void nir_live_variables_impl(nir_function_impl *impl);
  1675. bool nir_ssa_defs_interfere(nir_ssa_def *a, nir_ssa_def *b);
  1676.  
  1677. void nir_convert_to_ssa_impl(nir_function_impl *impl);
  1678. void nir_convert_to_ssa(nir_shader *shader);
  1679. void nir_convert_from_ssa(nir_shader *shader);
  1680.  
  1681. bool nir_opt_algebraic(nir_shader *shader);
  1682. bool nir_opt_algebraic_late(nir_shader *shader);
  1683. bool nir_opt_constant_folding(nir_shader *shader);
  1684.  
  1685. bool nir_opt_global_to_local(nir_shader *shader);
  1686.  
  1687. bool nir_copy_prop_impl(nir_function_impl *impl);
  1688. bool nir_copy_prop(nir_shader *shader);
  1689.  
  1690. bool nir_opt_cse(nir_shader *shader);
  1691.  
  1692. bool nir_opt_dce_impl(nir_function_impl *impl);
  1693. bool nir_opt_dce(nir_shader *shader);
  1694.  
  1695. void nir_opt_gcm(nir_shader *shader);
  1696.  
  1697. bool nir_opt_peephole_select(nir_shader *shader);
  1698. bool nir_opt_peephole_ffma(nir_shader *shader);
  1699.  
  1700. bool nir_opt_remove_phis(nir_shader *shader);
  1701.  
  1702. void nir_sweep(nir_shader *shader);
  1703.  
  1704. #ifdef __cplusplus
  1705. } /* extern "C" */
  1706. #endif
  1707.