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