xref: /aosp_15_r20/external/mesa3d/src/compiler/glsl/ast.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /* -*- c++ -*- */
2*61046927SAndroid Build Coastguard Worker /*
3*61046927SAndroid Build Coastguard Worker  * Copyright © 2009 Intel Corporation
4*61046927SAndroid Build Coastguard Worker  *
5*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
6*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
7*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
8*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
10*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
11*61046927SAndroid Build Coastguard Worker  *
12*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
13*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
14*61046927SAndroid Build Coastguard Worker  * Software.
15*61046927SAndroid Build Coastguard Worker  *
16*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22*61046927SAndroid Build Coastguard Worker  * DEALINGS IN THE SOFTWARE.
23*61046927SAndroid Build Coastguard Worker  */
24*61046927SAndroid Build Coastguard Worker 
25*61046927SAndroid Build Coastguard Worker #ifndef AST_H
26*61046927SAndroid Build Coastguard Worker #define AST_H
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker #include "list.h"
29*61046927SAndroid Build Coastguard Worker #include "glsl_parser_extras.h"
30*61046927SAndroid Build Coastguard Worker #include "compiler/glsl_types.h"
31*61046927SAndroid Build Coastguard Worker #include "util/bitset.h"
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker struct _mesa_glsl_parse_state;
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker struct YYLTYPE;
36*61046927SAndroid Build Coastguard Worker 
37*61046927SAndroid Build Coastguard Worker /**
38*61046927SAndroid Build Coastguard Worker  * \defgroup AST Abstract syntax tree node definitions
39*61046927SAndroid Build Coastguard Worker  *
40*61046927SAndroid Build Coastguard Worker  * An abstract syntax tree is generated by the parser.  This is a fairly
41*61046927SAndroid Build Coastguard Worker  * direct representation of the gramma derivation for the source program.
42*61046927SAndroid Build Coastguard Worker  * No symantic checking is done during the generation of the AST.  Only
43*61046927SAndroid Build Coastguard Worker  * syntactic checking is done.  Symantic checking is performed by a later
44*61046927SAndroid Build Coastguard Worker  * stage that converts the AST to a more generic intermediate representation.
45*61046927SAndroid Build Coastguard Worker  *
46*61046927SAndroid Build Coastguard Worker  *@{
47*61046927SAndroid Build Coastguard Worker  */
48*61046927SAndroid Build Coastguard Worker /**
49*61046927SAndroid Build Coastguard Worker  * Base class of all abstract syntax tree nodes
50*61046927SAndroid Build Coastguard Worker  */
51*61046927SAndroid Build Coastguard Worker class ast_node {
52*61046927SAndroid Build Coastguard Worker public:
53*61046927SAndroid Build Coastguard Worker    DECLARE_LINEAR_ZALLOC_CXX_OPERATORS(ast_node);
54*61046927SAndroid Build Coastguard Worker 
55*61046927SAndroid Build Coastguard Worker    /**
56*61046927SAndroid Build Coastguard Worker     * Print an AST node in something approximating the original GLSL code
57*61046927SAndroid Build Coastguard Worker     */
58*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker    /**
61*61046927SAndroid Build Coastguard Worker     * Convert the AST node to the high-level intermediate representation
62*61046927SAndroid Build Coastguard Worker     */
63*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
64*61046927SAndroid Build Coastguard Worker 			  struct _mesa_glsl_parse_state *state);
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker    virtual bool has_sequence_subexpression() const;
67*61046927SAndroid Build Coastguard Worker 
68*61046927SAndroid Build Coastguard Worker    /**
69*61046927SAndroid Build Coastguard Worker     * Retrieve the source location of an AST node
70*61046927SAndroid Build Coastguard Worker     *
71*61046927SAndroid Build Coastguard Worker     * This function is primarily used to get the source position of an AST node
72*61046927SAndroid Build Coastguard Worker     * into a form that can be passed to \c _mesa_glsl_error.
73*61046927SAndroid Build Coastguard Worker     *
74*61046927SAndroid Build Coastguard Worker     * \sa _mesa_glsl_error, ast_node::set_location
75*61046927SAndroid Build Coastguard Worker     */
get_location(void)76*61046927SAndroid Build Coastguard Worker    struct YYLTYPE get_location(void) const
77*61046927SAndroid Build Coastguard Worker    {
78*61046927SAndroid Build Coastguard Worker       struct YYLTYPE locp;
79*61046927SAndroid Build Coastguard Worker 
80*61046927SAndroid Build Coastguard Worker       locp.path = this->location.path;
81*61046927SAndroid Build Coastguard Worker       locp.source = this->location.source;
82*61046927SAndroid Build Coastguard Worker       locp.first_line = this->location.first_line;
83*61046927SAndroid Build Coastguard Worker       locp.first_column = this->location.first_column;
84*61046927SAndroid Build Coastguard Worker       locp.last_line = this->location.last_line;
85*61046927SAndroid Build Coastguard Worker       locp.last_column = this->location.last_column;
86*61046927SAndroid Build Coastguard Worker 
87*61046927SAndroid Build Coastguard Worker       return locp;
88*61046927SAndroid Build Coastguard Worker    }
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker    /**
91*61046927SAndroid Build Coastguard Worker     * Set the source location of an AST node from a parser location
92*61046927SAndroid Build Coastguard Worker     *
93*61046927SAndroid Build Coastguard Worker     * \sa ast_node::get_location
94*61046927SAndroid Build Coastguard Worker     */
set_location(const struct YYLTYPE & locp)95*61046927SAndroid Build Coastguard Worker    void set_location(const struct YYLTYPE &locp)
96*61046927SAndroid Build Coastguard Worker    {
97*61046927SAndroid Build Coastguard Worker       this->location.path = locp.path;
98*61046927SAndroid Build Coastguard Worker       this->location.source = locp.source;
99*61046927SAndroid Build Coastguard Worker       this->location.first_line = locp.first_line;
100*61046927SAndroid Build Coastguard Worker       this->location.first_column = locp.first_column;
101*61046927SAndroid Build Coastguard Worker       this->location.last_line = locp.last_line;
102*61046927SAndroid Build Coastguard Worker       this->location.last_column = locp.last_column;
103*61046927SAndroid Build Coastguard Worker    }
104*61046927SAndroid Build Coastguard Worker 
105*61046927SAndroid Build Coastguard Worker    /**
106*61046927SAndroid Build Coastguard Worker     * Set the source location range of an AST node using two location nodes
107*61046927SAndroid Build Coastguard Worker     *
108*61046927SAndroid Build Coastguard Worker     * \sa ast_node::set_location
109*61046927SAndroid Build Coastguard Worker     */
set_location_range(const struct YYLTYPE & begin,const struct YYLTYPE & end)110*61046927SAndroid Build Coastguard Worker    void set_location_range(const struct YYLTYPE &begin, const struct YYLTYPE &end)
111*61046927SAndroid Build Coastguard Worker    {
112*61046927SAndroid Build Coastguard Worker       this->location.path = begin.path;
113*61046927SAndroid Build Coastguard Worker       this->location.source = begin.source;
114*61046927SAndroid Build Coastguard Worker       this->location.first_line = begin.first_line;
115*61046927SAndroid Build Coastguard Worker       this->location.last_line = end.last_line;
116*61046927SAndroid Build Coastguard Worker       this->location.first_column = begin.first_column;
117*61046927SAndroid Build Coastguard Worker       this->location.last_column = end.last_column;
118*61046927SAndroid Build Coastguard Worker    }
119*61046927SAndroid Build Coastguard Worker 
120*61046927SAndroid Build Coastguard Worker    /**
121*61046927SAndroid Build Coastguard Worker     * Source location of the AST node.
122*61046927SAndroid Build Coastguard Worker     */
123*61046927SAndroid Build Coastguard Worker    struct {
124*61046927SAndroid Build Coastguard Worker       char *path;               /**< GLSL shader include path. */
125*61046927SAndroid Build Coastguard Worker       unsigned source;          /**< GLSL source number. */
126*61046927SAndroid Build Coastguard Worker       unsigned first_line;      /**< First line number within the source string. */
127*61046927SAndroid Build Coastguard Worker       unsigned first_column;    /**< First column in the first line. */
128*61046927SAndroid Build Coastguard Worker       unsigned last_line;       /**< Last line number within the source string. */
129*61046927SAndroid Build Coastguard Worker       unsigned last_column;     /**< Last column in the last line. */
130*61046927SAndroid Build Coastguard Worker    } location;
131*61046927SAndroid Build Coastguard Worker 
132*61046927SAndroid Build Coastguard Worker    exec_node link;
133*61046927SAndroid Build Coastguard Worker 
134*61046927SAndroid Build Coastguard Worker    virtual void set_is_lhs(bool);
135*61046927SAndroid Build Coastguard Worker 
136*61046927SAndroid Build Coastguard Worker protected:
137*61046927SAndroid Build Coastguard Worker    /**
138*61046927SAndroid Build Coastguard Worker     * The only constructor is protected so that only derived class objects can
139*61046927SAndroid Build Coastguard Worker     * be created.
140*61046927SAndroid Build Coastguard Worker     */
141*61046927SAndroid Build Coastguard Worker    ast_node(void);
142*61046927SAndroid Build Coastguard Worker };
143*61046927SAndroid Build Coastguard Worker 
144*61046927SAndroid Build Coastguard Worker 
145*61046927SAndroid Build Coastguard Worker /**
146*61046927SAndroid Build Coastguard Worker  * Operators for AST expression nodes.
147*61046927SAndroid Build Coastguard Worker  */
148*61046927SAndroid Build Coastguard Worker enum ast_operators {
149*61046927SAndroid Build Coastguard Worker    ast_assign,
150*61046927SAndroid Build Coastguard Worker    ast_plus,        /**< Unary + operator. */
151*61046927SAndroid Build Coastguard Worker    ast_neg,
152*61046927SAndroid Build Coastguard Worker    ast_add,
153*61046927SAndroid Build Coastguard Worker    ast_sub,
154*61046927SAndroid Build Coastguard Worker    ast_mul,
155*61046927SAndroid Build Coastguard Worker    ast_div,
156*61046927SAndroid Build Coastguard Worker    ast_mod,
157*61046927SAndroid Build Coastguard Worker    ast_lshift,
158*61046927SAndroid Build Coastguard Worker    ast_rshift,
159*61046927SAndroid Build Coastguard Worker    ast_less,
160*61046927SAndroid Build Coastguard Worker    ast_greater,
161*61046927SAndroid Build Coastguard Worker    ast_lequal,
162*61046927SAndroid Build Coastguard Worker    ast_gequal,
163*61046927SAndroid Build Coastguard Worker    ast_equal,
164*61046927SAndroid Build Coastguard Worker    ast_nequal,
165*61046927SAndroid Build Coastguard Worker    ast_bit_and,
166*61046927SAndroid Build Coastguard Worker    ast_bit_xor,
167*61046927SAndroid Build Coastguard Worker    ast_bit_or,
168*61046927SAndroid Build Coastguard Worker    ast_bit_not,
169*61046927SAndroid Build Coastguard Worker    ast_logic_and,
170*61046927SAndroid Build Coastguard Worker    ast_logic_xor,
171*61046927SAndroid Build Coastguard Worker    ast_logic_or,
172*61046927SAndroid Build Coastguard Worker    ast_logic_not,
173*61046927SAndroid Build Coastguard Worker 
174*61046927SAndroid Build Coastguard Worker    ast_mul_assign,
175*61046927SAndroid Build Coastguard Worker    ast_div_assign,
176*61046927SAndroid Build Coastguard Worker    ast_mod_assign,
177*61046927SAndroid Build Coastguard Worker    ast_add_assign,
178*61046927SAndroid Build Coastguard Worker    ast_sub_assign,
179*61046927SAndroid Build Coastguard Worker    ast_ls_assign,
180*61046927SAndroid Build Coastguard Worker    ast_rs_assign,
181*61046927SAndroid Build Coastguard Worker    ast_and_assign,
182*61046927SAndroid Build Coastguard Worker    ast_xor_assign,
183*61046927SAndroid Build Coastguard Worker    ast_or_assign,
184*61046927SAndroid Build Coastguard Worker 
185*61046927SAndroid Build Coastguard Worker    ast_conditional,
186*61046927SAndroid Build Coastguard Worker 
187*61046927SAndroid Build Coastguard Worker    ast_pre_inc,
188*61046927SAndroid Build Coastguard Worker    ast_pre_dec,
189*61046927SAndroid Build Coastguard Worker    ast_post_inc,
190*61046927SAndroid Build Coastguard Worker    ast_post_dec,
191*61046927SAndroid Build Coastguard Worker    ast_field_selection,
192*61046927SAndroid Build Coastguard Worker    ast_array_index,
193*61046927SAndroid Build Coastguard Worker    ast_unsized_array_dim,
194*61046927SAndroid Build Coastguard Worker 
195*61046927SAndroid Build Coastguard Worker    ast_function_call,
196*61046927SAndroid Build Coastguard Worker 
197*61046927SAndroid Build Coastguard Worker    ast_identifier,
198*61046927SAndroid Build Coastguard Worker    ast_int_constant,
199*61046927SAndroid Build Coastguard Worker    ast_uint_constant,
200*61046927SAndroid Build Coastguard Worker    ast_float16_constant,
201*61046927SAndroid Build Coastguard Worker    ast_float_constant,
202*61046927SAndroid Build Coastguard Worker    ast_bool_constant,
203*61046927SAndroid Build Coastguard Worker    ast_double_constant,
204*61046927SAndroid Build Coastguard Worker    ast_int64_constant,
205*61046927SAndroid Build Coastguard Worker    ast_uint64_constant,
206*61046927SAndroid Build Coastguard Worker 
207*61046927SAndroid Build Coastguard Worker    ast_sequence,
208*61046927SAndroid Build Coastguard Worker    ast_aggregate
209*61046927SAndroid Build Coastguard Worker 
210*61046927SAndroid Build Coastguard Worker    /**
211*61046927SAndroid Build Coastguard Worker     * Number of possible operators for an ast_expression
212*61046927SAndroid Build Coastguard Worker     *
213*61046927SAndroid Build Coastguard Worker     * This is done as a define instead of as an additional value in the enum so
214*61046927SAndroid Build Coastguard Worker     * that the compiler won't generate spurious messages like "warning:
215*61046927SAndroid Build Coastguard Worker     * enumeration value ‘ast_num_operators’ not handled in switch"
216*61046927SAndroid Build Coastguard Worker     */
217*61046927SAndroid Build Coastguard Worker    #define AST_NUM_OPERATORS (ast_aggregate + 1)
218*61046927SAndroid Build Coastguard Worker };
219*61046927SAndroid Build Coastguard Worker 
220*61046927SAndroid Build Coastguard Worker /**
221*61046927SAndroid Build Coastguard Worker  * Representation of any sort of expression.
222*61046927SAndroid Build Coastguard Worker  */
223*61046927SAndroid Build Coastguard Worker class ast_expression : public ast_node {
224*61046927SAndroid Build Coastguard Worker public:
225*61046927SAndroid Build Coastguard Worker    ast_expression(int oper, ast_expression *,
226*61046927SAndroid Build Coastguard Worker 		  ast_expression *, ast_expression *);
227*61046927SAndroid Build Coastguard Worker 
ast_expression(const char * identifier)228*61046927SAndroid Build Coastguard Worker    ast_expression(const char *identifier) :
229*61046927SAndroid Build Coastguard Worker       oper(ast_identifier)
230*61046927SAndroid Build Coastguard Worker    {
231*61046927SAndroid Build Coastguard Worker       subexpressions[0] = NULL;
232*61046927SAndroid Build Coastguard Worker       subexpressions[1] = NULL;
233*61046927SAndroid Build Coastguard Worker       subexpressions[2] = NULL;
234*61046927SAndroid Build Coastguard Worker       primary_expression.identifier = identifier;
235*61046927SAndroid Build Coastguard Worker       this->non_lvalue_description = NULL;
236*61046927SAndroid Build Coastguard Worker       this->is_lhs = false;
237*61046927SAndroid Build Coastguard Worker    }
238*61046927SAndroid Build Coastguard Worker 
239*61046927SAndroid Build Coastguard Worker    static const char *operator_string(enum ast_operators op);
240*61046927SAndroid Build Coastguard Worker 
241*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
242*61046927SAndroid Build Coastguard Worker 			  struct _mesa_glsl_parse_state *state);
243*61046927SAndroid Build Coastguard Worker 
244*61046927SAndroid Build Coastguard Worker    virtual void hir_no_rvalue(exec_list *instructions,
245*61046927SAndroid Build Coastguard Worker                               struct _mesa_glsl_parse_state *state);
246*61046927SAndroid Build Coastguard Worker 
247*61046927SAndroid Build Coastguard Worker    virtual bool has_sequence_subexpression() const;
248*61046927SAndroid Build Coastguard Worker 
249*61046927SAndroid Build Coastguard Worker    ir_rvalue *do_hir(exec_list *instructions,
250*61046927SAndroid Build Coastguard Worker                      struct _mesa_glsl_parse_state *state,
251*61046927SAndroid Build Coastguard Worker                      bool needs_rvalue);
252*61046927SAndroid Build Coastguard Worker 
253*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
254*61046927SAndroid Build Coastguard Worker 
255*61046927SAndroid Build Coastguard Worker    enum ast_operators oper;
256*61046927SAndroid Build Coastguard Worker 
257*61046927SAndroid Build Coastguard Worker    ast_expression *subexpressions[3];
258*61046927SAndroid Build Coastguard Worker 
259*61046927SAndroid Build Coastguard Worker    union {
260*61046927SAndroid Build Coastguard Worker       const char *identifier;
261*61046927SAndroid Build Coastguard Worker       int int_constant;
262*61046927SAndroid Build Coastguard Worker       float float16_constant;
263*61046927SAndroid Build Coastguard Worker       float float_constant;
264*61046927SAndroid Build Coastguard Worker       unsigned uint_constant;
265*61046927SAndroid Build Coastguard Worker       int bool_constant;
266*61046927SAndroid Build Coastguard Worker       double double_constant;
267*61046927SAndroid Build Coastguard Worker       uint64_t uint64_constant;
268*61046927SAndroid Build Coastguard Worker       int64_t int64_constant;
269*61046927SAndroid Build Coastguard Worker    } primary_expression;
270*61046927SAndroid Build Coastguard Worker 
271*61046927SAndroid Build Coastguard Worker 
272*61046927SAndroid Build Coastguard Worker    /**
273*61046927SAndroid Build Coastguard Worker     * List of expressions for an \c ast_sequence or parameters for an
274*61046927SAndroid Build Coastguard Worker     * \c ast_function_call
275*61046927SAndroid Build Coastguard Worker     */
276*61046927SAndroid Build Coastguard Worker    exec_list expressions;
277*61046927SAndroid Build Coastguard Worker 
278*61046927SAndroid Build Coastguard Worker    /**
279*61046927SAndroid Build Coastguard Worker     * For things that can't be l-values, this describes what it is.
280*61046927SAndroid Build Coastguard Worker     *
281*61046927SAndroid Build Coastguard Worker     * This text is used by the code that generates IR for assignments to
282*61046927SAndroid Build Coastguard Worker     * detect and emit useful messages for assignments to some things that
283*61046927SAndroid Build Coastguard Worker     * can't be l-values.  For example, pre- or post-incerement expressions.
284*61046927SAndroid Build Coastguard Worker     *
285*61046927SAndroid Build Coastguard Worker     * \note
286*61046927SAndroid Build Coastguard Worker     * This pointer may be \c NULL.
287*61046927SAndroid Build Coastguard Worker     */
288*61046927SAndroid Build Coastguard Worker    const char *non_lvalue_description;
289*61046927SAndroid Build Coastguard Worker 
290*61046927SAndroid Build Coastguard Worker    void set_is_lhs(bool new_value);
291*61046927SAndroid Build Coastguard Worker 
292*61046927SAndroid Build Coastguard Worker private:
293*61046927SAndroid Build Coastguard Worker    bool is_lhs;
294*61046927SAndroid Build Coastguard Worker };
295*61046927SAndroid Build Coastguard Worker 
296*61046927SAndroid Build Coastguard Worker class ast_expression_bin : public ast_expression {
297*61046927SAndroid Build Coastguard Worker public:
298*61046927SAndroid Build Coastguard Worker    ast_expression_bin(int oper, ast_expression *, ast_expression *);
299*61046927SAndroid Build Coastguard Worker 
300*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
301*61046927SAndroid Build Coastguard Worker };
302*61046927SAndroid Build Coastguard Worker 
303*61046927SAndroid Build Coastguard Worker /**
304*61046927SAndroid Build Coastguard Worker  * Subclass of expressions for function calls
305*61046927SAndroid Build Coastguard Worker  */
306*61046927SAndroid Build Coastguard Worker class ast_function_expression : public ast_expression {
307*61046927SAndroid Build Coastguard Worker public:
ast_function_expression(ast_expression * callee)308*61046927SAndroid Build Coastguard Worker    ast_function_expression(ast_expression *callee)
309*61046927SAndroid Build Coastguard Worker       : ast_expression(ast_function_call, callee,
310*61046927SAndroid Build Coastguard Worker 		       NULL, NULL),
311*61046927SAndroid Build Coastguard Worker 	cons(false)
312*61046927SAndroid Build Coastguard Worker    {
313*61046927SAndroid Build Coastguard Worker       /* empty */
314*61046927SAndroid Build Coastguard Worker    }
315*61046927SAndroid Build Coastguard Worker 
ast_function_expression(class ast_type_specifier * type)316*61046927SAndroid Build Coastguard Worker    ast_function_expression(class ast_type_specifier *type)
317*61046927SAndroid Build Coastguard Worker       : ast_expression(ast_function_call, (ast_expression *) type,
318*61046927SAndroid Build Coastguard Worker 		       NULL, NULL),
319*61046927SAndroid Build Coastguard Worker 	cons(true)
320*61046927SAndroid Build Coastguard Worker    {
321*61046927SAndroid Build Coastguard Worker       /* empty */
322*61046927SAndroid Build Coastguard Worker    }
323*61046927SAndroid Build Coastguard Worker 
is_constructor()324*61046927SAndroid Build Coastguard Worker    bool is_constructor() const
325*61046927SAndroid Build Coastguard Worker    {
326*61046927SAndroid Build Coastguard Worker       return cons;
327*61046927SAndroid Build Coastguard Worker    }
328*61046927SAndroid Build Coastguard Worker 
329*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
330*61046927SAndroid Build Coastguard Worker 			  struct _mesa_glsl_parse_state *state);
331*61046927SAndroid Build Coastguard Worker 
332*61046927SAndroid Build Coastguard Worker    virtual void hir_no_rvalue(exec_list *instructions,
333*61046927SAndroid Build Coastguard Worker                               struct _mesa_glsl_parse_state *state);
334*61046927SAndroid Build Coastguard Worker 
335*61046927SAndroid Build Coastguard Worker    virtual bool has_sequence_subexpression() const;
336*61046927SAndroid Build Coastguard Worker 
337*61046927SAndroid Build Coastguard Worker private:
338*61046927SAndroid Build Coastguard Worker    /**
339*61046927SAndroid Build Coastguard Worker     * Is this function call actually a constructor?
340*61046927SAndroid Build Coastguard Worker     */
341*61046927SAndroid Build Coastguard Worker    bool cons;
342*61046927SAndroid Build Coastguard Worker    ir_rvalue *
343*61046927SAndroid Build Coastguard Worker    handle_method(exec_list *instructions,
344*61046927SAndroid Build Coastguard Worker                  struct _mesa_glsl_parse_state *state);
345*61046927SAndroid Build Coastguard Worker };
346*61046927SAndroid Build Coastguard Worker 
347*61046927SAndroid Build Coastguard Worker class ast_subroutine_list : public ast_node
348*61046927SAndroid Build Coastguard Worker {
349*61046927SAndroid Build Coastguard Worker public:
350*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
351*61046927SAndroid Build Coastguard Worker    exec_list declarations;
352*61046927SAndroid Build Coastguard Worker };
353*61046927SAndroid Build Coastguard Worker 
354*61046927SAndroid Build Coastguard Worker class ast_array_specifier : public ast_node {
355*61046927SAndroid Build Coastguard Worker public:
ast_array_specifier(const struct YYLTYPE & locp,ast_expression * dim)356*61046927SAndroid Build Coastguard Worker    ast_array_specifier(const struct YYLTYPE &locp, ast_expression *dim)
357*61046927SAndroid Build Coastguard Worker    {
358*61046927SAndroid Build Coastguard Worker       set_location(locp);
359*61046927SAndroid Build Coastguard Worker       array_dimensions.push_tail(&dim->link);
360*61046927SAndroid Build Coastguard Worker    }
361*61046927SAndroid Build Coastguard Worker 
add_dimension(ast_expression * dim)362*61046927SAndroid Build Coastguard Worker    void add_dimension(ast_expression *dim)
363*61046927SAndroid Build Coastguard Worker    {
364*61046927SAndroid Build Coastguard Worker       array_dimensions.push_tail(&dim->link);
365*61046927SAndroid Build Coastguard Worker    }
366*61046927SAndroid Build Coastguard Worker 
is_single_dimension()367*61046927SAndroid Build Coastguard Worker    bool is_single_dimension() const
368*61046927SAndroid Build Coastguard Worker    {
369*61046927SAndroid Build Coastguard Worker       return this->array_dimensions.get_tail_raw()->prev != NULL &&
370*61046927SAndroid Build Coastguard Worker              this->array_dimensions.get_tail_raw()->prev->is_head_sentinel();
371*61046927SAndroid Build Coastguard Worker    }
372*61046927SAndroid Build Coastguard Worker 
373*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
374*61046927SAndroid Build Coastguard Worker 
375*61046927SAndroid Build Coastguard Worker    /* This list contains objects of type ast_node containing the
376*61046927SAndroid Build Coastguard Worker     * array dimensions in outermost-to-innermost order.
377*61046927SAndroid Build Coastguard Worker     */
378*61046927SAndroid Build Coastguard Worker    exec_list array_dimensions;
379*61046927SAndroid Build Coastguard Worker };
380*61046927SAndroid Build Coastguard Worker 
381*61046927SAndroid Build Coastguard Worker class ast_layout_expression : public ast_node {
382*61046927SAndroid Build Coastguard Worker public:
ast_layout_expression(const struct YYLTYPE & locp,ast_expression * expr)383*61046927SAndroid Build Coastguard Worker    ast_layout_expression(const struct YYLTYPE &locp, ast_expression *expr)
384*61046927SAndroid Build Coastguard Worker    {
385*61046927SAndroid Build Coastguard Worker       set_location(locp);
386*61046927SAndroid Build Coastguard Worker       layout_const_expressions.push_tail(&expr->link);
387*61046927SAndroid Build Coastguard Worker    }
388*61046927SAndroid Build Coastguard Worker 
389*61046927SAndroid Build Coastguard Worker    bool process_qualifier_constant(struct _mesa_glsl_parse_state *state,
390*61046927SAndroid Build Coastguard Worker                                    const char *qual_indentifier,
391*61046927SAndroid Build Coastguard Worker                                    unsigned *value, bool can_be_zero);
392*61046927SAndroid Build Coastguard Worker 
merge_qualifier(ast_layout_expression * l_expr)393*61046927SAndroid Build Coastguard Worker    void merge_qualifier(ast_layout_expression *l_expr)
394*61046927SAndroid Build Coastguard Worker    {
395*61046927SAndroid Build Coastguard Worker       layout_const_expressions.append_list(&l_expr->layout_const_expressions);
396*61046927SAndroid Build Coastguard Worker    }
397*61046927SAndroid Build Coastguard Worker 
398*61046927SAndroid Build Coastguard Worker    exec_list layout_const_expressions;
399*61046927SAndroid Build Coastguard Worker };
400*61046927SAndroid Build Coastguard Worker 
401*61046927SAndroid Build Coastguard Worker /**
402*61046927SAndroid Build Coastguard Worker  * C-style aggregate initialization class
403*61046927SAndroid Build Coastguard Worker  *
404*61046927SAndroid Build Coastguard Worker  * Represents C-style initializers of vectors, matrices, arrays, and
405*61046927SAndroid Build Coastguard Worker  * structures. E.g., vec3 pos = {1.0, 0.0, -1.0} is equivalent to
406*61046927SAndroid Build Coastguard Worker  * vec3 pos = vec3(1.0, 0.0, -1.0).
407*61046927SAndroid Build Coastguard Worker  *
408*61046927SAndroid Build Coastguard Worker  * Specified in GLSL 4.20 and GL_ARB_shading_language_420pack.
409*61046927SAndroid Build Coastguard Worker  *
410*61046927SAndroid Build Coastguard Worker  * \sa _mesa_ast_set_aggregate_type
411*61046927SAndroid Build Coastguard Worker  */
412*61046927SAndroid Build Coastguard Worker class ast_aggregate_initializer : public ast_expression {
413*61046927SAndroid Build Coastguard Worker public:
ast_aggregate_initializer()414*61046927SAndroid Build Coastguard Worker    ast_aggregate_initializer()
415*61046927SAndroid Build Coastguard Worker       : ast_expression(ast_aggregate, NULL, NULL, NULL),
416*61046927SAndroid Build Coastguard Worker         constructor_type(NULL)
417*61046927SAndroid Build Coastguard Worker    {
418*61046927SAndroid Build Coastguard Worker       /* empty */
419*61046927SAndroid Build Coastguard Worker    }
420*61046927SAndroid Build Coastguard Worker 
421*61046927SAndroid Build Coastguard Worker    /**
422*61046927SAndroid Build Coastguard Worker     * glsl_type of the aggregate, which is inferred from the LHS of whatever
423*61046927SAndroid Build Coastguard Worker     * the aggregate is being used to initialize.  This can't be inferred at
424*61046927SAndroid Build Coastguard Worker     * parse time (since the parser deals with ast_type_specifiers, not
425*61046927SAndroid Build Coastguard Worker     * glsl_types), so the parser leaves it NULL.  However, the ast-to-hir
426*61046927SAndroid Build Coastguard Worker     * conversion code makes sure to fill it in with the appropriate type
427*61046927SAndroid Build Coastguard Worker     * before hir() is called.
428*61046927SAndroid Build Coastguard Worker     */
429*61046927SAndroid Build Coastguard Worker    const glsl_type *constructor_type;
430*61046927SAndroid Build Coastguard Worker 
431*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
432*61046927SAndroid Build Coastguard Worker                           struct _mesa_glsl_parse_state *state);
433*61046927SAndroid Build Coastguard Worker 
434*61046927SAndroid Build Coastguard Worker    virtual void hir_no_rvalue(exec_list *instructions,
435*61046927SAndroid Build Coastguard Worker                               struct _mesa_glsl_parse_state *state);
436*61046927SAndroid Build Coastguard Worker };
437*61046927SAndroid Build Coastguard Worker 
438*61046927SAndroid Build Coastguard Worker 
439*61046927SAndroid Build Coastguard Worker class ast_compound_statement : public ast_node {
440*61046927SAndroid Build Coastguard Worker public:
441*61046927SAndroid Build Coastguard Worker    ast_compound_statement(int new_scope, ast_node *statements);
442*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
443*61046927SAndroid Build Coastguard Worker 
444*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
445*61046927SAndroid Build Coastguard Worker 			  struct _mesa_glsl_parse_state *state);
446*61046927SAndroid Build Coastguard Worker 
447*61046927SAndroid Build Coastguard Worker    int new_scope;
448*61046927SAndroid Build Coastguard Worker    exec_list statements;
449*61046927SAndroid Build Coastguard Worker };
450*61046927SAndroid Build Coastguard Worker 
451*61046927SAndroid Build Coastguard Worker class ast_declaration : public ast_node {
452*61046927SAndroid Build Coastguard Worker public:
453*61046927SAndroid Build Coastguard Worker    ast_declaration(const char *identifier,
454*61046927SAndroid Build Coastguard Worker                    ast_array_specifier *array_specifier,
455*61046927SAndroid Build Coastguard Worker                    ast_expression *initializer);
456*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
457*61046927SAndroid Build Coastguard Worker 
458*61046927SAndroid Build Coastguard Worker    const char *identifier;
459*61046927SAndroid Build Coastguard Worker 
460*61046927SAndroid Build Coastguard Worker    ast_array_specifier *array_specifier;
461*61046927SAndroid Build Coastguard Worker 
462*61046927SAndroid Build Coastguard Worker    ast_expression *initializer;
463*61046927SAndroid Build Coastguard Worker };
464*61046927SAndroid Build Coastguard Worker 
465*61046927SAndroid Build Coastguard Worker 
466*61046927SAndroid Build Coastguard Worker enum {
467*61046927SAndroid Build Coastguard Worker    ast_precision_none = 0, /**< Absence of precision qualifier. */
468*61046927SAndroid Build Coastguard Worker    ast_precision_high,
469*61046927SAndroid Build Coastguard Worker    ast_precision_medium,
470*61046927SAndroid Build Coastguard Worker    ast_precision_low
471*61046927SAndroid Build Coastguard Worker };
472*61046927SAndroid Build Coastguard Worker 
473*61046927SAndroid Build Coastguard Worker enum {
474*61046927SAndroid Build Coastguard Worker    ast_depth_none = 0, /**< Absence of depth qualifier. */
475*61046927SAndroid Build Coastguard Worker    ast_depth_any,
476*61046927SAndroid Build Coastguard Worker    ast_depth_greater,
477*61046927SAndroid Build Coastguard Worker    ast_depth_less,
478*61046927SAndroid Build Coastguard Worker    ast_depth_unchanged
479*61046927SAndroid Build Coastguard Worker };
480*61046927SAndroid Build Coastguard Worker 
481*61046927SAndroid Build Coastguard Worker struct ast_type_qualifier {
482*61046927SAndroid Build Coastguard Worker    DECLARE_RALLOC_CXX_OPERATORS(ast_type_qualifier);
483*61046927SAndroid Build Coastguard Worker    /* Note: this bitset needs to have at least as many bits as the 'q'
484*61046927SAndroid Build Coastguard Worker     * struct has flags, below.  Previously, the size was 128 instead of 96.
485*61046927SAndroid Build Coastguard Worker     * But an apparent bug in GCC 5.4.0 causes bad SSE code generation
486*61046927SAndroid Build Coastguard Worker     * elsewhere, leading to a crash.  96 bits works around the issue.
487*61046927SAndroid Build Coastguard Worker     * See https://bugs.freedesktop.org/show_bug.cgi?id=105497
488*61046927SAndroid Build Coastguard Worker     */
489*61046927SAndroid Build Coastguard Worker    DECLARE_BITSET_T(bitset_t, 96);
490*61046927SAndroid Build Coastguard Worker 
491*61046927SAndroid Build Coastguard Worker    union flags {
492*61046927SAndroid Build Coastguard Worker       struct {
493*61046927SAndroid Build Coastguard Worker 	 unsigned invariant:1;
494*61046927SAndroid Build Coastguard Worker          unsigned precise:1;
495*61046927SAndroid Build Coastguard Worker 	 unsigned constant:1;
496*61046927SAndroid Build Coastguard Worker 	 unsigned attribute:1;
497*61046927SAndroid Build Coastguard Worker 	 unsigned varying:1;
498*61046927SAndroid Build Coastguard Worker 	 unsigned in:1;
499*61046927SAndroid Build Coastguard Worker 	 unsigned out:1;
500*61046927SAndroid Build Coastguard Worker 	 unsigned centroid:1;
501*61046927SAndroid Build Coastguard Worker          unsigned sample:1;
502*61046927SAndroid Build Coastguard Worker 	 unsigned patch:1;
503*61046927SAndroid Build Coastguard Worker 	 unsigned uniform:1;
504*61046927SAndroid Build Coastguard Worker 	 unsigned buffer:1;
505*61046927SAndroid Build Coastguard Worker 	 unsigned shared_storage:1;
506*61046927SAndroid Build Coastguard Worker 	 unsigned smooth:1;
507*61046927SAndroid Build Coastguard Worker 	 unsigned flat:1;
508*61046927SAndroid Build Coastguard Worker 	 unsigned noperspective:1;
509*61046927SAndroid Build Coastguard Worker 
510*61046927SAndroid Build Coastguard Worker 	 /** \name Layout qualifiers for GL_ARB_fragment_coord_conventions */
511*61046927SAndroid Build Coastguard Worker 	 /*@{*/
512*61046927SAndroid Build Coastguard Worker 	 unsigned origin_upper_left:1;
513*61046927SAndroid Build Coastguard Worker 	 unsigned pixel_center_integer:1;
514*61046927SAndroid Build Coastguard Worker 	 /*@}*/
515*61046927SAndroid Build Coastguard Worker 
516*61046927SAndroid Build Coastguard Worker          /**
517*61046927SAndroid Build Coastguard Worker           * Flag set if GL_ARB_enhanced_layouts "align" layout qualifier is
518*61046927SAndroid Build Coastguard Worker           * used.
519*61046927SAndroid Build Coastguard Worker           */
520*61046927SAndroid Build Coastguard Worker          unsigned explicit_align:1;
521*61046927SAndroid Build Coastguard Worker 
522*61046927SAndroid Build Coastguard Worker 	 /**
523*61046927SAndroid Build Coastguard Worker 	  * Flag set if GL_ARB_explicit_attrib_location "location" layout
524*61046927SAndroid Build Coastguard Worker 	  * qualifier is used.
525*61046927SAndroid Build Coastguard Worker 	  */
526*61046927SAndroid Build Coastguard Worker 	 unsigned explicit_location:1;
527*61046927SAndroid Build Coastguard Worker 	 /**
528*61046927SAndroid Build Coastguard Worker 	  * Flag set if GL_ARB_explicit_attrib_location "index" layout
529*61046927SAndroid Build Coastguard Worker 	  * qualifier is used.
530*61046927SAndroid Build Coastguard Worker 	  */
531*61046927SAndroid Build Coastguard Worker 	 unsigned explicit_index:1;
532*61046927SAndroid Build Coastguard Worker 
533*61046927SAndroid Build Coastguard Worker 	 /**
534*61046927SAndroid Build Coastguard Worker 	  * Flag set if GL_ARB_enhanced_layouts "component" layout
535*61046927SAndroid Build Coastguard Worker 	  * qualifier is used.
536*61046927SAndroid Build Coastguard Worker 	  */
537*61046927SAndroid Build Coastguard Worker 	 unsigned explicit_component:1;
538*61046927SAndroid Build Coastguard Worker 
539*61046927SAndroid Build Coastguard Worker          /**
540*61046927SAndroid Build Coastguard Worker           * Flag set if GL_ARB_shading_language_420pack "binding" layout
541*61046927SAndroid Build Coastguard Worker           * qualifier is used.
542*61046927SAndroid Build Coastguard Worker           */
543*61046927SAndroid Build Coastguard Worker          unsigned explicit_binding:1;
544*61046927SAndroid Build Coastguard Worker 
545*61046927SAndroid Build Coastguard Worker          /**
546*61046927SAndroid Build Coastguard Worker           * Flag set if GL_ARB_shader_atomic counter "offset" layout
547*61046927SAndroid Build Coastguard Worker           * qualifier is used.
548*61046927SAndroid Build Coastguard Worker           */
549*61046927SAndroid Build Coastguard Worker          unsigned explicit_offset:1;
550*61046927SAndroid Build Coastguard Worker 
551*61046927SAndroid Build Coastguard Worker          /** \name Layout qualifiers for GL_AMD_conservative_depth */
552*61046927SAndroid Build Coastguard Worker          /** \{ */
553*61046927SAndroid Build Coastguard Worker          unsigned depth_type:1;
554*61046927SAndroid Build Coastguard Worker          /** \} */
555*61046927SAndroid Build Coastguard Worker 
556*61046927SAndroid Build Coastguard Worker 	 /** \name Layout qualifiers for GL_ARB_uniform_buffer_object */
557*61046927SAndroid Build Coastguard Worker 	 /** \{ */
558*61046927SAndroid Build Coastguard Worker          unsigned std140:1;
559*61046927SAndroid Build Coastguard Worker          unsigned std430:1;
560*61046927SAndroid Build Coastguard Worker          unsigned shared:1;
561*61046927SAndroid Build Coastguard Worker          unsigned packed:1;
562*61046927SAndroid Build Coastguard Worker          unsigned column_major:1;
563*61046927SAndroid Build Coastguard Worker          unsigned row_major:1;
564*61046927SAndroid Build Coastguard Worker 	 /** \} */
565*61046927SAndroid Build Coastguard Worker 
566*61046927SAndroid Build Coastguard Worker 	 /** \name Layout qualifiers for GLSL 1.50 geometry shaders */
567*61046927SAndroid Build Coastguard Worker 	 /** \{ */
568*61046927SAndroid Build Coastguard Worker 	 unsigned prim_type:1;
569*61046927SAndroid Build Coastguard Worker 	 unsigned max_vertices:1;
570*61046927SAndroid Build Coastguard Worker 	 /** \} */
571*61046927SAndroid Build Coastguard Worker 
572*61046927SAndroid Build Coastguard Worker          /**
573*61046927SAndroid Build Coastguard Worker           * local_size_{x,y,z} flags for compute shaders.  Bit 0 represents
574*61046927SAndroid Build Coastguard Worker           * local_size_x, and so on.
575*61046927SAndroid Build Coastguard Worker           */
576*61046927SAndroid Build Coastguard Worker          unsigned local_size:3;
577*61046927SAndroid Build Coastguard Worker 
578*61046927SAndroid Build Coastguard Worker 	 /** \name Layout qualifiers for ARB_compute_variable_group_size. */
579*61046927SAndroid Build Coastguard Worker 	 /** \{ */
580*61046927SAndroid Build Coastguard Worker 	 unsigned local_size_variable:1;
581*61046927SAndroid Build Coastguard Worker 	 /** \} */
582*61046927SAndroid Build Coastguard Worker 
583*61046927SAndroid Build Coastguard Worker 	 /** \name Layout and memory qualifiers for ARB_shader_image_load_store. */
584*61046927SAndroid Build Coastguard Worker 	 /** \{ */
585*61046927SAndroid Build Coastguard Worker 	 unsigned early_fragment_tests:1;
586*61046927SAndroid Build Coastguard Worker 	 unsigned explicit_image_format:1;
587*61046927SAndroid Build Coastguard Worker 	 unsigned coherent:1;
588*61046927SAndroid Build Coastguard Worker 	 unsigned _volatile:1;
589*61046927SAndroid Build Coastguard Worker 	 unsigned restrict_flag:1;
590*61046927SAndroid Build Coastguard Worker 	 unsigned read_only:1; /**< "readonly" qualifier. */
591*61046927SAndroid Build Coastguard Worker 	 unsigned write_only:1; /**< "writeonly" qualifier. */
592*61046927SAndroid Build Coastguard Worker 	 /** \} */
593*61046927SAndroid Build Coastguard Worker 
594*61046927SAndroid Build Coastguard Worker          /** \name Layout qualifiers for GL_ARB_gpu_shader5 */
595*61046927SAndroid Build Coastguard Worker          /** \{ */
596*61046927SAndroid Build Coastguard Worker          unsigned invocations:1;
597*61046927SAndroid Build Coastguard Worker          unsigned stream:1; /**< Has stream value assigned  */
598*61046927SAndroid Build Coastguard Worker          unsigned explicit_stream:1; /**< stream value assigned explicitly by shader code */
599*61046927SAndroid Build Coastguard Worker          /** \} */
600*61046927SAndroid Build Coastguard Worker 
601*61046927SAndroid Build Coastguard Worker          /** \name Layout qualifiers for GL_ARB_enhanced_layouts */
602*61046927SAndroid Build Coastguard Worker          /** \{ */
603*61046927SAndroid Build Coastguard Worker          unsigned explicit_xfb_offset:1; /**< xfb_offset value assigned explicitly by shader code */
604*61046927SAndroid Build Coastguard Worker          unsigned xfb_buffer:1; /**< Has xfb_buffer value assigned  */
605*61046927SAndroid Build Coastguard Worker          unsigned explicit_xfb_buffer:1; /**< xfb_buffer value assigned explicitly by shader code */
606*61046927SAndroid Build Coastguard Worker          unsigned xfb_stride:1; /**< Is xfb_stride value yet to be merged with global values  */
607*61046927SAndroid Build Coastguard Worker          unsigned explicit_xfb_stride:1; /**< xfb_stride value assigned explicitly by shader code */
608*61046927SAndroid Build Coastguard Worker          /** \} */
609*61046927SAndroid Build Coastguard Worker 
610*61046927SAndroid Build Coastguard Worker          /**
611*61046927SAndroid Build Coastguard Worker           * Flag set if GL_OVR_multiview num_views_relative layout
612*61046927SAndroid Build Coastguard Worker           * qualifier is used.
613*61046927SAndroid Build Coastguard Worker           */
614*61046927SAndroid Build Coastguard Worker          unsigned explicit_numviews:1;
615*61046927SAndroid Build Coastguard Worker 
616*61046927SAndroid Build Coastguard Worker 	 /** \name Layout qualifiers for GL_ARB_tessellation_shader */
617*61046927SAndroid Build Coastguard Worker 	 /** \{ */
618*61046927SAndroid Build Coastguard Worker 	 /* tess eval input layout */
619*61046927SAndroid Build Coastguard Worker 	 /* gs prim_type reused for primitive mode */
620*61046927SAndroid Build Coastguard Worker 	 unsigned vertex_spacing:1;
621*61046927SAndroid Build Coastguard Worker 	 unsigned ordering:1;
622*61046927SAndroid Build Coastguard Worker 	 unsigned point_mode:1;
623*61046927SAndroid Build Coastguard Worker 	 /* tess control output layout */
624*61046927SAndroid Build Coastguard Worker 	 unsigned vertices:1;
625*61046927SAndroid Build Coastguard Worker 	 /** \} */
626*61046927SAndroid Build Coastguard Worker 
627*61046927SAndroid Build Coastguard Worker          /** \name Qualifiers for GL_ARB_shader_subroutine */
628*61046927SAndroid Build Coastguard Worker 	 /** \{ */
629*61046927SAndroid Build Coastguard Worker          unsigned subroutine:1;  /**< Is this marked 'subroutine' */
630*61046927SAndroid Build Coastguard Worker 	 /** \} */
631*61046927SAndroid Build Coastguard Worker 
632*61046927SAndroid Build Coastguard Worker          /** \name Qualifiers for GL_KHR_blend_equation_advanced */
633*61046927SAndroid Build Coastguard Worker          /** \{ */
634*61046927SAndroid Build Coastguard Worker          unsigned blend_support:1; /**< Are there any blend_support_ qualifiers */
635*61046927SAndroid Build Coastguard Worker          /** \} */
636*61046927SAndroid Build Coastguard Worker 
637*61046927SAndroid Build Coastguard Worker          /**
638*61046927SAndroid Build Coastguard Worker           * Flag set if GL_ARB_post_depth_coverage layout qualifier is used.
639*61046927SAndroid Build Coastguard Worker           */
640*61046927SAndroid Build Coastguard Worker          unsigned post_depth_coverage:1;
641*61046927SAndroid Build Coastguard Worker 
642*61046927SAndroid Build Coastguard Worker          /**
643*61046927SAndroid Build Coastguard Worker           * Flags for the layout qualifers added by ARB_fragment_shader_interlock
644*61046927SAndroid Build Coastguard Worker           */
645*61046927SAndroid Build Coastguard Worker 
646*61046927SAndroid Build Coastguard Worker          unsigned pixel_interlock_ordered:1;
647*61046927SAndroid Build Coastguard Worker          unsigned pixel_interlock_unordered:1;
648*61046927SAndroid Build Coastguard Worker          unsigned sample_interlock_ordered:1;
649*61046927SAndroid Build Coastguard Worker          unsigned sample_interlock_unordered:1;
650*61046927SAndroid Build Coastguard Worker 
651*61046927SAndroid Build Coastguard Worker          /**
652*61046927SAndroid Build Coastguard Worker           * Flag set if GL_INTEL_conservartive_rasterization layout qualifier
653*61046927SAndroid Build Coastguard Worker           * is used.
654*61046927SAndroid Build Coastguard Worker           */
655*61046927SAndroid Build Coastguard Worker          unsigned inner_coverage:1;
656*61046927SAndroid Build Coastguard Worker 
657*61046927SAndroid Build Coastguard Worker          /** \name Layout qualifiers for GL_ARB_bindless_texture */
658*61046927SAndroid Build Coastguard Worker          /** \{ */
659*61046927SAndroid Build Coastguard Worker          unsigned bindless_sampler:1;
660*61046927SAndroid Build Coastguard Worker          unsigned bindless_image:1;
661*61046927SAndroid Build Coastguard Worker          unsigned bound_sampler:1;
662*61046927SAndroid Build Coastguard Worker          unsigned bound_image:1;
663*61046927SAndroid Build Coastguard Worker          /** \} */
664*61046927SAndroid Build Coastguard Worker 
665*61046927SAndroid Build Coastguard Worker          /** \name Layout qualifiers for GL_EXT_shader_framebuffer_fetch_non_coherent */
666*61046927SAndroid Build Coastguard Worker          /** \{ */
667*61046927SAndroid Build Coastguard Worker          unsigned non_coherent:1;
668*61046927SAndroid Build Coastguard Worker          /** \} */
669*61046927SAndroid Build Coastguard Worker 
670*61046927SAndroid Build Coastguard Worker          /** \name Layout qualifiers for NV_compute_shader_derivatives */
671*61046927SAndroid Build Coastguard Worker          /** \{ */
672*61046927SAndroid Build Coastguard Worker          unsigned derivative_group:1;
673*61046927SAndroid Build Coastguard Worker          /** \} */
674*61046927SAndroid Build Coastguard Worker 
675*61046927SAndroid Build Coastguard Worker          /**
676*61046927SAndroid Build Coastguard Worker           * Flag set if GL_NV_viewport_array2 viewport_relative layout
677*61046927SAndroid Build Coastguard Worker           * qualifier is used.
678*61046927SAndroid Build Coastguard Worker           */
679*61046927SAndroid Build Coastguard Worker          unsigned viewport_relative:1;
680*61046927SAndroid Build Coastguard Worker       }
681*61046927SAndroid Build Coastguard Worker       /** \brief Set of flags, accessed by name. */
682*61046927SAndroid Build Coastguard Worker       q;
683*61046927SAndroid Build Coastguard Worker 
684*61046927SAndroid Build Coastguard Worker       /** \brief Set of flags, accessed as a bitmask. */
685*61046927SAndroid Build Coastguard Worker       bitset_t i;
686*61046927SAndroid Build Coastguard Worker    } flags;
687*61046927SAndroid Build Coastguard Worker 
688*61046927SAndroid Build Coastguard Worker    /** Precision of the type (highp/medium/lowp). */
689*61046927SAndroid Build Coastguard Worker    unsigned precision:2;
690*61046927SAndroid Build Coastguard Worker 
691*61046927SAndroid Build Coastguard Worker    /** Type of layout qualifiers for GL_AMD_conservative_depth. */
692*61046927SAndroid Build Coastguard Worker    unsigned depth_type:3;
693*61046927SAndroid Build Coastguard Worker 
694*61046927SAndroid Build Coastguard Worker    /**
695*61046927SAndroid Build Coastguard Worker     * Alignment specified via GL_ARB_enhanced_layouts "align" layout qualifier
696*61046927SAndroid Build Coastguard Worker     */
697*61046927SAndroid Build Coastguard Worker    ast_expression *align;
698*61046927SAndroid Build Coastguard Worker 
699*61046927SAndroid Build Coastguard Worker    /** Geometry shader invocations for GL_ARB_gpu_shader5. */
700*61046927SAndroid Build Coastguard Worker    ast_layout_expression *invocations;
701*61046927SAndroid Build Coastguard Worker 
702*61046927SAndroid Build Coastguard Worker    /**
703*61046927SAndroid Build Coastguard Worker     * Location specified via GL_ARB_explicit_attrib_location layout
704*61046927SAndroid Build Coastguard Worker     *
705*61046927SAndroid Build Coastguard Worker     * \note
706*61046927SAndroid Build Coastguard Worker     * This field is only valid if \c explicit_location is set.
707*61046927SAndroid Build Coastguard Worker     */
708*61046927SAndroid Build Coastguard Worker    ast_expression *location;
709*61046927SAndroid Build Coastguard Worker    /**
710*61046927SAndroid Build Coastguard Worker     * Index specified via GL_ARB_explicit_attrib_location layout
711*61046927SAndroid Build Coastguard Worker     *
712*61046927SAndroid Build Coastguard Worker     * \note
713*61046927SAndroid Build Coastguard Worker     * This field is only valid if \c explicit_index is set.
714*61046927SAndroid Build Coastguard Worker     */
715*61046927SAndroid Build Coastguard Worker    ast_expression *index;
716*61046927SAndroid Build Coastguard Worker 
717*61046927SAndroid Build Coastguard Worker    /**
718*61046927SAndroid Build Coastguard Worker     * Component specified via GL_ARB_enhaced_layouts
719*61046927SAndroid Build Coastguard Worker     *
720*61046927SAndroid Build Coastguard Worker     * \note
721*61046927SAndroid Build Coastguard Worker     * This field is only valid if \c explicit_component is set.
722*61046927SAndroid Build Coastguard Worker     */
723*61046927SAndroid Build Coastguard Worker    ast_expression *component;
724*61046927SAndroid Build Coastguard Worker 
725*61046927SAndroid Build Coastguard Worker    /** Maximum output vertices in GLSL 1.50 geometry shaders. */
726*61046927SAndroid Build Coastguard Worker    ast_layout_expression *max_vertices;
727*61046927SAndroid Build Coastguard Worker 
728*61046927SAndroid Build Coastguard Worker    /** Stream in GLSL 1.50 geometry shaders. */
729*61046927SAndroid Build Coastguard Worker    ast_expression *stream;
730*61046927SAndroid Build Coastguard Worker 
731*61046927SAndroid Build Coastguard Worker    /** xfb_buffer specified via the GL_ARB_enhanced_layouts keyword. */
732*61046927SAndroid Build Coastguard Worker    ast_expression *xfb_buffer;
733*61046927SAndroid Build Coastguard Worker 
734*61046927SAndroid Build Coastguard Worker    /** xfb_stride specified via the GL_ARB_enhanced_layouts keyword. */
735*61046927SAndroid Build Coastguard Worker    ast_expression *xfb_stride;
736*61046927SAndroid Build Coastguard Worker 
737*61046927SAndroid Build Coastguard Worker    /** global xfb_stride values for each buffer */
738*61046927SAndroid Build Coastguard Worker    ast_layout_expression *out_xfb_stride[MAX_FEEDBACK_BUFFERS];
739*61046927SAndroid Build Coastguard Worker 
740*61046927SAndroid Build Coastguard Worker    /**
741*61046927SAndroid Build Coastguard Worker     * Input or output primitive type in GLSL 1.50 geometry shaders
742*61046927SAndroid Build Coastguard Worker     * and tessellation shaders.
743*61046927SAndroid Build Coastguard Worker     */
744*61046927SAndroid Build Coastguard Worker    GLenum prim_type;
745*61046927SAndroid Build Coastguard Worker 
746*61046927SAndroid Build Coastguard Worker    /**
747*61046927SAndroid Build Coastguard Worker     * Binding specified via GL_ARB_shading_language_420pack's "binding" keyword.
748*61046927SAndroid Build Coastguard Worker     *
749*61046927SAndroid Build Coastguard Worker     * \note
750*61046927SAndroid Build Coastguard Worker     * This field is only valid if \c explicit_binding is set.
751*61046927SAndroid Build Coastguard Worker     */
752*61046927SAndroid Build Coastguard Worker    ast_expression *binding;
753*61046927SAndroid Build Coastguard Worker 
754*61046927SAndroid Build Coastguard Worker    /**
755*61046927SAndroid Build Coastguard Worker     * Binding specified via GL_OVR_multiview's "num_views" keyword.
756*61046927SAndroid Build Coastguard Worker     *
757*61046927SAndroid Build Coastguard Worker     * \note
758*61046927SAndroid Build Coastguard Worker     * This field is only valid if \c explicit_numviews is set.
759*61046927SAndroid Build Coastguard Worker     */
760*61046927SAndroid Build Coastguard Worker    ast_expression *num_views;
761*61046927SAndroid Build Coastguard Worker 
762*61046927SAndroid Build Coastguard Worker    /**
763*61046927SAndroid Build Coastguard Worker     * Offset specified via GL_ARB_shader_atomic_counter's or
764*61046927SAndroid Build Coastguard Worker     * GL_ARB_enhanced_layouts "offset" keyword, or by GL_ARB_enhanced_layouts
765*61046927SAndroid Build Coastguard Worker     * "xfb_offset" keyword.
766*61046927SAndroid Build Coastguard Worker     *
767*61046927SAndroid Build Coastguard Worker     * \note
768*61046927SAndroid Build Coastguard Worker     * This field is only valid if \c explicit_offset is set.
769*61046927SAndroid Build Coastguard Worker     */
770*61046927SAndroid Build Coastguard Worker    ast_expression *offset;
771*61046927SAndroid Build Coastguard Worker 
772*61046927SAndroid Build Coastguard Worker    /**
773*61046927SAndroid Build Coastguard Worker     * Local size specified via GL_ARB_compute_shader's "local_size_{x,y,z}"
774*61046927SAndroid Build Coastguard Worker     * layout qualifier.  Element i of this array is only valid if
775*61046927SAndroid Build Coastguard Worker     * flags.q.local_size & (1 << i) is set.
776*61046927SAndroid Build Coastguard Worker     */
777*61046927SAndroid Build Coastguard Worker    ast_layout_expression *local_size[3];
778*61046927SAndroid Build Coastguard Worker 
779*61046927SAndroid Build Coastguard Worker    /** Tessellation evaluation shader: vertex spacing (equal, fractional even/odd) */
780*61046927SAndroid Build Coastguard Worker    enum gl_tess_spacing vertex_spacing;
781*61046927SAndroid Build Coastguard Worker 
782*61046927SAndroid Build Coastguard Worker    /** Tessellation evaluation shader: vertex ordering (CW or CCW) */
783*61046927SAndroid Build Coastguard Worker    GLenum ordering;
784*61046927SAndroid Build Coastguard Worker 
785*61046927SAndroid Build Coastguard Worker    /** Tessellation evaluation shader: point mode */
786*61046927SAndroid Build Coastguard Worker    bool point_mode;
787*61046927SAndroid Build Coastguard Worker 
788*61046927SAndroid Build Coastguard Worker    /** Tessellation control shader: number of output vertices */
789*61046927SAndroid Build Coastguard Worker    ast_layout_expression *vertices;
790*61046927SAndroid Build Coastguard Worker 
791*61046927SAndroid Build Coastguard Worker    /**
792*61046927SAndroid Build Coastguard Worker     * Image format specified with an ARB_shader_image_load_store
793*61046927SAndroid Build Coastguard Worker     * layout qualifier.
794*61046927SAndroid Build Coastguard Worker     *
795*61046927SAndroid Build Coastguard Worker     * \note
796*61046927SAndroid Build Coastguard Worker     * This field is only valid if \c explicit_image_format is set.
797*61046927SAndroid Build Coastguard Worker     */
798*61046927SAndroid Build Coastguard Worker    enum pipe_format image_format;
799*61046927SAndroid Build Coastguard Worker 
800*61046927SAndroid Build Coastguard Worker    /**
801*61046927SAndroid Build Coastguard Worker     * Arrangement of invocations used to calculate derivatives in a compute
802*61046927SAndroid Build Coastguard Worker     * shader.  From NV_compute_shader_derivatives.
803*61046927SAndroid Build Coastguard Worker     */
804*61046927SAndroid Build Coastguard Worker    enum gl_derivative_group derivative_group;
805*61046927SAndroid Build Coastguard Worker 
806*61046927SAndroid Build Coastguard Worker    /**
807*61046927SAndroid Build Coastguard Worker     * Base type of the data read from or written to this image.  Only
808*61046927SAndroid Build Coastguard Worker     * the following enumerants are allowed: GLSL_TYPE_UINT,
809*61046927SAndroid Build Coastguard Worker     * GLSL_TYPE_INT, GLSL_TYPE_FLOAT.
810*61046927SAndroid Build Coastguard Worker     *
811*61046927SAndroid Build Coastguard Worker     * \note
812*61046927SAndroid Build Coastguard Worker     * This field is only valid if \c explicit_image_format is set.
813*61046927SAndroid Build Coastguard Worker     */
814*61046927SAndroid Build Coastguard Worker    glsl_base_type image_base_type;
815*61046927SAndroid Build Coastguard Worker 
816*61046927SAndroid Build Coastguard Worker    /**
817*61046927SAndroid Build Coastguard Worker     * Return true if and only if an interpolation qualifier is present.
818*61046927SAndroid Build Coastguard Worker     */
819*61046927SAndroid Build Coastguard Worker    bool has_interpolation() const;
820*61046927SAndroid Build Coastguard Worker 
821*61046927SAndroid Build Coastguard Worker    /**
822*61046927SAndroid Build Coastguard Worker     * Return whether a layout qualifier is present.
823*61046927SAndroid Build Coastguard Worker     */
824*61046927SAndroid Build Coastguard Worker    bool has_layout() const;
825*61046927SAndroid Build Coastguard Worker 
826*61046927SAndroid Build Coastguard Worker    /**
827*61046927SAndroid Build Coastguard Worker     * Return whether a storage qualifier is present.
828*61046927SAndroid Build Coastguard Worker     */
829*61046927SAndroid Build Coastguard Worker    bool has_storage() const;
830*61046927SAndroid Build Coastguard Worker 
831*61046927SAndroid Build Coastguard Worker    /**
832*61046927SAndroid Build Coastguard Worker     * Return whether an auxiliary storage qualifier is present.
833*61046927SAndroid Build Coastguard Worker     */
834*61046927SAndroid Build Coastguard Worker    bool has_auxiliary_storage() const;
835*61046927SAndroid Build Coastguard Worker 
836*61046927SAndroid Build Coastguard Worker    /**
837*61046927SAndroid Build Coastguard Worker     * Return true if and only if a memory qualifier is present.
838*61046927SAndroid Build Coastguard Worker     */
839*61046927SAndroid Build Coastguard Worker    bool has_memory() const;
840*61046927SAndroid Build Coastguard Worker 
841*61046927SAndroid Build Coastguard Worker    /**
842*61046927SAndroid Build Coastguard Worker     * Return true if the qualifier is a subroutine declaration.
843*61046927SAndroid Build Coastguard Worker     */
844*61046927SAndroid Build Coastguard Worker    bool is_subroutine_decl() const;
845*61046927SAndroid Build Coastguard Worker 
846*61046927SAndroid Build Coastguard Worker    bool merge_qualifier(YYLTYPE *loc,
847*61046927SAndroid Build Coastguard Worker 			_mesa_glsl_parse_state *state,
848*61046927SAndroid Build Coastguard Worker                         const ast_type_qualifier &q,
849*61046927SAndroid Build Coastguard Worker                         bool is_single_layout_merge,
850*61046927SAndroid Build Coastguard Worker                         bool is_multiple_layouts_merge = false);
851*61046927SAndroid Build Coastguard Worker 
852*61046927SAndroid Build Coastguard Worker    /**
853*61046927SAndroid Build Coastguard Worker     * Validate current qualifier against the global out one.
854*61046927SAndroid Build Coastguard Worker     */
855*61046927SAndroid Build Coastguard Worker    bool validate_out_qualifier(YYLTYPE *loc,
856*61046927SAndroid Build Coastguard Worker                                _mesa_glsl_parse_state *state);
857*61046927SAndroid Build Coastguard Worker 
858*61046927SAndroid Build Coastguard Worker    /**
859*61046927SAndroid Build Coastguard Worker     * Merge current qualifier into the global out one.
860*61046927SAndroid Build Coastguard Worker     */
861*61046927SAndroid Build Coastguard Worker    bool merge_into_out_qualifier(YYLTYPE *loc,
862*61046927SAndroid Build Coastguard Worker                                  _mesa_glsl_parse_state *state,
863*61046927SAndroid Build Coastguard Worker                                  ast_node* &node);
864*61046927SAndroid Build Coastguard Worker 
865*61046927SAndroid Build Coastguard Worker    /**
866*61046927SAndroid Build Coastguard Worker     * Validate current qualifier against the global in one.
867*61046927SAndroid Build Coastguard Worker     */
868*61046927SAndroid Build Coastguard Worker    bool validate_in_qualifier(YYLTYPE *loc,
869*61046927SAndroid Build Coastguard Worker                               _mesa_glsl_parse_state *state);
870*61046927SAndroid Build Coastguard Worker 
871*61046927SAndroid Build Coastguard Worker    /**
872*61046927SAndroid Build Coastguard Worker     * Merge current qualifier into the global in one.
873*61046927SAndroid Build Coastguard Worker     */
874*61046927SAndroid Build Coastguard Worker    bool merge_into_in_qualifier(YYLTYPE *loc,
875*61046927SAndroid Build Coastguard Worker                                 _mesa_glsl_parse_state *state,
876*61046927SAndroid Build Coastguard Worker                                 ast_node* &node);
877*61046927SAndroid Build Coastguard Worker 
878*61046927SAndroid Build Coastguard Worker    /**
879*61046927SAndroid Build Coastguard Worker     * Push pending layout qualifiers to the global values.
880*61046927SAndroid Build Coastguard Worker     */
881*61046927SAndroid Build Coastguard Worker    bool push_to_global(YYLTYPE *loc,
882*61046927SAndroid Build Coastguard Worker                        _mesa_glsl_parse_state *state);
883*61046927SAndroid Build Coastguard Worker 
884*61046927SAndroid Build Coastguard Worker    bool validate_flags(YYLTYPE *loc,
885*61046927SAndroid Build Coastguard Worker                        _mesa_glsl_parse_state *state,
886*61046927SAndroid Build Coastguard Worker                        const ast_type_qualifier &allowed_flags,
887*61046927SAndroid Build Coastguard Worker                        const char *message, const char *name);
888*61046927SAndroid Build Coastguard Worker 
889*61046927SAndroid Build Coastguard Worker    ast_subroutine_list *subroutine_list;
890*61046927SAndroid Build Coastguard Worker };
891*61046927SAndroid Build Coastguard Worker 
892*61046927SAndroid Build Coastguard Worker class ast_declarator_list;
893*61046927SAndroid Build Coastguard Worker 
894*61046927SAndroid Build Coastguard Worker class ast_struct_specifier : public ast_node {
895*61046927SAndroid Build Coastguard Worker public:
896*61046927SAndroid Build Coastguard Worker    ast_struct_specifier(const char *identifier,
897*61046927SAndroid Build Coastguard Worker                         ast_declarator_list *declarator_list);
898*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
899*61046927SAndroid Build Coastguard Worker 
900*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
901*61046927SAndroid Build Coastguard Worker 			  struct _mesa_glsl_parse_state *state);
902*61046927SAndroid Build Coastguard Worker 
903*61046927SAndroid Build Coastguard Worker    const char *name;
904*61046927SAndroid Build Coastguard Worker    ast_type_qualifier *layout;
905*61046927SAndroid Build Coastguard Worker    /* List of ast_declarator_list * */
906*61046927SAndroid Build Coastguard Worker    exec_list declarations;
907*61046927SAndroid Build Coastguard Worker    bool is_declaration;
908*61046927SAndroid Build Coastguard Worker    const glsl_type *type;
909*61046927SAndroid Build Coastguard Worker };
910*61046927SAndroid Build Coastguard Worker 
911*61046927SAndroid Build Coastguard Worker 
912*61046927SAndroid Build Coastguard Worker 
913*61046927SAndroid Build Coastguard Worker class ast_type_specifier : public ast_node {
914*61046927SAndroid Build Coastguard Worker public:
915*61046927SAndroid Build Coastguard Worker    /** Construct a type specifier from a type name */
ast_type_specifier(const char * name)916*61046927SAndroid Build Coastguard Worker    ast_type_specifier(const char *name)
917*61046927SAndroid Build Coastguard Worker       : type(NULL), type_name(name), structure(NULL), array_specifier(NULL),
918*61046927SAndroid Build Coastguard Worker 	default_precision(ast_precision_none)
919*61046927SAndroid Build Coastguard Worker    {
920*61046927SAndroid Build Coastguard Worker       /* empty */
921*61046927SAndroid Build Coastguard Worker    }
922*61046927SAndroid Build Coastguard Worker 
923*61046927SAndroid Build Coastguard Worker    /** Construct a type specifier from a structure definition */
ast_type_specifier(ast_struct_specifier * s)924*61046927SAndroid Build Coastguard Worker    ast_type_specifier(ast_struct_specifier *s)
925*61046927SAndroid Build Coastguard Worker       : type(NULL), type_name(s->name), structure(s), array_specifier(NULL),
926*61046927SAndroid Build Coastguard Worker 	default_precision(ast_precision_none)
927*61046927SAndroid Build Coastguard Worker    {
928*61046927SAndroid Build Coastguard Worker       /* empty */
929*61046927SAndroid Build Coastguard Worker    }
930*61046927SAndroid Build Coastguard Worker 
ast_type_specifier(const glsl_type * t)931*61046927SAndroid Build Coastguard Worker    ast_type_specifier(const glsl_type *t)
932*61046927SAndroid Build Coastguard Worker       : type(t), type_name(glsl_get_type_name(t)), structure(NULL), array_specifier(NULL),
933*61046927SAndroid Build Coastguard Worker         default_precision(ast_precision_none)
934*61046927SAndroid Build Coastguard Worker    {
935*61046927SAndroid Build Coastguard Worker       /* empty */
936*61046927SAndroid Build Coastguard Worker    }
937*61046927SAndroid Build Coastguard Worker 
938*61046927SAndroid Build Coastguard Worker    const struct glsl_type *glsl_type(const char **name,
939*61046927SAndroid Build Coastguard Worker 				     struct _mesa_glsl_parse_state *state)
940*61046927SAndroid Build Coastguard Worker       const;
941*61046927SAndroid Build Coastguard Worker 
942*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
943*61046927SAndroid Build Coastguard Worker 
944*61046927SAndroid Build Coastguard Worker    ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *);
945*61046927SAndroid Build Coastguard Worker 
946*61046927SAndroid Build Coastguard Worker    const struct glsl_type *type;
947*61046927SAndroid Build Coastguard Worker    const char *type_name;
948*61046927SAndroid Build Coastguard Worker    ast_struct_specifier *structure;
949*61046927SAndroid Build Coastguard Worker 
950*61046927SAndroid Build Coastguard Worker    ast_array_specifier *array_specifier;
951*61046927SAndroid Build Coastguard Worker 
952*61046927SAndroid Build Coastguard Worker    /** For precision statements, this is the given precision; otherwise none. */
953*61046927SAndroid Build Coastguard Worker    unsigned default_precision:2;
954*61046927SAndroid Build Coastguard Worker };
955*61046927SAndroid Build Coastguard Worker 
956*61046927SAndroid Build Coastguard Worker 
957*61046927SAndroid Build Coastguard Worker class ast_fully_specified_type : public ast_node {
958*61046927SAndroid Build Coastguard Worker public:
959*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
960*61046927SAndroid Build Coastguard Worker    bool has_qualifiers(_mesa_glsl_parse_state *state) const;
961*61046927SAndroid Build Coastguard Worker 
ast_fully_specified_type()962*61046927SAndroid Build Coastguard Worker    ast_fully_specified_type() : qualifier(), specifier(NULL)
963*61046927SAndroid Build Coastguard Worker    {
964*61046927SAndroid Build Coastguard Worker    }
965*61046927SAndroid Build Coastguard Worker 
966*61046927SAndroid Build Coastguard Worker    const struct glsl_type *glsl_type(const char **name,
967*61046927SAndroid Build Coastguard Worker 				     struct _mesa_glsl_parse_state *state)
968*61046927SAndroid Build Coastguard Worker       const;
969*61046927SAndroid Build Coastguard Worker 
970*61046927SAndroid Build Coastguard Worker    ast_type_qualifier qualifier;
971*61046927SAndroid Build Coastguard Worker    ast_type_specifier *specifier;
972*61046927SAndroid Build Coastguard Worker };
973*61046927SAndroid Build Coastguard Worker 
974*61046927SAndroid Build Coastguard Worker 
975*61046927SAndroid Build Coastguard Worker class ast_declarator_list : public ast_node {
976*61046927SAndroid Build Coastguard Worker public:
977*61046927SAndroid Build Coastguard Worker    ast_declarator_list(ast_fully_specified_type *);
978*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
979*61046927SAndroid Build Coastguard Worker 
980*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
981*61046927SAndroid Build Coastguard Worker 			  struct _mesa_glsl_parse_state *state);
982*61046927SAndroid Build Coastguard Worker 
983*61046927SAndroid Build Coastguard Worker    ast_fully_specified_type *type;
984*61046927SAndroid Build Coastguard Worker    /** List of 'ast_declaration *' */
985*61046927SAndroid Build Coastguard Worker    exec_list declarations;
986*61046927SAndroid Build Coastguard Worker 
987*61046927SAndroid Build Coastguard Worker    /**
988*61046927SAndroid Build Coastguard Worker     * Flags for redeclarations. In these cases, no type is specified, to
989*61046927SAndroid Build Coastguard Worker     * `type` is allowed to be NULL. In all other cases, this would be an error.
990*61046927SAndroid Build Coastguard Worker     */
991*61046927SAndroid Build Coastguard Worker    int invariant;     /** < `invariant` redeclaration */
992*61046927SAndroid Build Coastguard Worker    int precise;       /** < `precise` redeclaration */
993*61046927SAndroid Build Coastguard Worker };
994*61046927SAndroid Build Coastguard Worker 
995*61046927SAndroid Build Coastguard Worker 
996*61046927SAndroid Build Coastguard Worker class ast_parameter_declarator : public ast_node {
997*61046927SAndroid Build Coastguard Worker public:
ast_parameter_declarator()998*61046927SAndroid Build Coastguard Worker    ast_parameter_declarator() :
999*61046927SAndroid Build Coastguard Worker       type(NULL),
1000*61046927SAndroid Build Coastguard Worker       identifier(NULL),
1001*61046927SAndroid Build Coastguard Worker       array_specifier(NULL),
1002*61046927SAndroid Build Coastguard Worker       formal_parameter(false),
1003*61046927SAndroid Build Coastguard Worker       is_void(false)
1004*61046927SAndroid Build Coastguard Worker    {
1005*61046927SAndroid Build Coastguard Worker       /* empty */
1006*61046927SAndroid Build Coastguard Worker    }
1007*61046927SAndroid Build Coastguard Worker 
1008*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
1009*61046927SAndroid Build Coastguard Worker 
1010*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
1011*61046927SAndroid Build Coastguard Worker 			  struct _mesa_glsl_parse_state *state);
1012*61046927SAndroid Build Coastguard Worker 
1013*61046927SAndroid Build Coastguard Worker    ast_fully_specified_type *type;
1014*61046927SAndroid Build Coastguard Worker    const char *identifier;
1015*61046927SAndroid Build Coastguard Worker    ast_array_specifier *array_specifier;
1016*61046927SAndroid Build Coastguard Worker 
1017*61046927SAndroid Build Coastguard Worker    static void parameters_to_hir(exec_list *ast_parameters,
1018*61046927SAndroid Build Coastguard Worker 				 bool formal, exec_list *ir_parameters,
1019*61046927SAndroid Build Coastguard Worker 				 struct _mesa_glsl_parse_state *state);
1020*61046927SAndroid Build Coastguard Worker 
1021*61046927SAndroid Build Coastguard Worker private:
1022*61046927SAndroid Build Coastguard Worker    /** Is this parameter declaration part of a formal parameter list? */
1023*61046927SAndroid Build Coastguard Worker    bool formal_parameter;
1024*61046927SAndroid Build Coastguard Worker 
1025*61046927SAndroid Build Coastguard Worker    /**
1026*61046927SAndroid Build Coastguard Worker     * Is this parameter 'void' type?
1027*61046927SAndroid Build Coastguard Worker     *
1028*61046927SAndroid Build Coastguard Worker     * This field is set by \c ::hir.
1029*61046927SAndroid Build Coastguard Worker     */
1030*61046927SAndroid Build Coastguard Worker    bool is_void;
1031*61046927SAndroid Build Coastguard Worker };
1032*61046927SAndroid Build Coastguard Worker 
1033*61046927SAndroid Build Coastguard Worker 
1034*61046927SAndroid Build Coastguard Worker class ast_function : public ast_node {
1035*61046927SAndroid Build Coastguard Worker public:
1036*61046927SAndroid Build Coastguard Worker    ast_function(void);
1037*61046927SAndroid Build Coastguard Worker 
1038*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
1039*61046927SAndroid Build Coastguard Worker 
1040*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
1041*61046927SAndroid Build Coastguard Worker 			  struct _mesa_glsl_parse_state *state);
1042*61046927SAndroid Build Coastguard Worker 
1043*61046927SAndroid Build Coastguard Worker    ast_fully_specified_type *return_type;
1044*61046927SAndroid Build Coastguard Worker    const char *identifier;
1045*61046927SAndroid Build Coastguard Worker 
1046*61046927SAndroid Build Coastguard Worker    exec_list parameters;
1047*61046927SAndroid Build Coastguard Worker 
1048*61046927SAndroid Build Coastguard Worker private:
1049*61046927SAndroid Build Coastguard Worker    /**
1050*61046927SAndroid Build Coastguard Worker     * Is this prototype part of the function definition?
1051*61046927SAndroid Build Coastguard Worker     *
1052*61046927SAndroid Build Coastguard Worker     * Used by ast_function_definition::hir to process the parameters, etc.
1053*61046927SAndroid Build Coastguard Worker     * of the function.
1054*61046927SAndroid Build Coastguard Worker     *
1055*61046927SAndroid Build Coastguard Worker     * \sa ::hir
1056*61046927SAndroid Build Coastguard Worker     */
1057*61046927SAndroid Build Coastguard Worker    bool is_definition;
1058*61046927SAndroid Build Coastguard Worker 
1059*61046927SAndroid Build Coastguard Worker    /**
1060*61046927SAndroid Build Coastguard Worker     * Function signature corresponding to this function prototype instance
1061*61046927SAndroid Build Coastguard Worker     *
1062*61046927SAndroid Build Coastguard Worker     * Used by ast_function_definition::hir to process the parameters, etc.
1063*61046927SAndroid Build Coastguard Worker     * of the function.
1064*61046927SAndroid Build Coastguard Worker     *
1065*61046927SAndroid Build Coastguard Worker     * \sa ::hir
1066*61046927SAndroid Build Coastguard Worker     */
1067*61046927SAndroid Build Coastguard Worker    class ir_function_signature *signature;
1068*61046927SAndroid Build Coastguard Worker 
1069*61046927SAndroid Build Coastguard Worker    friend class ast_function_definition;
1070*61046927SAndroid Build Coastguard Worker };
1071*61046927SAndroid Build Coastguard Worker 
1072*61046927SAndroid Build Coastguard Worker 
1073*61046927SAndroid Build Coastguard Worker class ast_expression_statement : public ast_node {
1074*61046927SAndroid Build Coastguard Worker public:
1075*61046927SAndroid Build Coastguard Worker    ast_expression_statement(ast_expression *);
1076*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
1077*61046927SAndroid Build Coastguard Worker 
1078*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
1079*61046927SAndroid Build Coastguard Worker 			  struct _mesa_glsl_parse_state *state);
1080*61046927SAndroid Build Coastguard Worker 
1081*61046927SAndroid Build Coastguard Worker    ast_expression *expression;
1082*61046927SAndroid Build Coastguard Worker };
1083*61046927SAndroid Build Coastguard Worker 
1084*61046927SAndroid Build Coastguard Worker 
1085*61046927SAndroid Build Coastguard Worker class ast_case_label : public ast_node {
1086*61046927SAndroid Build Coastguard Worker public:
1087*61046927SAndroid Build Coastguard Worker    ast_case_label(ast_expression *test_value);
1088*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
1089*61046927SAndroid Build Coastguard Worker 
1090*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
1091*61046927SAndroid Build Coastguard Worker 			  struct _mesa_glsl_parse_state *state);
1092*61046927SAndroid Build Coastguard Worker 
1093*61046927SAndroid Build Coastguard Worker    /**
1094*61046927SAndroid Build Coastguard Worker     * An test value of NULL means 'default'.
1095*61046927SAndroid Build Coastguard Worker     */
1096*61046927SAndroid Build Coastguard Worker    ast_expression *test_value;
1097*61046927SAndroid Build Coastguard Worker };
1098*61046927SAndroid Build Coastguard Worker 
1099*61046927SAndroid Build Coastguard Worker 
1100*61046927SAndroid Build Coastguard Worker class ast_case_label_list : public ast_node {
1101*61046927SAndroid Build Coastguard Worker public:
1102*61046927SAndroid Build Coastguard Worker    ast_case_label_list(void);
1103*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
1104*61046927SAndroid Build Coastguard Worker 
1105*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
1106*61046927SAndroid Build Coastguard Worker 			  struct _mesa_glsl_parse_state *state);
1107*61046927SAndroid Build Coastguard Worker 
1108*61046927SAndroid Build Coastguard Worker    /**
1109*61046927SAndroid Build Coastguard Worker     * A list of case labels.
1110*61046927SAndroid Build Coastguard Worker     */
1111*61046927SAndroid Build Coastguard Worker    exec_list labels;
1112*61046927SAndroid Build Coastguard Worker };
1113*61046927SAndroid Build Coastguard Worker 
1114*61046927SAndroid Build Coastguard Worker 
1115*61046927SAndroid Build Coastguard Worker class ast_case_statement : public ast_node {
1116*61046927SAndroid Build Coastguard Worker public:
1117*61046927SAndroid Build Coastguard Worker    ast_case_statement(ast_case_label_list *labels);
1118*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
1119*61046927SAndroid Build Coastguard Worker 
1120*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
1121*61046927SAndroid Build Coastguard Worker 			  struct _mesa_glsl_parse_state *state);
1122*61046927SAndroid Build Coastguard Worker 
1123*61046927SAndroid Build Coastguard Worker    ast_case_label_list *labels;
1124*61046927SAndroid Build Coastguard Worker 
1125*61046927SAndroid Build Coastguard Worker    /**
1126*61046927SAndroid Build Coastguard Worker     * A list of statements.
1127*61046927SAndroid Build Coastguard Worker     */
1128*61046927SAndroid Build Coastguard Worker    exec_list stmts;
1129*61046927SAndroid Build Coastguard Worker };
1130*61046927SAndroid Build Coastguard Worker 
1131*61046927SAndroid Build Coastguard Worker 
1132*61046927SAndroid Build Coastguard Worker class ast_case_statement_list : public ast_node {
1133*61046927SAndroid Build Coastguard Worker public:
1134*61046927SAndroid Build Coastguard Worker    ast_case_statement_list(void);
1135*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
1136*61046927SAndroid Build Coastguard Worker 
1137*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
1138*61046927SAndroid Build Coastguard Worker 			  struct _mesa_glsl_parse_state *state);
1139*61046927SAndroid Build Coastguard Worker 
1140*61046927SAndroid Build Coastguard Worker    /**
1141*61046927SAndroid Build Coastguard Worker     * A list of cases.
1142*61046927SAndroid Build Coastguard Worker     */
1143*61046927SAndroid Build Coastguard Worker    exec_list cases;
1144*61046927SAndroid Build Coastguard Worker };
1145*61046927SAndroid Build Coastguard Worker 
1146*61046927SAndroid Build Coastguard Worker 
1147*61046927SAndroid Build Coastguard Worker class ast_switch_body : public ast_node {
1148*61046927SAndroid Build Coastguard Worker public:
1149*61046927SAndroid Build Coastguard Worker    ast_switch_body(ast_case_statement_list *stmts);
1150*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
1151*61046927SAndroid Build Coastguard Worker 
1152*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
1153*61046927SAndroid Build Coastguard Worker 			  struct _mesa_glsl_parse_state *state);
1154*61046927SAndroid Build Coastguard Worker 
1155*61046927SAndroid Build Coastguard Worker    ast_case_statement_list *stmts;
1156*61046927SAndroid Build Coastguard Worker };
1157*61046927SAndroid Build Coastguard Worker 
1158*61046927SAndroid Build Coastguard Worker 
1159*61046927SAndroid Build Coastguard Worker class ast_selection_statement : public ast_node {
1160*61046927SAndroid Build Coastguard Worker public:
1161*61046927SAndroid Build Coastguard Worker    ast_selection_statement(ast_expression *condition,
1162*61046927SAndroid Build Coastguard Worker 			   ast_node *then_statement,
1163*61046927SAndroid Build Coastguard Worker 			   ast_node *else_statement);
1164*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
1165*61046927SAndroid Build Coastguard Worker 
1166*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
1167*61046927SAndroid Build Coastguard Worker 			  struct _mesa_glsl_parse_state *state);
1168*61046927SAndroid Build Coastguard Worker 
1169*61046927SAndroid Build Coastguard Worker    ast_expression *condition;
1170*61046927SAndroid Build Coastguard Worker    ast_node *then_statement;
1171*61046927SAndroid Build Coastguard Worker    ast_node *else_statement;
1172*61046927SAndroid Build Coastguard Worker };
1173*61046927SAndroid Build Coastguard Worker 
1174*61046927SAndroid Build Coastguard Worker 
1175*61046927SAndroid Build Coastguard Worker class ast_switch_statement : public ast_node {
1176*61046927SAndroid Build Coastguard Worker public:
1177*61046927SAndroid Build Coastguard Worker    ast_switch_statement(ast_expression *test_expression,
1178*61046927SAndroid Build Coastguard Worker 			ast_node *body);
1179*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
1180*61046927SAndroid Build Coastguard Worker 
1181*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
1182*61046927SAndroid Build Coastguard Worker 			  struct _mesa_glsl_parse_state *state);
1183*61046927SAndroid Build Coastguard Worker 
1184*61046927SAndroid Build Coastguard Worker    ast_expression *test_expression;
1185*61046927SAndroid Build Coastguard Worker    ast_node *body;
1186*61046927SAndroid Build Coastguard Worker 
1187*61046927SAndroid Build Coastguard Worker protected:
1188*61046927SAndroid Build Coastguard Worker    void test_to_hir(exec_list *, struct _mesa_glsl_parse_state *);
1189*61046927SAndroid Build Coastguard Worker    void eval_test_expression(exec_list *instructions,
1190*61046927SAndroid Build Coastguard Worker                              struct _mesa_glsl_parse_state *state);
1191*61046927SAndroid Build Coastguard Worker    ir_rvalue *test_val;
1192*61046927SAndroid Build Coastguard Worker };
1193*61046927SAndroid Build Coastguard Worker 
1194*61046927SAndroid Build Coastguard Worker class ast_iteration_statement : public ast_node {
1195*61046927SAndroid Build Coastguard Worker public:
1196*61046927SAndroid Build Coastguard Worker    ast_iteration_statement(int mode, ast_node *init, ast_node *condition,
1197*61046927SAndroid Build Coastguard Worker 			   ast_expression *rest_expression, ast_node *body);
1198*61046927SAndroid Build Coastguard Worker 
1199*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
1200*61046927SAndroid Build Coastguard Worker 
1201*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *);
1202*61046927SAndroid Build Coastguard Worker 
1203*61046927SAndroid Build Coastguard Worker    enum ast_iteration_modes {
1204*61046927SAndroid Build Coastguard Worker       ast_for,
1205*61046927SAndroid Build Coastguard Worker       ast_while,
1206*61046927SAndroid Build Coastguard Worker       ast_do_while
1207*61046927SAndroid Build Coastguard Worker    } mode;
1208*61046927SAndroid Build Coastguard Worker 
1209*61046927SAndroid Build Coastguard Worker 
1210*61046927SAndroid Build Coastguard Worker    ast_node *init_statement;
1211*61046927SAndroid Build Coastguard Worker    ast_node *condition;
1212*61046927SAndroid Build Coastguard Worker    ast_expression *rest_expression;
1213*61046927SAndroid Build Coastguard Worker 
1214*61046927SAndroid Build Coastguard Worker    exec_list rest_instructions;
1215*61046927SAndroid Build Coastguard Worker 
1216*61046927SAndroid Build Coastguard Worker    ast_node *body;
1217*61046927SAndroid Build Coastguard Worker 
1218*61046927SAndroid Build Coastguard Worker    /**
1219*61046927SAndroid Build Coastguard Worker     * Generate IR from the condition of a loop
1220*61046927SAndroid Build Coastguard Worker     *
1221*61046927SAndroid Build Coastguard Worker     * This is factored out of ::hir because some loops have the condition
1222*61046927SAndroid Build Coastguard Worker     * test at the top (for and while), and others have it at the end (do-while).
1223*61046927SAndroid Build Coastguard Worker     */
1224*61046927SAndroid Build Coastguard Worker    void condition_to_hir(exec_list *, struct _mesa_glsl_parse_state *);
1225*61046927SAndroid Build Coastguard Worker };
1226*61046927SAndroid Build Coastguard Worker 
1227*61046927SAndroid Build Coastguard Worker 
1228*61046927SAndroid Build Coastguard Worker class ast_jump_statement : public ast_node {
1229*61046927SAndroid Build Coastguard Worker public:
1230*61046927SAndroid Build Coastguard Worker    ast_jump_statement(int mode, ast_expression *return_value);
1231*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
1232*61046927SAndroid Build Coastguard Worker 
1233*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
1234*61046927SAndroid Build Coastguard Worker 			  struct _mesa_glsl_parse_state *state);
1235*61046927SAndroid Build Coastguard Worker 
1236*61046927SAndroid Build Coastguard Worker    enum ast_jump_modes {
1237*61046927SAndroid Build Coastguard Worker       ast_continue,
1238*61046927SAndroid Build Coastguard Worker       ast_break,
1239*61046927SAndroid Build Coastguard Worker       ast_return,
1240*61046927SAndroid Build Coastguard Worker       ast_discard
1241*61046927SAndroid Build Coastguard Worker    } mode;
1242*61046927SAndroid Build Coastguard Worker 
1243*61046927SAndroid Build Coastguard Worker    ast_expression *opt_return_value;
1244*61046927SAndroid Build Coastguard Worker };
1245*61046927SAndroid Build Coastguard Worker 
1246*61046927SAndroid Build Coastguard Worker 
1247*61046927SAndroid Build Coastguard Worker class ast_demote_statement : public ast_node {
1248*61046927SAndroid Build Coastguard Worker public:
ast_demote_statement(void)1249*61046927SAndroid Build Coastguard Worker    ast_demote_statement(void) {}
1250*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
1251*61046927SAndroid Build Coastguard Worker 
1252*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
1253*61046927SAndroid Build Coastguard Worker                           struct _mesa_glsl_parse_state *state);
1254*61046927SAndroid Build Coastguard Worker };
1255*61046927SAndroid Build Coastguard Worker 
1256*61046927SAndroid Build Coastguard Worker 
1257*61046927SAndroid Build Coastguard Worker class ast_function_definition : public ast_node {
1258*61046927SAndroid Build Coastguard Worker public:
ast_function_definition()1259*61046927SAndroid Build Coastguard Worker    ast_function_definition() : prototype(NULL), body(NULL)
1260*61046927SAndroid Build Coastguard Worker    {
1261*61046927SAndroid Build Coastguard Worker    }
1262*61046927SAndroid Build Coastguard Worker 
1263*61046927SAndroid Build Coastguard Worker    virtual void print(void) const;
1264*61046927SAndroid Build Coastguard Worker 
1265*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
1266*61046927SAndroid Build Coastguard Worker 			  struct _mesa_glsl_parse_state *state);
1267*61046927SAndroid Build Coastguard Worker 
1268*61046927SAndroid Build Coastguard Worker    ast_function *prototype;
1269*61046927SAndroid Build Coastguard Worker    ast_compound_statement *body;
1270*61046927SAndroid Build Coastguard Worker };
1271*61046927SAndroid Build Coastguard Worker 
1272*61046927SAndroid Build Coastguard Worker class ast_interface_block : public ast_node {
1273*61046927SAndroid Build Coastguard Worker public:
ast_interface_block(const char * instance_name,ast_array_specifier * array_specifier)1274*61046927SAndroid Build Coastguard Worker    ast_interface_block(const char *instance_name,
1275*61046927SAndroid Build Coastguard Worker                        ast_array_specifier *array_specifier)
1276*61046927SAndroid Build Coastguard Worker    : block_name(NULL), instance_name(instance_name),
1277*61046927SAndroid Build Coastguard Worker      array_specifier(array_specifier)
1278*61046927SAndroid Build Coastguard Worker    {
1279*61046927SAndroid Build Coastguard Worker    }
1280*61046927SAndroid Build Coastguard Worker 
1281*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
1282*61046927SAndroid Build Coastguard Worker 			  struct _mesa_glsl_parse_state *state);
1283*61046927SAndroid Build Coastguard Worker 
1284*61046927SAndroid Build Coastguard Worker    ast_type_qualifier default_layout;
1285*61046927SAndroid Build Coastguard Worker    ast_type_qualifier layout;
1286*61046927SAndroid Build Coastguard Worker    const char *block_name;
1287*61046927SAndroid Build Coastguard Worker 
1288*61046927SAndroid Build Coastguard Worker    /**
1289*61046927SAndroid Build Coastguard Worker     * Declared name of the block instance, if specified.
1290*61046927SAndroid Build Coastguard Worker     *
1291*61046927SAndroid Build Coastguard Worker     * If the block does not have an instance name, this field will be
1292*61046927SAndroid Build Coastguard Worker     * \c NULL.
1293*61046927SAndroid Build Coastguard Worker     */
1294*61046927SAndroid Build Coastguard Worker    const char *instance_name;
1295*61046927SAndroid Build Coastguard Worker 
1296*61046927SAndroid Build Coastguard Worker    /** List of ast_declarator_list * */
1297*61046927SAndroid Build Coastguard Worker    exec_list declarations;
1298*61046927SAndroid Build Coastguard Worker 
1299*61046927SAndroid Build Coastguard Worker    /**
1300*61046927SAndroid Build Coastguard Worker     * Declared array size of the block instance
1301*61046927SAndroid Build Coastguard Worker     *
1302*61046927SAndroid Build Coastguard Worker     * If the block is not declared as an array or if the block instance array
1303*61046927SAndroid Build Coastguard Worker     * is unsized, this field will be \c NULL.
1304*61046927SAndroid Build Coastguard Worker     */
1305*61046927SAndroid Build Coastguard Worker    ast_array_specifier *array_specifier;
1306*61046927SAndroid Build Coastguard Worker };
1307*61046927SAndroid Build Coastguard Worker 
1308*61046927SAndroid Build Coastguard Worker 
1309*61046927SAndroid Build Coastguard Worker /**
1310*61046927SAndroid Build Coastguard Worker  * AST node representing a declaration of the output layout for tessellation
1311*61046927SAndroid Build Coastguard Worker  * control shaders.
1312*61046927SAndroid Build Coastguard Worker  */
1313*61046927SAndroid Build Coastguard Worker class ast_tcs_output_layout : public ast_node
1314*61046927SAndroid Build Coastguard Worker {
1315*61046927SAndroid Build Coastguard Worker public:
ast_tcs_output_layout(const struct YYLTYPE & locp)1316*61046927SAndroid Build Coastguard Worker    ast_tcs_output_layout(const struct YYLTYPE &locp)
1317*61046927SAndroid Build Coastguard Worker    {
1318*61046927SAndroid Build Coastguard Worker       set_location(locp);
1319*61046927SAndroid Build Coastguard Worker    }
1320*61046927SAndroid Build Coastguard Worker 
1321*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
1322*61046927SAndroid Build Coastguard Worker                           struct _mesa_glsl_parse_state *state);
1323*61046927SAndroid Build Coastguard Worker };
1324*61046927SAndroid Build Coastguard Worker 
1325*61046927SAndroid Build Coastguard Worker 
1326*61046927SAndroid Build Coastguard Worker /**
1327*61046927SAndroid Build Coastguard Worker  * AST node representing a declaration of the input layout for geometry
1328*61046927SAndroid Build Coastguard Worker  * shaders.
1329*61046927SAndroid Build Coastguard Worker  */
1330*61046927SAndroid Build Coastguard Worker class ast_gs_input_layout : public ast_node
1331*61046927SAndroid Build Coastguard Worker {
1332*61046927SAndroid Build Coastguard Worker public:
ast_gs_input_layout(const struct YYLTYPE & locp,GLenum prim_type)1333*61046927SAndroid Build Coastguard Worker    ast_gs_input_layout(const struct YYLTYPE &locp, GLenum prim_type)
1334*61046927SAndroid Build Coastguard Worker       : prim_type(prim_type)
1335*61046927SAndroid Build Coastguard Worker    {
1336*61046927SAndroid Build Coastguard Worker       set_location(locp);
1337*61046927SAndroid Build Coastguard Worker    }
1338*61046927SAndroid Build Coastguard Worker 
1339*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
1340*61046927SAndroid Build Coastguard Worker                           struct _mesa_glsl_parse_state *state);
1341*61046927SAndroid Build Coastguard Worker 
1342*61046927SAndroid Build Coastguard Worker private:
1343*61046927SAndroid Build Coastguard Worker    const GLenum prim_type;
1344*61046927SAndroid Build Coastguard Worker };
1345*61046927SAndroid Build Coastguard Worker 
1346*61046927SAndroid Build Coastguard Worker 
1347*61046927SAndroid Build Coastguard Worker /**
1348*61046927SAndroid Build Coastguard Worker  * AST node representing a decalaration of the input layout for compute
1349*61046927SAndroid Build Coastguard Worker  * shaders.
1350*61046927SAndroid Build Coastguard Worker  */
1351*61046927SAndroid Build Coastguard Worker class ast_cs_input_layout : public ast_node
1352*61046927SAndroid Build Coastguard Worker {
1353*61046927SAndroid Build Coastguard Worker public:
ast_cs_input_layout(const struct YYLTYPE & locp,ast_layout_expression * const * local_size)1354*61046927SAndroid Build Coastguard Worker    ast_cs_input_layout(const struct YYLTYPE &locp,
1355*61046927SAndroid Build Coastguard Worker                        ast_layout_expression *const *local_size)
1356*61046927SAndroid Build Coastguard Worker    {
1357*61046927SAndroid Build Coastguard Worker       for (int i = 0; i < 3; i++) {
1358*61046927SAndroid Build Coastguard Worker          this->local_size[i] = local_size[i];
1359*61046927SAndroid Build Coastguard Worker       }
1360*61046927SAndroid Build Coastguard Worker       set_location(locp);
1361*61046927SAndroid Build Coastguard Worker    }
1362*61046927SAndroid Build Coastguard Worker 
1363*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
1364*61046927SAndroid Build Coastguard Worker                           struct _mesa_glsl_parse_state *state);
1365*61046927SAndroid Build Coastguard Worker 
1366*61046927SAndroid Build Coastguard Worker private:
1367*61046927SAndroid Build Coastguard Worker    ast_layout_expression *local_size[3];
1368*61046927SAndroid Build Coastguard Worker };
1369*61046927SAndroid Build Coastguard Worker 
1370*61046927SAndroid Build Coastguard Worker class ast_warnings_toggle : public ast_node {
1371*61046927SAndroid Build Coastguard Worker public:
ast_warnings_toggle(bool _enable)1372*61046927SAndroid Build Coastguard Worker    ast_warnings_toggle(bool _enable)
1373*61046927SAndroid Build Coastguard Worker       : enable(_enable)
1374*61046927SAndroid Build Coastguard Worker    {
1375*61046927SAndroid Build Coastguard Worker       /* empty */
1376*61046927SAndroid Build Coastguard Worker    }
1377*61046927SAndroid Build Coastguard Worker 
1378*61046927SAndroid Build Coastguard Worker    virtual ir_rvalue *hir(exec_list *instructions,
1379*61046927SAndroid Build Coastguard Worker                           struct _mesa_glsl_parse_state *state);
1380*61046927SAndroid Build Coastguard Worker 
1381*61046927SAndroid Build Coastguard Worker private:
1382*61046927SAndroid Build Coastguard Worker    bool enable;
1383*61046927SAndroid Build Coastguard Worker };
1384*61046927SAndroid Build Coastguard Worker /*@}*/
1385*61046927SAndroid Build Coastguard Worker 
1386*61046927SAndroid Build Coastguard Worker extern void
1387*61046927SAndroid Build Coastguard Worker _mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state);
1388*61046927SAndroid Build Coastguard Worker 
1389*61046927SAndroid Build Coastguard Worker extern ir_rvalue *
1390*61046927SAndroid Build Coastguard Worker _mesa_ast_field_selection_to_hir(const ast_expression *expr,
1391*61046927SAndroid Build Coastguard Worker 				 exec_list *instructions,
1392*61046927SAndroid Build Coastguard Worker 				 struct _mesa_glsl_parse_state *state);
1393*61046927SAndroid Build Coastguard Worker 
1394*61046927SAndroid Build Coastguard Worker extern ir_rvalue *
1395*61046927SAndroid Build Coastguard Worker _mesa_ast_array_index_to_hir(void *mem_ctx,
1396*61046927SAndroid Build Coastguard Worker 			     struct _mesa_glsl_parse_state *state,
1397*61046927SAndroid Build Coastguard Worker 			     ir_rvalue *array, ir_rvalue *idx,
1398*61046927SAndroid Build Coastguard Worker 			     YYLTYPE &loc, YYLTYPE &idx_loc);
1399*61046927SAndroid Build Coastguard Worker 
1400*61046927SAndroid Build Coastguard Worker extern void
1401*61046927SAndroid Build Coastguard Worker _mesa_ast_set_aggregate_type(const glsl_type *type,
1402*61046927SAndroid Build Coastguard Worker                              ast_expression *expr);
1403*61046927SAndroid Build Coastguard Worker 
1404*61046927SAndroid Build Coastguard Worker void
1405*61046927SAndroid Build Coastguard Worker emit_function(_mesa_glsl_parse_state *state, ir_function *f);
1406*61046927SAndroid Build Coastguard Worker 
1407*61046927SAndroid Build Coastguard Worker extern void
1408*61046927SAndroid Build Coastguard Worker check_builtin_array_max_size(const char *name, unsigned size,
1409*61046927SAndroid Build Coastguard Worker                              YYLTYPE loc, struct _mesa_glsl_parse_state *state);
1410*61046927SAndroid Build Coastguard Worker 
1411*61046927SAndroid Build Coastguard Worker extern void _mesa_ast_process_interface_block(YYLTYPE *locp,
1412*61046927SAndroid Build Coastguard Worker                                               _mesa_glsl_parse_state *state,
1413*61046927SAndroid Build Coastguard Worker                                               ast_interface_block *const block,
1414*61046927SAndroid Build Coastguard Worker                                               const struct ast_type_qualifier &q);
1415*61046927SAndroid Build Coastguard Worker 
1416*61046927SAndroid Build Coastguard Worker extern bool
1417*61046927SAndroid Build Coastguard Worker process_qualifier_constant(struct _mesa_glsl_parse_state *state,
1418*61046927SAndroid Build Coastguard Worker                            YYLTYPE *loc,
1419*61046927SAndroid Build Coastguard Worker                            const char *qual_indentifier,
1420*61046927SAndroid Build Coastguard Worker                            ast_expression *const_expression,
1421*61046927SAndroid Build Coastguard Worker                            unsigned *value);
1422*61046927SAndroid Build Coastguard Worker #endif /* AST_H */
1423