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 */
61enum 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 */
91class ir_instruction : public exec_node {
92public:
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    */
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
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
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
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
204protected:
205   ir_instruction(enum ir_node_type t)
206      : ir_type(t)
207   {
208   }
209
210private:
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 */
221class ir_rvalue : public ir_instruction {
222public:
223   const struct glsl_type *type;
224
225   virtual ir_rvalue *clone(void *mem_ctx, struct hash_table *) const;
226
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    */
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    */
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    */
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
318protected:
319   ir_rvalue(enum ir_node_type t);
320};
321
322
323/**
324 * Variable storage classes
325 */
326enum 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 */
346enum 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 */
382enum 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 */
393const char*
394depth_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 */
401struct 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 */
419const char *interpolation_string(unsigned interpolation);
420
421
422class ir_variable : public ir_instruction {
423public:
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
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    */
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    */
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    */
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    */
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    */
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    */
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    */
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
548   const glsl_type *get_interface_type() const
549   {
550      return this->interface_type;
551   }
552
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    */
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
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
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
583   inline ir_state_slot *get_state_slots()
584   {
585      return this->is_interface_instance() ? NULL : this->u.state_slots;
586   }
587
588   inline const ir_state_slot *get_state_slots() const
589   {
590      return this->is_interface_instance() ? NULL : this->u.state_slots;
591   }
592
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
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
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
641private:
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
650public:
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
1014private:
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
1055public:
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 */
1079typedef 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
1087enum 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 */
1183class 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    */
1187public:
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
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    */
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    */
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
1294private:
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 */
1332class ir_function : public ir_instruction {
1333public:
1334   ir_function(const char *name);
1335
1336   virtual ir_function *clone(void *mem_ctx, struct hash_table *ht) const;
1337
1338   virtual void accept(ir_visitor *v)
1339   {
1340      v->visit(this);
1341   }
1342
1343   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1344
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
1406inline 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 */
1416class ir_if : public ir_instruction {
1417public:
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
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 */
1443class ir_loop : public ir_instruction {
1444public:
1445   ir_loop();
1446
1447   virtual ir_loop *clone(void *mem_ctx, struct hash_table *ht) const;
1448
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
1461class ir_assignment : public ir_instruction {
1462public:
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
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
1545extern const char *const ir_expression_operation_strings[ir_last_opcode + 1];
1546extern const char *const ir_expression_operation_enum_strings[ir_last_opcode + 1];
1547
1548class ir_expression : public ir_rvalue {
1549public:
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    */
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
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    */
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 */
1643class ir_call : public ir_instruction {
1644public:
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
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
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    */
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/*@{*/
1720class ir_jump : public ir_instruction {
1721protected:
1722   ir_jump(enum ir_node_type t)
1723      : ir_instruction(t)
1724   {
1725   }
1726};
1727
1728class ir_return : public ir_jump {
1729public:
1730   ir_return()
1731      : ir_jump(ir_type_return), value(NULL)
1732   {
1733   }
1734
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
1742   ir_rvalue *get_value() const
1743   {
1744      return value;
1745   }
1746
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 */
1766class ir_loop_jump : public ir_jump {
1767public:
1768   enum jump_mode {
1769      jump_break,
1770      jump_continue
1771   };
1772
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
1781   virtual void accept(ir_visitor *v)
1782   {
1783      v->visit(this);
1784   }
1785
1786   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1787
1788   bool is_break() const
1789   {
1790      return mode == jump_break;
1791   }
1792
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 */
1805class ir_discard : public ir_jump {
1806public:
1807   ir_discard()
1808      : ir_jump(ir_type_discard)
1809   {
1810      this->condition = NULL;
1811   }
1812
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
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 */
1837class ir_demote : public ir_instruction {
1838public:
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
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 */
1858enum 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 */
1899class ir_texture : public ir_rvalue {
1900public:
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
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
1978struct 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
1998class ir_swizzle : public ir_rvalue {
1999public:
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
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
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
2040private:
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
2050class ir_dereference : public ir_rvalue {
2051public:
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
2067protected:
2068   ir_dereference(enum ir_node_type t)
2069      : ir_rvalue(t)
2070   {
2071   }
2072};
2073
2074
2075class ir_dereference_variable : public ir_dereference {
2076public:
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    */
2091   virtual ir_variable *variable_referenced() const
2092   {
2093      return this->var;
2094   }
2095
2096   virtual int precision() const
2097   {
2098      return this->var->data.precision;
2099   }
2100
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
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
2126class ir_dereference_array : public ir_dereference {
2127public:
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    */
2144   virtual ir_variable *variable_referenced() const
2145   {
2146      return this->array->variable_referenced();
2147   }
2148
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
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
2169private:
2170   void set_array(ir_rvalue *value);
2171};
2172
2173
2174class ir_dereference_record : public ir_dereference {
2175public:
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    */
2189   virtual ir_variable *variable_referenced() const
2190   {
2191      return this->record->variable_referenced();
2192   }
2193
2194   virtual int precision() const
2195   {
2196      glsl_struct_field *field = record->type->fields.structure + field_idx;
2197
2198      return field->precision;
2199   }
2200
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 */
2216union 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
2230class ir_constant : public ir_rvalue {
2231public:
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
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
2368private:
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 */
2378class ir_emit_vertex : public ir_instruction {
2379public:
2380   ir_emit_vertex(ir_rvalue *stream)
2381      : ir_instruction(ir_type_emit_vertex),
2382        stream(stream)
2383   {
2384      assert(stream);
2385   }
2386
2387   virtual void accept(ir_visitor *v)
2388   {
2389      v->visit(this);
2390   }
2391
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
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 */
2411class ir_end_primitive : public ir_instruction {
2412public:
2413   ir_end_primitive(ir_rvalue *stream)
2414      : ir_instruction(ir_type_end_primitive),
2415        stream(stream)
2416   {
2417      assert(stream);
2418   }
2419
2420   virtual void accept(ir_visitor *v)
2421   {
2422      v->visit(this);
2423   }
2424
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
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 */
2443class ir_barrier : public ir_instruction {
2444public:
2445   ir_barrier()
2446      : ir_instruction(ir_type_barrier)
2447   {
2448   }
2449
2450   virtual void accept(ir_visitor *v)
2451   {
2452      v->visit(this);
2453   }
2454
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 */
2468void
2469visit_exec_list(exec_list *list, ir_visitor *visitor);
2470
2471/**
2472 * Validate invariants on each IR node in a list
2473 */
2474void validate_ir_tree(exec_list *instructions);
2475
2476struct _mesa_glsl_parse_state;
2477struct 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 */
2486void
2487detect_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 */
2498void
2499detect_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 */
2508void
2509clone_ir_list(void *mem_ctx, exec_list *out, const exec_list *in);
2510
2511extern void
2512_mesa_glsl_initialize_variables(exec_list *instructions,
2513				struct _mesa_glsl_parse_state *state);
2514
2515extern void
2516reparent_ir(exec_list *list, void *mem_ctx);
2517
2518extern void
2519do_set_program_inouts(exec_list *instructions, struct gl_program *prog,
2520                      gl_shader_stage shader_stage);
2521
2522extern char *
2523prototype_string(const glsl_type *return_type, const char *name,
2524		 exec_list *parameters);
2525
2526const char *
2527mode_string(const ir_variable *var);
2528
2529/**
2530 * Built-in / reserved GL variables names start with "gl_"
2531 */
2532static inline bool
2533is_gl_identifier(const char *s)
2534{
2535   return s && s[0] == 'g' && s[1] == 'l' && s[2] == '_';
2536}
2537
2538extern "C" {
2539#endif /* __cplusplus */
2540
2541extern void _mesa_print_ir(FILE *f, struct exec_list *instructions,
2542                           struct _mesa_glsl_parse_state *state);
2543
2544extern void
2545fprint_ir(FILE *f, const void *instruction);
2546
2547extern 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
2554unsigned
2555vertices_per_prim(GLenum prim);
2556
2557#endif /* IR_H */
2558