• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* -*- c++ -*- */
2 /*
3  * Copyright © 2010 Intel Corporation
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the next
13  * paragraph) shall be included in all copies or substantial portions of the
14  * Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22  * DEALINGS IN THE SOFTWARE.
23  */
24 
25 #ifndef IR_H
26 #define IR_H
27 
28 #include <stdio.h>
29 #include <stdlib.h>
30 
31 #include "util/ralloc.h"
32 #include "util/format/u_format.h"
33 #include "util/half_float.h"
34 #include "compiler/glsl_types.h"
35 #include "list.h"
36 #include "ir_visitor.h"
37 #include "ir_hierarchical_visitor.h"
38 
39 #ifdef __cplusplus
40 
41 /**
42  * \defgroup IR Intermediate representation nodes
43  *
44  * @{
45  */
46 
47 /**
48  * Class tags
49  *
50  * Each concrete class derived from \c ir_instruction has a value in this
51  * enumerant.  The value for the type is stored in \c ir_instruction::ir_type
52  * by the constructor.  While using type tags is not very C++, it is extremely
53  * convenient.  For example, during debugging you can simply inspect
54  * \c ir_instruction::ir_type to find out the actual type of the object.
55  *
56  * In addition, it is possible to use a switch-statement based on \c
57  * \c ir_instruction::ir_type to select different behavior for different object
58  * types.  For functions that have only slight differences for several object
59  * types, this allows writing very straightforward, readable code.
60  */
61 enum ir_node_type {
62    ir_type_dereference_array,
63    ir_type_dereference_record,
64    ir_type_dereference_variable,
65    ir_type_constant,
66    ir_type_expression,
67    ir_type_swizzle,
68    ir_type_texture,
69    ir_type_variable,
70    ir_type_assignment,
71    ir_type_call,
72    ir_type_function,
73    ir_type_function_signature,
74    ir_type_if,
75    ir_type_loop,
76    ir_type_loop_jump,
77    ir_type_return,
78    ir_type_discard,
79    ir_type_demote,
80    ir_type_emit_vertex,
81    ir_type_end_primitive,
82    ir_type_barrier,
83    ir_type_max, /**< maximum ir_type enum number, for validation */
84    ir_type_unset = ir_type_max
85 };
86 
87 
88 /**
89  * Base class of all IR instructions
90  */
91 class ir_instruction : public exec_node {
92 public:
93    enum ir_node_type ir_type;
94 
95    /**
96     * GCC 4.7+ and clang warn when deleting an ir_instruction unless
97     * there's a virtual destructor present.  Because we almost
98     * universally use ralloc for our memory management of
99     * ir_instructions, the destructor doesn't need to do any work.
100     */
~ir_instruction()101    virtual ~ir_instruction()
102    {
103    }
104 
105    /** ir_print_visitor helper for debugging. */
106    void print(void) const;
107    void fprint(FILE *f) const;
108 
109    virtual void accept(ir_visitor *) = 0;
110    virtual ir_visitor_status accept(ir_hierarchical_visitor *) = 0;
111    virtual ir_instruction *clone(void *mem_ctx,
112 				 struct hash_table *ht) const = 0;
113 
is_rvalue()114    bool is_rvalue() const
115    {
116       return ir_type == ir_type_dereference_array ||
117              ir_type == ir_type_dereference_record ||
118              ir_type == ir_type_dereference_variable ||
119              ir_type == ir_type_constant ||
120              ir_type == ir_type_expression ||
121              ir_type == ir_type_swizzle ||
122              ir_type == ir_type_texture;
123    }
124 
is_dereference()125    bool is_dereference() const
126    {
127       return ir_type == ir_type_dereference_array ||
128              ir_type == ir_type_dereference_record ||
129              ir_type == ir_type_dereference_variable;
130    }
131 
is_jump()132    bool is_jump() const
133    {
134       return ir_type == ir_type_loop_jump ||
135              ir_type == ir_type_return ||
136              ir_type == ir_type_discard;
137    }
138 
139    /**
140     * \name IR instruction downcast functions
141     *
142     * These functions either cast the object to a derived class or return
143     * \c NULL if the object's type does not match the specified derived class.
144     * Additional downcast functions will be added as needed.
145     */
146    /*@{*/
147    #define AS_BASE(TYPE)                                \
148    class ir_##TYPE *as_##TYPE()                         \
149    {                                                    \
150       assume(this != NULL);                             \
151       return is_##TYPE() ? (ir_##TYPE *) this : NULL;   \
152    }                                                    \
153    const class ir_##TYPE *as_##TYPE() const             \
154    {                                                    \
155       assume(this != NULL);                             \
156       return is_##TYPE() ? (ir_##TYPE *) this : NULL;   \
157    }
158 
159    AS_BASE(rvalue)
160    AS_BASE(dereference)
161    AS_BASE(jump)
162    #undef AS_BASE
163 
164    #define AS_CHILD(TYPE) \
165    class ir_##TYPE * as_##TYPE() \
166    { \
167       assume(this != NULL);                                         \
168       return ir_type == ir_type_##TYPE ? (ir_##TYPE *) this : NULL; \
169    }                                                                      \
170    const class ir_##TYPE * as_##TYPE() const                              \
171    {                                                                      \
172       assume(this != NULL);                                               \
173       return ir_type == ir_type_##TYPE ? (const ir_##TYPE *) this : NULL; \
174    }
175    AS_CHILD(variable)
176    AS_CHILD(function)
177    AS_CHILD(dereference_array)
178    AS_CHILD(dereference_variable)
179    AS_CHILD(dereference_record)
180    AS_CHILD(expression)
181    AS_CHILD(loop)
182    AS_CHILD(assignment)
183    AS_CHILD(call)
184    AS_CHILD(return)
185    AS_CHILD(if)
186    AS_CHILD(swizzle)
187    AS_CHILD(texture)
188    AS_CHILD(constant)
189    AS_CHILD(discard)
190    #undef AS_CHILD
191    /*@}*/
192 
193    /**
194     * IR equality method: Return true if the referenced instruction would
195     * return the same value as this one.
196     *
197     * This intended to be used for CSE and algebraic optimizations, on rvalues
198     * in particular.  No support for other instruction types (assignments,
199     * jumps, calls, etc.) is planned.
200     */
201    virtual bool equals(const ir_instruction *ir,
202                        enum ir_node_type ignore = ir_type_unset) const;
203 
204 protected:
ir_instruction(enum ir_node_type t)205    ir_instruction(enum ir_node_type t)
206       : ir_type(t)
207    {
208    }
209 
210 private:
ir_instruction()211    ir_instruction()
212    {
213       assert(!"Should not get here.");
214    }
215 };
216 
217 
218 /**
219  * The base class for all "values"/expression trees.
220  */
221 class ir_rvalue : public ir_instruction {
222 public:
223    const struct glsl_type *type;
224 
225    virtual ir_rvalue *clone(void *mem_ctx, struct hash_table *) const;
226 
accept(ir_visitor * v)227    virtual void accept(ir_visitor *v)
228    {
229       v->visit(this);
230    }
231 
232    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
233 
234    virtual ir_constant *constant_expression_value(void *mem_ctx,
235                                                   struct hash_table *variable_context = NULL);
236 
237    ir_rvalue *as_rvalue_to_saturate();
238 
239    virtual bool is_lvalue(const struct _mesa_glsl_parse_state * = NULL) const
240    {
241       return false;
242    }
243 
244    /**
245     * Get the variable that is ultimately referenced by an r-value
246     */
variable_referenced()247    virtual ir_variable *variable_referenced() const
248    {
249       return NULL;
250    }
251 
252 
253    /**
254     * If an r-value is a reference to a whole variable, get that variable
255     *
256     * \return
257     * Pointer to a variable that is completely dereferenced by the r-value.  If
258     * the r-value is not a dereference or the dereference does not access the
259     * entire variable (i.e., it's just one array element, struct field), \c NULL
260     * is returned.
261     */
whole_variable_referenced()262    virtual ir_variable *whole_variable_referenced()
263    {
264       return NULL;
265    }
266 
267    /**
268     * Determine if an r-value has the value zero
269     *
270     * The base implementation of this function always returns \c false.  The
271     * \c ir_constant class over-rides this function to return \c true \b only
272     * for vector and scalar types that have all elements set to the value
273     * zero (or \c false for booleans).
274     *
275     * \sa ir_constant::has_value, ir_rvalue::is_one, ir_rvalue::is_negative_one
276     */
277    virtual bool is_zero() const;
278 
279    /**
280     * Determine if an r-value has the value one
281     *
282     * The base implementation of this function always returns \c false.  The
283     * \c ir_constant class over-rides this function to return \c true \b only
284     * for vector and scalar types that have all elements set to the value
285     * one (or \c true for booleans).
286     *
287     * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_negative_one
288     */
289    virtual bool is_one() const;
290 
291    /**
292     * Determine if an r-value has the value negative one
293     *
294     * The base implementation of this function always returns \c false.  The
295     * \c ir_constant class over-rides this function to return \c true \b only
296     * for vector and scalar types that have all elements set to the value
297     * negative one.  For boolean types, the result is always \c false.
298     *
299     * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_one
300     */
301    virtual bool is_negative_one() const;
302 
303    /**
304     * Determine if an r-value is an unsigned integer constant which can be
305     * stored in 16 bits.
306     *
307     * \sa ir_constant::is_uint16_constant.
308     */
is_uint16_constant()309    virtual bool is_uint16_constant() const { return false; }
310 
311    /**
312     * Return a generic value of error_type.
313     *
314     * Allocation will be performed with 'mem_ctx' as ralloc owner.
315     */
316    static ir_rvalue *error_value(void *mem_ctx);
317 
318 protected:
319    ir_rvalue(enum ir_node_type t);
320 };
321 
322 
323 /**
324  * Variable storage classes
325  */
326 enum ir_variable_mode {
327    ir_var_auto = 0,             /**< Function local variables and globals. */
328    ir_var_uniform,              /**< Variable declared as a uniform. */
329    ir_var_shader_storage,       /**< Variable declared as an ssbo. */
330    ir_var_shader_shared,        /**< Variable declared as shared. */
331    ir_var_shader_in,
332    ir_var_shader_out,
333    ir_var_function_in,
334    ir_var_function_out,
335    ir_var_function_inout,
336    ir_var_const_in,             /**< "in" param that must be a constant expression */
337    ir_var_system_value,         /**< Ex: front-face, instance-id, etc. */
338    ir_var_temporary,            /**< Temporary variable generated during compilation. */
339    ir_var_mode_count            /**< Number of variable modes */
340 };
341 
342 /**
343  * Enum keeping track of how a variable was declared.  For error checking of
344  * the gl_PerVertex redeclaration rules.
345  */
346 enum ir_var_declaration_type {
347    /**
348     * Normal declaration (for most variables, this means an explicit
349     * declaration.  Exception: temporaries are always implicitly declared, but
350     * they still use ir_var_declared_normally).
351     *
352     * Note: an ir_variable that represents a named interface block uses
353     * ir_var_declared_normally.
354     */
355    ir_var_declared_normally = 0,
356 
357    /**
358     * Variable was explicitly declared (or re-declared) in an unnamed
359     * interface block.
360     */
361    ir_var_declared_in_block,
362 
363    /**
364     * Variable is an implicitly declared built-in that has not been explicitly
365     * re-declared by the shader.
366     */
367    ir_var_declared_implicitly,
368 
369    /**
370     * Variable is implicitly generated by the compiler and should not be
371     * visible via the API.
372     */
373    ir_var_hidden,
374 };
375 
376 /**
377  * \brief Layout qualifiers for gl_FragDepth.
378  *
379  * The AMD/ARB_conservative_depth extensions allow gl_FragDepth to be redeclared
380  * with a layout qualifier.
381  */
382 enum ir_depth_layout {
383     ir_depth_layout_none, /**< No depth layout is specified. */
384     ir_depth_layout_any,
385     ir_depth_layout_greater,
386     ir_depth_layout_less,
387     ir_depth_layout_unchanged
388 };
389 
390 /**
391  * \brief Convert depth layout qualifier to string.
392  */
393 const char*
394 depth_layout_string(ir_depth_layout layout);
395 
396 /**
397  * Description of built-in state associated with a uniform
398  *
399  * \sa ir_variable::state_slots
400  */
401 struct ir_state_slot {
402    gl_state_index16 tokens[STATE_LENGTH];
403    int swizzle;
404 };
405 
406 
407 /**
408  * Get the string value for an interpolation qualifier
409  *
410  * \return The string that would be used in a shader to specify \c
411  * mode will be returned.
412  *
413  * This function is used to generate error messages of the form "shader
414  * uses %s interpolation qualifier", so in the case where there is no
415  * interpolation qualifier, it returns "no".
416  *
417  * This function should only be used on a shader input or output variable.
418  */
419 const char *interpolation_string(unsigned interpolation);
420 
421 
422 class ir_variable : public ir_instruction {
423 public:
424    ir_variable(const struct glsl_type *, const char *, ir_variable_mode);
425 
426    virtual ir_variable *clone(void *mem_ctx, struct hash_table *ht) const;
427 
accept(ir_visitor * v)428    virtual void accept(ir_visitor *v)
429    {
430       v->visit(this);
431    }
432 
433    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
434 
435 
436    /**
437     * Determine whether or not a variable is part of a uniform or
438     * shader storage block.
439     */
is_in_buffer_block()440    inline bool is_in_buffer_block() const
441    {
442       return (this->data.mode == ir_var_uniform ||
443               this->data.mode == ir_var_shader_storage) &&
444              this->interface_type != NULL;
445    }
446 
447    /**
448     * Determine whether or not a variable is part of a shader storage block.
449     */
is_in_shader_storage_block()450    inline bool is_in_shader_storage_block() const
451    {
452       return this->data.mode == ir_var_shader_storage &&
453              this->interface_type != NULL;
454    }
455 
456    /**
457     * Determine whether or not a variable is the declaration of an interface
458     * block
459     *
460     * For the first declaration below, there will be an \c ir_variable named
461     * "instance" whose type and whose instance_type will be the same
462     * \c glsl_type.  For the second declaration, there will be an \c ir_variable
463     * named "f" whose type is float and whose instance_type is B2.
464     *
465     * "instance" is an interface instance variable, but "f" is not.
466     *
467     * uniform B1 {
468     *     float f;
469     * } instance;
470     *
471     * uniform B2 {
472     *     float f;
473     * };
474     */
is_interface_instance()475    inline bool is_interface_instance() const
476    {
477       return this->type->without_array() == this->interface_type;
478    }
479 
480    /**
481     * Return whether this variable contains a bindless sampler/image.
482     */
contains_bindless()483    inline bool contains_bindless() const
484    {
485       if (!this->type->contains_sampler() && !this->type->contains_image())
486          return false;
487 
488       return this->data.bindless || this->data.mode != ir_var_uniform;
489    }
490 
491    /**
492     * Set this->interface_type on a newly created variable.
493     */
init_interface_type(const struct glsl_type * type)494    void init_interface_type(const struct glsl_type *type)
495    {
496       assert(this->interface_type == NULL);
497       this->interface_type = type;
498       if (this->is_interface_instance()) {
499          this->u.max_ifc_array_access =
500             ralloc_array(this, int, type->length);
501          for (unsigned i = 0; i < type->length; i++) {
502             this->u.max_ifc_array_access[i] = -1;
503          }
504       }
505    }
506 
507    /**
508     * Change this->interface_type on a variable that previously had a
509     * different, but compatible, interface_type.  This is used during linking
510     * to set the size of arrays in interface blocks.
511     */
change_interface_type(const struct glsl_type * type)512    void change_interface_type(const struct glsl_type *type)
513    {
514       if (this->u.max_ifc_array_access != NULL) {
515          /* max_ifc_array_access has already been allocated, so make sure the
516           * new interface has the same number of fields as the old one.
517           */
518          assert(this->interface_type->length == type->length);
519       }
520       this->interface_type = type;
521    }
522 
523    /**
524     * Change this->interface_type on a variable that previously had a
525     * different, and incompatible, interface_type. This is used during
526     * compilation to handle redeclaration of the built-in gl_PerVertex
527     * interface block.
528     */
reinit_interface_type(const struct glsl_type * type)529    void reinit_interface_type(const struct glsl_type *type)
530    {
531       if (this->u.max_ifc_array_access != NULL) {
532 #ifndef NDEBUG
533          /* Redeclaring gl_PerVertex is only allowed if none of the built-ins
534           * it defines have been accessed yet; so it's safe to throw away the
535           * old max_ifc_array_access pointer, since all of its values are
536           * zero.
537           */
538          for (unsigned i = 0; i < this->interface_type->length; i++)
539             assert(this->u.max_ifc_array_access[i] == -1);
540 #endif
541          ralloc_free(this->u.max_ifc_array_access);
542          this->u.max_ifc_array_access = NULL;
543       }
544       this->interface_type = NULL;
545       init_interface_type(type);
546    }
547 
get_interface_type()548    const glsl_type *get_interface_type() const
549    {
550       return this->interface_type;
551    }
552 
get_interface_type_packing()553    enum glsl_interface_packing get_interface_type_packing() const
554    {
555      return this->interface_type->get_interface_packing();
556    }
557    /**
558     * Get the max_ifc_array_access pointer
559     *
560     * A "set" function is not needed because the array is dynamically allocated
561     * as necessary.
562     */
get_max_ifc_array_access()563    inline int *get_max_ifc_array_access()
564    {
565       assert(this->data._num_state_slots == 0);
566       return this->u.max_ifc_array_access;
567    }
568 
get_num_state_slots()569    inline unsigned get_num_state_slots() const
570    {
571       assert(!this->is_interface_instance()
572              || this->data._num_state_slots == 0);
573       return this->data._num_state_slots;
574    }
575 
set_num_state_slots(unsigned n)576    inline void set_num_state_slots(unsigned n)
577    {
578       assert(!this->is_interface_instance()
579              || n == 0);
580       this->data._num_state_slots = n;
581    }
582 
get_state_slots()583    inline ir_state_slot *get_state_slots()
584    {
585       return this->is_interface_instance() ? NULL : this->u.state_slots;
586    }
587 
get_state_slots()588    inline const ir_state_slot *get_state_slots() const
589    {
590       return this->is_interface_instance() ? NULL : this->u.state_slots;
591    }
592 
allocate_state_slots(unsigned n)593    inline ir_state_slot *allocate_state_slots(unsigned n)
594    {
595       assert(!this->is_interface_instance());
596 
597       this->u.state_slots = ralloc_array(this, ir_state_slot, n);
598       this->data._num_state_slots = 0;
599 
600       if (this->u.state_slots != NULL)
601          this->data._num_state_slots = n;
602 
603       return this->u.state_slots;
604    }
605 
is_interpolation_flat()606    inline bool is_interpolation_flat() const
607    {
608       return this->data.interpolation == INTERP_MODE_FLAT ||
609              this->type->contains_integer() ||
610              this->type->contains_double();
611    }
612 
is_name_ralloced()613    inline bool is_name_ralloced() const
614    {
615       return this->name != ir_variable::tmp_name &&
616              this->name != this->name_storage;
617    }
618 
619    /**
620     * Enable emitting extension warnings for this variable
621     */
622    void enable_extension_warning(const char *extension);
623 
624    /**
625     * Get the extension warning string for this variable
626     *
627     * If warnings are not enabled, \c NULL is returned.
628     */
629    const char *get_extension_warning() const;
630 
631    /**
632     * Declared type of the variable
633     */
634    const struct glsl_type *type;
635 
636    /**
637     * Declared name of the variable
638     */
639    const char *name;
640 
641 private:
642    /**
643     * If the name length fits into name_storage, it's used, otherwise
644     * the name is ralloc'd. shader-db mining showed that 70% of variables
645     * fit here. This is a win over ralloc where only ralloc_header has
646     * 20 bytes on 64-bit (28 bytes with DEBUG), and we can also skip malloc.
647     */
648    char name_storage[16];
649 
650 public:
651    struct ir_variable_data {
652 
653       /**
654        * Is the variable read-only?
655        *
656        * This is set for variables declared as \c const, shader inputs,
657        * and uniforms.
658        */
659       unsigned read_only:1;
660       unsigned centroid:1;
661       unsigned sample:1;
662       unsigned patch:1;
663       /**
664        * Was an 'invariant' qualifier explicitly set in the shader?
665        *
666        * This is used to cross validate qualifiers.
667        */
668       unsigned explicit_invariant:1;
669       /**
670        * Is the variable invariant?
671        *
672        * It can happen either by having the 'invariant' qualifier
673        * explicitly set in the shader or by being used in calculations
674        * of other invariant variables.
675        */
676       unsigned invariant:1;
677       unsigned precise:1;
678 
679       /**
680        * Has this variable been used for reading or writing?
681        *
682        * Several GLSL semantic checks require knowledge of whether or not a
683        * variable has been used.  For example, it is an error to redeclare a
684        * variable as invariant after it has been used.
685        *
686        * This is maintained in the ast_to_hir.cpp path and during linking,
687        * but not in Mesa's fixed function or ARB program paths.
688        */
689       unsigned used:1;
690 
691       /**
692        * Has this variable been statically assigned?
693        *
694        * This answers whether the variable was assigned in any path of
695        * the shader during ast_to_hir.  This doesn't answer whether it is
696        * still written after dead code removal, nor is it maintained in
697        * non-ast_to_hir.cpp (GLSL parsing) paths.
698        */
699       unsigned assigned:1;
700 
701       /**
702        * When separate shader programs are enabled, only input/outputs between
703        * the stages of a multi-stage separate program can be safely removed
704        * from the shader interface. Other input/outputs must remains active.
705        */
706       unsigned always_active_io:1;
707 
708       /**
709        * Enum indicating how the variable was declared.  See
710        * ir_var_declaration_type.
711        *
712        * This is used to detect certain kinds of illegal variable redeclarations.
713        */
714       unsigned how_declared:2;
715 
716       /**
717        * Storage class of the variable.
718        *
719        * \sa ir_variable_mode
720        */
721       unsigned mode:4;
722 
723       /**
724        * Interpolation mode for shader inputs / outputs
725        *
726        * \sa glsl_interp_mode
727        */
728       unsigned interpolation:2;
729 
730       /**
731        * Was the location explicitly set in the shader?
732        *
733        * If the location is explicitly set in the shader, it \b cannot be changed
734        * by the linker or by the API (e.g., calls to \c glBindAttribLocation have
735        * no effect).
736        */
737       unsigned explicit_location:1;
738       unsigned explicit_index:1;
739 
740       /**
741        * Was an initial binding explicitly set in the shader?
742        *
743        * If so, constant_value contains an integer ir_constant representing the
744        * initial binding point.
745        */
746       unsigned explicit_binding:1;
747 
748       /**
749        * Was an initial component explicitly set in the shader?
750        */
751       unsigned explicit_component:1;
752 
753       /**
754        * Does this variable have an initializer?
755        *
756        * This is used by the linker to cross-validiate initializers of global
757        * variables.
758        */
759       unsigned has_initializer:1;
760 
761       /**
762        * Is the initializer created by the compiler (glsl_zero_init)
763        */
764       unsigned is_implicit_initializer:1;
765 
766       /**
767        * Is this variable a generic output or input that has not yet been matched
768        * up to a variable in another stage of the pipeline?
769        *
770        * This is used by the linker as scratch storage while assigning locations
771        * to generic inputs and outputs.
772        */
773       unsigned is_unmatched_generic_inout:1;
774 
775       /**
776        * Is this varying used by transform feedback?
777        *
778        * This is used by the linker to decide if it's safe to pack the varying.
779        */
780       unsigned is_xfb:1;
781 
782       /**
783        * Is this varying used only by transform feedback?
784        *
785        * This is used by the linker to decide if its safe to pack the varying.
786        */
787       unsigned is_xfb_only:1;
788 
789       /**
790        * Was a transform feedback buffer set in the shader?
791        */
792       unsigned explicit_xfb_buffer:1;
793 
794       /**
795        * Was a transform feedback offset set in the shader?
796        */
797       unsigned explicit_xfb_offset:1;
798 
799       /**
800        * Was a transform feedback stride set in the shader?
801        */
802       unsigned explicit_xfb_stride:1;
803 
804       /**
805        * If non-zero, then this variable may be packed along with other variables
806        * into a single varying slot, so this offset should be applied when
807        * accessing components.  For example, an offset of 1 means that the x
808        * component of this variable is actually stored in component y of the
809        * location specified by \c location.
810        */
811       unsigned location_frac:2;
812 
813       /**
814        * Layout of the matrix.  Uses glsl_matrix_layout values.
815        */
816       unsigned matrix_layout:2;
817 
818       /**
819        * Non-zero if this variable was created by lowering a named interface
820        * block.
821        */
822       unsigned from_named_ifc_block:1;
823 
824       /**
825        * Non-zero if the variable must be a shader input. This is useful for
826        * constraints on function parameters.
827        */
828       unsigned must_be_shader_input:1;
829 
830       /**
831        * Output index for dual source blending.
832        *
833        * \note
834        * The GLSL spec only allows the values 0 or 1 for the index in \b dual
835        * source blending.
836        */
837       unsigned index:1;
838 
839       /**
840        * Precision qualifier.
841        *
842        * In desktop GLSL we do not care about precision qualifiers at all, in
843        * fact, the spec says that precision qualifiers are ignored.
844        *
845        * To make things easy, we make it so that this field is always
846        * GLSL_PRECISION_NONE on desktop shaders. This way all the variables
847        * have the same precision value and the checks we add in the compiler
848        * for this field will never break a desktop shader compile.
849        */
850       unsigned precision:2;
851 
852       /**
853        * \brief Layout qualifier for gl_FragDepth.
854        *
855        * This is not equal to \c ir_depth_layout_none if and only if this
856        * variable is \c gl_FragDepth and a layout qualifier is specified.
857        */
858       ir_depth_layout depth_layout:3;
859 
860       /**
861        * Memory qualifiers.
862        */
863       unsigned memory_read_only:1; /**< "readonly" qualifier. */
864       unsigned memory_write_only:1; /**< "writeonly" qualifier. */
865       unsigned memory_coherent:1;
866       unsigned memory_volatile:1;
867       unsigned memory_restrict:1;
868 
869       /**
870        * ARB_shader_storage_buffer_object
871        */
872       unsigned from_ssbo_unsized_array:1; /**< unsized array buffer variable. */
873 
874       unsigned implicit_sized_array:1;
875 
876       /**
877        * Whether this is a fragment shader output implicitly initialized with
878        * the previous contents of the specified render target at the
879        * framebuffer location corresponding to this shader invocation.
880        */
881       unsigned fb_fetch_output:1;
882 
883       /**
884        * Non-zero if this variable is considered bindless as defined by
885        * ARB_bindless_texture.
886        */
887       unsigned bindless:1;
888 
889       /**
890        * Non-zero if this variable is considered bound as defined by
891        * ARB_bindless_texture.
892        */
893       unsigned bound:1;
894 
895       /**
896        * Non-zero if the variable shall not be implicitly converted during
897        * functions matching.
898        */
899       unsigned implicit_conversion_prohibited:1;
900 
901       /**
902        * Emit a warning if this variable is accessed.
903        */
904    private:
905       uint8_t warn_extension_index;
906 
907    public:
908       /**
909        * Image internal format if specified explicitly, otherwise
910        * PIPE_FORMAT_NONE.
911        */
912       enum pipe_format image_format;
913 
914    private:
915       /**
916        * Number of state slots used
917        *
918        * \note
919        * This could be stored in as few as 7-bits, if necessary.  If it is made
920        * smaller, add an assertion to \c ir_variable::allocate_state_slots to
921        * be safe.
922        */
923       uint16_t _num_state_slots;
924 
925    public:
926       /**
927        * Initial binding point for a sampler, atomic, or UBO.
928        *
929        * For array types, this represents the binding point for the first element.
930        */
931       uint16_t binding;
932 
933       /**
934        * Storage location of the base of this variable
935        *
936        * The precise meaning of this field depends on the nature of the variable.
937        *
938        *   - Vertex shader input: one of the values from \c gl_vert_attrib.
939        *   - Vertex shader output: one of the values from \c gl_varying_slot.
940        *   - Geometry shader input: one of the values from \c gl_varying_slot.
941        *   - Geometry shader output: one of the values from \c gl_varying_slot.
942        *   - Fragment shader input: one of the values from \c gl_varying_slot.
943        *   - Fragment shader output: one of the values from \c gl_frag_result.
944        *   - Uniforms: Per-stage uniform slot number for default uniform block.
945        *   - Uniforms: Index within the uniform block definition for UBO members.
946        *   - Non-UBO Uniforms: explicit location until linking then reused to
947        *     store uniform slot number.
948        *   - Other: This field is not currently used.
949        *
950        * If the variable is a uniform, shader input, or shader output, and the
951        * slot has not been assigned, the value will be -1.
952        */
953       int location;
954 
955       /**
956        * for glsl->tgsi/mesa IR we need to store the index into the
957        * parameters for uniforms, initially the code overloaded location
958        * but this causes problems with indirect samplers and AoA.
959        * This is assigned in _mesa_generate_parameters_list_for_uniforms.
960        */
961       int param_index;
962 
963       /**
964        * Vertex stream output identifier.
965        *
966        * For packed outputs, bit 31 is set and bits [2*i+1,2*i] indicate the
967        * stream of the i-th component.
968        */
969       unsigned stream;
970 
971       /**
972        * Atomic, transform feedback or block member offset.
973        */
974       unsigned offset;
975 
976       /**
977        * Highest element accessed with a constant expression array index
978        *
979        * Not used for non-array variables. -1 is never accessed.
980        */
981       int max_array_access;
982 
983       /**
984        * Transform feedback buffer.
985        */
986       unsigned xfb_buffer;
987 
988       /**
989        * Transform feedback stride.
990        */
991       unsigned xfb_stride;
992 
993       /**
994        * Allow (only) ir_variable direct access private members.
995        */
996       friend class ir_variable;
997    } data;
998 
999    /**
1000     * Value assigned in the initializer of a variable declared "const"
1001     */
1002    ir_constant *constant_value;
1003 
1004    /**
1005     * Constant expression assigned in the initializer of the variable
1006     *
1007     * \warning
1008     * This field and \c ::constant_value are distinct.  Even if the two fields
1009     * refer to constants with the same value, they must point to separate
1010     * objects.
1011     */
1012    ir_constant *constant_initializer;
1013 
1014 private:
1015    static const char *const warn_extension_table[];
1016 
1017    union {
1018       /**
1019        * For variables which satisfy the is_interface_instance() predicate,
1020        * this points to an array of integers such that if the ith member of
1021        * the interface block is an array, max_ifc_array_access[i] is the
1022        * maximum array element of that member that has been accessed.  If the
1023        * ith member of the interface block is not an array,
1024        * max_ifc_array_access[i] is unused.
1025        *
1026        * For variables whose type is not an interface block, this pointer is
1027        * NULL.
1028        */
1029       int *max_ifc_array_access;
1030 
1031       /**
1032        * Built-in state that backs this uniform
1033        *
1034        * Once set at variable creation, \c state_slots must remain invariant.
1035        *
1036        * If the variable is not a uniform, \c _num_state_slots will be zero
1037        * and \c state_slots will be \c NULL.
1038        */
1039       ir_state_slot *state_slots;
1040    } u;
1041 
1042    /**
1043     * For variables that are in an interface block or are an instance of an
1044     * interface block, this is the \c GLSL_TYPE_INTERFACE type for that block.
1045     *
1046     * \sa ir_variable::location
1047     */
1048    const glsl_type *interface_type;
1049 
1050    /**
1051     * Name used for anonymous compiler temporaries
1052     */
1053    static const char tmp_name[];
1054 
1055 public:
1056    /**
1057     * Should the construct keep names for ir_var_temporary variables?
1058     *
1059     * When this global is false, names passed to the constructor for
1060     * \c ir_var_temporary variables will be dropped.  Instead, the variable will
1061     * be named "compiler_temp".  This name will be in static storage.
1062     *
1063     * \warning
1064     * \b NEVER change the mode of an \c ir_var_temporary.
1065     *
1066     * \warning
1067     * This variable is \b not thread-safe.  It is global, \b not
1068     * per-context. It begins life false.  A context can, at some point, make
1069     * it true.  From that point on, it will be true forever.  This should be
1070     * okay since it will only be set true while debugging.
1071     */
1072    static bool temporaries_allocate_names;
1073 };
1074 
1075 /**
1076  * A function that returns whether a built-in function is available in the
1077  * current shading language (based on version, ES or desktop, and extensions).
1078  */
1079 typedef bool (*builtin_available_predicate)(const _mesa_glsl_parse_state *);
1080 
1081 #define MAKE_INTRINSIC_FOR_TYPE(op, t) \
1082    ir_intrinsic_generic_ ## op - ir_intrinsic_generic_load + ir_intrinsic_ ## t ## _ ## load
1083 
1084 #define MAP_INTRINSIC_TO_TYPE(i, t) \
1085    ir_intrinsic_id(int(i) - int(ir_intrinsic_generic_load) + int(ir_intrinsic_ ## t ## _ ## load))
1086 
1087 enum ir_intrinsic_id {
1088    ir_intrinsic_invalid = 0,
1089 
1090    /**
1091     * \name Generic intrinsics
1092     *
1093     * Each of these intrinsics has a specific version for shared variables and
1094     * SSBOs.
1095     */
1096    /*@{*/
1097    ir_intrinsic_generic_load,
1098    ir_intrinsic_generic_store,
1099    ir_intrinsic_generic_atomic_add,
1100    ir_intrinsic_generic_atomic_and,
1101    ir_intrinsic_generic_atomic_or,
1102    ir_intrinsic_generic_atomic_xor,
1103    ir_intrinsic_generic_atomic_min,
1104    ir_intrinsic_generic_atomic_max,
1105    ir_intrinsic_generic_atomic_exchange,
1106    ir_intrinsic_generic_atomic_comp_swap,
1107    /*@}*/
1108 
1109    ir_intrinsic_atomic_counter_read,
1110    ir_intrinsic_atomic_counter_increment,
1111    ir_intrinsic_atomic_counter_predecrement,
1112    ir_intrinsic_atomic_counter_add,
1113    ir_intrinsic_atomic_counter_and,
1114    ir_intrinsic_atomic_counter_or,
1115    ir_intrinsic_atomic_counter_xor,
1116    ir_intrinsic_atomic_counter_min,
1117    ir_intrinsic_atomic_counter_max,
1118    ir_intrinsic_atomic_counter_exchange,
1119    ir_intrinsic_atomic_counter_comp_swap,
1120 
1121    ir_intrinsic_image_load,
1122    ir_intrinsic_image_store,
1123    ir_intrinsic_image_atomic_add,
1124    ir_intrinsic_image_atomic_and,
1125    ir_intrinsic_image_atomic_or,
1126    ir_intrinsic_image_atomic_xor,
1127    ir_intrinsic_image_atomic_min,
1128    ir_intrinsic_image_atomic_max,
1129    ir_intrinsic_image_atomic_exchange,
1130    ir_intrinsic_image_atomic_comp_swap,
1131    ir_intrinsic_image_size,
1132    ir_intrinsic_image_samples,
1133    ir_intrinsic_image_atomic_inc_wrap,
1134    ir_intrinsic_image_atomic_dec_wrap,
1135 
1136    ir_intrinsic_ssbo_load,
1137    ir_intrinsic_ssbo_store = MAKE_INTRINSIC_FOR_TYPE(store, ssbo),
1138    ir_intrinsic_ssbo_atomic_add = MAKE_INTRINSIC_FOR_TYPE(atomic_add, ssbo),
1139    ir_intrinsic_ssbo_atomic_and = MAKE_INTRINSIC_FOR_TYPE(atomic_and, ssbo),
1140    ir_intrinsic_ssbo_atomic_or = MAKE_INTRINSIC_FOR_TYPE(atomic_or, ssbo),
1141    ir_intrinsic_ssbo_atomic_xor = MAKE_INTRINSIC_FOR_TYPE(atomic_xor, ssbo),
1142    ir_intrinsic_ssbo_atomic_min = MAKE_INTRINSIC_FOR_TYPE(atomic_min, ssbo),
1143    ir_intrinsic_ssbo_atomic_max = MAKE_INTRINSIC_FOR_TYPE(atomic_max, ssbo),
1144    ir_intrinsic_ssbo_atomic_exchange = MAKE_INTRINSIC_FOR_TYPE(atomic_exchange, ssbo),
1145    ir_intrinsic_ssbo_atomic_comp_swap = MAKE_INTRINSIC_FOR_TYPE(atomic_comp_swap, ssbo),
1146 
1147    ir_intrinsic_memory_barrier,
1148    ir_intrinsic_shader_clock,
1149    ir_intrinsic_group_memory_barrier,
1150    ir_intrinsic_memory_barrier_atomic_counter,
1151    ir_intrinsic_memory_barrier_buffer,
1152    ir_intrinsic_memory_barrier_image,
1153    ir_intrinsic_memory_barrier_shared,
1154    ir_intrinsic_begin_invocation_interlock,
1155    ir_intrinsic_end_invocation_interlock,
1156 
1157    ir_intrinsic_vote_all,
1158    ir_intrinsic_vote_any,
1159    ir_intrinsic_vote_eq,
1160    ir_intrinsic_ballot,
1161    ir_intrinsic_read_invocation,
1162    ir_intrinsic_read_first_invocation,
1163 
1164    ir_intrinsic_helper_invocation,
1165 
1166    ir_intrinsic_shared_load,
1167    ir_intrinsic_shared_store = MAKE_INTRINSIC_FOR_TYPE(store, shared),
1168    ir_intrinsic_shared_atomic_add = MAKE_INTRINSIC_FOR_TYPE(atomic_add, shared),
1169    ir_intrinsic_shared_atomic_and = MAKE_INTRINSIC_FOR_TYPE(atomic_and, shared),
1170    ir_intrinsic_shared_atomic_or = MAKE_INTRINSIC_FOR_TYPE(atomic_or, shared),
1171    ir_intrinsic_shared_atomic_xor = MAKE_INTRINSIC_FOR_TYPE(atomic_xor, shared),
1172    ir_intrinsic_shared_atomic_min = MAKE_INTRINSIC_FOR_TYPE(atomic_min, shared),
1173    ir_intrinsic_shared_atomic_max = MAKE_INTRINSIC_FOR_TYPE(atomic_max, shared),
1174    ir_intrinsic_shared_atomic_exchange = MAKE_INTRINSIC_FOR_TYPE(atomic_exchange, shared),
1175    ir_intrinsic_shared_atomic_comp_swap = MAKE_INTRINSIC_FOR_TYPE(atomic_comp_swap, shared),
1176 };
1177 
1178 /*@{*/
1179 /**
1180  * The representation of a function instance; may be the full definition or
1181  * simply a prototype.
1182  */
1183 class ir_function_signature : public ir_instruction {
1184    /* An ir_function_signature will be part of the list of signatures in
1185     * an ir_function.
1186     */
1187 public:
1188    ir_function_signature(const glsl_type *return_type,
1189                          builtin_available_predicate builtin_avail = NULL);
1190 
1191    virtual ir_function_signature *clone(void *mem_ctx,
1192 					struct hash_table *ht) const;
1193    ir_function_signature *clone_prototype(void *mem_ctx,
1194 					  struct hash_table *ht) const;
1195 
accept(ir_visitor * v)1196    virtual void accept(ir_visitor *v)
1197    {
1198       v->visit(this);
1199    }
1200 
1201    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1202 
1203    /**
1204     * Attempt to evaluate this function as a constant expression,
1205     * given a list of the actual parameters and the variable context.
1206     * Returns NULL for non-built-ins.
1207     */
1208    ir_constant *constant_expression_value(void *mem_ctx,
1209                                           exec_list *actual_parameters,
1210                                           struct hash_table *variable_context);
1211 
1212    /**
1213     * Get the name of the function for which this is a signature
1214     */
1215    const char *function_name() const;
1216 
1217    /**
1218     * Get a handle to the function for which this is a signature
1219     *
1220     * There is no setter function, this function returns a \c const pointer,
1221     * and \c ir_function_signature::_function is private for a reason.  The
1222     * only way to make a connection between a function and function signature
1223     * is via \c ir_function::add_signature.  This helps ensure that certain
1224     * invariants (i.e., a function signature is in the list of signatures for
1225     * its \c _function) are met.
1226     *
1227     * \sa ir_function::add_signature
1228     */
function()1229    inline const class ir_function *function() const
1230    {
1231       return this->_function;
1232    }
1233 
1234    /**
1235     * Check whether the qualifiers match between this signature's parameters
1236     * and the supplied parameter list.  If not, returns the name of the first
1237     * parameter with mismatched qualifiers (for use in error messages).
1238     */
1239    const char *qualifiers_match(exec_list *params);
1240 
1241    /**
1242     * Replace the current parameter list with the given one.  This is useful
1243     * if the current information came from a prototype, and either has invalid
1244     * or missing parameter names.
1245     */
1246    void replace_parameters(exec_list *new_params);
1247 
1248    /**
1249     * Function return type.
1250     *
1251     * \note The precision qualifier is stored separately in return_precision.
1252     */
1253    const struct glsl_type *return_type;
1254 
1255    /**
1256     * List of ir_variable of function parameters.
1257     *
1258     * This represents the storage.  The paramaters passed in a particular
1259     * call will be in ir_call::actual_paramaters.
1260     */
1261    struct exec_list parameters;
1262 
1263    /** Whether or not this function has a body (which may be empty). */
1264    unsigned is_defined:1;
1265 
1266    /*
1267     * Precision qualifier for the return type.
1268     *
1269     * See the comment for ir_variable_data::precision for more details.
1270     */
1271    unsigned return_precision:2;
1272 
1273    /** Whether or not this function signature is a built-in. */
1274    bool is_builtin() const;
1275 
1276    /**
1277     * Whether or not this function is an intrinsic to be implemented
1278     * by the driver.
1279     */
is_intrinsic()1280    inline bool is_intrinsic() const
1281    {
1282       return intrinsic_id != ir_intrinsic_invalid;
1283    }
1284 
1285    /** Identifier for this intrinsic. */
1286    enum ir_intrinsic_id intrinsic_id;
1287 
1288    /** Whether or not a built-in is available for this shader. */
1289    bool is_builtin_available(const _mesa_glsl_parse_state *state) const;
1290 
1291    /** Body of instructions in the function. */
1292    struct exec_list body;
1293 
1294 private:
1295    /**
1296     * A function pointer to a predicate that answers whether a built-in
1297     * function is available in the current shader.  NULL if not a built-in.
1298     */
1299    builtin_available_predicate builtin_avail;
1300 
1301    /** Function of which this signature is one overload. */
1302    class ir_function *_function;
1303 
1304    /** Function signature of which this one is a prototype clone */
1305    const ir_function_signature *origin;
1306 
1307    friend class ir_function;
1308 
1309    /**
1310     * Helper function to run a list of instructions for constant
1311     * expression evaluation.
1312     *
1313     * The hash table represents the values of the visible variables.
1314     * There are no scoping issues because the table is indexed on
1315     * ir_variable pointers, not variable names.
1316     *
1317     * Returns false if the expression is not constant, true otherwise,
1318     * and the value in *result if result is non-NULL.
1319     */
1320    bool constant_expression_evaluate_expression_list(void *mem_ctx,
1321                                                      const struct exec_list &body,
1322 						     struct hash_table *variable_context,
1323 						     ir_constant **result);
1324 };
1325 
1326 
1327 /**
1328  * Header for tracking multiple overloaded functions with the same name.
1329  * Contains a list of ir_function_signatures representing each of the
1330  * actual functions.
1331  */
1332 class ir_function : public ir_instruction {
1333 public:
1334    ir_function(const char *name);
1335 
1336    virtual ir_function *clone(void *mem_ctx, struct hash_table *ht) const;
1337 
accept(ir_visitor * v)1338    virtual void accept(ir_visitor *v)
1339    {
1340       v->visit(this);
1341    }
1342 
1343    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1344 
add_signature(ir_function_signature * sig)1345    void add_signature(ir_function_signature *sig)
1346    {
1347       sig->_function = this;
1348       this->signatures.push_tail(sig);
1349    }
1350 
1351    /**
1352     * Find a signature that matches a set of actual parameters, taking implicit
1353     * conversions into account.  Also flags whether the match was exact.
1354     */
1355    ir_function_signature *matching_signature(_mesa_glsl_parse_state *state,
1356                                              const exec_list *actual_param,
1357                                              bool allow_builtins,
1358 					     bool *match_is_exact);
1359 
1360    /**
1361     * Find a signature that matches a set of actual parameters, taking implicit
1362     * conversions into account.
1363     */
1364    ir_function_signature *matching_signature(_mesa_glsl_parse_state *state,
1365                                              const exec_list *actual_param,
1366                                              bool allow_builtins);
1367 
1368    /**
1369     * Find a signature that exactly matches a set of actual parameters without
1370     * any implicit type conversions.
1371     */
1372    ir_function_signature *exact_matching_signature(_mesa_glsl_parse_state *state,
1373                                                    const exec_list *actual_ps);
1374 
1375    /**
1376     * Name of the function.
1377     */
1378    const char *name;
1379 
1380    /** Whether or not this function has a signature that isn't a built-in. */
1381    bool has_user_signature();
1382 
1383    /**
1384     * List of ir_function_signature for each overloaded function with this name.
1385     */
1386    struct exec_list signatures;
1387 
1388    /**
1389     * is this function a subroutine type declaration
1390     * e.g. subroutine void type1(float arg1);
1391     */
1392    bool is_subroutine;
1393 
1394    /**
1395     * is this function associated to a subroutine type
1396     * e.g. subroutine (type1, type2) function_name { function_body };
1397     * would have num_subroutine_types 2,
1398     * and pointers to the type1 and type2 types.
1399     */
1400    int num_subroutine_types;
1401    const struct glsl_type **subroutine_types;
1402 
1403    int subroutine_index;
1404 };
1405 
function_name()1406 inline const char *ir_function_signature::function_name() const
1407 {
1408    return this->_function->name;
1409 }
1410 /*@}*/
1411 
1412 
1413 /**
1414  * IR instruction representing high-level if-statements
1415  */
1416 class ir_if : public ir_instruction {
1417 public:
ir_if(ir_rvalue * condition)1418    ir_if(ir_rvalue *condition)
1419       : ir_instruction(ir_type_if), condition(condition)
1420    {
1421    }
1422 
1423    virtual ir_if *clone(void *mem_ctx, struct hash_table *ht) const;
1424 
accept(ir_visitor * v)1425    virtual void accept(ir_visitor *v)
1426    {
1427       v->visit(this);
1428    }
1429 
1430    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1431 
1432    ir_rvalue *condition;
1433    /** List of ir_instruction for the body of the then branch */
1434    exec_list  then_instructions;
1435    /** List of ir_instruction for the body of the else branch */
1436    exec_list  else_instructions;
1437 };
1438 
1439 
1440 /**
1441  * IR instruction representing a high-level loop structure.
1442  */
1443 class ir_loop : public ir_instruction {
1444 public:
1445    ir_loop();
1446 
1447    virtual ir_loop *clone(void *mem_ctx, struct hash_table *ht) const;
1448 
accept(ir_visitor * v)1449    virtual void accept(ir_visitor *v)
1450    {
1451       v->visit(this);
1452    }
1453 
1454    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1455 
1456    /** List of ir_instruction that make up the body of the loop. */
1457    exec_list body_instructions;
1458 };
1459 
1460 
1461 class ir_assignment : public ir_instruction {
1462 public:
1463    ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition = NULL);
1464 
1465    /**
1466     * Construct an assignment with an explicit write mask
1467     *
1468     * \note
1469     * Since a write mask is supplied, the LHS must already be a bare
1470     * \c ir_dereference.  The cannot be any swizzles in the LHS.
1471     */
1472    ir_assignment(ir_dereference *lhs, ir_rvalue *rhs, ir_rvalue *condition,
1473 		 unsigned write_mask);
1474 
1475    virtual ir_assignment *clone(void *mem_ctx, struct hash_table *ht) const;
1476 
1477    virtual ir_constant *constant_expression_value(void *mem_ctx,
1478                                                   struct hash_table *variable_context = NULL);
1479 
accept(ir_visitor * v)1480    virtual void accept(ir_visitor *v)
1481    {
1482       v->visit(this);
1483    }
1484 
1485    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1486 
1487    /**
1488     * Get a whole variable written by an assignment
1489     *
1490     * If the LHS of the assignment writes a whole variable, the variable is
1491     * returned.  Otherwise \c NULL is returned.  Examples of whole-variable
1492     * assignment are:
1493     *
1494     *  - Assigning to a scalar
1495     *  - Assigning to all components of a vector
1496     *  - Whole array (or matrix) assignment
1497     *  - Whole structure assignment
1498     */
1499    ir_variable *whole_variable_written();
1500 
1501    /**
1502     * Set the LHS of an assignment
1503     */
1504    void set_lhs(ir_rvalue *lhs);
1505 
1506    /**
1507     * Left-hand side of the assignment.
1508     *
1509     * This should be treated as read only.  If you need to set the LHS of an
1510     * assignment, use \c ir_assignment::set_lhs.
1511     */
1512    ir_dereference *lhs;
1513 
1514    /**
1515     * Value being assigned
1516     */
1517    ir_rvalue *rhs;
1518 
1519    /**
1520     * Optional condition for the assignment.
1521     */
1522    ir_rvalue *condition;
1523 
1524 
1525    /**
1526     * Component mask written
1527     *
1528     * For non-vector types in the LHS, this field will be zero.  For vector
1529     * types, a bit will be set for each component that is written.  Note that
1530     * for \c vec2 and \c vec3 types only the lower bits will ever be set.
1531     *
1532     * A partially-set write mask means that each enabled channel gets
1533     * the value from a consecutive channel of the rhs.  For example,
1534     * to write just .xyw of gl_FrontColor with color:
1535     *
1536     * (assign (constant bool (1)) (xyw)
1537     *     (var_ref gl_FragColor)
1538     *     (swiz xyw (var_ref color)))
1539     */
1540    unsigned write_mask:4;
1541 };
1542 
1543 #include "ir_expression_operation.h"
1544 
1545 extern const char *const ir_expression_operation_strings[ir_last_opcode + 1];
1546 extern const char *const ir_expression_operation_enum_strings[ir_last_opcode + 1];
1547 
1548 class ir_expression : public ir_rvalue {
1549 public:
1550    ir_expression(int op, const struct glsl_type *type,
1551                  ir_rvalue *op0, ir_rvalue *op1 = NULL,
1552                  ir_rvalue *op2 = NULL, ir_rvalue *op3 = NULL);
1553 
1554    /**
1555     * Constructor for unary operation expressions
1556     */
1557    ir_expression(int op, ir_rvalue *);
1558 
1559    /**
1560     * Constructor for binary operation expressions
1561     */
1562    ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1);
1563 
1564    /**
1565     * Constructor for ternary operation expressions
1566     */
1567    ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1, ir_rvalue *op2);
1568 
1569    virtual bool equals(const ir_instruction *ir,
1570                        enum ir_node_type ignore = ir_type_unset) const;
1571 
1572    virtual ir_expression *clone(void *mem_ctx, struct hash_table *ht) const;
1573 
1574    /**
1575     * Attempt to constant-fold the expression
1576     *
1577     * The "variable_context" hash table links ir_variable * to ir_constant *
1578     * that represent the variables' values.  \c NULL represents an empty
1579     * context.
1580     *
1581     * If the expression cannot be constant folded, this method will return
1582     * \c NULL.
1583     */
1584    virtual ir_constant *constant_expression_value(void *mem_ctx,
1585                                                   struct hash_table *variable_context = NULL);
1586 
1587    /**
1588     * This is only here for ir_reader to used for testing purposes please use
1589     * the precomputed num_operands field if you need the number of operands.
1590     */
1591    static unsigned get_num_operands(ir_expression_operation);
1592 
1593    /**
1594     * Return whether the expression operates on vectors horizontally.
1595     */
is_horizontal()1596    bool is_horizontal() const
1597    {
1598       return operation == ir_binop_all_equal ||
1599              operation == ir_binop_any_nequal ||
1600              operation == ir_binop_dot ||
1601              operation == ir_binop_vector_extract ||
1602              operation == ir_triop_vector_insert ||
1603              operation == ir_binop_ubo_load ||
1604              operation == ir_quadop_vector;
1605    }
1606 
1607    /**
1608     * Do a reverse-lookup to translate the given string into an operator.
1609     */
1610    static ir_expression_operation get_operator(const char *);
1611 
accept(ir_visitor * v)1612    virtual void accept(ir_visitor *v)
1613    {
1614       v->visit(this);
1615    }
1616 
1617    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1618 
1619    virtual ir_variable *variable_referenced() const;
1620 
1621    /**
1622     * Determine the number of operands used by an expression
1623     */
init_num_operands()1624    void init_num_operands()
1625    {
1626       if (operation == ir_quadop_vector) {
1627          num_operands = this->type->vector_elements;
1628       } else {
1629          num_operands = get_num_operands(operation);
1630       }
1631    }
1632 
1633    ir_expression_operation operation;
1634    ir_rvalue *operands[4];
1635    uint8_t num_operands;
1636 };
1637 
1638 
1639 /**
1640  * HIR instruction representing a high-level function call, containing a list
1641  * of parameters and returning a value in the supplied temporary.
1642  */
1643 class ir_call : public ir_instruction {
1644 public:
ir_call(ir_function_signature * callee,ir_dereference_variable * return_deref,exec_list * actual_parameters)1645    ir_call(ir_function_signature *callee,
1646 	   ir_dereference_variable *return_deref,
1647 	   exec_list *actual_parameters)
1648       : ir_instruction(ir_type_call), return_deref(return_deref), callee(callee), sub_var(NULL), array_idx(NULL)
1649    {
1650       assert(callee->return_type != NULL);
1651       actual_parameters->move_nodes_to(& this->actual_parameters);
1652    }
1653 
ir_call(ir_function_signature * callee,ir_dereference_variable * return_deref,exec_list * actual_parameters,ir_variable * var,ir_rvalue * array_idx)1654    ir_call(ir_function_signature *callee,
1655 	   ir_dereference_variable *return_deref,
1656 	   exec_list *actual_parameters,
1657 	   ir_variable *var, ir_rvalue *array_idx)
1658       : ir_instruction(ir_type_call), return_deref(return_deref), callee(callee), sub_var(var), array_idx(array_idx)
1659    {
1660       assert(callee->return_type != NULL);
1661       actual_parameters->move_nodes_to(& this->actual_parameters);
1662    }
1663 
1664    virtual ir_call *clone(void *mem_ctx, struct hash_table *ht) const;
1665 
1666    virtual ir_constant *constant_expression_value(void *mem_ctx,
1667                                                   struct hash_table *variable_context = NULL);
1668 
accept(ir_visitor * v)1669    virtual void accept(ir_visitor *v)
1670    {
1671       v->visit(this);
1672    }
1673 
1674    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1675 
1676    /**
1677     * Get the name of the function being called.
1678     */
callee_name()1679    const char *callee_name() const
1680    {
1681       return callee->function_name();
1682    }
1683 
1684    /**
1685     * Generates an inline version of the function before @ir,
1686     * storing the return value in return_deref.
1687     */
1688    void generate_inline(ir_instruction *ir);
1689 
1690    /**
1691     * Storage for the function's return value.
1692     * This must be NULL if the return type is void.
1693     */
1694    ir_dereference_variable *return_deref;
1695 
1696    /**
1697     * The specific function signature being called.
1698     */
1699    ir_function_signature *callee;
1700 
1701    /* List of ir_rvalue of paramaters passed in this call. */
1702    exec_list actual_parameters;
1703 
1704    /*
1705     * ARB_shader_subroutine support -
1706     * the subroutine uniform variable and array index
1707     * rvalue to be used in the lowering pass later.
1708     */
1709    ir_variable *sub_var;
1710    ir_rvalue *array_idx;
1711 };
1712 
1713 
1714 /**
1715  * \name Jump-like IR instructions.
1716  *
1717  * These include \c break, \c continue, \c return, and \c discard.
1718  */
1719 /*@{*/
1720 class ir_jump : public ir_instruction {
1721 protected:
ir_jump(enum ir_node_type t)1722    ir_jump(enum ir_node_type t)
1723       : ir_instruction(t)
1724    {
1725    }
1726 };
1727 
1728 class ir_return : public ir_jump {
1729 public:
ir_return()1730    ir_return()
1731       : ir_jump(ir_type_return), value(NULL)
1732    {
1733    }
1734 
ir_return(ir_rvalue * value)1735    ir_return(ir_rvalue *value)
1736       : ir_jump(ir_type_return), value(value)
1737    {
1738    }
1739 
1740    virtual ir_return *clone(void *mem_ctx, struct hash_table *) const;
1741 
get_value()1742    ir_rvalue *get_value() const
1743    {
1744       return value;
1745    }
1746 
accept(ir_visitor * v)1747    virtual void accept(ir_visitor *v)
1748    {
1749       v->visit(this);
1750    }
1751 
1752    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1753 
1754    ir_rvalue *value;
1755 };
1756 
1757 
1758 /**
1759  * Jump instructions used inside loops
1760  *
1761  * These include \c break and \c continue.  The \c break within a loop is
1762  * different from the \c break within a switch-statement.
1763  *
1764  * \sa ir_switch_jump
1765  */
1766 class ir_loop_jump : public ir_jump {
1767 public:
1768    enum jump_mode {
1769       jump_break,
1770       jump_continue
1771    };
1772 
ir_loop_jump(jump_mode mode)1773    ir_loop_jump(jump_mode mode)
1774       : ir_jump(ir_type_loop_jump)
1775    {
1776       this->mode = mode;
1777    }
1778 
1779    virtual ir_loop_jump *clone(void *mem_ctx, struct hash_table *) const;
1780 
accept(ir_visitor * v)1781    virtual void accept(ir_visitor *v)
1782    {
1783       v->visit(this);
1784    }
1785 
1786    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1787 
is_break()1788    bool is_break() const
1789    {
1790       return mode == jump_break;
1791    }
1792 
is_continue()1793    bool is_continue() const
1794    {
1795       return mode == jump_continue;
1796    }
1797 
1798    /** Mode selector for the jump instruction. */
1799    enum jump_mode mode;
1800 };
1801 
1802 /**
1803  * IR instruction representing discard statements.
1804  */
1805 class ir_discard : public ir_jump {
1806 public:
ir_discard()1807    ir_discard()
1808       : ir_jump(ir_type_discard)
1809    {
1810       this->condition = NULL;
1811    }
1812 
ir_discard(ir_rvalue * cond)1813    ir_discard(ir_rvalue *cond)
1814       : ir_jump(ir_type_discard)
1815    {
1816       this->condition = cond;
1817    }
1818 
1819    virtual ir_discard *clone(void *mem_ctx, struct hash_table *ht) const;
1820 
accept(ir_visitor * v)1821    virtual void accept(ir_visitor *v)
1822    {
1823       v->visit(this);
1824    }
1825 
1826    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1827 
1828    ir_rvalue *condition;
1829 };
1830 /*@}*/
1831 
1832 
1833 /**
1834  * IR instruction representing demote statements from
1835  * GL_EXT_demote_to_helper_invocation.
1836  */
1837 class ir_demote : public ir_instruction {
1838 public:
ir_demote()1839    ir_demote()
1840       : ir_instruction(ir_type_demote)
1841    {
1842    }
1843 
1844    virtual ir_demote *clone(void *mem_ctx, struct hash_table *ht) const;
1845 
accept(ir_visitor * v)1846    virtual void accept(ir_visitor *v)
1847    {
1848       v->visit(this);
1849    }
1850 
1851    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1852 };
1853 
1854 
1855 /**
1856  * Texture sampling opcodes used in ir_texture
1857  */
1858 enum ir_texture_opcode {
1859    ir_tex,		/**< Regular texture look-up */
1860    ir_txb,		/**< Texture look-up with LOD bias */
1861    ir_txl,		/**< Texture look-up with explicit LOD */
1862    ir_txd,		/**< Texture look-up with partial derivatives */
1863    ir_txf,		/**< Texel fetch with explicit LOD */
1864    ir_txf_ms,           /**< Multisample texture fetch */
1865    ir_txs,		/**< Texture size */
1866    ir_lod,		/**< Texture lod query */
1867    ir_tg4,		/**< Texture gather */
1868    ir_query_levels,     /**< Texture levels query */
1869    ir_texture_samples,  /**< Texture samples query */
1870    ir_samples_identical, /**< Query whether all samples are definitely identical. */
1871 };
1872 
1873 
1874 /**
1875  * IR instruction to sample a texture
1876  *
1877  * The specific form of the IR instruction depends on the \c mode value
1878  * selected from \c ir_texture_opcodes.  In the printed IR, these will
1879  * appear as:
1880  *
1881  *                                    Texel offset (0 or an expression)
1882  *                                    | Projection divisor
1883  *                                    | |  Shadow comparator
1884  *                                    | |  |
1885  *                                    v v  v
1886  * (tex <type> <sampler> <coordinate> 0 1 ( ))
1887  * (txb <type> <sampler> <coordinate> 0 1 ( ) <bias>)
1888  * (txl <type> <sampler> <coordinate> 0 1 ( ) <lod>)
1889  * (txd <type> <sampler> <coordinate> 0 1 ( ) (dPdx dPdy))
1890  * (txf <type> <sampler> <coordinate> 0       <lod>)
1891  * (txf_ms
1892  *      <type> <sampler> <coordinate>         <sample_index>)
1893  * (txs <type> <sampler> <lod>)
1894  * (lod <type> <sampler> <coordinate>)
1895  * (tg4 <type> <sampler> <coordinate> <offset> <component>)
1896  * (query_levels <type> <sampler>)
1897  * (samples_identical <sampler> <coordinate>)
1898  */
1899 class ir_texture : public ir_rvalue {
1900 public:
ir_texture(enum ir_texture_opcode op)1901    ir_texture(enum ir_texture_opcode op)
1902       : ir_rvalue(ir_type_texture),
1903         op(op), sampler(NULL), coordinate(NULL), projector(NULL),
1904         shadow_comparator(NULL), offset(NULL)
1905    {
1906       memset(&lod_info, 0, sizeof(lod_info));
1907    }
1908 
1909    virtual ir_texture *clone(void *mem_ctx, struct hash_table *) const;
1910 
1911    virtual ir_constant *constant_expression_value(void *mem_ctx,
1912                                                   struct hash_table *variable_context = NULL);
1913 
accept(ir_visitor * v)1914    virtual void accept(ir_visitor *v)
1915    {
1916       v->visit(this);
1917    }
1918 
1919    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1920 
1921    virtual bool equals(const ir_instruction *ir,
1922                        enum ir_node_type ignore = ir_type_unset) const;
1923 
1924    /**
1925     * Return a string representing the ir_texture_opcode.
1926     */
1927    const char *opcode_string();
1928 
1929    /** Set the sampler and type. */
1930    void set_sampler(ir_dereference *sampler, const glsl_type *type);
1931 
1932    /**
1933     * Do a reverse-lookup to translate a string into an ir_texture_opcode.
1934     */
1935    static ir_texture_opcode get_opcode(const char *);
1936 
1937    enum ir_texture_opcode op;
1938 
1939    /** Sampler to use for the texture access. */
1940    ir_dereference *sampler;
1941 
1942    /** Texture coordinate to sample */
1943    ir_rvalue *coordinate;
1944 
1945    /**
1946     * Value used for projective divide.
1947     *
1948     * If there is no projective divide (the common case), this will be
1949     * \c NULL.  Optimization passes should check for this to point to a constant
1950     * of 1.0 and replace that with \c NULL.
1951     */
1952    ir_rvalue *projector;
1953 
1954    /**
1955     * Coordinate used for comparison on shadow look-ups.
1956     *
1957     * If there is no shadow comparison, this will be \c NULL.  For the
1958     * \c ir_txf opcode, this *must* be \c NULL.
1959     */
1960    ir_rvalue *shadow_comparator;
1961 
1962    /** Texel offset. */
1963    ir_rvalue *offset;
1964 
1965    union {
1966       ir_rvalue *lod;		/**< Floating point LOD */
1967       ir_rvalue *bias;		/**< Floating point LOD bias */
1968       ir_rvalue *sample_index;  /**< MSAA sample index */
1969       ir_rvalue *component;     /**< Gather component selector */
1970       struct {
1971 	 ir_rvalue *dPdx;	/**< Partial derivative of coordinate wrt X */
1972 	 ir_rvalue *dPdy;	/**< Partial derivative of coordinate wrt Y */
1973       } grad;
1974    } lod_info;
1975 };
1976 
1977 
1978 struct ir_swizzle_mask {
1979    unsigned x:2;
1980    unsigned y:2;
1981    unsigned z:2;
1982    unsigned w:2;
1983 
1984    /**
1985     * Number of components in the swizzle.
1986     */
1987    unsigned num_components:3;
1988 
1989    /**
1990     * Does the swizzle contain duplicate components?
1991     *
1992     * L-value swizzles cannot contain duplicate components.
1993     */
1994    unsigned has_duplicates:1;
1995 };
1996 
1997 
1998 class ir_swizzle : public ir_rvalue {
1999 public:
2000    ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w,
2001               unsigned count);
2002 
2003    ir_swizzle(ir_rvalue *val, const unsigned *components, unsigned count);
2004 
2005    ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask);
2006 
2007    virtual ir_swizzle *clone(void *mem_ctx, struct hash_table *) const;
2008 
2009    virtual ir_constant *constant_expression_value(void *mem_ctx,
2010                                                   struct hash_table *variable_context = NULL);
2011 
2012    /**
2013     * Construct an ir_swizzle from the textual representation.  Can fail.
2014     */
2015    static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length);
2016 
accept(ir_visitor * v)2017    virtual void accept(ir_visitor *v)
2018    {
2019       v->visit(this);
2020    }
2021 
2022    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
2023 
2024    virtual bool equals(const ir_instruction *ir,
2025                        enum ir_node_type ignore = ir_type_unset) const;
2026 
is_lvalue(const struct _mesa_glsl_parse_state * state)2027    bool is_lvalue(const struct _mesa_glsl_parse_state *state) const
2028    {
2029       return val->is_lvalue(state) && !mask.has_duplicates;
2030    }
2031 
2032    /**
2033     * Get the variable that is ultimately referenced by an r-value
2034     */
2035    virtual ir_variable *variable_referenced() const;
2036 
2037    ir_rvalue *val;
2038    ir_swizzle_mask mask;
2039 
2040 private:
2041    /**
2042     * Initialize the mask component of a swizzle
2043     *
2044     * This is used by the \c ir_swizzle constructors.
2045     */
2046    void init_mask(const unsigned *components, unsigned count);
2047 };
2048 
2049 
2050 class ir_dereference : public ir_rvalue {
2051 public:
2052    virtual ir_dereference *clone(void *mem_ctx, struct hash_table *) const = 0;
2053 
2054    bool is_lvalue(const struct _mesa_glsl_parse_state *state) const;
2055 
2056    /**
2057     * Get the variable that is ultimately referenced by an r-value
2058     */
2059    virtual ir_variable *variable_referenced() const = 0;
2060 
2061    /**
2062     * Get the precision. This can either come from the eventual variable that
2063     * is dereferenced, or from a record member.
2064     */
2065    virtual int precision() const = 0;
2066 
2067 protected:
ir_dereference(enum ir_node_type t)2068    ir_dereference(enum ir_node_type t)
2069       : ir_rvalue(t)
2070    {
2071    }
2072 };
2073 
2074 
2075 class ir_dereference_variable : public ir_dereference {
2076 public:
2077    ir_dereference_variable(ir_variable *var);
2078 
2079    virtual ir_dereference_variable *clone(void *mem_ctx,
2080 					  struct hash_table *) const;
2081 
2082    virtual ir_constant *constant_expression_value(void *mem_ctx,
2083                                                   struct hash_table *variable_context = NULL);
2084 
2085    virtual bool equals(const ir_instruction *ir,
2086                        enum ir_node_type ignore = ir_type_unset) const;
2087 
2088    /**
2089     * Get the variable that is ultimately referenced by an r-value
2090     */
variable_referenced()2091    virtual ir_variable *variable_referenced() const
2092    {
2093       return this->var;
2094    }
2095 
precision()2096    virtual int precision() const
2097    {
2098       return this->var->data.precision;
2099    }
2100 
whole_variable_referenced()2101    virtual ir_variable *whole_variable_referenced()
2102    {
2103       /* ir_dereference_variable objects always dereference the entire
2104        * variable.  However, if this dereference is dereferenced by anything
2105        * else, the complete dereference chain is not a whole-variable
2106        * dereference.  This method should only be called on the top most
2107        * ir_rvalue in a dereference chain.
2108        */
2109       return this->var;
2110    }
2111 
accept(ir_visitor * v)2112    virtual void accept(ir_visitor *v)
2113    {
2114       v->visit(this);
2115    }
2116 
2117    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
2118 
2119    /**
2120     * Object being dereferenced.
2121     */
2122    ir_variable *var;
2123 };
2124 
2125 
2126 class ir_dereference_array : public ir_dereference {
2127 public:
2128    ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index);
2129 
2130    ir_dereference_array(ir_variable *var, ir_rvalue *array_index);
2131 
2132    virtual ir_dereference_array *clone(void *mem_ctx,
2133 				       struct hash_table *) const;
2134 
2135    virtual ir_constant *constant_expression_value(void *mem_ctx,
2136                                                   struct hash_table *variable_context = NULL);
2137 
2138    virtual bool equals(const ir_instruction *ir,
2139                        enum ir_node_type ignore = ir_type_unset) const;
2140 
2141    /**
2142     * Get the variable that is ultimately referenced by an r-value
2143     */
variable_referenced()2144    virtual ir_variable *variable_referenced() const
2145    {
2146       return this->array->variable_referenced();
2147    }
2148 
precision()2149    virtual int precision() const
2150    {
2151       ir_dereference *deref = this->array->as_dereference();
2152 
2153       if (deref == NULL)
2154          return GLSL_PRECISION_NONE;
2155       else
2156          return deref->precision();
2157    }
2158 
accept(ir_visitor * v)2159    virtual void accept(ir_visitor *v)
2160    {
2161       v->visit(this);
2162    }
2163 
2164    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
2165 
2166    ir_rvalue *array;
2167    ir_rvalue *array_index;
2168 
2169 private:
2170    void set_array(ir_rvalue *value);
2171 };
2172 
2173 
2174 class ir_dereference_record : public ir_dereference {
2175 public:
2176    ir_dereference_record(ir_rvalue *value, const char *field);
2177 
2178    ir_dereference_record(ir_variable *var, const char *field);
2179 
2180    virtual ir_dereference_record *clone(void *mem_ctx,
2181 					struct hash_table *) const;
2182 
2183    virtual ir_constant *constant_expression_value(void *mem_ctx,
2184                                                   struct hash_table *variable_context = NULL);
2185 
2186    /**
2187     * Get the variable that is ultimately referenced by an r-value
2188     */
variable_referenced()2189    virtual ir_variable *variable_referenced() const
2190    {
2191       return this->record->variable_referenced();
2192    }
2193 
precision()2194    virtual int precision() const
2195    {
2196       glsl_struct_field *field = record->type->fields.structure + field_idx;
2197 
2198       return field->precision;
2199    }
2200 
accept(ir_visitor * v)2201    virtual void accept(ir_visitor *v)
2202    {
2203       v->visit(this);
2204    }
2205 
2206    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
2207 
2208    ir_rvalue *record;
2209    int field_idx;
2210 };
2211 
2212 
2213 /**
2214  * Data stored in an ir_constant
2215  */
2216 union ir_constant_data {
2217       unsigned u[16];
2218       int i[16];
2219       float f[16];
2220       bool b[16];
2221       double d[16];
2222       uint16_t f16[16];
2223       uint16_t u16[16];
2224       int16_t i16[16];
2225       uint64_t u64[16];
2226       int64_t i64[16];
2227 };
2228 
2229 
2230 class ir_constant : public ir_rvalue {
2231 public:
2232    ir_constant(const struct glsl_type *type, const ir_constant_data *data);
2233    ir_constant(bool b, unsigned vector_elements=1);
2234    ir_constant(int16_t i16, unsigned vector_elements=1);
2235    ir_constant(uint16_t u16, unsigned vector_elements=1);
2236    ir_constant(unsigned int u, unsigned vector_elements=1);
2237    ir_constant(int i, unsigned vector_elements=1);
2238    ir_constant(float16_t f16, unsigned vector_elements=1);
2239    ir_constant(float f, unsigned vector_elements=1);
2240    ir_constant(double d, unsigned vector_elements=1);
2241    ir_constant(uint64_t u64, unsigned vector_elements=1);
2242    ir_constant(int64_t i64, unsigned vector_elements=1);
2243 
2244    /**
2245     * Construct an ir_constant from a list of ir_constant values
2246     */
2247    ir_constant(const struct glsl_type *type, exec_list *values);
2248 
2249    /**
2250     * Construct an ir_constant from a scalar component of another ir_constant
2251     *
2252     * The new \c ir_constant inherits the type of the component from the
2253     * source constant.
2254     *
2255     * \note
2256     * In the case of a matrix constant, the new constant is a scalar, \b not
2257     * a vector.
2258     */
2259    ir_constant(const ir_constant *c, unsigned i);
2260 
2261    /**
2262     * Return a new ir_constant of the specified type containing all zeros.
2263     */
2264    static ir_constant *zero(void *mem_ctx, const glsl_type *type);
2265 
2266    virtual ir_constant *clone(void *mem_ctx, struct hash_table *) const;
2267 
2268    virtual ir_constant *constant_expression_value(void *mem_ctx,
2269                                                   struct hash_table *variable_context = NULL);
2270 
accept(ir_visitor * v)2271    virtual void accept(ir_visitor *v)
2272    {
2273       v->visit(this);
2274    }
2275 
2276    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
2277 
2278    virtual bool equals(const ir_instruction *ir,
2279                        enum ir_node_type ignore = ir_type_unset) const;
2280 
2281    /**
2282     * Get a particular component of a constant as a specific type
2283     *
2284     * This is useful, for example, to get a value from an integer constant
2285     * as a float or bool.  This appears frequently when constructors are
2286     * called with all constant parameters.
2287     */
2288    /*@{*/
2289    bool get_bool_component(unsigned i) const;
2290    float get_float_component(unsigned i) const;
2291    uint16_t get_float16_component(unsigned i) const;
2292    double get_double_component(unsigned i) const;
2293    int16_t get_int16_component(unsigned i) const;
2294    uint16_t get_uint16_component(unsigned i) const;
2295    int get_int_component(unsigned i) const;
2296    unsigned get_uint_component(unsigned i) const;
2297    int64_t get_int64_component(unsigned i) const;
2298    uint64_t get_uint64_component(unsigned i) const;
2299    /*@}*/
2300 
2301    ir_constant *get_array_element(unsigned i) const;
2302 
2303    ir_constant *get_record_field(int idx);
2304 
2305    /**
2306     * Copy the values on another constant at a given offset.
2307     *
2308     * The offset is ignored for array or struct copies, it's only for
2309     * scalars or vectors into vectors or matrices.
2310     *
2311     * With identical types on both sides and zero offset it's clone()
2312     * without creating a new object.
2313     */
2314 
2315    void copy_offset(ir_constant *src, int offset);
2316 
2317    /**
2318     * Copy the values on another constant at a given offset and
2319     * following an assign-like mask.
2320     *
2321     * The mask is ignored for scalars.
2322     *
2323     * Note that this function only handles what assign can handle,
2324     * i.e. at most a vector as source and a column of a matrix as
2325     * destination.
2326     */
2327 
2328    void copy_masked_offset(ir_constant *src, int offset, unsigned int mask);
2329 
2330    /**
2331     * Determine whether a constant has the same value as another constant
2332     *
2333     * \sa ir_constant::is_zero, ir_constant::is_one,
2334     * ir_constant::is_negative_one
2335     */
2336    bool has_value(const ir_constant *) const;
2337 
2338    /**
2339     * Return true if this ir_constant represents the given value.
2340     *
2341     * For vectors, this checks that each component is the given value.
2342     */
2343    virtual bool is_value(float f, int i) const;
2344    virtual bool is_zero() const;
2345    virtual bool is_one() const;
2346    virtual bool is_negative_one() const;
2347 
2348    /**
2349     * Return true for constants that could be stored as 16-bit unsigned values.
2350     *
2351     * Note that this will return true even for signed integer ir_constants, as
2352     * long as the value is non-negative and fits in 16-bits.
2353     */
2354    virtual bool is_uint16_constant() const;
2355 
2356    /**
2357     * Value of the constant.
2358     *
2359     * The field used to back the values supplied by the constant is determined
2360     * by the type associated with the \c ir_instruction.  Constants may be
2361     * scalars, vectors, or matrices.
2362     */
2363    union ir_constant_data value;
2364 
2365    /* Array elements and structure fields */
2366    ir_constant **const_elements;
2367 
2368 private:
2369    /**
2370     * Parameterless constructor only used by the clone method
2371     */
2372    ir_constant(void);
2373 };
2374 
2375 /**
2376  * IR instruction to emit a vertex in a geometry shader.
2377  */
2378 class ir_emit_vertex : public ir_instruction {
2379 public:
ir_emit_vertex(ir_rvalue * stream)2380    ir_emit_vertex(ir_rvalue *stream)
2381       : ir_instruction(ir_type_emit_vertex),
2382         stream(stream)
2383    {
2384       assert(stream);
2385    }
2386 
accept(ir_visitor * v)2387    virtual void accept(ir_visitor *v)
2388    {
2389       v->visit(this);
2390    }
2391 
clone(void * mem_ctx,struct hash_table * ht)2392    virtual ir_emit_vertex *clone(void *mem_ctx, struct hash_table *ht) const
2393    {
2394       return new(mem_ctx) ir_emit_vertex(this->stream->clone(mem_ctx, ht));
2395    }
2396 
2397    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
2398 
stream_id()2399    int stream_id() const
2400    {
2401       return stream->as_constant()->value.i[0];
2402    }
2403 
2404    ir_rvalue *stream;
2405 };
2406 
2407 /**
2408  * IR instruction to complete the current primitive and start a new one in a
2409  * geometry shader.
2410  */
2411 class ir_end_primitive : public ir_instruction {
2412 public:
ir_end_primitive(ir_rvalue * stream)2413    ir_end_primitive(ir_rvalue *stream)
2414       : ir_instruction(ir_type_end_primitive),
2415         stream(stream)
2416    {
2417       assert(stream);
2418    }
2419 
accept(ir_visitor * v)2420    virtual void accept(ir_visitor *v)
2421    {
2422       v->visit(this);
2423    }
2424 
clone(void * mem_ctx,struct hash_table * ht)2425    virtual ir_end_primitive *clone(void *mem_ctx, struct hash_table *ht) const
2426    {
2427       return new(mem_ctx) ir_end_primitive(this->stream->clone(mem_ctx, ht));
2428    }
2429 
2430    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
2431 
stream_id()2432    int stream_id() const
2433    {
2434       return stream->as_constant()->value.i[0];
2435    }
2436 
2437    ir_rvalue *stream;
2438 };
2439 
2440 /**
2441  * IR instruction for tessellation control and compute shader barrier.
2442  */
2443 class ir_barrier : public ir_instruction {
2444 public:
ir_barrier()2445    ir_barrier()
2446       : ir_instruction(ir_type_barrier)
2447    {
2448    }
2449 
accept(ir_visitor * v)2450    virtual void accept(ir_visitor *v)
2451    {
2452       v->visit(this);
2453    }
2454 
clone(void * mem_ctx,struct hash_table *)2455    virtual ir_barrier *clone(void *mem_ctx, struct hash_table *) const
2456    {
2457       return new(mem_ctx) ir_barrier();
2458    }
2459 
2460    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
2461 };
2462 
2463 /*@}*/
2464 
2465 /**
2466  * Apply a visitor to each IR node in a list
2467  */
2468 void
2469 visit_exec_list(exec_list *list, ir_visitor *visitor);
2470 
2471 /**
2472  * Validate invariants on each IR node in a list
2473  */
2474 void validate_ir_tree(exec_list *instructions);
2475 
2476 struct _mesa_glsl_parse_state;
2477 struct gl_shader_program;
2478 
2479 /**
2480  * Detect whether an unlinked shader contains static recursion
2481  *
2482  * If the list of instructions is determined to contain static recursion,
2483  * \c _mesa_glsl_error will be called to emit error messages for each function
2484  * that is in the recursion cycle.
2485  */
2486 void
2487 detect_recursion_unlinked(struct _mesa_glsl_parse_state *state,
2488 			  exec_list *instructions);
2489 
2490 /**
2491  * Detect whether a linked shader contains static recursion
2492  *
2493  * If the list of instructions is determined to contain static recursion,
2494  * \c link_error_printf will be called to emit error messages for each function
2495  * that is in the recursion cycle.  In addition,
2496  * \c gl_shader_program::LinkStatus will be set to false.
2497  */
2498 void
2499 detect_recursion_linked(struct gl_shader_program *prog,
2500 			exec_list *instructions);
2501 
2502 /**
2503  * Make a clone of each IR instruction in a list
2504  *
2505  * \param in   List of IR instructions that are to be cloned
2506  * \param out  List to hold the cloned instructions
2507  */
2508 void
2509 clone_ir_list(void *mem_ctx, exec_list *out, const exec_list *in);
2510 
2511 extern void
2512 _mesa_glsl_initialize_variables(exec_list *instructions,
2513 				struct _mesa_glsl_parse_state *state);
2514 
2515 extern void
2516 reparent_ir(exec_list *list, void *mem_ctx);
2517 
2518 extern void
2519 do_set_program_inouts(exec_list *instructions, struct gl_program *prog,
2520                       gl_shader_stage shader_stage);
2521 
2522 extern char *
2523 prototype_string(const glsl_type *return_type, const char *name,
2524 		 exec_list *parameters);
2525 
2526 const char *
2527 mode_string(const ir_variable *var);
2528 
2529 /**
2530  * Built-in / reserved GL variables names start with "gl_"
2531  */
2532 static inline bool
is_gl_identifier(const char * s)2533 is_gl_identifier(const char *s)
2534 {
2535    return s && s[0] == 'g' && s[1] == 'l' && s[2] == '_';
2536 }
2537 
2538 extern "C" {
2539 #endif /* __cplusplus */
2540 
2541 extern void _mesa_print_ir(FILE *f, struct exec_list *instructions,
2542                            struct _mesa_glsl_parse_state *state);
2543 
2544 extern void
2545 fprint_ir(FILE *f, const void *instruction);
2546 
2547 extern const struct gl_builtin_uniform_desc *
2548 _mesa_glsl_get_builtin_uniform_desc(const char *name);
2549 
2550 #ifdef __cplusplus
2551 } /* extern "C" */
2552 #endif
2553 
2554 unsigned
2555 vertices_per_prim(GLenum prim);
2556 
2557 #endif /* IR_H */
2558