OSDN Git Service

2cfca3ed80a846916a7ef383bdcfa4e08bd935fb
[android-x86/external-mesa.git] / src / compiler / nir / nir.h
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 "compiler/glsl/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 "util/macros.h"
38 #include "compiler/nir_types.h"
39 #include "compiler/shader_enums.h"
40 #include <stdio.h>
41
42 #include "nir_opcodes.h"
43
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47
48 struct gl_program;
49 struct gl_shader_program;
50
51 #define NIR_FALSE 0u
52 #define NIR_TRUE (~0u)
53
54 /** Defines a cast function
55  *
56  * This macro defines a cast function from in_type to out_type where
57  * out_type is some structure type that contains a field of type out_type.
58  *
59  * Note that you have to be a bit careful as the generated cast function
60  * destroys constness.
61  */
62 #define NIR_DEFINE_CAST(name, in_type, out_type, field)  \
63 static inline out_type *                                 \
64 name(const in_type *parent)                              \
65 {                                                        \
66    return exec_node_data(out_type, parent, field);       \
67 }
68
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       = (1 << 0),
86    nir_var_shader_out      = (1 << 1),
87    nir_var_global          = (1 << 2),
88    nir_var_local           = (1 << 3),
89    nir_var_uniform         = (1 << 4),
90    nir_var_shader_storage  = (1 << 5),
91    nir_var_system_value    = (1 << 6),
92    nir_var_param           = (1 << 7),
93    nir_var_shared          = (1 << 8),
94    nir_var_all             = ~0,
95 } nir_variable_mode;
96
97 /**
98  * Data stored in an nir_constant
99  */
100 union nir_constant_data {
101    unsigned u[16];
102    int i[16];
103    float f[16];
104    bool b[16];
105    double d[16];
106 };
107
108 typedef struct nir_constant {
109    /**
110     * Value of the constant.
111     *
112     * The field used to back the values supplied by the constant is determined
113     * by the type associated with the \c nir_variable.  Constants may be
114     * scalars, vectors, or matrices.
115     */
116    union nir_constant_data value;
117
118    /* we could get this from the var->type but makes clone *much* easier to
119     * not have to care about the type.
120     */
121    unsigned num_elements;
122
123    /* Array elements / Structure Fields */
124    struct nir_constant **elements;
125 } nir_constant;
126
127 /**
128  * \brief Layout qualifiers for gl_FragDepth.
129  *
130  * The AMD/ARB_conservative_depth extensions allow gl_FragDepth to be redeclared
131  * with a layout qualifier.
132  */
133 typedef enum {
134     nir_depth_layout_none, /**< No depth layout is specified. */
135     nir_depth_layout_any,
136     nir_depth_layout_greater,
137     nir_depth_layout_less,
138     nir_depth_layout_unchanged
139 } nir_depth_layout;
140
141 /**
142  * Either a uniform, global variable, shader input, or shader output. Based on
143  * ir_variable - it should be easy to translate between the two.
144  */
145
146 typedef struct nir_variable {
147    struct exec_node node;
148
149    /**
150     * Declared type of the variable
151     */
152    const struct glsl_type *type;
153
154    /**
155     * Declared name of the variable
156     */
157    char *name;
158
159    struct nir_variable_data {
160       /**
161        * Storage class of the variable.
162        *
163        * \sa nir_variable_mode
164        */
165       nir_variable_mode mode;
166
167       /**
168        * Is the variable read-only?
169        *
170        * This is set for variables declared as \c const, shader inputs,
171        * and uniforms.
172        */
173       unsigned read_only:1;
174       unsigned centroid:1;
175       unsigned sample:1;
176       unsigned patch:1;
177       unsigned invariant:1;
178
179       /**
180        * Interpolation mode for shader inputs / outputs
181        *
182        * \sa glsl_interp_qualifier
183        */
184       unsigned interpolation:2;
185
186       /**
187        * \name ARB_fragment_coord_conventions
188        * @{
189        */
190       unsigned origin_upper_left:1;
191       unsigned pixel_center_integer:1;
192       /*@}*/
193
194       /**
195        * Was the location explicitly set in the shader?
196        *
197        * If the location is explicitly set in the shader, it \b cannot be changed
198        * by the linker or by the API (e.g., calls to \c glBindAttribLocation have
199        * no effect).
200        */
201       unsigned explicit_location:1;
202       unsigned explicit_index:1;
203
204       /**
205        * Was an initial binding explicitly set in the shader?
206        *
207        * If so, constant_initializer contains an integer nir_constant
208        * representing the initial binding point.
209        */
210       unsigned explicit_binding:1;
211
212       /**
213        * Does this variable have an initializer?
214        *
215        * This is used by the linker to cross-validiate initializers of global
216        * variables.
217        */
218       unsigned has_initializer:1;
219
220       /**
221        * If non-zero, then this variable may be packed along with other variables
222        * into a single varying slot, so this offset should be applied when
223        * accessing components.  For example, an offset of 1 means that the x
224        * component of this variable is actually stored in component y of the
225        * location specified by \c location.
226        */
227       unsigned location_frac:2;
228
229       /**
230        * \brief Layout qualifier for gl_FragDepth.
231        *
232        * This is not equal to \c ir_depth_layout_none if and only if this
233        * variable is \c gl_FragDepth and a layout qualifier is specified.
234        */
235       nir_depth_layout depth_layout;
236
237       /**
238        * Storage location of the base of this variable
239        *
240        * The precise meaning of this field depends on the nature of the variable.
241        *
242        *   - Vertex shader input: one of the values from \c gl_vert_attrib.
243        *   - Vertex shader output: one of the values from \c gl_varying_slot.
244        *   - Geometry shader input: one of the values from \c gl_varying_slot.
245        *   - Geometry shader output: one of the values from \c gl_varying_slot.
246        *   - Fragment shader input: one of the values from \c gl_varying_slot.
247        *   - Fragment shader output: one of the values from \c gl_frag_result.
248        *   - Uniforms: Per-stage uniform slot number for default uniform block.
249        *   - Uniforms: Index within the uniform block definition for UBO members.
250        *   - Non-UBO Uniforms: uniform slot number.
251        *   - Other: This field is not currently used.
252        *
253        * If the variable is a uniform, shader input, or shader output, and the
254        * slot has not been assigned, the value will be -1.
255        */
256       int location;
257
258       /**
259        * The actual location of the variable in the IR. Only valid for inputs
260        * and outputs.
261        */
262       unsigned int driver_location;
263
264       /**
265        * output index for dual source blending.
266        */
267       int index;
268
269       /**
270        * Descriptor set binding for sampler or UBO.
271        */
272       int descriptor_set;
273
274       /**
275        * Initial binding point for a sampler or UBO.
276        *
277        * For array types, this represents the binding point for the first element.
278        */
279       int binding;
280
281       /**
282        * Location an atomic counter is stored at.
283        */
284       unsigned offset;
285
286       /**
287        * ARB_shader_image_load_store qualifiers.
288        */
289       struct {
290          bool read_only; /**< "readonly" qualifier. */
291          bool write_only; /**< "writeonly" qualifier. */
292          bool coherent;
293          bool _volatile;
294          bool restrict_flag;
295
296          /** Image internal format if specified explicitly, otherwise GL_NONE. */
297          GLenum format;
298       } image;
299
300       /**
301        * Highest element accessed with a constant expression array index
302        *
303        * Not used for non-array variables.
304        */
305       unsigned max_array_access;
306
307    } data;
308
309    /**
310     * Built-in state that backs this uniform
311     *
312     * Once set at variable creation, \c state_slots must remain invariant.
313     * This is because, ideally, this array would be shared by all clones of
314     * this variable in the IR tree.  In other words, we'd really like for it
315     * to be a fly-weight.
316     *
317     * If the variable is not a uniform, \c num_state_slots will be zero and
318     * \c state_slots will be \c NULL.
319     */
320    /*@{*/
321    unsigned num_state_slots;    /**< Number of state slots used */
322    nir_state_slot *state_slots;  /**< State descriptors. */
323    /*@}*/
324
325    /**
326     * Constant expression assigned in the initializer of the variable
327     */
328    nir_constant *constant_initializer;
329
330    /**
331     * For variables that are in an interface block or are an instance of an
332     * interface block, this is the \c GLSL_TYPE_INTERFACE type for that block.
333     *
334     * \sa ir_variable::location
335     */
336    const struct glsl_type *interface_type;
337 } nir_variable;
338
339 #define nir_foreach_variable(var, var_list) \
340    foreach_list_typed(nir_variable, var, node, var_list)
341
342 #define nir_foreach_variable_safe(var, var_list) \
343    foreach_list_typed_safe(nir_variable, var, node, var_list)
344
345 static inline bool
346 nir_variable_is_global(const nir_variable *var)
347 {
348    return var->data.mode != nir_var_local && var->data.mode != nir_var_param;
349 }
350
351 typedef struct nir_register {
352    struct exec_node node;
353
354    unsigned num_components; /** < number of vector components */
355    unsigned num_array_elems; /** < size of array (0 for no array) */
356
357    /* The bit-size of each channel; must be one of 8, 16, 32, or 64 */
358    uint8_t bit_size;
359
360    /** generic register index. */
361    unsigned index;
362
363    /** only for debug purposes, can be NULL */
364    const char *name;
365
366    /** whether this register is local (per-function) or global (per-shader) */
367    bool is_global;
368
369    /**
370     * If this flag is set to true, then accessing channels >= num_components
371     * is well-defined, and simply spills over to the next array element. This
372     * is useful for backends that can do per-component accessing, in
373     * particular scalar backends. By setting this flag and making
374     * num_components equal to 1, structures can be packed tightly into
375     * registers and then registers can be accessed per-component to get to
376     * each structure member, even if it crosses vec4 boundaries.
377     */
378    bool is_packed;
379
380    /** set of nir_src's where this register is used (read from) */
381    struct list_head uses;
382
383    /** set of nir_dest's where this register is defined (written to) */
384    struct list_head defs;
385
386    /** set of nir_if's where this register is used as a condition */
387    struct list_head if_uses;
388 } nir_register;
389
390 typedef enum {
391    nir_instr_type_alu,
392    nir_instr_type_call,
393    nir_instr_type_tex,
394    nir_instr_type_intrinsic,
395    nir_instr_type_load_const,
396    nir_instr_type_jump,
397    nir_instr_type_ssa_undef,
398    nir_instr_type_phi,
399    nir_instr_type_parallel_copy,
400 } nir_instr_type;
401
402 typedef struct nir_instr {
403    struct exec_node node;
404    nir_instr_type type;
405    struct nir_block *block;
406
407    /** generic instruction index. */
408    unsigned index;
409
410    /* A temporary for optimization and analysis passes to use for storing
411     * flags.  For instance, DCE uses this to store the "dead/live" info.
412     */
413    uint8_t pass_flags;
414 } nir_instr;
415
416 static inline nir_instr *
417 nir_instr_next(nir_instr *instr)
418 {
419    struct exec_node *next = exec_node_get_next(&instr->node);
420    if (exec_node_is_tail_sentinel(next))
421       return NULL;
422    else
423       return exec_node_data(nir_instr, next, node);
424 }
425
426 static inline nir_instr *
427 nir_instr_prev(nir_instr *instr)
428 {
429    struct exec_node *prev = exec_node_get_prev(&instr->node);
430    if (exec_node_is_head_sentinel(prev))
431       return NULL;
432    else
433       return exec_node_data(nir_instr, prev, node);
434 }
435
436 static inline bool
437 nir_instr_is_first(nir_instr *instr)
438 {
439    return exec_node_is_head_sentinel(exec_node_get_prev(&instr->node));
440 }
441
442 static inline bool
443 nir_instr_is_last(nir_instr *instr)
444 {
445    return exec_node_is_tail_sentinel(exec_node_get_next(&instr->node));
446 }
447
448 typedef struct nir_ssa_def {
449    /** for debugging only, can be NULL */
450    const char* name;
451
452    /** generic SSA definition index. */
453    unsigned index;
454
455    /** Index into the live_in and live_out bitfields */
456    unsigned live_index;
457
458    nir_instr *parent_instr;
459
460    /** set of nir_instr's where this register is used (read from) */
461    struct list_head uses;
462
463    /** set of nir_if's where this register is used as a condition */
464    struct list_head if_uses;
465
466    uint8_t num_components;
467
468    /* The bit-size of each channel; must be one of 8, 16, 32, or 64 */
469    uint8_t bit_size;
470 } nir_ssa_def;
471
472 struct nir_src;
473
474 typedef struct {
475    nir_register *reg;
476    struct nir_src *indirect; /** < NULL for no indirect offset */
477    unsigned base_offset;
478
479    /* TODO use-def chain goes here */
480 } nir_reg_src;
481
482 typedef struct {
483    nir_instr *parent_instr;
484    struct list_head def_link;
485
486    nir_register *reg;
487    struct nir_src *indirect; /** < NULL for no indirect offset */
488    unsigned base_offset;
489
490    /* TODO def-use chain goes here */
491 } nir_reg_dest;
492
493 struct nir_if;
494
495 typedef struct nir_src {
496    union {
497       nir_instr *parent_instr;
498       struct nir_if *parent_if;
499    };
500
501    struct list_head use_link;
502
503    union {
504       nir_reg_src reg;
505       nir_ssa_def *ssa;
506    };
507
508    bool is_ssa;
509 } nir_src;
510
511 static inline nir_src
512 nir_src_init(void)
513 {
514    nir_src src = { { NULL } };
515    return src;
516 }
517
518 #define NIR_SRC_INIT nir_src_init()
519
520 #define nir_foreach_use(src, reg_or_ssa_def) \
521    list_for_each_entry(nir_src, src, &(reg_or_ssa_def)->uses, use_link)
522
523 #define nir_foreach_use_safe(src, reg_or_ssa_def) \
524    list_for_each_entry_safe(nir_src, src, &(reg_or_ssa_def)->uses, use_link)
525
526 #define nir_foreach_if_use(src, reg_or_ssa_def) \
527    list_for_each_entry(nir_src, src, &(reg_or_ssa_def)->if_uses, use_link)
528
529 #define nir_foreach_if_use_safe(src, reg_or_ssa_def) \
530    list_for_each_entry_safe(nir_src, src, &(reg_or_ssa_def)->if_uses, use_link)
531
532 typedef struct {
533    union {
534       nir_reg_dest reg;
535       nir_ssa_def ssa;
536    };
537
538    bool is_ssa;
539 } nir_dest;
540
541 static inline nir_dest
542 nir_dest_init(void)
543 {
544    nir_dest dest = { { { NULL } } };
545    return dest;
546 }
547
548 #define NIR_DEST_INIT nir_dest_init()
549
550 #define nir_foreach_def(dest, reg) \
551    list_for_each_entry(nir_dest, dest, &(reg)->defs, reg.def_link)
552
553 #define nir_foreach_def_safe(dest, reg) \
554    list_for_each_entry_safe(nir_dest, dest, &(reg)->defs, reg.def_link)
555
556 static inline nir_src
557 nir_src_for_ssa(nir_ssa_def *def)
558 {
559    nir_src src = NIR_SRC_INIT;
560
561    src.is_ssa = true;
562    src.ssa = def;
563
564    return src;
565 }
566
567 static inline nir_src
568 nir_src_for_reg(nir_register *reg)
569 {
570    nir_src src = NIR_SRC_INIT;
571
572    src.is_ssa = false;
573    src.reg.reg = reg;
574    src.reg.indirect = NULL;
575    src.reg.base_offset = 0;
576
577    return src;
578 }
579
580 static inline nir_dest
581 nir_dest_for_reg(nir_register *reg)
582 {
583    nir_dest dest = NIR_DEST_INIT;
584
585    dest.reg.reg = reg;
586
587    return dest;
588 }
589
590 static inline unsigned
591 nir_src_bit_size(nir_src src)
592 {
593    return src.is_ssa ? src.ssa->bit_size : src.reg.reg->bit_size;
594 }
595
596 static inline unsigned
597 nir_dest_bit_size(nir_dest dest)
598 {
599    return dest.is_ssa ? dest.ssa.bit_size : dest.reg.reg->bit_size;
600 }
601
602 void nir_src_copy(nir_src *dest, const nir_src *src, void *instr_or_if);
603 void nir_dest_copy(nir_dest *dest, const nir_dest *src, nir_instr *instr);
604
605 typedef struct {
606    nir_src src;
607
608    /**
609     * \name input modifiers
610     */
611    /*@{*/
612    /**
613     * For inputs interpreted as floating point, flips the sign bit. For
614     * inputs interpreted as integers, performs the two's complement negation.
615     */
616    bool negate;
617
618    /**
619     * Clears the sign bit for floating point values, and computes the integer
620     * absolute value for integers. Note that the negate modifier acts after
621     * the absolute value modifier, therefore if both are set then all inputs
622     * will become negative.
623     */
624    bool abs;
625    /*@}*/
626
627    /**
628     * For each input component, says which component of the register it is
629     * chosen from. Note that which elements of the swizzle are used and which
630     * are ignored are based on the write mask for most opcodes - for example,
631     * a statement like "foo.xzw = bar.zyx" would have a writemask of 1101b and
632     * a swizzle of {2, x, 1, 0} where x means "don't care."
633     */
634    uint8_t swizzle[4];
635 } nir_alu_src;
636
637 typedef struct {
638    nir_dest dest;
639
640    /**
641     * \name saturate output modifier
642     *
643     * Only valid for opcodes that output floating-point numbers. Clamps the
644     * output to between 0.0 and 1.0 inclusive.
645     */
646
647    bool saturate;
648
649    unsigned write_mask : 4; /* ignored if dest.is_ssa is true */
650 } nir_alu_dest;
651
652 typedef enum {
653    nir_type_invalid = 0, /* Not a valid type */
654    nir_type_float,
655    nir_type_int,
656    nir_type_uint,
657    nir_type_bool,
658    nir_type_bool32 =    32 | nir_type_bool,
659    nir_type_int8 =      8  | nir_type_int,
660    nir_type_int16 =     16 | nir_type_int,
661    nir_type_int32 =     32 | nir_type_int,
662    nir_type_int64 =     64 | nir_type_int,
663    nir_type_uint8 =     8  | nir_type_uint,
664    nir_type_uint16 =    16 | nir_type_uint,
665    nir_type_uint32 =    32 | nir_type_uint,
666    nir_type_uint64 =    64 | nir_type_uint,
667    nir_type_float16 =   16 | nir_type_float,
668    nir_type_float32 =   32 | nir_type_float,
669    nir_type_float64 =   64 | nir_type_float,
670 } nir_alu_type;
671
672 #define NIR_ALU_TYPE_SIZE_MASK 0xfffffff8
673 #define NIR_ALU_TYPE_BASE_TYPE_MASK 0x00000007
674
675 static inline unsigned
676 nir_alu_type_get_type_size(nir_alu_type type)
677 {
678    return type & NIR_ALU_TYPE_SIZE_MASK;
679 }
680
681 static inline unsigned
682 nir_alu_type_get_base_type(nir_alu_type type)
683 {
684    return type & NIR_ALU_TYPE_BASE_TYPE_MASK;
685 }
686
687 typedef enum {
688    NIR_OP_IS_COMMUTATIVE = (1 << 0),
689    NIR_OP_IS_ASSOCIATIVE = (1 << 1),
690 } nir_op_algebraic_property;
691
692 typedef struct {
693    const char *name;
694
695    unsigned num_inputs;
696
697    /**
698     * The number of components in the output
699     *
700     * If non-zero, this is the size of the output and input sizes are
701     * explicitly given; swizzle and writemask are still in effect, but if
702     * the output component is masked out, then the input component may
703     * still be in use.
704     *
705     * If zero, the opcode acts in the standard, per-component manner; the
706     * operation is performed on each component (except the ones that are
707     * masked out) with the input being taken from the input swizzle for
708     * that component.
709     *
710     * The size of some of the inputs may be given (i.e. non-zero) even
711     * though output_size is zero; in that case, the inputs with a zero
712     * size act per-component, while the inputs with non-zero size don't.
713     */
714    unsigned output_size;
715
716    /**
717     * The type of vector that the instruction outputs. Note that the
718     * staurate modifier is only allowed on outputs with the float type.
719     */
720
721    nir_alu_type output_type;
722
723    /**
724     * The number of components in each input
725     */
726    unsigned input_sizes[4];
727
728    /**
729     * The type of vector that each input takes. Note that negate and
730     * absolute value are only allowed on inputs with int or float type and
731     * behave differently on the two.
732     */
733    nir_alu_type input_types[4];
734
735    nir_op_algebraic_property algebraic_properties;
736 } nir_op_info;
737
738 extern const nir_op_info nir_op_infos[nir_num_opcodes];
739
740 typedef struct nir_alu_instr {
741    nir_instr instr;
742    nir_op op;
743
744    /** Indicates that this ALU instruction generates an exact value
745     *
746     * This is kind of a mixture of GLSL "precise" and "invariant" and not
747     * really equivalent to either.  This indicates that the value generated by
748     * this operation is high-precision and any code transformations that touch
749     * it must ensure that the resulting value is bit-for-bit identical to the
750     * original.
751     */
752    bool exact;
753
754    nir_alu_dest dest;
755    nir_alu_src src[];
756 } nir_alu_instr;
757
758 void nir_alu_src_copy(nir_alu_src *dest, const nir_alu_src *src,
759                       nir_alu_instr *instr);
760 void nir_alu_dest_copy(nir_alu_dest *dest, const nir_alu_dest *src,
761                        nir_alu_instr *instr);
762
763 /* is this source channel used? */
764 static inline bool
765 nir_alu_instr_channel_used(nir_alu_instr *instr, unsigned src, unsigned channel)
766 {
767    if (nir_op_infos[instr->op].input_sizes[src] > 0)
768       return channel < nir_op_infos[instr->op].input_sizes[src];
769
770    return (instr->dest.write_mask >> channel) & 1;
771 }
772
773 /*
774  * For instructions whose destinations are SSA, get the number of channels
775  * used for a source
776  */
777 static inline unsigned
778 nir_ssa_alu_instr_src_components(const nir_alu_instr *instr, unsigned src)
779 {
780    assert(instr->dest.dest.is_ssa);
781
782    if (nir_op_infos[instr->op].input_sizes[src] > 0)
783       return nir_op_infos[instr->op].input_sizes[src];
784
785    return instr->dest.dest.ssa.num_components;
786 }
787
788 typedef enum {
789    nir_deref_type_var,
790    nir_deref_type_array,
791    nir_deref_type_struct
792 } nir_deref_type;
793
794 typedef struct nir_deref {
795    nir_deref_type deref_type;
796    struct nir_deref *child;
797    const struct glsl_type *type;
798 } nir_deref;
799
800 typedef struct {
801    nir_deref deref;
802
803    nir_variable *var;
804 } nir_deref_var;
805
806 /* This enum describes how the array is referenced.  If the deref is
807  * direct then the base_offset is used.  If the deref is indirect then then
808  * offset is given by base_offset + indirect.  If the deref is a wildcard
809  * then the deref refers to all of the elements of the array at the same
810  * time.  Wildcard dereferences are only ever allowed in copy_var
811  * intrinsics and the source and destination derefs must have matching
812  * wildcards.
813  */
814 typedef enum {
815    nir_deref_array_type_direct,
816    nir_deref_array_type_indirect,
817    nir_deref_array_type_wildcard,
818 } nir_deref_array_type;
819
820 typedef struct {
821    nir_deref deref;
822
823    nir_deref_array_type deref_array_type;
824    unsigned base_offset;
825    nir_src indirect;
826 } nir_deref_array;
827
828 typedef struct {
829    nir_deref deref;
830
831    unsigned index;
832 } nir_deref_struct;
833
834 NIR_DEFINE_CAST(nir_deref_as_var, nir_deref, nir_deref_var, deref)
835 NIR_DEFINE_CAST(nir_deref_as_array, nir_deref, nir_deref_array, deref)
836 NIR_DEFINE_CAST(nir_deref_as_struct, nir_deref, nir_deref_struct, deref)
837
838 /* Returns the last deref in the chain. */
839 static inline nir_deref *
840 nir_deref_tail(nir_deref *deref)
841 {
842    while (deref->child)
843       deref = deref->child;
844    return deref;
845 }
846
847 typedef struct {
848    nir_instr instr;
849
850    unsigned num_params;
851    nir_deref_var **params;
852    nir_deref_var *return_deref;
853
854    struct nir_function *callee;
855 } nir_call_instr;
856
857 #define INTRINSIC(name, num_srcs, src_components, has_dest, dest_components, \
858                   num_variables, num_indices, idx0, idx1, idx2, flags) \
859    nir_intrinsic_##name,
860
861 #define LAST_INTRINSIC(name) nir_last_intrinsic = nir_intrinsic_##name,
862
863 typedef enum {
864 #include "nir_intrinsics.h"
865    nir_num_intrinsics = nir_last_intrinsic + 1
866 } nir_intrinsic_op;
867
868 #undef INTRINSIC
869 #undef LAST_INTRINSIC
870
871 #define NIR_INTRINSIC_MAX_CONST_INDEX 3
872
873 /** Represents an intrinsic
874  *
875  * An intrinsic is an instruction type for handling things that are
876  * more-or-less regular operations but don't just consume and produce SSA
877  * values like ALU operations do.  Intrinsics are not for things that have
878  * special semantic meaning such as phi nodes and parallel copies.
879  * Examples of intrinsics include variable load/store operations, system
880  * value loads, and the like.  Even though texturing more-or-less falls
881  * under this category, texturing is its own instruction type because
882  * trying to represent texturing with intrinsics would lead to a
883  * combinatorial explosion of intrinsic opcodes.
884  *
885  * By having a single instruction type for handling a lot of different
886  * cases, optimization passes can look for intrinsics and, for the most
887  * part, completely ignore them.  Each intrinsic type also has a few
888  * possible flags that govern whether or not they can be reordered or
889  * eliminated.  That way passes like dead code elimination can still work
890  * on intrisics without understanding the meaning of each.
891  *
892  * Each intrinsic has some number of constant indices, some number of
893  * variables, and some number of sources.  What these sources, variables,
894  * and indices mean depends on the intrinsic and is documented with the
895  * intrinsic declaration in nir_intrinsics.h.  Intrinsics and texture
896  * instructions are the only types of instruction that can operate on
897  * variables.
898  */
899 typedef struct {
900    nir_instr instr;
901
902    nir_intrinsic_op intrinsic;
903
904    nir_dest dest;
905
906    /** number of components if this is a vectorized intrinsic
907     *
908     * Similarly to ALU operations, some intrinsics are vectorized.
909     * An intrinsic is vectorized if nir_intrinsic_infos.dest_components == 0.
910     * For vectorized intrinsics, the num_components field specifies the
911     * number of destination components and the number of source components
912     * for all sources with nir_intrinsic_infos.src_components[i] == 0.
913     */
914    uint8_t num_components;
915
916    int const_index[NIR_INTRINSIC_MAX_CONST_INDEX];
917
918    nir_deref_var *variables[2];
919
920    nir_src src[];
921 } nir_intrinsic_instr;
922
923 /**
924  * \name NIR intrinsics semantic flags
925  *
926  * information about what the compiler can do with the intrinsics.
927  *
928  * \sa nir_intrinsic_info::flags
929  */
930 typedef enum {
931    /**
932     * whether the intrinsic can be safely eliminated if none of its output
933     * value is not being used.
934     */
935    NIR_INTRINSIC_CAN_ELIMINATE = (1 << 0),
936
937    /**
938     * Whether the intrinsic can be reordered with respect to any other
939     * intrinsic, i.e. whether the only reordering dependencies of the
940     * intrinsic are due to the register reads/writes.
941     */
942    NIR_INTRINSIC_CAN_REORDER = (1 << 1),
943 } nir_intrinsic_semantic_flag;
944
945 /**
946  * \name NIR intrinsics const-index flag
947  *
948  * Indicates the usage of a const_index slot.
949  *
950  * \sa nir_intrinsic_info::index_map
951  */
952 typedef enum {
953    /**
954     * Generally instructions that take a offset src argument, can encode
955     * a constant 'base' value which is added to the offset.
956     */
957    NIR_INTRINSIC_BASE = 1,
958
959    /**
960     * For store instructions, a writemask for the store.
961     */
962    NIR_INTRINSIC_WRMASK = 2,
963
964    /**
965     * The stream-id for GS emit_vertex/end_primitive intrinsics.
966     */
967    NIR_INTRINSIC_STREAM_ID = 3,
968
969    /**
970     * The clip-plane id for load_user_clip_plane intrinsic.
971     */
972    NIR_INTRINSIC_UCP_ID = 4,
973
974    /**
975     * The amount of data, starting from BASE, that this instruction may
976     * access.  This is used to provide bounds if the offset is not constant.
977     */
978    NIR_INTRINSIC_RANGE = 5,
979
980    /**
981     * The Vulkan descriptor set for vulkan_resource_index intrinsic.
982     */
983    NIR_INTRINSIC_DESC_SET = 6,
984
985    /**
986     * The Vulkan descriptor set binding for vulkan_resource_index intrinsic.
987     */
988    NIR_INTRINSIC_BINDING = 7,
989
990    NIR_INTRINSIC_NUM_INDEX_FLAGS,
991
992 } nir_intrinsic_index_flag;
993
994 #define NIR_INTRINSIC_MAX_INPUTS 4
995
996 typedef struct {
997    const char *name;
998
999    unsigned num_srcs; /** < number of register/SSA inputs */
1000
1001    /** number of components of each input register
1002     *
1003     * If this value is 0, the number of components is given by the
1004     * num_components field of nir_intrinsic_instr.
1005     */
1006    unsigned src_components[NIR_INTRINSIC_MAX_INPUTS];
1007
1008    bool has_dest;
1009
1010    /** number of components of the output register
1011     *
1012     * If this value is 0, the number of components is given by the
1013     * num_components field of nir_intrinsic_instr.
1014     */
1015    unsigned dest_components;
1016
1017    /** the number of inputs/outputs that are variables */
1018    unsigned num_variables;
1019
1020    /** the number of constant indices used by the intrinsic */
1021    unsigned num_indices;
1022
1023    /** indicates the usage of intr->const_index[n] */
1024    unsigned index_map[NIR_INTRINSIC_NUM_INDEX_FLAGS];
1025
1026    /** semantic flags for calls to this intrinsic */
1027    nir_intrinsic_semantic_flag flags;
1028 } nir_intrinsic_info;
1029
1030 extern const nir_intrinsic_info nir_intrinsic_infos[nir_num_intrinsics];
1031
1032
1033 #define INTRINSIC_IDX_ACCESSORS(name, flag, type)                             \
1034 static inline type                                                            \
1035 nir_intrinsic_##name(nir_intrinsic_instr *instr)                              \
1036 {                                                                             \
1037    const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic];   \
1038    assert(info->index_map[NIR_INTRINSIC_##flag] > 0);                         \
1039    return instr->const_index[info->index_map[NIR_INTRINSIC_##flag] - 1];      \
1040 }                                                                             \
1041 static inline void                                                            \
1042 nir_intrinsic_set_##name(nir_intrinsic_instr *instr, type val)                \
1043 {                                                                             \
1044    const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic];   \
1045    assert(info->index_map[NIR_INTRINSIC_##flag] > 0);                         \
1046    instr->const_index[info->index_map[NIR_INTRINSIC_##flag] - 1] = val;       \
1047 }
1048
1049 INTRINSIC_IDX_ACCESSORS(write_mask, WRMASK, unsigned)
1050 INTRINSIC_IDX_ACCESSORS(base, BASE, int)
1051 INTRINSIC_IDX_ACCESSORS(stream_id, STREAM_ID, unsigned)
1052 INTRINSIC_IDX_ACCESSORS(ucp_id, UCP_ID, unsigned)
1053 INTRINSIC_IDX_ACCESSORS(range, RANGE, unsigned)
1054 INTRINSIC_IDX_ACCESSORS(desc_set, DESC_SET, unsigned)
1055 INTRINSIC_IDX_ACCESSORS(binding, BINDING, unsigned)
1056
1057 /**
1058  * \group texture information
1059  *
1060  * This gives semantic information about textures which is useful to the
1061  * frontend, the backend, and lowering passes, but not the optimizer.
1062  */
1063
1064 typedef enum {
1065    nir_tex_src_coord,
1066    nir_tex_src_projector,
1067    nir_tex_src_comparitor, /* shadow comparitor */
1068    nir_tex_src_offset,
1069    nir_tex_src_bias,
1070    nir_tex_src_lod,
1071    nir_tex_src_ms_index, /* MSAA sample index */
1072    nir_tex_src_ms_mcs, /* MSAA compression value */
1073    nir_tex_src_ddx,
1074    nir_tex_src_ddy,
1075    nir_tex_src_texture_offset, /* < dynamically uniform indirect offset */
1076    nir_tex_src_sampler_offset, /* < dynamically uniform indirect offset */
1077    nir_num_tex_src_types
1078 } nir_tex_src_type;
1079
1080 typedef struct {
1081    nir_src src;
1082    nir_tex_src_type src_type;
1083 } nir_tex_src;
1084
1085 typedef enum {
1086    nir_texop_tex,                /**< Regular texture look-up */
1087    nir_texop_txb,                /**< Texture look-up with LOD bias */
1088    nir_texop_txl,                /**< Texture look-up with explicit LOD */
1089    nir_texop_txd,                /**< Texture look-up with partial derivatvies */
1090    nir_texop_txf,                /**< Texel fetch with explicit LOD */
1091    nir_texop_txf_ms,                /**< Multisample texture fetch */
1092    nir_texop_txf_ms_mcs,         /**< Multisample compression value fetch */
1093    nir_texop_txs,                /**< Texture size */
1094    nir_texop_lod,                /**< Texture lod query */
1095    nir_texop_tg4,                /**< Texture gather */
1096    nir_texop_query_levels,       /**< Texture levels query */
1097    nir_texop_texture_samples,    /**< Texture samples query */
1098    nir_texop_samples_identical,  /**< Query whether all samples are definitely
1099                                   * identical.
1100                                   */
1101 } nir_texop;
1102
1103 typedef struct {
1104    nir_instr instr;
1105
1106    enum glsl_sampler_dim sampler_dim;
1107    nir_alu_type dest_type;
1108
1109    nir_texop op;
1110    nir_dest dest;
1111    nir_tex_src *src;
1112    unsigned num_srcs, coord_components;
1113    bool is_array, is_shadow;
1114
1115    /**
1116     * If is_shadow is true, whether this is the old-style shadow that outputs 4
1117     * components or the new-style shadow that outputs 1 component.
1118     */
1119    bool is_new_style_shadow;
1120
1121    /* gather component selector */
1122    unsigned component : 2;
1123
1124    /** The texture index
1125     *
1126     * If this texture instruction has a nir_tex_src_texture_offset source,
1127     * then the texture index is given by texture_index + texture_offset.
1128     */
1129    unsigned texture_index;
1130
1131    /** The size of the texture array or 0 if it's not an array */
1132    unsigned texture_array_size;
1133
1134    /** The texture deref
1135     *
1136     * If this is null, use texture_index instead.
1137     */
1138    nir_deref_var *texture;
1139
1140    /** The sampler index
1141     *
1142     * The following operations do not require a sampler and, as such, this
1143     * field should be ignored:
1144     *    - nir_texop_txf
1145     *    - nir_texop_txf_ms
1146     *    - nir_texop_txs
1147     *    - nir_texop_lod
1148     *    - nir_texop_tg4
1149     *    - nir_texop_query_levels
1150     *    - nir_texop_texture_samples
1151     *    - nir_texop_samples_identical
1152     *
1153     * If this texture instruction has a nir_tex_src_sampler_offset source,
1154     * then the sampler index is given by sampler_index + sampler_offset.
1155     */
1156    unsigned sampler_index;
1157
1158    /** The sampler deref
1159     *
1160     * If this is null, use sampler_index instead.
1161     */
1162    nir_deref_var *sampler;
1163 } nir_tex_instr;
1164
1165 static inline unsigned
1166 nir_tex_instr_dest_size(nir_tex_instr *instr)
1167 {
1168    switch (instr->op) {
1169    case nir_texop_txs: {
1170       unsigned ret;
1171       switch (instr->sampler_dim) {
1172          case GLSL_SAMPLER_DIM_1D:
1173          case GLSL_SAMPLER_DIM_BUF:
1174             ret = 1;
1175             break;
1176          case GLSL_SAMPLER_DIM_2D:
1177          case GLSL_SAMPLER_DIM_CUBE:
1178          case GLSL_SAMPLER_DIM_MS:
1179          case GLSL_SAMPLER_DIM_RECT:
1180          case GLSL_SAMPLER_DIM_EXTERNAL:
1181             ret = 2;
1182             break;
1183          case GLSL_SAMPLER_DIM_3D:
1184             ret = 3;
1185             break;
1186          default:
1187             unreachable("not reached");
1188       }
1189       if (instr->is_array)
1190          ret++;
1191       return ret;
1192    }
1193
1194    case nir_texop_lod:
1195       return 2;
1196
1197    case nir_texop_texture_samples:
1198    case nir_texop_query_levels:
1199    case nir_texop_samples_identical:
1200       return 1;
1201
1202    default:
1203       if (instr->is_shadow && instr->is_new_style_shadow)
1204          return 1;
1205
1206       return 4;
1207    }
1208 }
1209
1210 /* Returns true if this texture operation queries something about the texture
1211  * rather than actually sampling it.
1212  */
1213 static inline bool
1214 nir_tex_instr_is_query(nir_tex_instr *instr)
1215 {
1216    switch (instr->op) {
1217    case nir_texop_txs:
1218    case nir_texop_lod:
1219    case nir_texop_texture_samples:
1220    case nir_texop_query_levels:
1221    case nir_texop_txf_ms_mcs:
1222       return true;
1223    case nir_texop_tex:
1224    case nir_texop_txb:
1225    case nir_texop_txl:
1226    case nir_texop_txd:
1227    case nir_texop_txf:
1228    case nir_texop_txf_ms:
1229    case nir_texop_tg4:
1230       return false;
1231    default:
1232       unreachable("Invalid texture opcode");
1233    }
1234 }
1235
1236 static inline unsigned
1237 nir_tex_instr_src_size(nir_tex_instr *instr, unsigned src)
1238 {
1239    if (instr->src[src].src_type == nir_tex_src_coord)
1240       return instr->coord_components;
1241
1242    /* The MCS value is expected to be a vec4 returned by a txf_ms_mcs */
1243    if (instr->src[src].src_type == nir_tex_src_ms_mcs)
1244       return 4;
1245
1246    if (instr->src[src].src_type == nir_tex_src_offset ||
1247        instr->src[src].src_type == nir_tex_src_ddx ||
1248        instr->src[src].src_type == nir_tex_src_ddy) {
1249       if (instr->is_array)
1250          return instr->coord_components - 1;
1251       else
1252          return instr->coord_components;
1253    }
1254
1255    return 1;
1256 }
1257
1258 static inline int
1259 nir_tex_instr_src_index(nir_tex_instr *instr, nir_tex_src_type type)
1260 {
1261    for (unsigned i = 0; i < instr->num_srcs; i++)
1262       if (instr->src[i].src_type == type)
1263          return (int) i;
1264
1265    return -1;
1266 }
1267
1268 typedef struct {
1269    union {
1270       float f32[4];
1271       double f64[4];
1272       int32_t i32[4];
1273       uint32_t u32[4];
1274       int64_t i64[4];
1275       uint64_t u64[4];
1276    };
1277 } nir_const_value;
1278
1279 typedef struct {
1280    nir_instr instr;
1281
1282    nir_const_value value;
1283
1284    nir_ssa_def def;
1285 } nir_load_const_instr;
1286
1287 typedef enum {
1288    nir_jump_return,
1289    nir_jump_break,
1290    nir_jump_continue,
1291 } nir_jump_type;
1292
1293 typedef struct {
1294    nir_instr instr;
1295    nir_jump_type type;
1296 } nir_jump_instr;
1297
1298 /* creates a new SSA variable in an undefined state */
1299
1300 typedef struct {
1301    nir_instr instr;
1302    nir_ssa_def def;
1303 } nir_ssa_undef_instr;
1304
1305 typedef struct {
1306    struct exec_node node;
1307
1308    /* The predecessor block corresponding to this source */
1309    struct nir_block *pred;
1310
1311    nir_src src;
1312 } nir_phi_src;
1313
1314 #define nir_foreach_phi_src(phi_src, phi) \
1315    foreach_list_typed(nir_phi_src, phi_src, node, &(phi)->srcs)
1316 #define nir_foreach_phi_src_safe(phi_src, phi) \
1317    foreach_list_typed_safe(nir_phi_src, phi_src, node, &(phi)->srcs)
1318
1319 typedef struct {
1320    nir_instr instr;
1321
1322    struct exec_list srcs; /** < list of nir_phi_src */
1323
1324    nir_dest dest;
1325 } nir_phi_instr;
1326
1327 typedef struct {
1328    struct exec_node node;
1329    nir_src src;
1330    nir_dest dest;
1331 } nir_parallel_copy_entry;
1332
1333 #define nir_foreach_parallel_copy_entry(entry, pcopy) \
1334    foreach_list_typed(nir_parallel_copy_entry, entry, node, &(pcopy)->entries)
1335
1336 typedef struct {
1337    nir_instr instr;
1338
1339    /* A list of nir_parallel_copy_entry's.  The sources of all of the
1340     * entries are copied to the corresponding destinations "in parallel".
1341     * In other words, if we have two entries: a -> b and b -> a, the values
1342     * get swapped.
1343     */
1344    struct exec_list entries;
1345 } nir_parallel_copy_instr;
1346
1347 NIR_DEFINE_CAST(nir_instr_as_alu, nir_instr, nir_alu_instr, instr)
1348 NIR_DEFINE_CAST(nir_instr_as_call, nir_instr, nir_call_instr, instr)
1349 NIR_DEFINE_CAST(nir_instr_as_jump, nir_instr, nir_jump_instr, instr)
1350 NIR_DEFINE_CAST(nir_instr_as_tex, nir_instr, nir_tex_instr, instr)
1351 NIR_DEFINE_CAST(nir_instr_as_intrinsic, nir_instr, nir_intrinsic_instr, instr)
1352 NIR_DEFINE_CAST(nir_instr_as_load_const, nir_instr, nir_load_const_instr, instr)
1353 NIR_DEFINE_CAST(nir_instr_as_ssa_undef, nir_instr, nir_ssa_undef_instr, instr)
1354 NIR_DEFINE_CAST(nir_instr_as_phi, nir_instr, nir_phi_instr, instr)
1355 NIR_DEFINE_CAST(nir_instr_as_parallel_copy, nir_instr,
1356                 nir_parallel_copy_instr, instr)
1357
1358 /*
1359  * Control flow
1360  *
1361  * Control flow consists of a tree of control flow nodes, which include
1362  * if-statements and loops. The leaves of the tree are basic blocks, lists of
1363  * instructions that always run start-to-finish. Each basic block also keeps
1364  * track of its successors (blocks which may run immediately after the current
1365  * block) and predecessors (blocks which could have run immediately before the
1366  * current block). Each function also has a start block and an end block which
1367  * all return statements point to (which is always empty). Together, all the
1368  * blocks with their predecessors and successors make up the control flow
1369  * graph (CFG) of the function. There are helpers that modify the tree of
1370  * control flow nodes while modifying the CFG appropriately; these should be
1371  * used instead of modifying the tree directly.
1372  */
1373
1374 typedef enum {
1375    nir_cf_node_block,
1376    nir_cf_node_if,
1377    nir_cf_node_loop,
1378    nir_cf_node_function
1379 } nir_cf_node_type;
1380
1381 typedef struct nir_cf_node {
1382    struct exec_node node;
1383    nir_cf_node_type type;
1384    struct nir_cf_node *parent;
1385 } nir_cf_node;
1386
1387 typedef struct nir_block {
1388    nir_cf_node cf_node;
1389
1390    struct exec_list instr_list; /** < list of nir_instr */
1391
1392    /** generic block index; generated by nir_index_blocks */
1393    unsigned index;
1394
1395    /*
1396     * Each block can only have up to 2 successors, so we put them in a simple
1397     * array - no need for anything more complicated.
1398     */
1399    struct nir_block *successors[2];
1400
1401    /* Set of nir_block predecessors in the CFG */
1402    struct set *predecessors;
1403
1404    /*
1405     * this node's immediate dominator in the dominance tree - set to NULL for
1406     * the start block.
1407     */
1408    struct nir_block *imm_dom;
1409
1410    /* This node's children in the dominance tree */
1411    unsigned num_dom_children;
1412    struct nir_block **dom_children;
1413
1414    /* Set of nir_block's on the dominance frontier of this block */
1415    struct set *dom_frontier;
1416
1417    /*
1418     * These two indices have the property that dom_{pre,post}_index for each
1419     * child of this block in the dominance tree will always be between
1420     * dom_pre_index and dom_post_index for this block, which makes testing if
1421     * a given block is dominated by another block an O(1) operation.
1422     */
1423    unsigned dom_pre_index, dom_post_index;
1424
1425    /* live in and out for this block; used for liveness analysis */
1426    BITSET_WORD *live_in;
1427    BITSET_WORD *live_out;
1428 } nir_block;
1429
1430 static inline nir_instr *
1431 nir_block_first_instr(nir_block *block)
1432 {
1433    struct exec_node *head = exec_list_get_head(&block->instr_list);
1434    return exec_node_data(nir_instr, head, node);
1435 }
1436
1437 static inline nir_instr *
1438 nir_block_last_instr(nir_block *block)
1439 {
1440    struct exec_node *tail = exec_list_get_tail(&block->instr_list);
1441    return exec_node_data(nir_instr, tail, node);
1442 }
1443
1444 #define nir_foreach_instr(instr, block) \
1445    foreach_list_typed(nir_instr, instr, node, &(block)->instr_list)
1446 #define nir_foreach_instr_reverse(instr, block) \
1447    foreach_list_typed_reverse(nir_instr, instr, node, &(block)->instr_list)
1448 #define nir_foreach_instr_safe(instr, block) \
1449    foreach_list_typed_safe(nir_instr, instr, node, &(block)->instr_list)
1450 #define nir_foreach_instr_reverse_safe(instr, block) \
1451    foreach_list_typed_reverse_safe(nir_instr, instr, node, &(block)->instr_list)
1452
1453 typedef struct nir_if {
1454    nir_cf_node cf_node;
1455    nir_src condition;
1456
1457    struct exec_list then_list; /** < list of nir_cf_node */
1458    struct exec_list else_list; /** < list of nir_cf_node */
1459 } nir_if;
1460
1461 static inline nir_cf_node *
1462 nir_if_first_then_node(nir_if *if_stmt)
1463 {
1464    struct exec_node *head = exec_list_get_head(&if_stmt->then_list);
1465    return exec_node_data(nir_cf_node, head, node);
1466 }
1467
1468 static inline nir_cf_node *
1469 nir_if_last_then_node(nir_if *if_stmt)
1470 {
1471    struct exec_node *tail = exec_list_get_tail(&if_stmt->then_list);
1472    return exec_node_data(nir_cf_node, tail, node);
1473 }
1474
1475 static inline nir_cf_node *
1476 nir_if_first_else_node(nir_if *if_stmt)
1477 {
1478    struct exec_node *head = exec_list_get_head(&if_stmt->else_list);
1479    return exec_node_data(nir_cf_node, head, node);
1480 }
1481
1482 static inline nir_cf_node *
1483 nir_if_last_else_node(nir_if *if_stmt)
1484 {
1485    struct exec_node *tail = exec_list_get_tail(&if_stmt->else_list);
1486    return exec_node_data(nir_cf_node, tail, node);
1487 }
1488
1489 typedef struct {
1490    nir_cf_node cf_node;
1491
1492    struct exec_list body; /** < list of nir_cf_node */
1493 } nir_loop;
1494
1495 static inline nir_cf_node *
1496 nir_loop_first_cf_node(nir_loop *loop)
1497 {
1498    return exec_node_data(nir_cf_node, exec_list_get_head(&loop->body), node);
1499 }
1500
1501 static inline nir_cf_node *
1502 nir_loop_last_cf_node(nir_loop *loop)
1503 {
1504    return exec_node_data(nir_cf_node, exec_list_get_tail(&loop->body), node);
1505 }
1506
1507 /**
1508  * Various bits of metadata that can may be created or required by
1509  * optimization and analysis passes
1510  */
1511 typedef enum {
1512    nir_metadata_none = 0x0,
1513    nir_metadata_block_index = 0x1,
1514    nir_metadata_dominance = 0x2,
1515    nir_metadata_live_ssa_defs = 0x4,
1516    nir_metadata_not_properly_reset = 0x8,
1517 } nir_metadata;
1518
1519 typedef struct {
1520    nir_cf_node cf_node;
1521
1522    /** pointer to the function of which this is an implementation */
1523    struct nir_function *function;
1524
1525    struct exec_list body; /** < list of nir_cf_node */
1526
1527    nir_block *end_block;
1528
1529    /** list for all local variables in the function */
1530    struct exec_list locals;
1531
1532    /** array of variables used as parameters */
1533    unsigned num_params;
1534    nir_variable **params;
1535
1536    /** variable used to hold the result of the function */
1537    nir_variable *return_var;
1538
1539    /** list of local registers in the function */
1540    struct exec_list registers;
1541
1542    /** next available local register index */
1543    unsigned reg_alloc;
1544
1545    /** next available SSA value index */
1546    unsigned ssa_alloc;
1547
1548    /* total number of basic blocks, only valid when block_index_dirty = false */
1549    unsigned num_blocks;
1550
1551    nir_metadata valid_metadata;
1552 } nir_function_impl;
1553
1554 ATTRIBUTE_RETURNS_NONNULL static inline nir_block *
1555 nir_start_block(nir_function_impl *impl)
1556 {
1557    return (nir_block *) impl->body.head;
1558 }
1559
1560 ATTRIBUTE_RETURNS_NONNULL static inline nir_block *
1561 nir_impl_last_block(nir_function_impl *impl)
1562 {
1563    return (nir_block *) impl->body.tail_pred;
1564 }
1565
1566 static inline nir_cf_node *
1567 nir_cf_node_next(nir_cf_node *node)
1568 {
1569    struct exec_node *next = exec_node_get_next(&node->node);
1570    if (exec_node_is_tail_sentinel(next))
1571       return NULL;
1572    else
1573       return exec_node_data(nir_cf_node, next, node);
1574 }
1575
1576 static inline nir_cf_node *
1577 nir_cf_node_prev(nir_cf_node *node)
1578 {
1579    struct exec_node *prev = exec_node_get_prev(&node->node);
1580    if (exec_node_is_head_sentinel(prev))
1581       return NULL;
1582    else
1583       return exec_node_data(nir_cf_node, prev, node);
1584 }
1585
1586 static inline bool
1587 nir_cf_node_is_first(const nir_cf_node *node)
1588 {
1589    return exec_node_is_head_sentinel(node->node.prev);
1590 }
1591
1592 static inline bool
1593 nir_cf_node_is_last(const nir_cf_node *node)
1594 {
1595    return exec_node_is_tail_sentinel(node->node.next);
1596 }
1597
1598 NIR_DEFINE_CAST(nir_cf_node_as_block, nir_cf_node, nir_block, cf_node)
1599 NIR_DEFINE_CAST(nir_cf_node_as_if, nir_cf_node, nir_if, cf_node)
1600 NIR_DEFINE_CAST(nir_cf_node_as_loop, nir_cf_node, nir_loop, cf_node)
1601 NIR_DEFINE_CAST(nir_cf_node_as_function, nir_cf_node, nir_function_impl, cf_node)
1602
1603 typedef enum {
1604    nir_parameter_in,
1605    nir_parameter_out,
1606    nir_parameter_inout,
1607 } nir_parameter_type;
1608
1609 typedef struct {
1610    nir_parameter_type param_type;
1611    const struct glsl_type *type;
1612 } nir_parameter;
1613
1614 typedef struct nir_function {
1615    struct exec_node node;
1616
1617    const char *name;
1618    struct nir_shader *shader;
1619
1620    unsigned num_params;
1621    nir_parameter *params;
1622    const struct glsl_type *return_type;
1623
1624    /** The implementation of this function.
1625     *
1626     * If the function is only declared and not implemented, this is NULL.
1627     */
1628    nir_function_impl *impl;
1629 } nir_function;
1630
1631 typedef struct nir_shader_compiler_options {
1632    bool lower_fdiv;
1633    bool lower_ffma;
1634    bool fuse_ffma;
1635    bool lower_flrp32;
1636    /** Lowers flrp when it does not support doubles */
1637    bool lower_flrp64;
1638    bool lower_fpow;
1639    bool lower_fsat;
1640    bool lower_fsqrt;
1641    bool lower_fmod32;
1642    bool lower_fmod64;
1643    bool lower_bitfield_extract;
1644    bool lower_bitfield_insert;
1645    bool lower_uadd_carry;
1646    bool lower_usub_borrow;
1647    /** lowers fneg and ineg to fsub and isub. */
1648    bool lower_negate;
1649    /** lowers fsub and isub to fadd+fneg and iadd+ineg. */
1650    bool lower_sub;
1651
1652    /* lower {slt,sge,seq,sne} to {flt,fge,feq,fne} + b2f: */
1653    bool lower_scmp;
1654
1655    /* Does the native fdot instruction replicate its result for four
1656     * components?  If so, then opt_algebraic_late will turn all fdotN
1657     * instructions into fdot_replicatedN instructions.
1658     */
1659    bool fdot_replicates;
1660
1661    /** lowers ffract to fsub+ffloor: */
1662    bool lower_ffract;
1663
1664    bool lower_pack_half_2x16;
1665    bool lower_pack_unorm_2x16;
1666    bool lower_pack_snorm_2x16;
1667    bool lower_pack_unorm_4x8;
1668    bool lower_pack_snorm_4x8;
1669    bool lower_unpack_half_2x16;
1670    bool lower_unpack_unorm_2x16;
1671    bool lower_unpack_snorm_2x16;
1672    bool lower_unpack_unorm_4x8;
1673    bool lower_unpack_snorm_4x8;
1674
1675    bool lower_extract_byte;
1676    bool lower_extract_word;
1677
1678    /**
1679     * Does the driver support real 32-bit integers?  (Otherwise, integers
1680     * are simulated by floats.)
1681     */
1682    bool native_integers;
1683
1684    /* Indicates that the driver only has zero-based vertex id */
1685    bool vertex_id_zero_based;
1686 } nir_shader_compiler_options;
1687
1688 typedef struct nir_shader_info {
1689    const char *name;
1690
1691    /* Descriptive name provided by the client; may be NULL */
1692    const char *label;
1693
1694    /* Number of textures used by this shader */
1695    unsigned num_textures;
1696    /* Number of uniform buffers used by this shader */
1697    unsigned num_ubos;
1698    /* Number of atomic buffers used by this shader */
1699    unsigned num_abos;
1700    /* Number of shader storage buffers used by this shader */
1701    unsigned num_ssbos;
1702    /* Number of images used by this shader */
1703    unsigned num_images;
1704
1705    /* Which inputs are actually read */
1706    uint64_t inputs_read;
1707    /* Which outputs are actually written */
1708    uint64_t outputs_written;
1709    /* Which system values are actually read */
1710    uint64_t system_values_read;
1711
1712    /* Which patch inputs are actually read */
1713    uint32_t patch_inputs_read;
1714    /* Which patch outputs are actually written */
1715    uint32_t patch_outputs_written;
1716
1717    /* Whether or not this shader ever uses textureGather() */
1718    bool uses_texture_gather;
1719
1720    /** Whether or not this shader uses nir_intrinsic_interp_var_at_offset */
1721    bool uses_interp_var_at_offset;
1722
1723    /* Whether or not this shader uses the gl_ClipDistance output */
1724    bool uses_clip_distance_out;
1725
1726    /* Whether or not separate shader objects were used */
1727    bool separate_shader;
1728
1729    /** Was this shader linked with any transform feedback varyings? */
1730    bool has_transform_feedback_varyings;
1731
1732    union {
1733       struct {
1734          /** The number of vertices recieves per input primitive */
1735          unsigned vertices_in;
1736
1737          /** The output primitive type (GL enum value) */
1738          unsigned output_primitive;
1739
1740          /** The maximum number of vertices the geometry shader might write. */
1741          unsigned vertices_out;
1742
1743          /** 1 .. MAX_GEOMETRY_SHADER_INVOCATIONS */
1744          unsigned invocations;
1745
1746          /** Whether or not this shader uses EndPrimitive */
1747          bool uses_end_primitive;
1748
1749          /** Whether or not this shader uses non-zero streams */
1750          bool uses_streams;
1751       } gs;
1752
1753       struct {
1754          bool uses_discard;
1755
1756          /**
1757           * Whether any inputs are declared with the "sample" qualifier.
1758           */
1759          bool uses_sample_qualifier;
1760
1761          /**
1762           * Whether early fragment tests are enabled as defined by
1763           * ARB_shader_image_load_store.
1764           */
1765          bool early_fragment_tests;
1766
1767          /** gl_FragDepth layout for ARB_conservative_depth. */
1768          enum gl_frag_depth_layout depth_layout;
1769       } fs;
1770
1771       struct {
1772          unsigned local_size[3];
1773       } cs;
1774
1775       struct {
1776          /** The number of vertices in the TCS output patch. */
1777          unsigned vertices_out;
1778       } tcs;
1779    };
1780 } nir_shader_info;
1781
1782 typedef struct nir_shader {
1783    /** list of uniforms (nir_variable) */
1784    struct exec_list uniforms;
1785
1786    /** list of inputs (nir_variable) */
1787    struct exec_list inputs;
1788
1789    /** list of outputs (nir_variable) */
1790    struct exec_list outputs;
1791
1792    /** list of shared compute variables (nir_variable) */
1793    struct exec_list shared;
1794
1795    /** Set of driver-specific options for the shader.
1796     *
1797     * The memory for the options is expected to be kept in a single static
1798     * copy by the driver.
1799     */
1800    const struct nir_shader_compiler_options *options;
1801
1802    /** Various bits of compile-time information about a given shader */
1803    struct nir_shader_info info;
1804
1805    /** list of global variables in the shader (nir_variable) */
1806    struct exec_list globals;
1807
1808    /** list of system value variables in the shader (nir_variable) */
1809    struct exec_list system_values;
1810
1811    struct exec_list functions; /** < list of nir_function */
1812
1813    /** list of global register in the shader */
1814    struct exec_list registers;
1815
1816    /** next available global register index */
1817    unsigned reg_alloc;
1818
1819    /**
1820     * the highest index a load_input_*, load_uniform_*, etc. intrinsic can
1821     * access plus one
1822     */
1823    unsigned num_inputs, num_uniforms, num_outputs, num_shared;
1824
1825    /** The shader stage, such as MESA_SHADER_VERTEX. */
1826    gl_shader_stage stage;
1827 } nir_shader;
1828
1829 static inline nir_function *
1830 nir_shader_get_entrypoint(nir_shader *shader)
1831 {
1832    assert(exec_list_length(&shader->functions) == 1);
1833    struct exec_node *func_node = exec_list_get_head(&shader->functions);
1834    nir_function *func = exec_node_data(nir_function, func_node, node);
1835    assert(func->return_type == glsl_void_type());
1836    assert(func->num_params == 0);
1837    return func;
1838 }
1839
1840 #define nir_foreach_function(func, shader) \
1841    foreach_list_typed(nir_function, func, node, &(shader)->functions)
1842
1843 nir_shader *nir_shader_create(void *mem_ctx,
1844                               gl_shader_stage stage,
1845                               const nir_shader_compiler_options *options);
1846
1847 /** creates a register, including assigning it an index and adding it to the list */
1848 nir_register *nir_global_reg_create(nir_shader *shader);
1849
1850 nir_register *nir_local_reg_create(nir_function_impl *impl);
1851
1852 void nir_reg_remove(nir_register *reg);
1853
1854 /** Adds a variable to the appropreate list in nir_shader */
1855 void nir_shader_add_variable(nir_shader *shader, nir_variable *var);
1856
1857 static inline void
1858 nir_function_impl_add_variable(nir_function_impl *impl, nir_variable *var)
1859 {
1860    assert(var->data.mode == nir_var_local);
1861    exec_list_push_tail(&impl->locals, &var->node);
1862 }
1863
1864 /** creates a variable, sets a few defaults, and adds it to the list */
1865 nir_variable *nir_variable_create(nir_shader *shader,
1866                                   nir_variable_mode mode,
1867                                   const struct glsl_type *type,
1868                                   const char *name);
1869 /** creates a local variable and adds it to the list */
1870 nir_variable *nir_local_variable_create(nir_function_impl *impl,
1871                                         const struct glsl_type *type,
1872                                         const char *name);
1873
1874 /** creates a function and adds it to the shader's list of functions */
1875 nir_function *nir_function_create(nir_shader *shader, const char *name);
1876
1877 nir_function_impl *nir_function_impl_create(nir_function *func);
1878 /** creates a function_impl that isn't tied to any particular function */
1879 nir_function_impl *nir_function_impl_create_bare(nir_shader *shader);
1880
1881 nir_block *nir_block_create(nir_shader *shader);
1882 nir_if *nir_if_create(nir_shader *shader);
1883 nir_loop *nir_loop_create(nir_shader *shader);
1884
1885 nir_function_impl *nir_cf_node_get_function(nir_cf_node *node);
1886
1887 /** requests that the given pieces of metadata be generated */
1888 void nir_metadata_require(nir_function_impl *impl, nir_metadata required);
1889 /** dirties all but the preserved metadata */
1890 void nir_metadata_preserve(nir_function_impl *impl, nir_metadata preserved);
1891
1892 /** creates an instruction with default swizzle/writemask/etc. with NULL registers */
1893 nir_alu_instr *nir_alu_instr_create(nir_shader *shader, nir_op op);
1894
1895 nir_jump_instr *nir_jump_instr_create(nir_shader *shader, nir_jump_type type);
1896
1897 nir_load_const_instr *nir_load_const_instr_create(nir_shader *shader,
1898                                                   unsigned num_components,
1899                                                   unsigned bit_size);
1900
1901 nir_intrinsic_instr *nir_intrinsic_instr_create(nir_shader *shader,
1902                                                 nir_intrinsic_op op);
1903
1904 nir_call_instr *nir_call_instr_create(nir_shader *shader,
1905                                       nir_function *callee);
1906
1907 nir_tex_instr *nir_tex_instr_create(nir_shader *shader, unsigned num_srcs);
1908
1909 nir_phi_instr *nir_phi_instr_create(nir_shader *shader);
1910
1911 nir_parallel_copy_instr *nir_parallel_copy_instr_create(nir_shader *shader);
1912
1913 nir_ssa_undef_instr *nir_ssa_undef_instr_create(nir_shader *shader,
1914                                                 unsigned num_components,
1915                                                 unsigned bit_size);
1916
1917 nir_deref_var *nir_deref_var_create(void *mem_ctx, nir_variable *var);
1918 nir_deref_array *nir_deref_array_create(void *mem_ctx);
1919 nir_deref_struct *nir_deref_struct_create(void *mem_ctx, unsigned field_index);
1920
1921 nir_deref *nir_copy_deref(void *mem_ctx, nir_deref *deref);
1922
1923 nir_load_const_instr *
1924 nir_deref_get_const_initializer_load(nir_shader *shader, nir_deref_var *deref);
1925
1926 /**
1927  * NIR Cursors and Instruction Insertion API
1928  * @{
1929  *
1930  * A tiny struct representing a point to insert/extract instructions or
1931  * control flow nodes.  Helps reduce the combinatorial explosion of possible
1932  * points to insert/extract.
1933  *
1934  * \sa nir_control_flow.h
1935  */
1936 typedef enum {
1937    nir_cursor_before_block,
1938    nir_cursor_after_block,
1939    nir_cursor_before_instr,
1940    nir_cursor_after_instr,
1941 } nir_cursor_option;
1942
1943 typedef struct {
1944    nir_cursor_option option;
1945    union {
1946       nir_block *block;
1947       nir_instr *instr;
1948    };
1949 } nir_cursor;
1950
1951 static inline nir_block *
1952 nir_cursor_current_block(nir_cursor cursor)
1953 {
1954    if (cursor.option == nir_cursor_before_instr ||
1955        cursor.option == nir_cursor_after_instr) {
1956       return cursor.instr->block;
1957    } else {
1958       return cursor.block;
1959    }
1960 }
1961
1962 bool nir_cursors_equal(nir_cursor a, nir_cursor b);
1963
1964 static inline nir_cursor
1965 nir_before_block(nir_block *block)
1966 {
1967    nir_cursor cursor;
1968    cursor.option = nir_cursor_before_block;
1969    cursor.block = block;
1970    return cursor;
1971 }
1972
1973 static inline nir_cursor
1974 nir_after_block(nir_block *block)
1975 {
1976    nir_cursor cursor;
1977    cursor.option = nir_cursor_after_block;
1978    cursor.block = block;
1979    return cursor;
1980 }
1981
1982 static inline nir_cursor
1983 nir_before_instr(nir_instr *instr)
1984 {
1985    nir_cursor cursor;
1986    cursor.option = nir_cursor_before_instr;
1987    cursor.instr = instr;
1988    return cursor;
1989 }
1990
1991 static inline nir_cursor
1992 nir_after_instr(nir_instr *instr)
1993 {
1994    nir_cursor cursor;
1995    cursor.option = nir_cursor_after_instr;
1996    cursor.instr = instr;
1997    return cursor;
1998 }
1999
2000 static inline nir_cursor
2001 nir_after_block_before_jump(nir_block *block)
2002 {
2003    nir_instr *last_instr = nir_block_last_instr(block);
2004    if (last_instr && last_instr->type == nir_instr_type_jump) {
2005       return nir_before_instr(last_instr);
2006    } else {
2007       return nir_after_block(block);
2008    }
2009 }
2010
2011 static inline nir_cursor
2012 nir_before_cf_node(nir_cf_node *node)
2013 {
2014    if (node->type == nir_cf_node_block)
2015       return nir_before_block(nir_cf_node_as_block(node));
2016
2017    return nir_after_block(nir_cf_node_as_block(nir_cf_node_prev(node)));
2018 }
2019
2020 static inline nir_cursor
2021 nir_after_cf_node(nir_cf_node *node)
2022 {
2023    if (node->type == nir_cf_node_block)
2024       return nir_after_block(nir_cf_node_as_block(node));
2025
2026    return nir_before_block(nir_cf_node_as_block(nir_cf_node_next(node)));
2027 }
2028
2029 static inline nir_cursor
2030 nir_after_cf_node_and_phis(nir_cf_node *node)
2031 {
2032    if (node->type == nir_cf_node_block)
2033       return nir_after_block(nir_cf_node_as_block(node));
2034
2035    nir_block *block = nir_cf_node_as_block(nir_cf_node_next(node));
2036    assert(block->cf_node.type == nir_cf_node_block);
2037
2038    nir_foreach_instr(instr, block) {
2039       if (instr->type != nir_instr_type_phi)
2040          return nir_before_instr(instr);
2041    }
2042    return nir_after_block(block);
2043 }
2044
2045 static inline nir_cursor
2046 nir_before_cf_list(struct exec_list *cf_list)
2047 {
2048    nir_cf_node *first_node = exec_node_data(nir_cf_node,
2049                                             exec_list_get_head(cf_list), node);
2050    return nir_before_cf_node(first_node);
2051 }
2052
2053 static inline nir_cursor
2054 nir_after_cf_list(struct exec_list *cf_list)
2055 {
2056    nir_cf_node *last_node = exec_node_data(nir_cf_node,
2057                                            exec_list_get_tail(cf_list), node);
2058    return nir_after_cf_node(last_node);
2059 }
2060
2061 /**
2062  * Insert a NIR instruction at the given cursor.
2063  *
2064  * Note: This does not update the cursor.
2065  */
2066 void nir_instr_insert(nir_cursor cursor, nir_instr *instr);
2067
2068 static inline void
2069 nir_instr_insert_before(nir_instr *instr, nir_instr *before)
2070 {
2071    nir_instr_insert(nir_before_instr(instr), before);
2072 }
2073
2074 static inline void
2075 nir_instr_insert_after(nir_instr *instr, nir_instr *after)
2076 {
2077    nir_instr_insert(nir_after_instr(instr), after);
2078 }
2079
2080 static inline void
2081 nir_instr_insert_before_block(nir_block *block, nir_instr *before)
2082 {
2083    nir_instr_insert(nir_before_block(block), before);
2084 }
2085
2086 static inline void
2087 nir_instr_insert_after_block(nir_block *block, nir_instr *after)
2088 {
2089    nir_instr_insert(nir_after_block(block), after);
2090 }
2091
2092 static inline void
2093 nir_instr_insert_before_cf(nir_cf_node *node, nir_instr *before)
2094 {
2095    nir_instr_insert(nir_before_cf_node(node), before);
2096 }
2097
2098 static inline void
2099 nir_instr_insert_after_cf(nir_cf_node *node, nir_instr *after)
2100 {
2101    nir_instr_insert(nir_after_cf_node(node), after);
2102 }
2103
2104 static inline void
2105 nir_instr_insert_before_cf_list(struct exec_list *list, nir_instr *before)
2106 {
2107    nir_instr_insert(nir_before_cf_list(list), before);
2108 }
2109
2110 static inline void
2111 nir_instr_insert_after_cf_list(struct exec_list *list, nir_instr *after)
2112 {
2113    nir_instr_insert(nir_after_cf_list(list), after);
2114 }
2115
2116 void nir_instr_remove(nir_instr *instr);
2117
2118 /** @} */
2119
2120 typedef bool (*nir_foreach_ssa_def_cb)(nir_ssa_def *def, void *state);
2121 typedef bool (*nir_foreach_dest_cb)(nir_dest *dest, void *state);
2122 typedef bool (*nir_foreach_src_cb)(nir_src *src, void *state);
2123 bool nir_foreach_ssa_def(nir_instr *instr, nir_foreach_ssa_def_cb cb,
2124                          void *state);
2125 bool nir_foreach_dest(nir_instr *instr, nir_foreach_dest_cb cb, void *state);
2126 bool nir_foreach_src(nir_instr *instr, nir_foreach_src_cb cb, void *state);
2127
2128 nir_const_value *nir_src_as_const_value(nir_src src);
2129 bool nir_src_is_dynamically_uniform(nir_src src);
2130 bool nir_srcs_equal(nir_src src1, nir_src src2);
2131 void nir_instr_rewrite_src(nir_instr *instr, nir_src *src, nir_src new_src);
2132 void nir_instr_move_src(nir_instr *dest_instr, nir_src *dest, nir_src *src);
2133 void nir_if_rewrite_condition(nir_if *if_stmt, nir_src new_src);
2134 void nir_instr_rewrite_dest(nir_instr *instr, nir_dest *dest,
2135                             nir_dest new_dest);
2136
2137 void nir_ssa_dest_init(nir_instr *instr, nir_dest *dest,
2138                        unsigned num_components, unsigned bit_size,
2139                        const char *name);
2140 void nir_ssa_def_init(nir_instr *instr, nir_ssa_def *def,
2141                       unsigned num_components, unsigned bit_size,
2142                       const char *name);
2143 void nir_ssa_def_rewrite_uses(nir_ssa_def *def, nir_src new_src);
2144 void nir_ssa_def_rewrite_uses_after(nir_ssa_def *def, nir_src new_src,
2145                                     nir_instr *after_me);
2146
2147 uint8_t nir_ssa_def_components_read(nir_ssa_def *def);
2148
2149 /*
2150  * finds the next basic block in source-code order, returns NULL if there is
2151  * none
2152  */
2153
2154 nir_block *nir_block_cf_tree_next(nir_block *block);
2155
2156 /* Performs the opposite of nir_block_cf_tree_next() */
2157
2158 nir_block *nir_block_cf_tree_prev(nir_block *block);
2159
2160 /* Gets the first block in a CF node in source-code order */
2161
2162 nir_block *nir_cf_node_cf_tree_first(nir_cf_node *node);
2163
2164 /* Gets the last block in a CF node in source-code order */
2165
2166 nir_block *nir_cf_node_cf_tree_last(nir_cf_node *node);
2167
2168 /* Gets the next block after a CF node in source-code order */
2169
2170 nir_block *nir_cf_node_cf_tree_next(nir_cf_node *node);
2171
2172 /* Macros for loops that visit blocks in source-code order */
2173
2174 #define nir_foreach_block(block, impl) \
2175    for (nir_block *block = nir_start_block(impl); block != NULL; \
2176         block = nir_block_cf_tree_next(block))
2177
2178 #define nir_foreach_block_safe(block, impl) \
2179    for (nir_block *block = nir_start_block(impl), \
2180         *next = nir_block_cf_tree_next(block); \
2181         block != NULL; \
2182         block = next, next = nir_block_cf_tree_next(block))
2183
2184 #define nir_foreach_block_reverse(block, impl) \
2185    for (nir_block *block = nir_impl_last_block(impl); block != NULL; \
2186         block = nir_block_cf_tree_prev(block))
2187
2188 #define nir_foreach_block_reverse_safe(block, impl) \
2189    for (nir_block *block = nir_impl_last_block(impl), \
2190         *prev = nir_block_cf_tree_prev(block); \
2191         block != NULL; \
2192         block = prev, prev = nir_block_cf_tree_prev(block))
2193
2194 #define nir_foreach_block_in_cf_node(block, node) \
2195    for (nir_block *block = nir_cf_node_cf_tree_first(node); \
2196         block != nir_cf_node_cf_tree_next(node); \
2197         block = nir_block_cf_tree_next(block))
2198
2199 /* If the following CF node is an if, this function returns that if.
2200  * Otherwise, it returns NULL.
2201  */
2202 nir_if *nir_block_get_following_if(nir_block *block);
2203
2204 nir_loop *nir_block_get_following_loop(nir_block *block);
2205
2206 void nir_index_local_regs(nir_function_impl *impl);
2207 void nir_index_global_regs(nir_shader *shader);
2208 void nir_index_ssa_defs(nir_function_impl *impl);
2209 unsigned nir_index_instrs(nir_function_impl *impl);
2210
2211 void nir_index_blocks(nir_function_impl *impl);
2212
2213 void nir_print_shader(nir_shader *shader, FILE *fp);
2214 void nir_print_instr(const nir_instr *instr, FILE *fp);
2215
2216 nir_shader *nir_shader_clone(void *mem_ctx, const nir_shader *s);
2217 nir_function_impl *nir_function_impl_clone(const nir_function_impl *fi);
2218 nir_constant *nir_constant_clone(const nir_constant *c, nir_variable *var);
2219 nir_variable *nir_variable_clone(const nir_variable *c, nir_shader *shader);
2220
2221 #ifdef DEBUG
2222 void nir_validate_shader(nir_shader *shader);
2223 void nir_metadata_set_validation_flag(nir_shader *shader);
2224 void nir_metadata_check_validation_flag(nir_shader *shader);
2225
2226 #include "util/debug.h"
2227 static inline bool
2228 should_clone_nir(void)
2229 {
2230    static int should_clone = -1;
2231    if (should_clone < 0)
2232       should_clone = env_var_as_boolean("NIR_TEST_CLONE", false);
2233
2234    return should_clone;
2235 }
2236 #else
2237 static inline void nir_validate_shader(nir_shader *shader) { (void) shader; }
2238 static inline void nir_metadata_set_validation_flag(nir_shader *shader) { (void) shader; }
2239 static inline void nir_metadata_check_validation_flag(nir_shader *shader) { (void) shader; }
2240 static inline bool should_clone_nir(void) { return false; }
2241 #endif /* DEBUG */
2242
2243 #define _PASS(nir, do_pass) do {                                     \
2244    do_pass                                                           \
2245    nir_validate_shader(nir);                                         \
2246    if (should_clone_nir()) {                                         \
2247       nir_shader *clone = nir_shader_clone(ralloc_parent(nir), nir); \
2248       ralloc_free(nir);                                              \
2249       nir = clone;                                                   \
2250    }                                                                 \
2251 } while (0)
2252
2253 #define NIR_PASS(progress, nir, pass, ...) _PASS(nir,                \
2254    nir_metadata_set_validation_flag(nir);                            \
2255    if (pass(nir, ##__VA_ARGS__)) {                                   \
2256       progress = true;                                               \
2257       nir_metadata_check_validation_flag(nir);                       \
2258    }                                                                 \
2259 )
2260
2261 #define NIR_PASS_V(nir, pass, ...) _PASS(nir,                        \
2262    pass(nir, ##__VA_ARGS__);                                         \
2263 )
2264
2265 void nir_calc_dominance_impl(nir_function_impl *impl);
2266 void nir_calc_dominance(nir_shader *shader);
2267
2268 nir_block *nir_dominance_lca(nir_block *b1, nir_block *b2);
2269 bool nir_block_dominates(nir_block *parent, nir_block *child);
2270
2271 void nir_dump_dom_tree_impl(nir_function_impl *impl, FILE *fp);
2272 void nir_dump_dom_tree(nir_shader *shader, FILE *fp);
2273
2274 void nir_dump_dom_frontier_impl(nir_function_impl *impl, FILE *fp);
2275 void nir_dump_dom_frontier(nir_shader *shader, FILE *fp);
2276
2277 void nir_dump_cfg_impl(nir_function_impl *impl, FILE *fp);
2278 void nir_dump_cfg(nir_shader *shader, FILE *fp);
2279
2280 int nir_gs_count_vertices(const nir_shader *shader);
2281
2282 bool nir_split_var_copies(nir_shader *shader);
2283
2284 bool nir_lower_returns_impl(nir_function_impl *impl);
2285 bool nir_lower_returns(nir_shader *shader);
2286
2287 bool nir_inline_functions(nir_shader *shader);
2288
2289 void nir_lower_var_copy_instr(nir_intrinsic_instr *copy, void *mem_ctx);
2290 void nir_lower_var_copies(nir_shader *shader);
2291
2292 bool nir_lower_global_vars_to_local(nir_shader *shader);
2293
2294 bool nir_lower_indirect_derefs(nir_shader *shader, nir_variable_mode modes);
2295
2296 bool nir_lower_locals_to_regs(nir_shader *shader);
2297
2298 void nir_lower_io_to_temporaries(nir_shader *shader, nir_function *entrypoint,
2299                                  bool outputs, bool inputs);
2300
2301 void nir_shader_gather_info(nir_shader *shader, nir_function_impl *entrypoint);
2302
2303 void nir_assign_var_locations(struct exec_list *var_list,
2304                               unsigned *size,
2305                               int (*type_size)(const struct glsl_type *));
2306
2307 void nir_lower_io(nir_shader *shader,
2308                   nir_variable_mode modes,
2309                   int (*type_size)(const struct glsl_type *));
2310 nir_src *nir_get_io_offset_src(nir_intrinsic_instr *instr);
2311 nir_src *nir_get_io_vertex_index_src(nir_intrinsic_instr *instr);
2312
2313 void nir_lower_io_types(nir_shader *shader);
2314 void nir_lower_vars_to_ssa(nir_shader *shader);
2315
2316 bool nir_remove_dead_variables(nir_shader *shader, nir_variable_mode modes);
2317
2318 void nir_move_vec_src_uses_to_dest(nir_shader *shader);
2319 bool nir_lower_vec_to_movs(nir_shader *shader);
2320 void nir_lower_alu_to_scalar(nir_shader *shader);
2321 void nir_lower_load_const_to_scalar(nir_shader *shader);
2322
2323 void nir_lower_phis_to_scalar(nir_shader *shader);
2324
2325 void nir_lower_samplers(nir_shader *shader,
2326                         const struct gl_shader_program *shader_program);
2327
2328 bool nir_lower_system_values(nir_shader *shader);
2329
2330 typedef struct nir_lower_tex_options {
2331    /**
2332     * bitmask of (1 << GLSL_SAMPLER_DIM_x) to control for which
2333     * sampler types a texture projector is lowered.
2334     */
2335    unsigned lower_txp;
2336
2337    /**
2338     * If true, lower rect textures to 2D, using txs to fetch the
2339     * texture dimensions and dividing the texture coords by the
2340     * texture dims to normalize.
2341     */
2342    bool lower_rect;
2343
2344    /**
2345     * To emulate certain texture wrap modes, this can be used
2346     * to saturate the specified tex coord to [0.0, 1.0].  The
2347     * bits are according to sampler #, ie. if, for example:
2348     *
2349     *   (conf->saturate_s & (1 << n))
2350     *
2351     * is true, then the s coord for sampler n is saturated.
2352     *
2353     * Note that clamping must happen *after* projector lowering
2354     * so any projected texture sample instruction with a clamped
2355     * coordinate gets automatically lowered, regardless of the
2356     * 'lower_txp' setting.
2357     */
2358    unsigned saturate_s;
2359    unsigned saturate_t;
2360    unsigned saturate_r;
2361
2362    /* Bitmask of textures that need swizzling.
2363     *
2364     * If (swizzle_result & (1 << texture_index)), then the swizzle in
2365     * swizzles[texture_index] is applied to the result of the texturing
2366     * operation.
2367     */
2368    unsigned swizzle_result;
2369
2370    /* A swizzle for each texture.  Values 0-3 represent x, y, z, or w swizzles
2371     * while 4 and 5 represent 0 and 1 respectively.
2372     */
2373    uint8_t swizzles[32][4];
2374
2375    /**
2376     * Bitmap of textures that need srgb to linear conversion.  If
2377     * (lower_srgb & (1 << texture_index)) then the rgb (xyz) components
2378     * of the texture are lowered to linear.
2379     */
2380    unsigned lower_srgb;
2381 } nir_lower_tex_options;
2382
2383 bool nir_lower_tex(nir_shader *shader,
2384                    const nir_lower_tex_options *options);
2385
2386 bool nir_lower_idiv(nir_shader *shader);
2387
2388 void nir_lower_clip_vs(nir_shader *shader, unsigned ucp_enables);
2389 void nir_lower_clip_fs(nir_shader *shader, unsigned ucp_enables);
2390
2391 void nir_lower_two_sided_color(nir_shader *shader);
2392
2393 void nir_lower_clamp_color_outputs(nir_shader *shader);
2394
2395 void nir_lower_passthrough_edgeflags(nir_shader *shader);
2396
2397 typedef struct nir_lower_wpos_ytransform_options {
2398    int state_tokens[5];
2399    bool fs_coord_origin_upper_left :1;
2400    bool fs_coord_origin_lower_left :1;
2401    bool fs_coord_pixel_center_integer :1;
2402    bool fs_coord_pixel_center_half_integer :1;
2403 } nir_lower_wpos_ytransform_options;
2404
2405 bool nir_lower_wpos_ytransform(nir_shader *shader,
2406                                const nir_lower_wpos_ytransform_options *options);
2407
2408 typedef struct nir_lower_drawpixels_options {
2409    int texcoord_state_tokens[5];
2410    int scale_state_tokens[5];
2411    int bias_state_tokens[5];
2412    unsigned drawpix_sampler;
2413    unsigned pixelmap_sampler;
2414    bool pixel_maps :1;
2415    bool scale_and_bias :1;
2416 } nir_lower_drawpixels_options;
2417
2418 void nir_lower_drawpixels(nir_shader *shader,
2419                           const nir_lower_drawpixels_options *options);
2420
2421 typedef struct nir_lower_bitmap_options {
2422    unsigned sampler;
2423    bool swizzle_xxxx;
2424 } nir_lower_bitmap_options;
2425
2426 void nir_lower_bitmap(nir_shader *shader, const nir_lower_bitmap_options *options);
2427
2428 void nir_lower_atomics(nir_shader *shader,
2429                        const struct gl_shader_program *shader_program);
2430 void nir_lower_to_source_mods(nir_shader *shader);
2431
2432 bool nir_lower_gs_intrinsics(nir_shader *shader);
2433
2434 typedef enum {
2435    nir_lower_drcp = (1 << 0),
2436    nir_lower_dsqrt = (1 << 1),
2437    nir_lower_drsq = (1 << 2),
2438    nir_lower_dtrunc = (1 << 3),
2439    nir_lower_dfloor = (1 << 4),
2440    nir_lower_dceil = (1 << 5),
2441    nir_lower_dfract = (1 << 6),
2442    nir_lower_dround_even = (1 << 7),
2443    nir_lower_dmod = (1 << 8)
2444 } nir_lower_doubles_options;
2445
2446 void nir_lower_doubles(nir_shader *shader, nir_lower_doubles_options options);
2447 void nir_lower_double_pack(nir_shader *shader);
2448
2449 bool nir_normalize_cubemap_coords(nir_shader *shader);
2450
2451 void nir_live_ssa_defs_impl(nir_function_impl *impl);
2452 bool nir_ssa_defs_interfere(nir_ssa_def *a, nir_ssa_def *b);
2453
2454 void nir_convert_to_ssa_impl(nir_function_impl *impl);
2455 void nir_convert_to_ssa(nir_shader *shader);
2456
2457 bool nir_repair_ssa_impl(nir_function_impl *impl);
2458 bool nir_repair_ssa(nir_shader *shader);
2459
2460 /* If phi_webs_only is true, only convert SSA values involved in phi nodes to
2461  * registers.  If false, convert all values (even those not involved in a phi
2462  * node) to registers.
2463  */
2464 void nir_convert_from_ssa(nir_shader *shader, bool phi_webs_only);
2465
2466 bool nir_opt_algebraic(nir_shader *shader);
2467 bool nir_opt_algebraic_late(nir_shader *shader);
2468 bool nir_opt_constant_folding(nir_shader *shader);
2469
2470 bool nir_opt_global_to_local(nir_shader *shader);
2471
2472 bool nir_copy_prop(nir_shader *shader);
2473
2474 bool nir_opt_cse(nir_shader *shader);
2475
2476 bool nir_opt_dce(nir_shader *shader);
2477
2478 bool nir_opt_dead_cf(nir_shader *shader);
2479
2480 void nir_opt_gcm(nir_shader *shader);
2481
2482 bool nir_opt_peephole_select(nir_shader *shader);
2483
2484 bool nir_opt_remove_phis(nir_shader *shader);
2485
2486 bool nir_opt_undef(nir_shader *shader);
2487
2488 void nir_sweep(nir_shader *shader);
2489
2490 nir_intrinsic_op nir_intrinsic_from_system_value(gl_system_value val);
2491 gl_system_value nir_system_value_from_intrinsic(nir_intrinsic_op intrin);
2492
2493 #ifdef __cplusplus
2494 } /* extern "C" */
2495 #endif