glsl: Add a new ir_txs (textureSize) opcode to ir_texture.
[profile/ivi/mesa.git] / src / glsl / ir.h
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 "ralloc.h"
33 #include "glsl_types.h"
34 #include "list.h"
35 #include "ir_visitor.h"
36 #include "ir_hierarchical_visitor.h"
37
38 /**
39  * \defgroup IR Intermediate representation nodes
40  *
41  * @{
42  */
43
44 /**
45  * Class tags
46  *
47  * Each concrete class derived from \c ir_instruction has a value in this
48  * enumerant.  The value for the type is stored in \c ir_instruction::ir_type
49  * by the constructor.  While using type tags is not very C++, it is extremely
50  * convenient.  For example, during debugging you can simply inspect
51  * \c ir_instruction::ir_type to find out the actual type of the object.
52  *
53  * In addition, it is possible to use a switch-statement based on \c
54  * \c ir_instruction::ir_type to select different behavior for different object
55  * types.  For functions that have only slight differences for several object
56  * types, this allows writing very straightforward, readable code.
57  */
58 enum ir_node_type {
59    /**
60     * Zero is unused so that the IR validator can detect cases where
61     * \c ir_instruction::ir_type has not been initialized.
62     */
63    ir_type_unset,
64    ir_type_variable,
65    ir_type_assignment,
66    ir_type_call,
67    ir_type_constant,
68    ir_type_dereference_array,
69    ir_type_dereference_record,
70    ir_type_dereference_variable,
71    ir_type_discard,
72    ir_type_expression,
73    ir_type_function,
74    ir_type_function_signature,
75    ir_type_if,
76    ir_type_loop,
77    ir_type_loop_jump,
78    ir_type_return,
79    ir_type_swizzle,
80    ir_type_texture,
81    ir_type_max /**< maximum ir_type enum number, for validation */
82 };
83
84 /**
85  * Base class of all IR instructions
86  */
87 class ir_instruction : public exec_node {
88 public:
89    enum ir_node_type ir_type;
90    const struct glsl_type *type;
91
92    /** ir_print_visitor helper for debugging. */
93    void print(void) const;
94
95    virtual void accept(ir_visitor *) = 0;
96    virtual ir_visitor_status accept(ir_hierarchical_visitor *) = 0;
97    virtual ir_instruction *clone(void *mem_ctx,
98                                  struct hash_table *ht) const = 0;
99
100    /**
101     * \name IR instruction downcast functions
102     *
103     * These functions either cast the object to a derived class or return
104     * \c NULL if the object's type does not match the specified derived class.
105     * Additional downcast functions will be added as needed.
106     */
107    /*@{*/
108    virtual class ir_variable *          as_variable()         { return NULL; }
109    virtual class ir_function *          as_function()         { return NULL; }
110    virtual class ir_dereference *       as_dereference()      { return NULL; }
111    virtual class ir_dereference_array * as_dereference_array() { return NULL; }
112    virtual class ir_dereference_variable *as_dereference_variable() { return NULL; }
113    virtual class ir_expression *        as_expression()       { return NULL; }
114    virtual class ir_rvalue *            as_rvalue()           { return NULL; }
115    virtual class ir_loop *              as_loop()             { return NULL; }
116    virtual class ir_assignment *        as_assignment()       { return NULL; }
117    virtual class ir_call *              as_call()             { return NULL; }
118    virtual class ir_return *            as_return()           { return NULL; }
119    virtual class ir_if *                as_if()               { return NULL; }
120    virtual class ir_swizzle *           as_swizzle()          { return NULL; }
121    virtual class ir_constant *          as_constant()         { return NULL; }
122    virtual class ir_discard *           as_discard()          { return NULL; }
123    /*@}*/
124
125 protected:
126    ir_instruction()
127    {
128       ir_type = ir_type_unset;
129       type = NULL;
130    }
131 };
132
133
134 class ir_rvalue : public ir_instruction {
135 public:
136    virtual ir_rvalue *clone(void *mem_ctx, struct hash_table *) const = 0;
137
138    virtual ir_constant *constant_expression_value() = 0;
139
140    virtual ir_rvalue * as_rvalue()
141    {
142       return this;
143    }
144
145    ir_rvalue *as_rvalue_to_saturate();
146
147    virtual bool is_lvalue() const
148    {
149       return false;
150    }
151
152    /**
153     * Get the variable that is ultimately referenced by an r-value
154     */
155    virtual ir_variable *variable_referenced() const
156    {
157       return NULL;
158    }
159
160
161    /**
162     * If an r-value is a reference to a whole variable, get that variable
163     *
164     * \return
165     * Pointer to a variable that is completely dereferenced by the r-value.  If
166     * the r-value is not a dereference or the dereference does not access the
167     * entire variable (i.e., it's just one array element, struct field), \c NULL
168     * is returned.
169     */
170    virtual ir_variable *whole_variable_referenced()
171    {
172       return NULL;
173    }
174
175    /**
176     * Determine if an r-value has the value zero
177     *
178     * The base implementation of this function always returns \c false.  The
179     * \c ir_constant class over-rides this function to return \c true \b only
180     * for vector and scalar types that have all elements set to the value
181     * zero (or \c false for booleans).
182     *
183     * \sa ir_constant::has_value, ir_rvalue::is_one, ir_rvalue::is_negative_one
184     */
185    virtual bool is_zero() const;
186
187    /**
188     * Determine if an r-value has the value one
189     *
190     * The base implementation of this function always returns \c false.  The
191     * \c ir_constant class over-rides this function to return \c true \b only
192     * for vector and scalar types that have all elements set to the value
193     * one (or \c true for booleans).
194     *
195     * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_negative_one
196     */
197    virtual bool is_one() const;
198
199    /**
200     * Determine if an r-value has the value negative one
201     *
202     * The base implementation of this function always returns \c false.  The
203     * \c ir_constant class over-rides this function to return \c true \b only
204     * for vector and scalar types that have all elements set to the value
205     * negative one.  For boolean times, the result is always \c false.
206     *
207     * \sa ir_constant::has_value, ir_rvalue::is_zero, ir_rvalue::is_one
208     */
209    virtual bool is_negative_one() const;
210
211 protected:
212    ir_rvalue();
213 };
214
215
216 /**
217  * Variable storage classes
218  */
219 enum ir_variable_mode {
220    ir_var_auto = 0,     /**< Function local variables and globals. */
221    ir_var_uniform,      /**< Variable declared as a uniform. */
222    ir_var_in,
223    ir_var_out,
224    ir_var_inout,
225    ir_var_const_in,     /**< "in" param that must be a constant expression */
226    ir_var_system_value, /**< Ex: front-face, instance-id, etc. */
227    ir_var_temporary     /**< Temporary variable generated during compilation. */
228 };
229
230 enum ir_variable_interpolation {
231    ir_var_smooth = 0,
232    ir_var_flat,
233    ir_var_noperspective
234 };
235
236 /**
237  * \brief Layout qualifiers for gl_FragDepth.
238  *
239  * The AMD_conservative_depth extension allows gl_FragDepth to be redeclared
240  * with a layout qualifier.
241  */
242 enum ir_depth_layout {
243     ir_depth_layout_none, /**< No depth layout is specified. */
244     ir_depth_layout_any,
245     ir_depth_layout_greater,
246     ir_depth_layout_less,
247     ir_depth_layout_unchanged
248 };
249
250 /**
251  * \brief Convert depth layout qualifier to string.
252  */
253 const char*
254 depth_layout_string(ir_depth_layout layout);
255
256 /**
257  * Description of built-in state associated with a uniform
258  *
259  * \sa ir_variable::state_slots
260  */
261 struct ir_state_slot {
262    int tokens[5];
263    int swizzle;
264 };
265
266 class ir_variable : public ir_instruction {
267 public:
268    ir_variable(const struct glsl_type *, const char *, ir_variable_mode);
269
270    virtual ir_variable *clone(void *mem_ctx, struct hash_table *ht) const;
271
272    virtual ir_variable *as_variable()
273    {
274       return this;
275    }
276
277    virtual void accept(ir_visitor *v)
278    {
279       v->visit(this);
280    }
281
282    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
283
284
285    /**
286     * Get the string value for the interpolation qualifier
287     *
288     * \return The string that would be used in a shader to specify \c
289     * mode will be returned.
290     *
291     * This function should only be used on a shader input or output variable.
292     */
293    const char *interpolation_string() const;
294
295    /**
296     * Calculate the number of slots required to hold this variable
297     *
298     * This is used to determine how many uniform or varying locations a variable
299     * occupies.  The count is in units of floating point components.
300     */
301    unsigned component_slots() const;
302
303    /**
304     * Delcared name of the variable
305     */
306    const char *name;
307
308    /**
309     * Highest element accessed with a constant expression array index
310     *
311     * Not used for non-array variables.
312     */
313    unsigned max_array_access;
314
315    /**
316     * Is the variable read-only?
317     *
318     * This is set for variables declared as \c const, shader inputs,
319     * and uniforms.
320     */
321    unsigned read_only:1;
322    unsigned centroid:1;
323    unsigned invariant:1;
324
325    /**
326     * Has this variable been used for reading or writing?
327     *
328     * Several GLSL semantic checks require knowledge of whether or not a
329     * variable has been used.  For example, it is an error to redeclare a
330     * variable as invariant after it has been used.
331     */
332    unsigned used:1;
333
334    /**
335     * Storage class of the variable.
336     *
337     * \sa ir_variable_mode
338     */
339    unsigned mode:3;
340
341    /**
342     * Interpolation mode for shader inputs / outputs
343     *
344     * \sa ir_variable_interpolation
345     */
346    unsigned interpolation:2;
347
348    /**
349     * Flag that the whole array is assignable
350     *
351     * In GLSL 1.20 and later whole arrays are assignable (and comparable for
352     * equality).  This flag enables this behavior.
353     */
354    unsigned array_lvalue:1;
355
356    /**
357     * \name ARB_fragment_coord_conventions
358     * @{
359     */
360    unsigned origin_upper_left:1;
361    unsigned pixel_center_integer:1;
362    /*@}*/
363
364    /**
365     * \brief Layout qualifier for gl_FragDepth.
366     *
367     * This is not equal to \c ir_depth_layout_none if and only if this
368     * variable is \c gl_FragDepth and a layout qualifier is specified.
369     */
370    ir_depth_layout depth_layout;
371
372    /**
373     * Was the location explicitly set in the shader?
374     *
375     * If the location is explicitly set in the shader, it \b cannot be changed
376     * by the linker or by the API (e.g., calls to \c glBindAttribLocation have
377     * no effect).
378     */
379    unsigned explicit_location:1;
380
381    /**
382     * Storage location of the base of this variable
383     *
384     * The precise meaning of this field depends on the nature of the variable.
385     *
386     *   - Vertex shader input: one of the values from \c gl_vert_attrib.
387     *   - Vertex shader output: one of the values from \c gl_vert_result.
388     *   - Fragment shader input: one of the values from \c gl_frag_attrib.
389     *   - Fragment shader output: one of the values from \c gl_frag_result.
390     *   - Uniforms: Per-stage uniform slot number.
391     *   - Other: This field is not currently used.
392     *
393     * If the variable is a uniform, shader input, or shader output, and the
394     * slot has not been assigned, the value will be -1.
395     */
396    int location;
397
398    /**
399     * Built-in state that backs this uniform
400     *
401     * Once set at variable creation, \c state_slots must remain invariant.
402     * This is because, ideally, this array would be shared by all clones of
403     * this variable in the IR tree.  In other words, we'd really like for it
404     * to be a fly-weight.
405     *
406     * If the variable is not a uniform, \c num_state_slots will be zero and
407     * \c state_slots will be \c NULL.
408     */
409    /*@{*/
410    unsigned num_state_slots;    /**< Number of state slots used */
411    ir_state_slot *state_slots;  /**< State descriptors. */
412    /*@}*/
413
414    /**
415     * Emit a warning if this variable is accessed.
416     */
417    const char *warn_extension;
418
419    /**
420     * Value assigned in the initializer of a variable declared "const"
421     */
422    ir_constant *constant_value;
423 };
424
425
426 /*@{*/
427 /**
428  * The representation of a function instance; may be the full definition or
429  * simply a prototype.
430  */
431 class ir_function_signature : public ir_instruction {
432    /* An ir_function_signature will be part of the list of signatures in
433     * an ir_function.
434     */
435 public:
436    ir_function_signature(const glsl_type *return_type);
437
438    virtual ir_function_signature *clone(void *mem_ctx,
439                                         struct hash_table *ht) const;
440    ir_function_signature *clone_prototype(void *mem_ctx,
441                                           struct hash_table *ht) const;
442
443    virtual void accept(ir_visitor *v)
444    {
445       v->visit(this);
446    }
447
448    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
449
450    /**
451     * Get the name of the function for which this is a signature
452     */
453    const char *function_name() const;
454
455    /**
456     * Get a handle to the function for which this is a signature
457     *
458     * There is no setter function, this function returns a \c const pointer,
459     * and \c ir_function_signature::_function is private for a reason.  The
460     * only way to make a connection between a function and function signature
461     * is via \c ir_function::add_signature.  This helps ensure that certain
462     * invariants (i.e., a function signature is in the list of signatures for
463     * its \c _function) are met.
464     *
465     * \sa ir_function::add_signature
466     */
467    inline const class ir_function *function() const
468    {
469       return this->_function;
470    }
471
472    /**
473     * Check whether the qualifiers match between this signature's parameters
474     * and the supplied parameter list.  If not, returns the name of the first
475     * parameter with mismatched qualifiers (for use in error messages).
476     */
477    const char *qualifiers_match(exec_list *params);
478
479    /**
480     * Replace the current parameter list with the given one.  This is useful
481     * if the current information came from a prototype, and either has invalid
482     * or missing parameter names.
483     */
484    void replace_parameters(exec_list *new_params);
485
486    /**
487     * Function return type.
488     *
489     * \note This discards the optional precision qualifier.
490     */
491    const struct glsl_type *return_type;
492
493    /**
494     * List of ir_variable of function parameters.
495     *
496     * This represents the storage.  The paramaters passed in a particular
497     * call will be in ir_call::actual_paramaters.
498     */
499    struct exec_list parameters;
500
501    /** Whether or not this function has a body (which may be empty). */
502    unsigned is_defined:1;
503
504    /** Whether or not this function signature is a built-in. */
505    unsigned is_builtin:1;
506
507    /** Body of instructions in the function. */
508    struct exec_list body;
509
510 private:
511    /** Function of which this signature is one overload. */
512    class ir_function *_function;
513
514    friend class ir_function;
515 };
516
517
518 /**
519  * Header for tracking multiple overloaded functions with the same name.
520  * Contains a list of ir_function_signatures representing each of the
521  * actual functions.
522  */
523 class ir_function : public ir_instruction {
524 public:
525    ir_function(const char *name);
526
527    virtual ir_function *clone(void *mem_ctx, struct hash_table *ht) const;
528
529    virtual ir_function *as_function()
530    {
531       return this;
532    }
533
534    virtual void accept(ir_visitor *v)
535    {
536       v->visit(this);
537    }
538
539    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
540
541    void add_signature(ir_function_signature *sig)
542    {
543       sig->_function = this;
544       this->signatures.push_tail(sig);
545    }
546
547    /**
548     * Get an iterator for the set of function signatures
549     */
550    exec_list_iterator iterator()
551    {
552       return signatures.iterator();
553    }
554
555    /**
556     * Find a signature that matches a set of actual parameters, taking implicit
557     * conversions into account.
558     */
559    ir_function_signature *matching_signature(const exec_list *actual_param);
560
561    /**
562     * Find a signature that exactly matches a set of actual parameters without
563     * any implicit type conversions.
564     */
565    ir_function_signature *exact_matching_signature(const exec_list *actual_ps);
566
567    /**
568     * Name of the function.
569     */
570    const char *name;
571
572    /** Whether or not this function has a signature that isn't a built-in. */
573    bool has_user_signature();
574
575    /**
576     * List of ir_function_signature for each overloaded function with this name.
577     */
578    struct exec_list signatures;
579 };
580
581 inline const char *ir_function_signature::function_name() const
582 {
583    return this->_function->name;
584 }
585 /*@}*/
586
587
588 /**
589  * IR instruction representing high-level if-statements
590  */
591 class ir_if : public ir_instruction {
592 public:
593    ir_if(ir_rvalue *condition)
594       : condition(condition)
595    {
596       ir_type = ir_type_if;
597    }
598
599    virtual ir_if *clone(void *mem_ctx, struct hash_table *ht) const;
600
601    virtual ir_if *as_if()
602    {
603       return this;
604    }
605
606    virtual void accept(ir_visitor *v)
607    {
608       v->visit(this);
609    }
610
611    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
612
613    ir_rvalue *condition;
614    /** List of ir_instruction for the body of the then branch */
615    exec_list  then_instructions;
616    /** List of ir_instruction for the body of the else branch */
617    exec_list  else_instructions;
618 };
619
620
621 /**
622  * IR instruction representing a high-level loop structure.
623  */
624 class ir_loop : public ir_instruction {
625 public:
626    ir_loop();
627
628    virtual ir_loop *clone(void *mem_ctx, struct hash_table *ht) const;
629
630    virtual void accept(ir_visitor *v)
631    {
632       v->visit(this);
633    }
634
635    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
636
637    virtual ir_loop *as_loop()
638    {
639       return this;
640    }
641
642    /**
643     * Get an iterator for the instructions of the loop body
644     */
645    exec_list_iterator iterator()
646    {
647       return body_instructions.iterator();
648    }
649
650    /** List of ir_instruction that make up the body of the loop. */
651    exec_list body_instructions;
652
653    /**
654     * \name Loop counter and controls
655     *
656     * Represents a loop like a FORTRAN \c do-loop.
657     *
658     * \note
659     * If \c from and \c to are the same value, the loop will execute once.
660     */
661    /*@{*/
662    ir_rvalue *from;             /** Value of the loop counter on the first
663                                  * iteration of the loop.
664                                  */
665    ir_rvalue *to;               /** Value of the loop counter on the last
666                                  * iteration of the loop.
667                                  */
668    ir_rvalue *increment;
669    ir_variable *counter;
670
671    /**
672     * Comparison operation in the loop terminator.
673     *
674     * If any of the loop control fields are non-\c NULL, this field must be
675     * one of \c ir_binop_less, \c ir_binop_greater, \c ir_binop_lequal,
676     * \c ir_binop_gequal, \c ir_binop_equal, or \c ir_binop_nequal.
677     */
678    int cmp;
679    /*@}*/
680 };
681
682
683 class ir_assignment : public ir_instruction {
684 public:
685    ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition = NULL);
686
687    /**
688     * Construct an assignment with an explicit write mask
689     *
690     * \note
691     * Since a write mask is supplied, the LHS must already be a bare
692     * \c ir_dereference.  The cannot be any swizzles in the LHS.
693     */
694    ir_assignment(ir_dereference *lhs, ir_rvalue *rhs, ir_rvalue *condition,
695                  unsigned write_mask);
696
697    virtual ir_assignment *clone(void *mem_ctx, struct hash_table *ht) const;
698
699    virtual ir_constant *constant_expression_value();
700
701    virtual void accept(ir_visitor *v)
702    {
703       v->visit(this);
704    }
705
706    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
707
708    virtual ir_assignment * as_assignment()
709    {
710       return this;
711    }
712
713    /**
714     * Get a whole variable written by an assignment
715     *
716     * If the LHS of the assignment writes a whole variable, the variable is
717     * returned.  Otherwise \c NULL is returned.  Examples of whole-variable
718     * assignment are:
719     *
720     *  - Assigning to a scalar
721     *  - Assigning to all components of a vector
722     *  - Whole array (or matrix) assignment
723     *  - Whole structure assignment
724     */
725    ir_variable *whole_variable_written();
726
727    /**
728     * Set the LHS of an assignment
729     */
730    void set_lhs(ir_rvalue *lhs);
731
732    /**
733     * Left-hand side of the assignment.
734     *
735     * This should be treated as read only.  If you need to set the LHS of an
736     * assignment, use \c ir_assignment::set_lhs.
737     */
738    ir_dereference *lhs;
739
740    /**
741     * Value being assigned
742     */
743    ir_rvalue *rhs;
744
745    /**
746     * Optional condition for the assignment.
747     */
748    ir_rvalue *condition;
749
750
751    /**
752     * Component mask written
753     *
754     * For non-vector types in the LHS, this field will be zero.  For vector
755     * types, a bit will be set for each component that is written.  Note that
756     * for \c vec2 and \c vec3 types only the lower bits will ever be set.
757     *
758     * A partially-set write mask means that each enabled channel gets
759     * the value from a consecutive channel of the rhs.  For example,
760     * to write just .xyw of gl_FrontColor with color:
761     *
762     * (assign (constant bool (1)) (xyw)
763     *     (var_ref gl_FragColor)
764     *     (swiz xyw (var_ref color)))
765     */
766    unsigned write_mask:4;
767 };
768
769 /* Update ir_expression::num_operands() and operator_strs when
770  * updating this list.
771  */
772 enum ir_expression_operation {
773    ir_unop_bit_not,
774    ir_unop_logic_not,
775    ir_unop_neg,
776    ir_unop_abs,
777    ir_unop_sign,
778    ir_unop_rcp,
779    ir_unop_rsq,
780    ir_unop_sqrt,
781    ir_unop_exp,      /**< Log base e on gentype */
782    ir_unop_log,      /**< Natural log on gentype */
783    ir_unop_exp2,
784    ir_unop_log2,
785    ir_unop_f2i,      /**< Float-to-integer conversion. */
786    ir_unop_i2f,      /**< Integer-to-float conversion. */
787    ir_unop_f2b,      /**< Float-to-boolean conversion */
788    ir_unop_b2f,      /**< Boolean-to-float conversion */
789    ir_unop_i2b,      /**< int-to-boolean conversion */
790    ir_unop_b2i,      /**< Boolean-to-int conversion */
791    ir_unop_u2f,      /**< Unsigned-to-float conversion. */
792    ir_unop_i2u,      /**< Integer-to-unsigned conversion. */
793    ir_unop_u2i,      /**< Unsigned-to-integer conversion. */
794    ir_unop_any,
795
796    /**
797     * \name Unary floating-point rounding operations.
798     */
799    /*@{*/
800    ir_unop_trunc,
801    ir_unop_ceil,
802    ir_unop_floor,
803    ir_unop_fract,
804    ir_unop_round_even,
805    /*@}*/
806
807    /**
808     * \name Trigonometric operations.
809     */
810    /*@{*/
811    ir_unop_sin,
812    ir_unop_cos,
813    ir_unop_sin_reduced,    /**< Reduced range sin. [-pi, pi] */
814    ir_unop_cos_reduced,    /**< Reduced range cos. [-pi, pi] */
815    /*@}*/
816
817    /**
818     * \name Partial derivatives.
819     */
820    /*@{*/
821    ir_unop_dFdx,
822    ir_unop_dFdy,
823    /*@}*/
824
825    ir_unop_noise,
826
827    /**
828     * A sentinel marking the last of the unary operations.
829     */
830    ir_last_unop = ir_unop_noise,
831
832    ir_binop_add,
833    ir_binop_sub,
834    ir_binop_mul,
835    ir_binop_div,
836
837    /**
838     * Takes one of two combinations of arguments:
839     *
840     * - mod(vecN, vecN)
841     * - mod(vecN, float)
842     *
843     * Does not take integer types.
844     */
845    ir_binop_mod,
846
847    /**
848     * \name Binary comparison operators which return a boolean vector.
849     * The type of both operands must be equal.
850     */
851    /*@{*/
852    ir_binop_less,
853    ir_binop_greater,
854    ir_binop_lequal,
855    ir_binop_gequal,
856    ir_binop_equal,
857    ir_binop_nequal,
858    /**
859     * Returns single boolean for whether all components of operands[0]
860     * equal the components of operands[1].
861     */
862    ir_binop_all_equal,
863    /**
864     * Returns single boolean for whether any component of operands[0]
865     * is not equal to the corresponding component of operands[1].
866     */
867    ir_binop_any_nequal,
868    /*@}*/
869
870    /**
871     * \name Bit-wise binary operations.
872     */
873    /*@{*/
874    ir_binop_lshift,
875    ir_binop_rshift,
876    ir_binop_bit_and,
877    ir_binop_bit_xor,
878    ir_binop_bit_or,
879    /*@}*/
880
881    ir_binop_logic_and,
882    ir_binop_logic_xor,
883    ir_binop_logic_or,
884
885    ir_binop_dot,
886    ir_binop_min,
887    ir_binop_max,
888
889    ir_binop_pow,
890
891    /**
892     * A sentinel marking the last of the binary operations.
893     */
894    ir_last_binop = ir_binop_pow,
895
896    ir_quadop_vector,
897
898    /**
899     * A sentinel marking the last of all operations.
900     */
901    ir_last_opcode = ir_last_binop
902 };
903
904 class ir_expression : public ir_rvalue {
905 public:
906    /**
907     * Constructor for unary operation expressions
908     */
909    ir_expression(int op, const struct glsl_type *type, ir_rvalue *);
910    ir_expression(int op, ir_rvalue *);
911
912    /**
913     * Constructor for binary operation expressions
914     */
915    ir_expression(int op, const struct glsl_type *type,
916                  ir_rvalue *, ir_rvalue *);
917    ir_expression(int op, ir_rvalue *op0, ir_rvalue *op1);
918
919    /**
920     * Constructor for quad operator expressions
921     */
922    ir_expression(int op, const struct glsl_type *type,
923                  ir_rvalue *, ir_rvalue *, ir_rvalue *, ir_rvalue *);
924
925    virtual ir_expression *as_expression()
926    {
927       return this;
928    }
929
930    virtual ir_expression *clone(void *mem_ctx, struct hash_table *ht) const;
931
932    /**
933     * Attempt to constant-fold the expression
934     *
935     * If the expression cannot be constant folded, this method will return
936     * \c NULL.
937     */
938    virtual ir_constant *constant_expression_value();
939
940    /**
941     * Determine the number of operands used by an expression
942     */
943    static unsigned int get_num_operands(ir_expression_operation);
944
945    /**
946     * Determine the number of operands used by an expression
947     */
948    unsigned int get_num_operands() const
949    {
950       return (this->operation == ir_quadop_vector)
951          ? this->type->vector_elements : get_num_operands(operation);
952    }
953
954    /**
955     * Return a string representing this expression's operator.
956     */
957    const char *operator_string();
958
959    /**
960     * Return a string representing this expression's operator.
961     */
962    static const char *operator_string(ir_expression_operation);
963
964
965    /**
966     * Do a reverse-lookup to translate the given string into an operator.
967     */
968    static ir_expression_operation get_operator(const char *);
969
970    virtual void accept(ir_visitor *v)
971    {
972       v->visit(this);
973    }
974
975    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
976
977    ir_expression_operation operation;
978    ir_rvalue *operands[4];
979 };
980
981
982 /**
983  * IR instruction representing a function call
984  */
985 class ir_call : public ir_rvalue {
986 public:
987    ir_call(ir_function_signature *callee, exec_list *actual_parameters)
988       : callee(callee)
989    {
990       ir_type = ir_type_call;
991       assert(callee->return_type != NULL);
992       type = callee->return_type;
993       actual_parameters->move_nodes_to(& this->actual_parameters);
994       this->use_builtin = callee->is_builtin;
995    }
996
997    virtual ir_call *clone(void *mem_ctx, struct hash_table *ht) const;
998
999    virtual ir_constant *constant_expression_value();
1000
1001    virtual ir_call *as_call()
1002    {
1003       return this;
1004    }
1005
1006    virtual void accept(ir_visitor *v)
1007    {
1008       v->visit(this);
1009    }
1010
1011    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1012
1013    /**
1014     * Get a generic ir_call object when an error occurs
1015     *
1016     * Any allocation will be performed with 'ctx' as ralloc owner.
1017     */
1018    static ir_call *get_error_instruction(void *ctx);
1019
1020    /**
1021     * Get an iterator for the set of acutal parameters
1022     */
1023    exec_list_iterator iterator()
1024    {
1025       return actual_parameters.iterator();
1026    }
1027
1028    /**
1029     * Get the name of the function being called.
1030     */
1031    const char *callee_name() const
1032    {
1033       return callee->function_name();
1034    }
1035
1036    /**
1037     * Get the function signature bound to this function call
1038     */
1039    ir_function_signature *get_callee()
1040    {
1041       return callee;
1042    }
1043
1044    /**
1045     * Set the function call target
1046     */
1047    void set_callee(ir_function_signature *sig);
1048
1049    /**
1050     * Generates an inline version of the function before @ir,
1051     * returning the return value of the function.
1052     */
1053    ir_rvalue *generate_inline(ir_instruction *ir);
1054
1055    /* List of ir_rvalue of paramaters passed in this call. */
1056    exec_list actual_parameters;
1057
1058    /** Should this call only bind to a built-in function? */
1059    bool use_builtin;
1060
1061 private:
1062    ir_call()
1063       : callee(NULL)
1064    {
1065       this->ir_type = ir_type_call;
1066    }
1067
1068    ir_function_signature *callee;
1069 };
1070
1071
1072 /**
1073  * \name Jump-like IR instructions.
1074  *
1075  * These include \c break, \c continue, \c return, and \c discard.
1076  */
1077 /*@{*/
1078 class ir_jump : public ir_instruction {
1079 protected:
1080    ir_jump()
1081    {
1082       ir_type = ir_type_unset;
1083    }
1084 };
1085
1086 class ir_return : public ir_jump {
1087 public:
1088    ir_return()
1089       : value(NULL)
1090    {
1091       this->ir_type = ir_type_return;
1092    }
1093
1094    ir_return(ir_rvalue *value)
1095       : value(value)
1096    {
1097       this->ir_type = ir_type_return;
1098    }
1099
1100    virtual ir_return *clone(void *mem_ctx, struct hash_table *) const;
1101
1102    virtual ir_return *as_return()
1103    {
1104       return this;
1105    }
1106
1107    ir_rvalue *get_value() const
1108    {
1109       return value;
1110    }
1111
1112    virtual void accept(ir_visitor *v)
1113    {
1114       v->visit(this);
1115    }
1116
1117    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1118
1119    ir_rvalue *value;
1120 };
1121
1122
1123 /**
1124  * Jump instructions used inside loops
1125  *
1126  * These include \c break and \c continue.  The \c break within a loop is
1127  * different from the \c break within a switch-statement.
1128  *
1129  * \sa ir_switch_jump
1130  */
1131 class ir_loop_jump : public ir_jump {
1132 public:
1133    enum jump_mode {
1134       jump_break,
1135       jump_continue
1136    };
1137
1138    ir_loop_jump(jump_mode mode)
1139    {
1140       this->ir_type = ir_type_loop_jump;
1141       this->mode = mode;
1142       this->loop = loop;
1143    }
1144
1145    virtual ir_loop_jump *clone(void *mem_ctx, struct hash_table *) const;
1146
1147    virtual void accept(ir_visitor *v)
1148    {
1149       v->visit(this);
1150    }
1151
1152    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1153
1154    bool is_break() const
1155    {
1156       return mode == jump_break;
1157    }
1158
1159    bool is_continue() const
1160    {
1161       return mode == jump_continue;
1162    }
1163
1164    /** Mode selector for the jump instruction. */
1165    enum jump_mode mode;
1166 private:
1167    /** Loop containing this break instruction. */
1168    ir_loop *loop;
1169 };
1170
1171 /**
1172  * IR instruction representing discard statements.
1173  */
1174 class ir_discard : public ir_jump {
1175 public:
1176    ir_discard()
1177    {
1178       this->ir_type = ir_type_discard;
1179       this->condition = NULL;
1180    }
1181
1182    ir_discard(ir_rvalue *cond)
1183    {
1184       this->ir_type = ir_type_discard;
1185       this->condition = cond;
1186    }
1187
1188    virtual ir_discard *clone(void *mem_ctx, struct hash_table *ht) const;
1189
1190    virtual void accept(ir_visitor *v)
1191    {
1192       v->visit(this);
1193    }
1194
1195    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1196
1197    virtual ir_discard *as_discard()
1198    {
1199       return this;
1200    }
1201
1202    ir_rvalue *condition;
1203 };
1204 /*@}*/
1205
1206
1207 /**
1208  * Texture sampling opcodes used in ir_texture
1209  */
1210 enum ir_texture_opcode {
1211    ir_tex,              /**< Regular texture look-up */
1212    ir_txb,              /**< Texture look-up with LOD bias */
1213    ir_txl,              /**< Texture look-up with explicit LOD */
1214    ir_txd,              /**< Texture look-up with partial derivatvies */
1215    ir_txf,              /**< Texel fetch with explicit LOD */
1216    ir_txs               /**< Texture size */
1217 };
1218
1219
1220 /**
1221  * IR instruction to sample a texture
1222  *
1223  * The specific form of the IR instruction depends on the \c mode value
1224  * selected from \c ir_texture_opcodes.  In the printed IR, these will
1225  * appear as:
1226  *
1227  *                                    Texel offset (0 or an expression)
1228  *                                    | Projection divisor
1229  *                                    | |  Shadow comparitor
1230  *                                    | |  |
1231  *                                    v v  v
1232  * (tex <type> <sampler> <coordinate> 0 1 ( ))
1233  * (txb <type> <sampler> <coordinate> 0 1 ( ) <bias>)
1234  * (txl <type> <sampler> <coordinate> 0 1 ( ) <lod>)
1235  * (txd <type> <sampler> <coordinate> 0 1 ( ) (dPdx dPdy))
1236  * (txf <type> <sampler> <coordinate> 0       <lod>)
1237  * (txs <type> <sampler> <lod>)
1238  */
1239 class ir_texture : public ir_rvalue {
1240 public:
1241    ir_texture(enum ir_texture_opcode op)
1242       : op(op), projector(NULL), shadow_comparitor(NULL), offset(NULL)
1243    {
1244       this->ir_type = ir_type_texture;
1245    }
1246
1247    virtual ir_texture *clone(void *mem_ctx, struct hash_table *) const;
1248
1249    virtual ir_constant *constant_expression_value();
1250
1251    virtual void accept(ir_visitor *v)
1252    {
1253       v->visit(this);
1254    }
1255
1256    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1257
1258    /**
1259     * Return a string representing the ir_texture_opcode.
1260     */
1261    const char *opcode_string();
1262
1263    /** Set the sampler and type. */
1264    void set_sampler(ir_dereference *sampler, const glsl_type *type);
1265
1266    /**
1267     * Do a reverse-lookup to translate a string into an ir_texture_opcode.
1268     */
1269    static ir_texture_opcode get_opcode(const char *);
1270
1271    enum ir_texture_opcode op;
1272
1273    /** Sampler to use for the texture access. */
1274    ir_dereference *sampler;
1275
1276    /** Texture coordinate to sample */
1277    ir_rvalue *coordinate;
1278
1279    /**
1280     * Value used for projective divide.
1281     *
1282     * If there is no projective divide (the common case), this will be
1283     * \c NULL.  Optimization passes should check for this to point to a constant
1284     * of 1.0 and replace that with \c NULL.
1285     */
1286    ir_rvalue *projector;
1287
1288    /**
1289     * Coordinate used for comparison on shadow look-ups.
1290     *
1291     * If there is no shadow comparison, this will be \c NULL.  For the
1292     * \c ir_txf opcode, this *must* be \c NULL.
1293     */
1294    ir_rvalue *shadow_comparitor;
1295
1296    /** Texel offset. */
1297    ir_rvalue *offset;
1298
1299    union {
1300       ir_rvalue *lod;           /**< Floating point LOD */
1301       ir_rvalue *bias;          /**< Floating point LOD bias */
1302       struct {
1303          ir_rvalue *dPdx;       /**< Partial derivative of coordinate wrt X */
1304          ir_rvalue *dPdy;       /**< Partial derivative of coordinate wrt Y */
1305       } grad;
1306    } lod_info;
1307 };
1308
1309
1310 struct ir_swizzle_mask {
1311    unsigned x:2;
1312    unsigned y:2;
1313    unsigned z:2;
1314    unsigned w:2;
1315
1316    /**
1317     * Number of components in the swizzle.
1318     */
1319    unsigned num_components:3;
1320
1321    /**
1322     * Does the swizzle contain duplicate components?
1323     *
1324     * L-value swizzles cannot contain duplicate components.
1325     */
1326    unsigned has_duplicates:1;
1327 };
1328
1329
1330 class ir_swizzle : public ir_rvalue {
1331 public:
1332    ir_swizzle(ir_rvalue *, unsigned x, unsigned y, unsigned z, unsigned w,
1333               unsigned count);
1334
1335    ir_swizzle(ir_rvalue *val, const unsigned *components, unsigned count);
1336
1337    ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask);
1338
1339    virtual ir_swizzle *clone(void *mem_ctx, struct hash_table *) const;
1340
1341    virtual ir_constant *constant_expression_value();
1342
1343    virtual ir_swizzle *as_swizzle()
1344    {
1345       return this;
1346    }
1347
1348    /**
1349     * Construct an ir_swizzle from the textual representation.  Can fail.
1350     */
1351    static ir_swizzle *create(ir_rvalue *, const char *, unsigned vector_length);
1352
1353    virtual void accept(ir_visitor *v)
1354    {
1355       v->visit(this);
1356    }
1357
1358    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1359
1360    bool is_lvalue() const
1361    {
1362       return val->is_lvalue() && !mask.has_duplicates;
1363    }
1364
1365    /**
1366     * Get the variable that is ultimately referenced by an r-value
1367     */
1368    virtual ir_variable *variable_referenced() const;
1369
1370    ir_rvalue *val;
1371    ir_swizzle_mask mask;
1372
1373 private:
1374    /**
1375     * Initialize the mask component of a swizzle
1376     *
1377     * This is used by the \c ir_swizzle constructors.
1378     */
1379    void init_mask(const unsigned *components, unsigned count);
1380 };
1381
1382
1383 class ir_dereference : public ir_rvalue {
1384 public:
1385    virtual ir_dereference *clone(void *mem_ctx, struct hash_table *) const = 0;
1386
1387    virtual ir_dereference *as_dereference()
1388    {
1389       return this;
1390    }
1391
1392    bool is_lvalue() const;
1393
1394    /**
1395     * Get the variable that is ultimately referenced by an r-value
1396     */
1397    virtual ir_variable *variable_referenced() const = 0;
1398 };
1399
1400
1401 class ir_dereference_variable : public ir_dereference {
1402 public:
1403    ir_dereference_variable(ir_variable *var);
1404
1405    virtual ir_dereference_variable *clone(void *mem_ctx,
1406                                           struct hash_table *) const;
1407
1408    virtual ir_constant *constant_expression_value();
1409
1410    virtual ir_dereference_variable *as_dereference_variable()
1411    {
1412       return this;
1413    }
1414
1415    /**
1416     * Get the variable that is ultimately referenced by an r-value
1417     */
1418    virtual ir_variable *variable_referenced() const
1419    {
1420       return this->var;
1421    }
1422
1423    virtual ir_variable *whole_variable_referenced()
1424    {
1425       /* ir_dereference_variable objects always dereference the entire
1426        * variable.  However, if this dereference is dereferenced by anything
1427        * else, the complete deferefernce chain is not a whole-variable
1428        * dereference.  This method should only be called on the top most
1429        * ir_rvalue in a dereference chain.
1430        */
1431       return this->var;
1432    }
1433
1434    virtual void accept(ir_visitor *v)
1435    {
1436       v->visit(this);
1437    }
1438
1439    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1440
1441    /**
1442     * Object being dereferenced.
1443     */
1444    ir_variable *var;
1445 };
1446
1447
1448 class ir_dereference_array : public ir_dereference {
1449 public:
1450    ir_dereference_array(ir_rvalue *value, ir_rvalue *array_index);
1451
1452    ir_dereference_array(ir_variable *var, ir_rvalue *array_index);
1453
1454    virtual ir_dereference_array *clone(void *mem_ctx,
1455                                        struct hash_table *) const;
1456
1457    virtual ir_constant *constant_expression_value();
1458
1459    virtual ir_dereference_array *as_dereference_array()
1460    {
1461       return this;
1462    }
1463
1464    /**
1465     * Get the variable that is ultimately referenced by an r-value
1466     */
1467    virtual ir_variable *variable_referenced() const
1468    {
1469       return this->array->variable_referenced();
1470    }
1471
1472    virtual void accept(ir_visitor *v)
1473    {
1474       v->visit(this);
1475    }
1476
1477    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1478
1479    ir_rvalue *array;
1480    ir_rvalue *array_index;
1481
1482 private:
1483    void set_array(ir_rvalue *value);
1484 };
1485
1486
1487 class ir_dereference_record : public ir_dereference {
1488 public:
1489    ir_dereference_record(ir_rvalue *value, const char *field);
1490
1491    ir_dereference_record(ir_variable *var, const char *field);
1492
1493    virtual ir_dereference_record *clone(void *mem_ctx,
1494                                         struct hash_table *) const;
1495
1496    virtual ir_constant *constant_expression_value();
1497
1498    /**
1499     * Get the variable that is ultimately referenced by an r-value
1500     */
1501    virtual ir_variable *variable_referenced() const
1502    {
1503       return this->record->variable_referenced();
1504    }
1505
1506    virtual void accept(ir_visitor *v)
1507    {
1508       v->visit(this);
1509    }
1510
1511    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1512
1513    ir_rvalue *record;
1514    const char *field;
1515 };
1516
1517
1518 /**
1519  * Data stored in an ir_constant
1520  */
1521 union ir_constant_data {
1522       unsigned u[16];
1523       int i[16];
1524       float f[16];
1525       bool b[16];
1526 };
1527
1528
1529 class ir_constant : public ir_rvalue {
1530 public:
1531    ir_constant(const struct glsl_type *type, const ir_constant_data *data);
1532    ir_constant(bool b);
1533    ir_constant(unsigned int u);
1534    ir_constant(int i);
1535    ir_constant(float f);
1536
1537    /**
1538     * Construct an ir_constant from a list of ir_constant values
1539     */
1540    ir_constant(const struct glsl_type *type, exec_list *values);
1541
1542    /**
1543     * Construct an ir_constant from a scalar component of another ir_constant
1544     *
1545     * The new \c ir_constant inherits the type of the component from the
1546     * source constant.
1547     *
1548     * \note
1549     * In the case of a matrix constant, the new constant is a scalar, \b not
1550     * a vector.
1551     */
1552    ir_constant(const ir_constant *c, unsigned i);
1553
1554    /**
1555     * Return a new ir_constant of the specified type containing all zeros.
1556     */
1557    static ir_constant *zero(void *mem_ctx, const glsl_type *type);
1558
1559    virtual ir_constant *clone(void *mem_ctx, struct hash_table *) const;
1560
1561    virtual ir_constant *constant_expression_value();
1562
1563    virtual ir_constant *as_constant()
1564    {
1565       return this;
1566    }
1567
1568    virtual void accept(ir_visitor *v)
1569    {
1570       v->visit(this);
1571    }
1572
1573    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
1574
1575    /**
1576     * Get a particular component of a constant as a specific type
1577     *
1578     * This is useful, for example, to get a value from an integer constant
1579     * as a float or bool.  This appears frequently when constructors are
1580     * called with all constant parameters.
1581     */
1582    /*@{*/
1583    bool get_bool_component(unsigned i) const;
1584    float get_float_component(unsigned i) const;
1585    int get_int_component(unsigned i) const;
1586    unsigned get_uint_component(unsigned i) const;
1587    /*@}*/
1588
1589    ir_constant *get_array_element(unsigned i) const;
1590
1591    ir_constant *get_record_field(const char *name);
1592
1593    /**
1594     * Determine whether a constant has the same value as another constant
1595     *
1596     * \sa ir_constant::is_zero, ir_constant::is_one,
1597     * ir_constant::is_negative_one
1598     */
1599    bool has_value(const ir_constant *) const;
1600
1601    virtual bool is_zero() const;
1602    virtual bool is_one() const;
1603    virtual bool is_negative_one() const;
1604
1605    /**
1606     * Value of the constant.
1607     *
1608     * The field used to back the values supplied by the constant is determined
1609     * by the type associated with the \c ir_instruction.  Constants may be
1610     * scalars, vectors, or matrices.
1611     */
1612    union ir_constant_data value;
1613
1614    /* Array elements */
1615    ir_constant **array_elements;
1616
1617    /* Structure fields */
1618    exec_list components;
1619
1620 private:
1621    /**
1622     * Parameterless constructor only used by the clone method
1623     */
1624    ir_constant(void);
1625 };
1626
1627 /*@}*/
1628
1629 /**
1630  * Apply a visitor to each IR node in a list
1631  */
1632 void
1633 visit_exec_list(exec_list *list, ir_visitor *visitor);
1634
1635 /**
1636  * Validate invariants on each IR node in a list
1637  */
1638 void validate_ir_tree(exec_list *instructions);
1639
1640 struct _mesa_glsl_parse_state;
1641 struct gl_shader_program;
1642
1643 /**
1644  * Detect whether an unlinked shader contains static recursion
1645  *
1646  * If the list of instructions is determined to contain static recursion,
1647  * \c _mesa_glsl_error will be called to emit error messages for each function
1648  * that is in the recursion cycle.
1649  */
1650 void
1651 detect_recursion_unlinked(struct _mesa_glsl_parse_state *state,
1652                           exec_list *instructions);
1653
1654 /**
1655  * Detect whether a linked shader contains static recursion
1656  *
1657  * If the list of instructions is determined to contain static recursion,
1658  * \c link_error_printf will be called to emit error messages for each function
1659  * that is in the recursion cycle.  In addition,
1660  * \c gl_shader_program::LinkStatus will be set to false.
1661  */
1662 void
1663 detect_recursion_linked(struct gl_shader_program *prog,
1664                         exec_list *instructions);
1665
1666 /**
1667  * Make a clone of each IR instruction in a list
1668  *
1669  * \param in   List of IR instructions that are to be cloned
1670  * \param out  List to hold the cloned instructions
1671  */
1672 void
1673 clone_ir_list(void *mem_ctx, exec_list *out, const exec_list *in);
1674
1675 extern void
1676 _mesa_glsl_initialize_variables(exec_list *instructions,
1677                                 struct _mesa_glsl_parse_state *state);
1678
1679 extern void
1680 _mesa_glsl_initialize_functions(_mesa_glsl_parse_state *state);
1681
1682 extern void
1683 _mesa_glsl_release_functions(void);
1684
1685 extern void
1686 reparent_ir(exec_list *list, void *mem_ctx);
1687
1688 struct glsl_symbol_table;
1689
1690 extern void
1691 import_prototypes(const exec_list *source, exec_list *dest,
1692                   struct glsl_symbol_table *symbols, void *mem_ctx);
1693
1694 extern bool
1695 ir_has_call(ir_instruction *ir);
1696
1697 extern void
1698 do_set_program_inouts(exec_list *instructions, struct gl_program *prog);
1699
1700 extern char *
1701 prototype_string(const glsl_type *return_type, const char *name,
1702                  exec_list *parameters);
1703
1704 #endif /* IR_H */