xref: /aosp_15_r20/external/mesa3d/src/compiler/glsl/glsl_parser.yy (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker%{
2*61046927SAndroid Build Coastguard Worker/*
3*61046927SAndroid Build Coastguard Worker * Copyright © 2008, 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#include <stdio.h>
25*61046927SAndroid Build Coastguard Worker#include <stdlib.h>
26*61046927SAndroid Build Coastguard Worker#include <string.h>
27*61046927SAndroid Build Coastguard Worker#ifndef _MSC_VER
28*61046927SAndroid Build Coastguard Worker#include <strings.h>
29*61046927SAndroid Build Coastguard Worker#endif
30*61046927SAndroid Build Coastguard Worker#include <assert.h>
31*61046927SAndroid Build Coastguard Worker
32*61046927SAndroid Build Coastguard Worker#include "ast.h"
33*61046927SAndroid Build Coastguard Worker#include "glsl_parser_extras.h"
34*61046927SAndroid Build Coastguard Worker#include "compiler/glsl_types.h"
35*61046927SAndroid Build Coastguard Worker#include "util/u_string.h"
36*61046927SAndroid Build Coastguard Worker#include "util/format/u_format.h"
37*61046927SAndroid Build Coastguard Worker#include "main/consts_exts.h"
38*61046927SAndroid Build Coastguard Worker
39*61046927SAndroid Build Coastguard Worker#ifdef _MSC_VER
40*61046927SAndroid Build Coastguard Worker#pragma warning( disable : 4065 ) // switch statement contains 'default' but no 'case' labels
41*61046927SAndroid Build Coastguard Worker#endif
42*61046927SAndroid Build Coastguard Worker
43*61046927SAndroid Build Coastguard Worker#undef yyerror
44*61046927SAndroid Build Coastguard Worker
45*61046927SAndroid Build Coastguard Workerstatic void yyerror(YYLTYPE *loc, _mesa_glsl_parse_state *st, const char *msg)
46*61046927SAndroid Build Coastguard Worker{
47*61046927SAndroid Build Coastguard Worker   _mesa_glsl_error(loc, st, "%s", msg);
48*61046927SAndroid Build Coastguard Worker}
49*61046927SAndroid Build Coastguard Worker
50*61046927SAndroid Build Coastguard Workerstatic int
51*61046927SAndroid Build Coastguard Worker_mesa_glsl_lex(YYSTYPE *val, YYLTYPE *loc, _mesa_glsl_parse_state *state)
52*61046927SAndroid Build Coastguard Worker{
53*61046927SAndroid Build Coastguard Worker   return _mesa_glsl_lexer_lex(val, loc, state->scanner);
54*61046927SAndroid Build Coastguard Worker}
55*61046927SAndroid Build Coastguard Worker
56*61046927SAndroid Build Coastguard Workerstatic bool match_layout_qualifier(const char *s1, const char *s2,
57*61046927SAndroid Build Coastguard Worker                                   _mesa_glsl_parse_state *state)
58*61046927SAndroid Build Coastguard Worker{
59*61046927SAndroid Build Coastguard Worker   /* From the GLSL 1.50 spec, section 4.3.8 (Layout Qualifiers):
60*61046927SAndroid Build Coastguard Worker    *
61*61046927SAndroid Build Coastguard Worker    *     "The tokens in any layout-qualifier-id-list ... are not case
62*61046927SAndroid Build Coastguard Worker    *     sensitive, unless explicitly noted otherwise."
63*61046927SAndroid Build Coastguard Worker    *
64*61046927SAndroid Build Coastguard Worker    * The text "unless explicitly noted otherwise" appears to be
65*61046927SAndroid Build Coastguard Worker    * vacuous--no desktop GLSL spec (up through GLSL 4.40) notes
66*61046927SAndroid Build Coastguard Worker    * otherwise.
67*61046927SAndroid Build Coastguard Worker    *
68*61046927SAndroid Build Coastguard Worker    * However, the GLSL ES 3.00 spec says, in section 4.3.8 (Layout
69*61046927SAndroid Build Coastguard Worker    * Qualifiers):
70*61046927SAndroid Build Coastguard Worker    *
71*61046927SAndroid Build Coastguard Worker    *     "As for other identifiers, they are case sensitive."
72*61046927SAndroid Build Coastguard Worker    *
73*61046927SAndroid Build Coastguard Worker    * So we need to do a case-sensitive or a case-insensitive match,
74*61046927SAndroid Build Coastguard Worker    * depending on whether we are compiling for GLSL ES.
75*61046927SAndroid Build Coastguard Worker    */
76*61046927SAndroid Build Coastguard Worker   if (state->es_shader)
77*61046927SAndroid Build Coastguard Worker      return strcmp(s1, s2);
78*61046927SAndroid Build Coastguard Worker   else
79*61046927SAndroid Build Coastguard Worker      return strcasecmp(s1, s2);
80*61046927SAndroid Build Coastguard Worker}
81*61046927SAndroid Build Coastguard Worker%}
82*61046927SAndroid Build Coastguard Worker
83*61046927SAndroid Build Coastguard Worker%expect 0
84*61046927SAndroid Build Coastguard Worker
85*61046927SAndroid Build Coastguard Worker%pure-parser
86*61046927SAndroid Build Coastguard Worker%error-verbose
87*61046927SAndroid Build Coastguard Worker
88*61046927SAndroid Build Coastguard Worker%locations
89*61046927SAndroid Build Coastguard Worker%initial-action {
90*61046927SAndroid Build Coastguard Worker   @$.first_line = 1;
91*61046927SAndroid Build Coastguard Worker   @$.first_column = 1;
92*61046927SAndroid Build Coastguard Worker   @$.last_line = 1;
93*61046927SAndroid Build Coastguard Worker   @$.last_column = 1;
94*61046927SAndroid Build Coastguard Worker   @$.source = 0;
95*61046927SAndroid Build Coastguard Worker   @$.path = NULL;
96*61046927SAndroid Build Coastguard Worker}
97*61046927SAndroid Build Coastguard Worker
98*61046927SAndroid Build Coastguard Worker%lex-param   {struct _mesa_glsl_parse_state *state}
99*61046927SAndroid Build Coastguard Worker%parse-param {struct _mesa_glsl_parse_state *state}
100*61046927SAndroid Build Coastguard Worker
101*61046927SAndroid Build Coastguard Worker%union {
102*61046927SAndroid Build Coastguard Worker   int n;
103*61046927SAndroid Build Coastguard Worker   int64_t n64;
104*61046927SAndroid Build Coastguard Worker   float real;
105*61046927SAndroid Build Coastguard Worker   double dreal;
106*61046927SAndroid Build Coastguard Worker   const char *identifier;
107*61046927SAndroid Build Coastguard Worker
108*61046927SAndroid Build Coastguard Worker   struct ast_type_qualifier type_qualifier;
109*61046927SAndroid Build Coastguard Worker
110*61046927SAndroid Build Coastguard Worker   ast_node *node;
111*61046927SAndroid Build Coastguard Worker   ast_type_specifier *type_specifier;
112*61046927SAndroid Build Coastguard Worker   ast_array_specifier *array_specifier;
113*61046927SAndroid Build Coastguard Worker   ast_fully_specified_type *fully_specified_type;
114*61046927SAndroid Build Coastguard Worker   ast_function *function;
115*61046927SAndroid Build Coastguard Worker   ast_parameter_declarator *parameter_declarator;
116*61046927SAndroid Build Coastguard Worker   ast_function_definition *function_definition;
117*61046927SAndroid Build Coastguard Worker   ast_compound_statement *compound_statement;
118*61046927SAndroid Build Coastguard Worker   ast_expression *expression;
119*61046927SAndroid Build Coastguard Worker   ast_declarator_list *declarator_list;
120*61046927SAndroid Build Coastguard Worker   ast_struct_specifier *struct_specifier;
121*61046927SAndroid Build Coastguard Worker   ast_declaration *declaration;
122*61046927SAndroid Build Coastguard Worker   ast_switch_body *switch_body;
123*61046927SAndroid Build Coastguard Worker   ast_case_label *case_label;
124*61046927SAndroid Build Coastguard Worker   ast_case_label_list *case_label_list;
125*61046927SAndroid Build Coastguard Worker   ast_case_statement *case_statement;
126*61046927SAndroid Build Coastguard Worker   ast_case_statement_list *case_statement_list;
127*61046927SAndroid Build Coastguard Worker   ast_interface_block *interface_block;
128*61046927SAndroid Build Coastguard Worker   ast_subroutine_list *subroutine_list;
129*61046927SAndroid Build Coastguard Worker   struct {
130*61046927SAndroid Build Coastguard Worker      ast_node *cond;
131*61046927SAndroid Build Coastguard Worker      ast_expression *rest;
132*61046927SAndroid Build Coastguard Worker   } for_rest_statement;
133*61046927SAndroid Build Coastguard Worker
134*61046927SAndroid Build Coastguard Worker   struct {
135*61046927SAndroid Build Coastguard Worker      ast_node *then_statement;
136*61046927SAndroid Build Coastguard Worker      ast_node *else_statement;
137*61046927SAndroid Build Coastguard Worker   } selection_rest_statement;
138*61046927SAndroid Build Coastguard Worker
139*61046927SAndroid Build Coastguard Worker   const glsl_type *type;
140*61046927SAndroid Build Coastguard Worker}
141*61046927SAndroid Build Coastguard Worker
142*61046927SAndroid Build Coastguard Worker%token ATTRIBUTE CONST_TOK
143*61046927SAndroid Build Coastguard Worker%token <type> BASIC_TYPE_TOK
144*61046927SAndroid Build Coastguard Worker%token BREAK BUFFER CONTINUE DO ELSE FOR IF DEMOTE DISCARD RETURN SWITCH CASE DEFAULT
145*61046927SAndroid Build Coastguard Worker%token CENTROID IN_TOK OUT_TOK INOUT_TOK UNIFORM VARYING SAMPLE
146*61046927SAndroid Build Coastguard Worker%token NOPERSPECTIVE FLAT SMOOTH
147*61046927SAndroid Build Coastguard Worker%token IMAGE1DSHADOW IMAGE2DSHADOW IMAGE1DARRAYSHADOW IMAGE2DARRAYSHADOW
148*61046927SAndroid Build Coastguard Worker%token COHERENT VOLATILE RESTRICT READONLY WRITEONLY
149*61046927SAndroid Build Coastguard Worker%token SHARED
150*61046927SAndroid Build Coastguard Worker%token STRUCT VOID_TOK WHILE
151*61046927SAndroid Build Coastguard Worker%token <identifier> IDENTIFIER TYPE_IDENTIFIER NEW_IDENTIFIER
152*61046927SAndroid Build Coastguard Worker%type <identifier> any_identifier
153*61046927SAndroid Build Coastguard Worker%type <interface_block> instance_name_opt
154*61046927SAndroid Build Coastguard Worker%token <real> FLOATCONSTANT FLOAT16CONSTANT
155*61046927SAndroid Build Coastguard Worker%token <dreal> DOUBLECONSTANT
156*61046927SAndroid Build Coastguard Worker%token <n> INTCONSTANT UINTCONSTANT BOOLCONSTANT
157*61046927SAndroid Build Coastguard Worker%token <n64> INT64CONSTANT UINT64CONSTANT
158*61046927SAndroid Build Coastguard Worker%token <identifier> FIELD_SELECTION
159*61046927SAndroid Build Coastguard Worker%token LEFT_OP RIGHT_OP
160*61046927SAndroid Build Coastguard Worker%token INC_OP DEC_OP LE_OP GE_OP EQ_OP NE_OP
161*61046927SAndroid Build Coastguard Worker%token AND_OP OR_OP XOR_OP MUL_ASSIGN DIV_ASSIGN ADD_ASSIGN
162*61046927SAndroid Build Coastguard Worker%token MOD_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN XOR_ASSIGN OR_ASSIGN
163*61046927SAndroid Build Coastguard Worker%token SUB_ASSIGN
164*61046927SAndroid Build Coastguard Worker%token INVARIANT PRECISE
165*61046927SAndroid Build Coastguard Worker%token LOWP MEDIUMP HIGHP SUPERP PRECISION
166*61046927SAndroid Build Coastguard Worker
167*61046927SAndroid Build Coastguard Worker%token VERSION_TOK EXTENSION LINE COLON EOL INTERFACE_TOK OUTPUT
168*61046927SAndroid Build Coastguard Worker%token PRAGMA_DEBUG_ON PRAGMA_DEBUG_OFF
169*61046927SAndroid Build Coastguard Worker%token PRAGMA_OPTIMIZE_ON PRAGMA_OPTIMIZE_OFF
170*61046927SAndroid Build Coastguard Worker%token PRAGMA_WARNING_ON PRAGMA_WARNING_OFF
171*61046927SAndroid Build Coastguard Worker%token PRAGMA_INVARIANT_ALL
172*61046927SAndroid Build Coastguard Worker%token LAYOUT_TOK
173*61046927SAndroid Build Coastguard Worker%token DOT_TOK
174*61046927SAndroid Build Coastguard Worker   /* Reserved words that are not actually used in the grammar.
175*61046927SAndroid Build Coastguard Worker    */
176*61046927SAndroid Build Coastguard Worker%token ASM CLASS UNION ENUM TYPEDEF TEMPLATE THIS PACKED_TOK GOTO
177*61046927SAndroid Build Coastguard Worker%token INLINE_TOK NOINLINE PUBLIC_TOK STATIC EXTERN EXTERNAL
178*61046927SAndroid Build Coastguard Worker%token LONG_TOK SHORT_TOK HALF FIXED_TOK UNSIGNED INPUT_TOK
179*61046927SAndroid Build Coastguard Worker%token HVEC2 HVEC3 HVEC4 FVEC2 FVEC3 FVEC4
180*61046927SAndroid Build Coastguard Worker%token SAMPLER3DRECT
181*61046927SAndroid Build Coastguard Worker%token SIZEOF CAST NAMESPACE USING
182*61046927SAndroid Build Coastguard Worker%token RESOURCE PATCH
183*61046927SAndroid Build Coastguard Worker%token SUBROUTINE
184*61046927SAndroid Build Coastguard Worker
185*61046927SAndroid Build Coastguard Worker%token ERROR_TOK
186*61046927SAndroid Build Coastguard Worker
187*61046927SAndroid Build Coastguard Worker%token COMMON PARTITION ACTIVE FILTER ROW_MAJOR
188*61046927SAndroid Build Coastguard Worker
189*61046927SAndroid Build Coastguard Worker%type <identifier> variable_identifier
190*61046927SAndroid Build Coastguard Worker%type <node> statement
191*61046927SAndroid Build Coastguard Worker%type <node> statement_list
192*61046927SAndroid Build Coastguard Worker%type <node> simple_statement
193*61046927SAndroid Build Coastguard Worker%type <n> precision_qualifier
194*61046927SAndroid Build Coastguard Worker%type <type_qualifier> type_qualifier
195*61046927SAndroid Build Coastguard Worker%type <type_qualifier> auxiliary_storage_qualifier
196*61046927SAndroid Build Coastguard Worker%type <type_qualifier> storage_qualifier
197*61046927SAndroid Build Coastguard Worker%type <type_qualifier> interpolation_qualifier
198*61046927SAndroid Build Coastguard Worker%type <type_qualifier> layout_qualifier
199*61046927SAndroid Build Coastguard Worker%type <type_qualifier> layout_qualifier_id_list layout_qualifier_id
200*61046927SAndroid Build Coastguard Worker%type <type_qualifier> interface_block_layout_qualifier
201*61046927SAndroid Build Coastguard Worker%type <type_qualifier> memory_qualifier
202*61046927SAndroid Build Coastguard Worker%type <type_qualifier> subroutine_qualifier
203*61046927SAndroid Build Coastguard Worker%type <subroutine_list> subroutine_type_list
204*61046927SAndroid Build Coastguard Worker%type <type_qualifier> interface_qualifier
205*61046927SAndroid Build Coastguard Worker%type <type_specifier> type_specifier
206*61046927SAndroid Build Coastguard Worker%type <type_specifier> type_specifier_nonarray
207*61046927SAndroid Build Coastguard Worker%type <array_specifier> array_specifier
208*61046927SAndroid Build Coastguard Worker%type <type> basic_type_specifier_nonarray
209*61046927SAndroid Build Coastguard Worker%type <fully_specified_type> fully_specified_type
210*61046927SAndroid Build Coastguard Worker%type <function> function_prototype
211*61046927SAndroid Build Coastguard Worker%type <function> function_header
212*61046927SAndroid Build Coastguard Worker%type <function> function_header_with_parameters
213*61046927SAndroid Build Coastguard Worker%type <function> function_declarator
214*61046927SAndroid Build Coastguard Worker%type <parameter_declarator> parameter_declarator
215*61046927SAndroid Build Coastguard Worker%type <parameter_declarator> parameter_declaration
216*61046927SAndroid Build Coastguard Worker%type <type_qualifier> parameter_qualifier
217*61046927SAndroid Build Coastguard Worker%type <type_qualifier> parameter_direction_qualifier
218*61046927SAndroid Build Coastguard Worker%type <type_specifier> parameter_type_specifier
219*61046927SAndroid Build Coastguard Worker%type <function_definition> function_definition
220*61046927SAndroid Build Coastguard Worker%type <compound_statement> compound_statement_no_new_scope
221*61046927SAndroid Build Coastguard Worker%type <compound_statement> compound_statement
222*61046927SAndroid Build Coastguard Worker%type <node> statement_no_new_scope
223*61046927SAndroid Build Coastguard Worker%type <node> expression_statement
224*61046927SAndroid Build Coastguard Worker%type <expression> expression
225*61046927SAndroid Build Coastguard Worker%type <expression> primary_expression
226*61046927SAndroid Build Coastguard Worker%type <expression> assignment_expression
227*61046927SAndroid Build Coastguard Worker%type <expression> conditional_expression
228*61046927SAndroid Build Coastguard Worker%type <expression> logical_or_expression
229*61046927SAndroid Build Coastguard Worker%type <expression> logical_xor_expression
230*61046927SAndroid Build Coastguard Worker%type <expression> logical_and_expression
231*61046927SAndroid Build Coastguard Worker%type <expression> inclusive_or_expression
232*61046927SAndroid Build Coastguard Worker%type <expression> exclusive_or_expression
233*61046927SAndroid Build Coastguard Worker%type <expression> and_expression
234*61046927SAndroid Build Coastguard Worker%type <expression> equality_expression
235*61046927SAndroid Build Coastguard Worker%type <expression> relational_expression
236*61046927SAndroid Build Coastguard Worker%type <expression> shift_expression
237*61046927SAndroid Build Coastguard Worker%type <expression> additive_expression
238*61046927SAndroid Build Coastguard Worker%type <expression> multiplicative_expression
239*61046927SAndroid Build Coastguard Worker%type <expression> unary_expression
240*61046927SAndroid Build Coastguard Worker%type <expression> constant_expression
241*61046927SAndroid Build Coastguard Worker%type <expression> integer_expression
242*61046927SAndroid Build Coastguard Worker%type <expression> postfix_expression
243*61046927SAndroid Build Coastguard Worker%type <expression> function_call_header_with_parameters
244*61046927SAndroid Build Coastguard Worker%type <expression> function_call_header_no_parameters
245*61046927SAndroid Build Coastguard Worker%type <expression> function_call_header
246*61046927SAndroid Build Coastguard Worker%type <expression> function_call_generic
247*61046927SAndroid Build Coastguard Worker%type <expression> function_call_or_method
248*61046927SAndroid Build Coastguard Worker%type <expression> function_call
249*61046927SAndroid Build Coastguard Worker%type <n> assignment_operator
250*61046927SAndroid Build Coastguard Worker%type <n> unary_operator
251*61046927SAndroid Build Coastguard Worker%type <expression> function_identifier
252*61046927SAndroid Build Coastguard Worker%type <node> external_declaration
253*61046927SAndroid Build Coastguard Worker%type <node> pragma_statement
254*61046927SAndroid Build Coastguard Worker%type <declarator_list> init_declarator_list
255*61046927SAndroid Build Coastguard Worker%type <declarator_list> single_declaration
256*61046927SAndroid Build Coastguard Worker%type <expression> initializer
257*61046927SAndroid Build Coastguard Worker%type <expression> initializer_list
258*61046927SAndroid Build Coastguard Worker%type <node> declaration
259*61046927SAndroid Build Coastguard Worker%type <node> declaration_statement
260*61046927SAndroid Build Coastguard Worker%type <node> jump_statement
261*61046927SAndroid Build Coastguard Worker%type <node> demote_statement
262*61046927SAndroid Build Coastguard Worker%type <node> interface_block
263*61046927SAndroid Build Coastguard Worker%type <interface_block> basic_interface_block
264*61046927SAndroid Build Coastguard Worker%type <struct_specifier> struct_specifier
265*61046927SAndroid Build Coastguard Worker%type <declarator_list> struct_declaration_list
266*61046927SAndroid Build Coastguard Worker%type <declarator_list> struct_declaration
267*61046927SAndroid Build Coastguard Worker%type <declaration> struct_declarator
268*61046927SAndroid Build Coastguard Worker%type <declaration> struct_declarator_list
269*61046927SAndroid Build Coastguard Worker%type <declarator_list> member_list
270*61046927SAndroid Build Coastguard Worker%type <declarator_list> member_declaration
271*61046927SAndroid Build Coastguard Worker%type <node> selection_statement
272*61046927SAndroid Build Coastguard Worker%type <selection_rest_statement> selection_rest_statement
273*61046927SAndroid Build Coastguard Worker%type <node> switch_statement
274*61046927SAndroid Build Coastguard Worker%type <switch_body> switch_body
275*61046927SAndroid Build Coastguard Worker%type <case_label_list> case_label_list
276*61046927SAndroid Build Coastguard Worker%type <case_label> case_label
277*61046927SAndroid Build Coastguard Worker%type <case_statement> case_statement
278*61046927SAndroid Build Coastguard Worker%type <case_statement_list> case_statement_list
279*61046927SAndroid Build Coastguard Worker%type <node> iteration_statement
280*61046927SAndroid Build Coastguard Worker%type <node> condition
281*61046927SAndroid Build Coastguard Worker%type <node> conditionopt
282*61046927SAndroid Build Coastguard Worker%type <node> for_init_statement
283*61046927SAndroid Build Coastguard Worker%type <for_rest_statement> for_rest_statement
284*61046927SAndroid Build Coastguard Worker%type <node> layout_defaults
285*61046927SAndroid Build Coastguard Worker%type <type_qualifier> layout_uniform_defaults
286*61046927SAndroid Build Coastguard Worker%type <type_qualifier> layout_buffer_defaults
287*61046927SAndroid Build Coastguard Worker%type <type_qualifier> layout_in_defaults
288*61046927SAndroid Build Coastguard Worker%type <type_qualifier> layout_out_defaults
289*61046927SAndroid Build Coastguard Worker
290*61046927SAndroid Build Coastguard Worker%right THEN ELSE
291*61046927SAndroid Build Coastguard Worker%%
292*61046927SAndroid Build Coastguard Worker
293*61046927SAndroid Build Coastguard Workertranslation_unit:
294*61046927SAndroid Build Coastguard Worker   version_statement extension_statement_list
295*61046927SAndroid Build Coastguard Worker   {
296*61046927SAndroid Build Coastguard Worker      _mesa_glsl_initialize_types(state);
297*61046927SAndroid Build Coastguard Worker   }
298*61046927SAndroid Build Coastguard Worker   external_declaration_list
299*61046927SAndroid Build Coastguard Worker   {
300*61046927SAndroid Build Coastguard Worker      delete state->symbols;
301*61046927SAndroid Build Coastguard Worker      state->symbols = new(ralloc_parent(state)) glsl_symbol_table;
302*61046927SAndroid Build Coastguard Worker      if (state->es_shader) {
303*61046927SAndroid Build Coastguard Worker         if (state->stage == MESA_SHADER_FRAGMENT) {
304*61046927SAndroid Build Coastguard Worker            state->symbols->add_default_precision_qualifier("int", ast_precision_medium);
305*61046927SAndroid Build Coastguard Worker         } else {
306*61046927SAndroid Build Coastguard Worker            state->symbols->add_default_precision_qualifier("float", ast_precision_high);
307*61046927SAndroid Build Coastguard Worker            state->symbols->add_default_precision_qualifier("int", ast_precision_high);
308*61046927SAndroid Build Coastguard Worker         }
309*61046927SAndroid Build Coastguard Worker         state->symbols->add_default_precision_qualifier("sampler2D", ast_precision_low);
310*61046927SAndroid Build Coastguard Worker         state->symbols->add_default_precision_qualifier("samplerExternalOES", ast_precision_low);
311*61046927SAndroid Build Coastguard Worker         state->symbols->add_default_precision_qualifier("samplerCube", ast_precision_low);
312*61046927SAndroid Build Coastguard Worker         state->symbols->add_default_precision_qualifier("atomic_uint", ast_precision_high);
313*61046927SAndroid Build Coastguard Worker      }
314*61046927SAndroid Build Coastguard Worker      _mesa_glsl_initialize_types(state);
315*61046927SAndroid Build Coastguard Worker   }
316*61046927SAndroid Build Coastguard Worker   ;
317*61046927SAndroid Build Coastguard Worker
318*61046927SAndroid Build Coastguard Workerversion_statement:
319*61046927SAndroid Build Coastguard Worker   /* blank - no #version specified: defaults are already set */
320*61046927SAndroid Build Coastguard Worker   | VERSION_TOK INTCONSTANT EOL
321*61046927SAndroid Build Coastguard Worker   {
322*61046927SAndroid Build Coastguard Worker      state->process_version_directive(&@2, $2, NULL);
323*61046927SAndroid Build Coastguard Worker      if (state->error) {
324*61046927SAndroid Build Coastguard Worker         YYERROR;
325*61046927SAndroid Build Coastguard Worker      }
326*61046927SAndroid Build Coastguard Worker   }
327*61046927SAndroid Build Coastguard Worker   | VERSION_TOK INTCONSTANT any_identifier EOL
328*61046927SAndroid Build Coastguard Worker   {
329*61046927SAndroid Build Coastguard Worker      state->process_version_directive(&@2, $2, $3);
330*61046927SAndroid Build Coastguard Worker      if (state->error) {
331*61046927SAndroid Build Coastguard Worker         YYERROR;
332*61046927SAndroid Build Coastguard Worker      }
333*61046927SAndroid Build Coastguard Worker   }
334*61046927SAndroid Build Coastguard Worker   ;
335*61046927SAndroid Build Coastguard Worker
336*61046927SAndroid Build Coastguard Workerpragma_statement:
337*61046927SAndroid Build Coastguard Worker   PRAGMA_DEBUG_ON EOL { $$ = NULL; }
338*61046927SAndroid Build Coastguard Worker   | PRAGMA_DEBUG_OFF EOL { $$ = NULL; }
339*61046927SAndroid Build Coastguard Worker   | PRAGMA_OPTIMIZE_ON EOL { $$ = NULL; }
340*61046927SAndroid Build Coastguard Worker   | PRAGMA_OPTIMIZE_OFF EOL { $$ = NULL; }
341*61046927SAndroid Build Coastguard Worker   | PRAGMA_INVARIANT_ALL EOL
342*61046927SAndroid Build Coastguard Worker   {
343*61046927SAndroid Build Coastguard Worker      /* Pragma invariant(all) cannot be used in a fragment shader.
344*61046927SAndroid Build Coastguard Worker       *
345*61046927SAndroid Build Coastguard Worker       * Page 27 of the GLSL 1.20 spec, Page 53 of the GLSL ES 3.00 spec:
346*61046927SAndroid Build Coastguard Worker       *
347*61046927SAndroid Build Coastguard Worker       *     "It is an error to use this pragma in a fragment shader."
348*61046927SAndroid Build Coastguard Worker       */
349*61046927SAndroid Build Coastguard Worker      if (state->is_version(120, 300) &&
350*61046927SAndroid Build Coastguard Worker          state->stage == MESA_SHADER_FRAGMENT) {
351*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(& @1, state,
352*61046927SAndroid Build Coastguard Worker                          "pragma `invariant(all)' cannot be used "
353*61046927SAndroid Build Coastguard Worker                          "in a fragment shader.");
354*61046927SAndroid Build Coastguard Worker      } else if (!state->is_version(120, 100)) {
355*61046927SAndroid Build Coastguard Worker         _mesa_glsl_warning(& @1, state,
356*61046927SAndroid Build Coastguard Worker                            "pragma `invariant(all)' not supported in %s "
357*61046927SAndroid Build Coastguard Worker                            "(GLSL ES 1.00 or GLSL 1.20 required)",
358*61046927SAndroid Build Coastguard Worker                            state->get_version_string());
359*61046927SAndroid Build Coastguard Worker      } else {
360*61046927SAndroid Build Coastguard Worker         state->all_invariant = true;
361*61046927SAndroid Build Coastguard Worker      }
362*61046927SAndroid Build Coastguard Worker
363*61046927SAndroid Build Coastguard Worker      $$ = NULL;
364*61046927SAndroid Build Coastguard Worker   }
365*61046927SAndroid Build Coastguard Worker   | PRAGMA_WARNING_ON EOL
366*61046927SAndroid Build Coastguard Worker   {
367*61046927SAndroid Build Coastguard Worker      linear_ctx *mem_ctx = state->linalloc;
368*61046927SAndroid Build Coastguard Worker      $$ = new(mem_ctx) ast_warnings_toggle(true);
369*61046927SAndroid Build Coastguard Worker   }
370*61046927SAndroid Build Coastguard Worker   | PRAGMA_WARNING_OFF EOL
371*61046927SAndroid Build Coastguard Worker   {
372*61046927SAndroid Build Coastguard Worker      linear_ctx *mem_ctx = state->linalloc;
373*61046927SAndroid Build Coastguard Worker      $$ = new(mem_ctx) ast_warnings_toggle(false);
374*61046927SAndroid Build Coastguard Worker   }
375*61046927SAndroid Build Coastguard Worker   ;
376*61046927SAndroid Build Coastguard Worker
377*61046927SAndroid Build Coastguard Workerextension_statement_list:
378*61046927SAndroid Build Coastguard Worker
379*61046927SAndroid Build Coastguard Worker   | extension_statement_list extension_statement
380*61046927SAndroid Build Coastguard Worker   ;
381*61046927SAndroid Build Coastguard Worker
382*61046927SAndroid Build Coastguard Workerany_identifier:
383*61046927SAndroid Build Coastguard Worker   IDENTIFIER
384*61046927SAndroid Build Coastguard Worker   | TYPE_IDENTIFIER
385*61046927SAndroid Build Coastguard Worker   | NEW_IDENTIFIER
386*61046927SAndroid Build Coastguard Worker   ;
387*61046927SAndroid Build Coastguard Worker
388*61046927SAndroid Build Coastguard Workerextension_statement:
389*61046927SAndroid Build Coastguard Worker   EXTENSION any_identifier COLON any_identifier EOL
390*61046927SAndroid Build Coastguard Worker   {
391*61046927SAndroid Build Coastguard Worker      if (!_mesa_glsl_process_extension($2, & @2, $4, & @4, state)) {
392*61046927SAndroid Build Coastguard Worker         YYERROR;
393*61046927SAndroid Build Coastguard Worker      }
394*61046927SAndroid Build Coastguard Worker   }
395*61046927SAndroid Build Coastguard Worker   ;
396*61046927SAndroid Build Coastguard Worker
397*61046927SAndroid Build Coastguard Workerexternal_declaration_list:
398*61046927SAndroid Build Coastguard Worker   external_declaration
399*61046927SAndroid Build Coastguard Worker   {
400*61046927SAndroid Build Coastguard Worker      /* FINISHME: The NULL test is required because pragmas are set to
401*61046927SAndroid Build Coastguard Worker       * FINISHME: NULL. (See production rule for external_declaration.)
402*61046927SAndroid Build Coastguard Worker       */
403*61046927SAndroid Build Coastguard Worker      if ($1 != NULL)
404*61046927SAndroid Build Coastguard Worker         state->translation_unit.push_tail(& $1->link);
405*61046927SAndroid Build Coastguard Worker   }
406*61046927SAndroid Build Coastguard Worker   | external_declaration_list external_declaration
407*61046927SAndroid Build Coastguard Worker   {
408*61046927SAndroid Build Coastguard Worker      /* FINISHME: The NULL test is required because pragmas are set to
409*61046927SAndroid Build Coastguard Worker       * FINISHME: NULL. (See production rule for external_declaration.)
410*61046927SAndroid Build Coastguard Worker       */
411*61046927SAndroid Build Coastguard Worker      if ($2 != NULL)
412*61046927SAndroid Build Coastguard Worker         state->translation_unit.push_tail(& $2->link);
413*61046927SAndroid Build Coastguard Worker   }
414*61046927SAndroid Build Coastguard Worker   | external_declaration_list extension_statement {
415*61046927SAndroid Build Coastguard Worker      if (!state->allow_extension_directive_midshader) {
416*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(& @2, state,
417*61046927SAndroid Build Coastguard Worker                          "#extension directive is not allowed "
418*61046927SAndroid Build Coastguard Worker                          "in the middle of a shader");
419*61046927SAndroid Build Coastguard Worker         YYERROR;
420*61046927SAndroid Build Coastguard Worker      }
421*61046927SAndroid Build Coastguard Worker   }
422*61046927SAndroid Build Coastguard Worker   ;
423*61046927SAndroid Build Coastguard Worker
424*61046927SAndroid Build Coastguard Workervariable_identifier:
425*61046927SAndroid Build Coastguard Worker   IDENTIFIER
426*61046927SAndroid Build Coastguard Worker   | NEW_IDENTIFIER
427*61046927SAndroid Build Coastguard Worker   ;
428*61046927SAndroid Build Coastguard Worker
429*61046927SAndroid Build Coastguard Workerprimary_expression:
430*61046927SAndroid Build Coastguard Worker   variable_identifier
431*61046927SAndroid Build Coastguard Worker   {
432*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
433*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression(ast_identifier, NULL, NULL, NULL);
434*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
435*61046927SAndroid Build Coastguard Worker      $$->primary_expression.identifier = $1;
436*61046927SAndroid Build Coastguard Worker   }
437*61046927SAndroid Build Coastguard Worker   | INTCONSTANT
438*61046927SAndroid Build Coastguard Worker   {
439*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
440*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression(ast_int_constant, NULL, NULL, NULL);
441*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
442*61046927SAndroid Build Coastguard Worker      $$->primary_expression.int_constant = $1;
443*61046927SAndroid Build Coastguard Worker   }
444*61046927SAndroid Build Coastguard Worker   | UINTCONSTANT
445*61046927SAndroid Build Coastguard Worker   {
446*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
447*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression(ast_uint_constant, NULL, NULL, NULL);
448*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
449*61046927SAndroid Build Coastguard Worker      $$->primary_expression.uint_constant = $1;
450*61046927SAndroid Build Coastguard Worker   }
451*61046927SAndroid Build Coastguard Worker   | INT64CONSTANT
452*61046927SAndroid Build Coastguard Worker   {
453*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
454*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression(ast_int64_constant, NULL, NULL, NULL);
455*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
456*61046927SAndroid Build Coastguard Worker      $$->primary_expression.int64_constant = $1;
457*61046927SAndroid Build Coastguard Worker   }
458*61046927SAndroid Build Coastguard Worker   | UINT64CONSTANT
459*61046927SAndroid Build Coastguard Worker   {
460*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
461*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression(ast_uint64_constant, NULL, NULL, NULL);
462*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
463*61046927SAndroid Build Coastguard Worker      $$->primary_expression.uint64_constant = $1;
464*61046927SAndroid Build Coastguard Worker   }
465*61046927SAndroid Build Coastguard Worker   | FLOAT16CONSTANT
466*61046927SAndroid Build Coastguard Worker   {
467*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
468*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression(ast_float16_constant, NULL, NULL, NULL);
469*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
470*61046927SAndroid Build Coastguard Worker      $$->primary_expression.float16_constant = $1;
471*61046927SAndroid Build Coastguard Worker   }
472*61046927SAndroid Build Coastguard Worker   | FLOATCONSTANT
473*61046927SAndroid Build Coastguard Worker   {
474*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
475*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression(ast_float_constant, NULL, NULL, NULL);
476*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
477*61046927SAndroid Build Coastguard Worker      $$->primary_expression.float_constant = $1;
478*61046927SAndroid Build Coastguard Worker   }
479*61046927SAndroid Build Coastguard Worker   | DOUBLECONSTANT
480*61046927SAndroid Build Coastguard Worker   {
481*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
482*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression(ast_double_constant, NULL, NULL, NULL);
483*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
484*61046927SAndroid Build Coastguard Worker      $$->primary_expression.double_constant = $1;
485*61046927SAndroid Build Coastguard Worker   }
486*61046927SAndroid Build Coastguard Worker   | BOOLCONSTANT
487*61046927SAndroid Build Coastguard Worker   {
488*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
489*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression(ast_bool_constant, NULL, NULL, NULL);
490*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
491*61046927SAndroid Build Coastguard Worker      $$->primary_expression.bool_constant = $1;
492*61046927SAndroid Build Coastguard Worker   }
493*61046927SAndroid Build Coastguard Worker   | '(' expression ')'
494*61046927SAndroid Build Coastguard Worker   {
495*61046927SAndroid Build Coastguard Worker      $$ = $2;
496*61046927SAndroid Build Coastguard Worker   }
497*61046927SAndroid Build Coastguard Worker   ;
498*61046927SAndroid Build Coastguard Worker
499*61046927SAndroid Build Coastguard Workerpostfix_expression:
500*61046927SAndroid Build Coastguard Worker   primary_expression
501*61046927SAndroid Build Coastguard Worker   | postfix_expression '[' integer_expression ']'
502*61046927SAndroid Build Coastguard Worker   {
503*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
504*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression(ast_array_index, $1, $3, NULL);
505*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @4);
506*61046927SAndroid Build Coastguard Worker   }
507*61046927SAndroid Build Coastguard Worker   | function_call
508*61046927SAndroid Build Coastguard Worker   {
509*61046927SAndroid Build Coastguard Worker      $$ = $1;
510*61046927SAndroid Build Coastguard Worker   }
511*61046927SAndroid Build Coastguard Worker   | postfix_expression DOT_TOK FIELD_SELECTION
512*61046927SAndroid Build Coastguard Worker   {
513*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
514*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression(ast_field_selection, $1, NULL, NULL);
515*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
516*61046927SAndroid Build Coastguard Worker      $$->primary_expression.identifier = $3;
517*61046927SAndroid Build Coastguard Worker   }
518*61046927SAndroid Build Coastguard Worker   | postfix_expression INC_OP
519*61046927SAndroid Build Coastguard Worker   {
520*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
521*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression(ast_post_inc, $1, NULL, NULL);
522*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @2);
523*61046927SAndroid Build Coastguard Worker   }
524*61046927SAndroid Build Coastguard Worker   | postfix_expression DEC_OP
525*61046927SAndroid Build Coastguard Worker   {
526*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
527*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression(ast_post_dec, $1, NULL, NULL);
528*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @2);
529*61046927SAndroid Build Coastguard Worker   }
530*61046927SAndroid Build Coastguard Worker   ;
531*61046927SAndroid Build Coastguard Worker
532*61046927SAndroid Build Coastguard Workerinteger_expression:
533*61046927SAndroid Build Coastguard Worker   expression
534*61046927SAndroid Build Coastguard Worker   ;
535*61046927SAndroid Build Coastguard Worker
536*61046927SAndroid Build Coastguard Workerfunction_call:
537*61046927SAndroid Build Coastguard Worker   function_call_or_method
538*61046927SAndroid Build Coastguard Worker   ;
539*61046927SAndroid Build Coastguard Worker
540*61046927SAndroid Build Coastguard Workerfunction_call_or_method:
541*61046927SAndroid Build Coastguard Worker   function_call_generic
542*61046927SAndroid Build Coastguard Worker   ;
543*61046927SAndroid Build Coastguard Worker
544*61046927SAndroid Build Coastguard Workerfunction_call_generic:
545*61046927SAndroid Build Coastguard Worker   function_call_header_with_parameters ')'
546*61046927SAndroid Build Coastguard Worker   | function_call_header_no_parameters ')'
547*61046927SAndroid Build Coastguard Worker   ;
548*61046927SAndroid Build Coastguard Worker
549*61046927SAndroid Build Coastguard Workerfunction_call_header_no_parameters:
550*61046927SAndroid Build Coastguard Worker   function_call_header VOID_TOK
551*61046927SAndroid Build Coastguard Worker   | function_call_header
552*61046927SAndroid Build Coastguard Worker   ;
553*61046927SAndroid Build Coastguard Worker
554*61046927SAndroid Build Coastguard Workerfunction_call_header_with_parameters:
555*61046927SAndroid Build Coastguard Worker   function_call_header assignment_expression
556*61046927SAndroid Build Coastguard Worker   {
557*61046927SAndroid Build Coastguard Worker      $$ = $1;
558*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
559*61046927SAndroid Build Coastguard Worker      $$->expressions.push_tail(& $2->link);
560*61046927SAndroid Build Coastguard Worker   }
561*61046927SAndroid Build Coastguard Worker   | function_call_header_with_parameters ',' assignment_expression
562*61046927SAndroid Build Coastguard Worker   {
563*61046927SAndroid Build Coastguard Worker      $$ = $1;
564*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
565*61046927SAndroid Build Coastguard Worker      $$->expressions.push_tail(& $3->link);
566*61046927SAndroid Build Coastguard Worker   }
567*61046927SAndroid Build Coastguard Worker   ;
568*61046927SAndroid Build Coastguard Worker
569*61046927SAndroid Build Coastguard Worker   // Grammar Note: Constructors look like functions, but lexical
570*61046927SAndroid Build Coastguard Worker   // analysis recognized most of them as keywords. They are now
571*61046927SAndroid Build Coastguard Worker   // recognized through "type_specifier".
572*61046927SAndroid Build Coastguard Workerfunction_call_header:
573*61046927SAndroid Build Coastguard Worker   function_identifier '('
574*61046927SAndroid Build Coastguard Worker   ;
575*61046927SAndroid Build Coastguard Worker
576*61046927SAndroid Build Coastguard Workerfunction_identifier:
577*61046927SAndroid Build Coastguard Worker   type_specifier
578*61046927SAndroid Build Coastguard Worker   {
579*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
580*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_function_expression($1);
581*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
582*61046927SAndroid Build Coastguard Worker      }
583*61046927SAndroid Build Coastguard Worker   | postfix_expression
584*61046927SAndroid Build Coastguard Worker   {
585*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
586*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_function_expression($1);
587*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
588*61046927SAndroid Build Coastguard Worker      }
589*61046927SAndroid Build Coastguard Worker   ;
590*61046927SAndroid Build Coastguard Worker
591*61046927SAndroid Build Coastguard Worker   // Grammar Note: Constructors look like methods, but lexical
592*61046927SAndroid Build Coastguard Worker   // analysis recognized most of them as keywords. They are now
593*61046927SAndroid Build Coastguard Worker   // recognized through "type_specifier".
594*61046927SAndroid Build Coastguard Worker
595*61046927SAndroid Build Coastguard Worker   // Grammar Note: No traditional style type casts.
596*61046927SAndroid Build Coastguard Workerunary_expression:
597*61046927SAndroid Build Coastguard Worker   postfix_expression
598*61046927SAndroid Build Coastguard Worker   | INC_OP unary_expression
599*61046927SAndroid Build Coastguard Worker   {
600*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
601*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression(ast_pre_inc, $2, NULL, NULL);
602*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
603*61046927SAndroid Build Coastguard Worker   }
604*61046927SAndroid Build Coastguard Worker   | DEC_OP unary_expression
605*61046927SAndroid Build Coastguard Worker   {
606*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
607*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression(ast_pre_dec, $2, NULL, NULL);
608*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
609*61046927SAndroid Build Coastguard Worker   }
610*61046927SAndroid Build Coastguard Worker   | unary_operator unary_expression
611*61046927SAndroid Build Coastguard Worker   {
612*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
613*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression($1, $2, NULL, NULL);
614*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @2);
615*61046927SAndroid Build Coastguard Worker   }
616*61046927SAndroid Build Coastguard Worker   ;
617*61046927SAndroid Build Coastguard Worker
618*61046927SAndroid Build Coastguard Worker   // Grammar Note: No '*' or '&' unary ops. Pointers are not supported.
619*61046927SAndroid Build Coastguard Workerunary_operator:
620*61046927SAndroid Build Coastguard Worker   '+'   { $$ = ast_plus; }
621*61046927SAndroid Build Coastguard Worker   | '-' { $$ = ast_neg; }
622*61046927SAndroid Build Coastguard Worker   | '!' { $$ = ast_logic_not; }
623*61046927SAndroid Build Coastguard Worker   | '~' { $$ = ast_bit_not; }
624*61046927SAndroid Build Coastguard Worker   ;
625*61046927SAndroid Build Coastguard Worker
626*61046927SAndroid Build Coastguard Workermultiplicative_expression:
627*61046927SAndroid Build Coastguard Worker   unary_expression
628*61046927SAndroid Build Coastguard Worker   | multiplicative_expression '*' unary_expression
629*61046927SAndroid Build Coastguard Worker   {
630*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
631*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression_bin(ast_mul, $1, $3);
632*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
633*61046927SAndroid Build Coastguard Worker   }
634*61046927SAndroid Build Coastguard Worker   | multiplicative_expression '/' unary_expression
635*61046927SAndroid Build Coastguard Worker   {
636*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
637*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression_bin(ast_div, $1, $3);
638*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
639*61046927SAndroid Build Coastguard Worker   }
640*61046927SAndroid Build Coastguard Worker   | multiplicative_expression '%' unary_expression
641*61046927SAndroid Build Coastguard Worker   {
642*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
643*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression_bin(ast_mod, $1, $3);
644*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
645*61046927SAndroid Build Coastguard Worker   }
646*61046927SAndroid Build Coastguard Worker   ;
647*61046927SAndroid Build Coastguard Worker
648*61046927SAndroid Build Coastguard Workeradditive_expression:
649*61046927SAndroid Build Coastguard Worker   multiplicative_expression
650*61046927SAndroid Build Coastguard Worker   | additive_expression '+' multiplicative_expression
651*61046927SAndroid Build Coastguard Worker   {
652*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
653*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression_bin(ast_add, $1, $3);
654*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
655*61046927SAndroid Build Coastguard Worker   }
656*61046927SAndroid Build Coastguard Worker   | additive_expression '-' multiplicative_expression
657*61046927SAndroid Build Coastguard Worker   {
658*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
659*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression_bin(ast_sub, $1, $3);
660*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
661*61046927SAndroid Build Coastguard Worker   }
662*61046927SAndroid Build Coastguard Worker   ;
663*61046927SAndroid Build Coastguard Worker
664*61046927SAndroid Build Coastguard Workershift_expression:
665*61046927SAndroid Build Coastguard Worker   additive_expression
666*61046927SAndroid Build Coastguard Worker   | shift_expression LEFT_OP additive_expression
667*61046927SAndroid Build Coastguard Worker   {
668*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
669*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression_bin(ast_lshift, $1, $3);
670*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
671*61046927SAndroid Build Coastguard Worker   }
672*61046927SAndroid Build Coastguard Worker   | shift_expression RIGHT_OP additive_expression
673*61046927SAndroid Build Coastguard Worker   {
674*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
675*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression_bin(ast_rshift, $1, $3);
676*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
677*61046927SAndroid Build Coastguard Worker   }
678*61046927SAndroid Build Coastguard Worker   ;
679*61046927SAndroid Build Coastguard Worker
680*61046927SAndroid Build Coastguard Workerrelational_expression:
681*61046927SAndroid Build Coastguard Worker   shift_expression
682*61046927SAndroid Build Coastguard Worker   | relational_expression '<' shift_expression
683*61046927SAndroid Build Coastguard Worker   {
684*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
685*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression_bin(ast_less, $1, $3);
686*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
687*61046927SAndroid Build Coastguard Worker   }
688*61046927SAndroid Build Coastguard Worker   | relational_expression '>' shift_expression
689*61046927SAndroid Build Coastguard Worker   {
690*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
691*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression_bin(ast_greater, $1, $3);
692*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
693*61046927SAndroid Build Coastguard Worker   }
694*61046927SAndroid Build Coastguard Worker   | relational_expression LE_OP shift_expression
695*61046927SAndroid Build Coastguard Worker   {
696*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
697*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression_bin(ast_lequal, $1, $3);
698*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
699*61046927SAndroid Build Coastguard Worker   }
700*61046927SAndroid Build Coastguard Worker   | relational_expression GE_OP shift_expression
701*61046927SAndroid Build Coastguard Worker   {
702*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
703*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression_bin(ast_gequal, $1, $3);
704*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
705*61046927SAndroid Build Coastguard Worker   }
706*61046927SAndroid Build Coastguard Worker   ;
707*61046927SAndroid Build Coastguard Worker
708*61046927SAndroid Build Coastguard Workerequality_expression:
709*61046927SAndroid Build Coastguard Worker   relational_expression
710*61046927SAndroid Build Coastguard Worker   | equality_expression EQ_OP relational_expression
711*61046927SAndroid Build Coastguard Worker   {
712*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
713*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression_bin(ast_equal, $1, $3);
714*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
715*61046927SAndroid Build Coastguard Worker   }
716*61046927SAndroid Build Coastguard Worker   | equality_expression NE_OP relational_expression
717*61046927SAndroid Build Coastguard Worker   {
718*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
719*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression_bin(ast_nequal, $1, $3);
720*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
721*61046927SAndroid Build Coastguard Worker   }
722*61046927SAndroid Build Coastguard Worker   ;
723*61046927SAndroid Build Coastguard Worker
724*61046927SAndroid Build Coastguard Workerand_expression:
725*61046927SAndroid Build Coastguard Worker   equality_expression
726*61046927SAndroid Build Coastguard Worker   | and_expression '&' equality_expression
727*61046927SAndroid Build Coastguard Worker   {
728*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
729*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression_bin(ast_bit_and, $1, $3);
730*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
731*61046927SAndroid Build Coastguard Worker   }
732*61046927SAndroid Build Coastguard Worker   ;
733*61046927SAndroid Build Coastguard Worker
734*61046927SAndroid Build Coastguard Workerexclusive_or_expression:
735*61046927SAndroid Build Coastguard Worker   and_expression
736*61046927SAndroid Build Coastguard Worker   | exclusive_or_expression '^' and_expression
737*61046927SAndroid Build Coastguard Worker   {
738*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
739*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression_bin(ast_bit_xor, $1, $3);
740*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
741*61046927SAndroid Build Coastguard Worker   }
742*61046927SAndroid Build Coastguard Worker   ;
743*61046927SAndroid Build Coastguard Worker
744*61046927SAndroid Build Coastguard Workerinclusive_or_expression:
745*61046927SAndroid Build Coastguard Worker   exclusive_or_expression
746*61046927SAndroid Build Coastguard Worker   | inclusive_or_expression '|' exclusive_or_expression
747*61046927SAndroid Build Coastguard Worker   {
748*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
749*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression_bin(ast_bit_or, $1, $3);
750*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
751*61046927SAndroid Build Coastguard Worker   }
752*61046927SAndroid Build Coastguard Worker   ;
753*61046927SAndroid Build Coastguard Worker
754*61046927SAndroid Build Coastguard Workerlogical_and_expression:
755*61046927SAndroid Build Coastguard Worker   inclusive_or_expression
756*61046927SAndroid Build Coastguard Worker   | logical_and_expression AND_OP inclusive_or_expression
757*61046927SAndroid Build Coastguard Worker   {
758*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
759*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression_bin(ast_logic_and, $1, $3);
760*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
761*61046927SAndroid Build Coastguard Worker   }
762*61046927SAndroid Build Coastguard Worker   ;
763*61046927SAndroid Build Coastguard Worker
764*61046927SAndroid Build Coastguard Workerlogical_xor_expression:
765*61046927SAndroid Build Coastguard Worker   logical_and_expression
766*61046927SAndroid Build Coastguard Worker   | logical_xor_expression XOR_OP logical_and_expression
767*61046927SAndroid Build Coastguard Worker   {
768*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
769*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression_bin(ast_logic_xor, $1, $3);
770*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
771*61046927SAndroid Build Coastguard Worker   }
772*61046927SAndroid Build Coastguard Worker   ;
773*61046927SAndroid Build Coastguard Worker
774*61046927SAndroid Build Coastguard Workerlogical_or_expression:
775*61046927SAndroid Build Coastguard Worker   logical_xor_expression
776*61046927SAndroid Build Coastguard Worker   | logical_or_expression OR_OP logical_xor_expression
777*61046927SAndroid Build Coastguard Worker   {
778*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
779*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression_bin(ast_logic_or, $1, $3);
780*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
781*61046927SAndroid Build Coastguard Worker   }
782*61046927SAndroid Build Coastguard Worker   ;
783*61046927SAndroid Build Coastguard Worker
784*61046927SAndroid Build Coastguard Workerconditional_expression:
785*61046927SAndroid Build Coastguard Worker   logical_or_expression
786*61046927SAndroid Build Coastguard Worker   | logical_or_expression '?' expression ':' assignment_expression
787*61046927SAndroid Build Coastguard Worker   {
788*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
789*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression(ast_conditional, $1, $3, $5);
790*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @5);
791*61046927SAndroid Build Coastguard Worker   }
792*61046927SAndroid Build Coastguard Worker   ;
793*61046927SAndroid Build Coastguard Worker
794*61046927SAndroid Build Coastguard Workerassignment_expression:
795*61046927SAndroid Build Coastguard Worker   conditional_expression
796*61046927SAndroid Build Coastguard Worker   | unary_expression assignment_operator assignment_expression
797*61046927SAndroid Build Coastguard Worker   {
798*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
799*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression($2, $1, $3, NULL);
800*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
801*61046927SAndroid Build Coastguard Worker   }
802*61046927SAndroid Build Coastguard Worker   ;
803*61046927SAndroid Build Coastguard Worker
804*61046927SAndroid Build Coastguard Workerassignment_operator:
805*61046927SAndroid Build Coastguard Worker   '='                { $$ = ast_assign; }
806*61046927SAndroid Build Coastguard Worker   | MUL_ASSIGN       { $$ = ast_mul_assign; }
807*61046927SAndroid Build Coastguard Worker   | DIV_ASSIGN       { $$ = ast_div_assign; }
808*61046927SAndroid Build Coastguard Worker   | MOD_ASSIGN       { $$ = ast_mod_assign; }
809*61046927SAndroid Build Coastguard Worker   | ADD_ASSIGN       { $$ = ast_add_assign; }
810*61046927SAndroid Build Coastguard Worker   | SUB_ASSIGN       { $$ = ast_sub_assign; }
811*61046927SAndroid Build Coastguard Worker   | LEFT_ASSIGN      { $$ = ast_ls_assign; }
812*61046927SAndroid Build Coastguard Worker   | RIGHT_ASSIGN     { $$ = ast_rs_assign; }
813*61046927SAndroid Build Coastguard Worker   | AND_ASSIGN       { $$ = ast_and_assign; }
814*61046927SAndroid Build Coastguard Worker   | XOR_ASSIGN       { $$ = ast_xor_assign; }
815*61046927SAndroid Build Coastguard Worker   | OR_ASSIGN        { $$ = ast_or_assign; }
816*61046927SAndroid Build Coastguard Worker   ;
817*61046927SAndroid Build Coastguard Worker
818*61046927SAndroid Build Coastguard Workerexpression:
819*61046927SAndroid Build Coastguard Worker   assignment_expression
820*61046927SAndroid Build Coastguard Worker   {
821*61046927SAndroid Build Coastguard Worker      $$ = $1;
822*61046927SAndroid Build Coastguard Worker   }
823*61046927SAndroid Build Coastguard Worker   | expression ',' assignment_expression
824*61046927SAndroid Build Coastguard Worker   {
825*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
826*61046927SAndroid Build Coastguard Worker      if ($1->oper != ast_sequence) {
827*61046927SAndroid Build Coastguard Worker         $$ = new(ctx) ast_expression(ast_sequence, NULL, NULL, NULL);
828*61046927SAndroid Build Coastguard Worker         $$->set_location_range(@1, @3);
829*61046927SAndroid Build Coastguard Worker         $$->expressions.push_tail(& $1->link);
830*61046927SAndroid Build Coastguard Worker      } else {
831*61046927SAndroid Build Coastguard Worker         $$ = $1;
832*61046927SAndroid Build Coastguard Worker      }
833*61046927SAndroid Build Coastguard Worker
834*61046927SAndroid Build Coastguard Worker      $$->expressions.push_tail(& $3->link);
835*61046927SAndroid Build Coastguard Worker   }
836*61046927SAndroid Build Coastguard Worker   ;
837*61046927SAndroid Build Coastguard Worker
838*61046927SAndroid Build Coastguard Workerconstant_expression:
839*61046927SAndroid Build Coastguard Worker   conditional_expression
840*61046927SAndroid Build Coastguard Worker   ;
841*61046927SAndroid Build Coastguard Worker
842*61046927SAndroid Build Coastguard Workerdeclaration:
843*61046927SAndroid Build Coastguard Worker   function_prototype ';'
844*61046927SAndroid Build Coastguard Worker   {
845*61046927SAndroid Build Coastguard Worker      state->symbols->pop_scope();
846*61046927SAndroid Build Coastguard Worker      $$ = $1;
847*61046927SAndroid Build Coastguard Worker   }
848*61046927SAndroid Build Coastguard Worker   | init_declarator_list ';'
849*61046927SAndroid Build Coastguard Worker   {
850*61046927SAndroid Build Coastguard Worker      $$ = $1;
851*61046927SAndroid Build Coastguard Worker   }
852*61046927SAndroid Build Coastguard Worker   | PRECISION precision_qualifier type_specifier ';'
853*61046927SAndroid Build Coastguard Worker   {
854*61046927SAndroid Build Coastguard Worker      $3->default_precision = $2;
855*61046927SAndroid Build Coastguard Worker      $$ = $3;
856*61046927SAndroid Build Coastguard Worker   }
857*61046927SAndroid Build Coastguard Worker   | interface_block
858*61046927SAndroid Build Coastguard Worker   {
859*61046927SAndroid Build Coastguard Worker      ast_interface_block *block = (ast_interface_block *) $1;
860*61046927SAndroid Build Coastguard Worker      if (block->layout.has_layout() || block->layout.has_memory()) {
861*61046927SAndroid Build Coastguard Worker         if (!block->default_layout.merge_qualifier(& @1, state, block->layout, false)) {
862*61046927SAndroid Build Coastguard Worker            YYERROR;
863*61046927SAndroid Build Coastguard Worker         }
864*61046927SAndroid Build Coastguard Worker      }
865*61046927SAndroid Build Coastguard Worker      block->layout = block->default_layout;
866*61046927SAndroid Build Coastguard Worker      if (!block->layout.push_to_global(& @1, state)) {
867*61046927SAndroid Build Coastguard Worker         YYERROR;
868*61046927SAndroid Build Coastguard Worker      }
869*61046927SAndroid Build Coastguard Worker      $$ = $1;
870*61046927SAndroid Build Coastguard Worker   }
871*61046927SAndroid Build Coastguard Worker   ;
872*61046927SAndroid Build Coastguard Worker
873*61046927SAndroid Build Coastguard Workerfunction_prototype:
874*61046927SAndroid Build Coastguard Worker   function_declarator ')'
875*61046927SAndroid Build Coastguard Worker   ;
876*61046927SAndroid Build Coastguard Worker
877*61046927SAndroid Build Coastguard Workerfunction_declarator:
878*61046927SAndroid Build Coastguard Worker   function_header
879*61046927SAndroid Build Coastguard Worker   | function_header_with_parameters
880*61046927SAndroid Build Coastguard Worker   ;
881*61046927SAndroid Build Coastguard Worker
882*61046927SAndroid Build Coastguard Workerfunction_header_with_parameters:
883*61046927SAndroid Build Coastguard Worker   function_header parameter_declaration
884*61046927SAndroid Build Coastguard Worker   {
885*61046927SAndroid Build Coastguard Worker      $$ = $1;
886*61046927SAndroid Build Coastguard Worker      $$->parameters.push_tail(& $2->link);
887*61046927SAndroid Build Coastguard Worker   }
888*61046927SAndroid Build Coastguard Worker   | function_header_with_parameters ',' parameter_declaration
889*61046927SAndroid Build Coastguard Worker   {
890*61046927SAndroid Build Coastguard Worker      $$ = $1;
891*61046927SAndroid Build Coastguard Worker      $$->parameters.push_tail(& $3->link);
892*61046927SAndroid Build Coastguard Worker   }
893*61046927SAndroid Build Coastguard Worker   ;
894*61046927SAndroid Build Coastguard Worker
895*61046927SAndroid Build Coastguard Workerfunction_header:
896*61046927SAndroid Build Coastguard Worker   fully_specified_type variable_identifier '('
897*61046927SAndroid Build Coastguard Worker   {
898*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
899*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_function();
900*61046927SAndroid Build Coastguard Worker      $$->set_location(@2);
901*61046927SAndroid Build Coastguard Worker      $$->return_type = $1;
902*61046927SAndroid Build Coastguard Worker      $$->identifier = $2;
903*61046927SAndroid Build Coastguard Worker
904*61046927SAndroid Build Coastguard Worker      if ($1->qualifier.is_subroutine_decl()) {
905*61046927SAndroid Build Coastguard Worker         /* add type for IDENTIFIER search */
906*61046927SAndroid Build Coastguard Worker         state->symbols->add_type($2, glsl_subroutine_type($2));
907*61046927SAndroid Build Coastguard Worker      } else
908*61046927SAndroid Build Coastguard Worker         state->symbols->add_function(new(state) ir_function($2));
909*61046927SAndroid Build Coastguard Worker      state->symbols->push_scope();
910*61046927SAndroid Build Coastguard Worker   }
911*61046927SAndroid Build Coastguard Worker   ;
912*61046927SAndroid Build Coastguard Worker
913*61046927SAndroid Build Coastguard Workerparameter_declarator:
914*61046927SAndroid Build Coastguard Worker   type_specifier any_identifier
915*61046927SAndroid Build Coastguard Worker   {
916*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
917*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_parameter_declarator();
918*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @2);
919*61046927SAndroid Build Coastguard Worker      $$->type = new(ctx) ast_fully_specified_type();
920*61046927SAndroid Build Coastguard Worker      $$->type->set_location(@1);
921*61046927SAndroid Build Coastguard Worker      $$->type->specifier = $1;
922*61046927SAndroid Build Coastguard Worker      $$->identifier = $2;
923*61046927SAndroid Build Coastguard Worker      state->symbols->add_variable(new(state) ir_variable(NULL, $2, ir_var_auto));
924*61046927SAndroid Build Coastguard Worker   }
925*61046927SAndroid Build Coastguard Worker   | layout_qualifier type_specifier any_identifier
926*61046927SAndroid Build Coastguard Worker   {
927*61046927SAndroid Build Coastguard Worker      _mesa_glsl_error(&@1, state, "is is not allowed on function parameter");
928*61046927SAndroid Build Coastguard Worker      YYERROR;
929*61046927SAndroid Build Coastguard Worker   }
930*61046927SAndroid Build Coastguard Worker   | type_specifier any_identifier array_specifier
931*61046927SAndroid Build Coastguard Worker   {
932*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
933*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_parameter_declarator();
934*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
935*61046927SAndroid Build Coastguard Worker      $$->type = new(ctx) ast_fully_specified_type();
936*61046927SAndroid Build Coastguard Worker      $$->type->set_location(@1);
937*61046927SAndroid Build Coastguard Worker      $$->type->specifier = $1;
938*61046927SAndroid Build Coastguard Worker      $$->identifier = $2;
939*61046927SAndroid Build Coastguard Worker      $$->array_specifier = $3;
940*61046927SAndroid Build Coastguard Worker      state->symbols->add_variable(new(state) ir_variable(NULL, $2, ir_var_auto));
941*61046927SAndroid Build Coastguard Worker   }
942*61046927SAndroid Build Coastguard Worker   ;
943*61046927SAndroid Build Coastguard Worker
944*61046927SAndroid Build Coastguard Workerparameter_declaration:
945*61046927SAndroid Build Coastguard Worker   parameter_qualifier parameter_declarator
946*61046927SAndroid Build Coastguard Worker   {
947*61046927SAndroid Build Coastguard Worker      $$ = $2;
948*61046927SAndroid Build Coastguard Worker      $$->type->qualifier = $1;
949*61046927SAndroid Build Coastguard Worker      if (!$$->type->qualifier.push_to_global(& @1, state)) {
950*61046927SAndroid Build Coastguard Worker         YYERROR;
951*61046927SAndroid Build Coastguard Worker      }
952*61046927SAndroid Build Coastguard Worker   }
953*61046927SAndroid Build Coastguard Worker   | parameter_qualifier parameter_type_specifier
954*61046927SAndroid Build Coastguard Worker   {
955*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
956*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_parameter_declarator();
957*61046927SAndroid Build Coastguard Worker      $$->set_location(@2);
958*61046927SAndroid Build Coastguard Worker      $$->type = new(ctx) ast_fully_specified_type();
959*61046927SAndroid Build Coastguard Worker      $$->type->set_location_range(@1, @2);
960*61046927SAndroid Build Coastguard Worker      $$->type->qualifier = $1;
961*61046927SAndroid Build Coastguard Worker      if (!$$->type->qualifier.push_to_global(& @1, state)) {
962*61046927SAndroid Build Coastguard Worker         YYERROR;
963*61046927SAndroid Build Coastguard Worker      }
964*61046927SAndroid Build Coastguard Worker      $$->type->specifier = $2;
965*61046927SAndroid Build Coastguard Worker   }
966*61046927SAndroid Build Coastguard Worker   ;
967*61046927SAndroid Build Coastguard Worker
968*61046927SAndroid Build Coastguard Workerparameter_qualifier:
969*61046927SAndroid Build Coastguard Worker   /* empty */
970*61046927SAndroid Build Coastguard Worker   {
971*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
972*61046927SAndroid Build Coastguard Worker   }
973*61046927SAndroid Build Coastguard Worker   | CONST_TOK parameter_qualifier
974*61046927SAndroid Build Coastguard Worker   {
975*61046927SAndroid Build Coastguard Worker      if ($2.flags.q.constant)
976*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(&@1, state, "duplicate const qualifier");
977*61046927SAndroid Build Coastguard Worker
978*61046927SAndroid Build Coastguard Worker      $$ = $2;
979*61046927SAndroid Build Coastguard Worker      $$.flags.q.constant = 1;
980*61046927SAndroid Build Coastguard Worker   }
981*61046927SAndroid Build Coastguard Worker   | PRECISE parameter_qualifier
982*61046927SAndroid Build Coastguard Worker   {
983*61046927SAndroid Build Coastguard Worker      if ($2.flags.q.precise)
984*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(&@1, state, "duplicate precise qualifier");
985*61046927SAndroid Build Coastguard Worker
986*61046927SAndroid Build Coastguard Worker      $$ = $2;
987*61046927SAndroid Build Coastguard Worker      $$.flags.q.precise = 1;
988*61046927SAndroid Build Coastguard Worker   }
989*61046927SAndroid Build Coastguard Worker   | parameter_direction_qualifier parameter_qualifier
990*61046927SAndroid Build Coastguard Worker   {
991*61046927SAndroid Build Coastguard Worker      if (($1.flags.q.in || $1.flags.q.out) && ($2.flags.q.in || $2.flags.q.out))
992*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(&@1, state, "duplicate in/out/inout qualifier");
993*61046927SAndroid Build Coastguard Worker
994*61046927SAndroid Build Coastguard Worker      if (!state->has_420pack_or_es31() && $2.flags.q.constant)
995*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(&@1, state, "in/out/inout must come after const "
996*61046927SAndroid Build Coastguard Worker                                      "or precise");
997*61046927SAndroid Build Coastguard Worker
998*61046927SAndroid Build Coastguard Worker      $$ = $1;
999*61046927SAndroid Build Coastguard Worker      $$.merge_qualifier(&@1, state, $2, false);
1000*61046927SAndroid Build Coastguard Worker   }
1001*61046927SAndroid Build Coastguard Worker   | precision_qualifier parameter_qualifier
1002*61046927SAndroid Build Coastguard Worker   {
1003*61046927SAndroid Build Coastguard Worker      if ($2.precision != ast_precision_none)
1004*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(&@1, state, "duplicate precision qualifier");
1005*61046927SAndroid Build Coastguard Worker
1006*61046927SAndroid Build Coastguard Worker      if (!state->has_420pack_or_es31() &&
1007*61046927SAndroid Build Coastguard Worker          $2.flags.i != 0)
1008*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(&@1, state, "precision qualifiers must come last");
1009*61046927SAndroid Build Coastguard Worker
1010*61046927SAndroid Build Coastguard Worker      $$ = $2;
1011*61046927SAndroid Build Coastguard Worker      $$.precision = $1;
1012*61046927SAndroid Build Coastguard Worker   }
1013*61046927SAndroid Build Coastguard Worker   | memory_qualifier parameter_qualifier
1014*61046927SAndroid Build Coastguard Worker   {
1015*61046927SAndroid Build Coastguard Worker      $$ = $1;
1016*61046927SAndroid Build Coastguard Worker      $$.merge_qualifier(&@1, state, $2, false);
1017*61046927SAndroid Build Coastguard Worker   }
1018*61046927SAndroid Build Coastguard Worker
1019*61046927SAndroid Build Coastguard Workerparameter_direction_qualifier:
1020*61046927SAndroid Build Coastguard Worker   IN_TOK
1021*61046927SAndroid Build Coastguard Worker   {
1022*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
1023*61046927SAndroid Build Coastguard Worker      $$.flags.q.in = 1;
1024*61046927SAndroid Build Coastguard Worker   }
1025*61046927SAndroid Build Coastguard Worker   | OUT_TOK
1026*61046927SAndroid Build Coastguard Worker   {
1027*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
1028*61046927SAndroid Build Coastguard Worker      $$.flags.q.out = 1;
1029*61046927SAndroid Build Coastguard Worker   }
1030*61046927SAndroid Build Coastguard Worker   | INOUT_TOK
1031*61046927SAndroid Build Coastguard Worker   {
1032*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
1033*61046927SAndroid Build Coastguard Worker      $$.flags.q.in = 1;
1034*61046927SAndroid Build Coastguard Worker      $$.flags.q.out = 1;
1035*61046927SAndroid Build Coastguard Worker   }
1036*61046927SAndroid Build Coastguard Worker   ;
1037*61046927SAndroid Build Coastguard Worker
1038*61046927SAndroid Build Coastguard Workerparameter_type_specifier:
1039*61046927SAndroid Build Coastguard Worker   type_specifier
1040*61046927SAndroid Build Coastguard Worker   ;
1041*61046927SAndroid Build Coastguard Worker
1042*61046927SAndroid Build Coastguard Workerinit_declarator_list:
1043*61046927SAndroid Build Coastguard Worker   single_declaration
1044*61046927SAndroid Build Coastguard Worker   | init_declarator_list ',' any_identifier
1045*61046927SAndroid Build Coastguard Worker   {
1046*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
1047*61046927SAndroid Build Coastguard Worker      ast_declaration *decl = new(ctx) ast_declaration($3, NULL, NULL);
1048*61046927SAndroid Build Coastguard Worker      decl->set_location(@3);
1049*61046927SAndroid Build Coastguard Worker
1050*61046927SAndroid Build Coastguard Worker      $$ = $1;
1051*61046927SAndroid Build Coastguard Worker      $$->declarations.push_tail(&decl->link);
1052*61046927SAndroid Build Coastguard Worker      state->symbols->add_variable(new(state) ir_variable(NULL, $3, ir_var_auto));
1053*61046927SAndroid Build Coastguard Worker   }
1054*61046927SAndroid Build Coastguard Worker   | init_declarator_list ',' any_identifier array_specifier
1055*61046927SAndroid Build Coastguard Worker   {
1056*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
1057*61046927SAndroid Build Coastguard Worker      ast_declaration *decl = new(ctx) ast_declaration($3, $4, NULL);
1058*61046927SAndroid Build Coastguard Worker      decl->set_location_range(@3, @4);
1059*61046927SAndroid Build Coastguard Worker
1060*61046927SAndroid Build Coastguard Worker      $$ = $1;
1061*61046927SAndroid Build Coastguard Worker      $$->declarations.push_tail(&decl->link);
1062*61046927SAndroid Build Coastguard Worker      state->symbols->add_variable(new(state) ir_variable(NULL, $3, ir_var_auto));
1063*61046927SAndroid Build Coastguard Worker   }
1064*61046927SAndroid Build Coastguard Worker   | init_declarator_list ',' any_identifier array_specifier '=' initializer
1065*61046927SAndroid Build Coastguard Worker   {
1066*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
1067*61046927SAndroid Build Coastguard Worker      ast_declaration *decl = new(ctx) ast_declaration($3, $4, $6);
1068*61046927SAndroid Build Coastguard Worker      decl->set_location_range(@3, @4);
1069*61046927SAndroid Build Coastguard Worker
1070*61046927SAndroid Build Coastguard Worker      $$ = $1;
1071*61046927SAndroid Build Coastguard Worker      $$->declarations.push_tail(&decl->link);
1072*61046927SAndroid Build Coastguard Worker      state->symbols->add_variable(new(state) ir_variable(NULL, $3, ir_var_auto));
1073*61046927SAndroid Build Coastguard Worker   }
1074*61046927SAndroid Build Coastguard Worker   | init_declarator_list ',' any_identifier '=' initializer
1075*61046927SAndroid Build Coastguard Worker   {
1076*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
1077*61046927SAndroid Build Coastguard Worker      ast_declaration *decl = new(ctx) ast_declaration($3, NULL, $5);
1078*61046927SAndroid Build Coastguard Worker      decl->set_location(@3);
1079*61046927SAndroid Build Coastguard Worker
1080*61046927SAndroid Build Coastguard Worker      $$ = $1;
1081*61046927SAndroid Build Coastguard Worker      $$->declarations.push_tail(&decl->link);
1082*61046927SAndroid Build Coastguard Worker      state->symbols->add_variable(new(state) ir_variable(NULL, $3, ir_var_auto));
1083*61046927SAndroid Build Coastguard Worker   }
1084*61046927SAndroid Build Coastguard Worker   ;
1085*61046927SAndroid Build Coastguard Worker
1086*61046927SAndroid Build Coastguard Worker   // Grammar Note: No 'enum', or 'typedef'.
1087*61046927SAndroid Build Coastguard Workersingle_declaration:
1088*61046927SAndroid Build Coastguard Worker   fully_specified_type
1089*61046927SAndroid Build Coastguard Worker   {
1090*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
1091*61046927SAndroid Build Coastguard Worker      /* Empty declaration list is valid. */
1092*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_declarator_list($1);
1093*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
1094*61046927SAndroid Build Coastguard Worker   }
1095*61046927SAndroid Build Coastguard Worker   | fully_specified_type any_identifier
1096*61046927SAndroid Build Coastguard Worker   {
1097*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
1098*61046927SAndroid Build Coastguard Worker      ast_declaration *decl = new(ctx) ast_declaration($2, NULL, NULL);
1099*61046927SAndroid Build Coastguard Worker      decl->set_location(@2);
1100*61046927SAndroid Build Coastguard Worker
1101*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_declarator_list($1);
1102*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @2);
1103*61046927SAndroid Build Coastguard Worker      $$->declarations.push_tail(&decl->link);
1104*61046927SAndroid Build Coastguard Worker      state->symbols->add_variable(new(state) ir_variable(NULL, $2, ir_var_auto));
1105*61046927SAndroid Build Coastguard Worker   }
1106*61046927SAndroid Build Coastguard Worker   | fully_specified_type any_identifier array_specifier
1107*61046927SAndroid Build Coastguard Worker   {
1108*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
1109*61046927SAndroid Build Coastguard Worker      ast_declaration *decl = new(ctx) ast_declaration($2, $3, NULL);
1110*61046927SAndroid Build Coastguard Worker      decl->set_location_range(@2, @3);
1111*61046927SAndroid Build Coastguard Worker
1112*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_declarator_list($1);
1113*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
1114*61046927SAndroid Build Coastguard Worker      $$->declarations.push_tail(&decl->link);
1115*61046927SAndroid Build Coastguard Worker      state->symbols->add_variable(new(state) ir_variable(NULL, $2, ir_var_auto));
1116*61046927SAndroid Build Coastguard Worker   }
1117*61046927SAndroid Build Coastguard Worker   | fully_specified_type any_identifier array_specifier '=' initializer
1118*61046927SAndroid Build Coastguard Worker   {
1119*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
1120*61046927SAndroid Build Coastguard Worker      ast_declaration *decl = new(ctx) ast_declaration($2, $3, $5);
1121*61046927SAndroid Build Coastguard Worker      decl->set_location_range(@2, @3);
1122*61046927SAndroid Build Coastguard Worker
1123*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_declarator_list($1);
1124*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
1125*61046927SAndroid Build Coastguard Worker      $$->declarations.push_tail(&decl->link);
1126*61046927SAndroid Build Coastguard Worker      state->symbols->add_variable(new(state) ir_variable(NULL, $2, ir_var_auto));
1127*61046927SAndroid Build Coastguard Worker   }
1128*61046927SAndroid Build Coastguard Worker   | fully_specified_type any_identifier '=' initializer
1129*61046927SAndroid Build Coastguard Worker   {
1130*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
1131*61046927SAndroid Build Coastguard Worker      ast_declaration *decl = new(ctx) ast_declaration($2, NULL, $4);
1132*61046927SAndroid Build Coastguard Worker      decl->set_location(@2);
1133*61046927SAndroid Build Coastguard Worker
1134*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_declarator_list($1);
1135*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @2);
1136*61046927SAndroid Build Coastguard Worker      $$->declarations.push_tail(&decl->link);
1137*61046927SAndroid Build Coastguard Worker      state->symbols->add_variable(new(state) ir_variable(NULL, $2, ir_var_auto));
1138*61046927SAndroid Build Coastguard Worker   }
1139*61046927SAndroid Build Coastguard Worker   | INVARIANT variable_identifier
1140*61046927SAndroid Build Coastguard Worker   {
1141*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
1142*61046927SAndroid Build Coastguard Worker      ast_declaration *decl = new(ctx) ast_declaration($2, NULL, NULL);
1143*61046927SAndroid Build Coastguard Worker      decl->set_location(@2);
1144*61046927SAndroid Build Coastguard Worker
1145*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_declarator_list(NULL);
1146*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @2);
1147*61046927SAndroid Build Coastguard Worker      $$->invariant = true;
1148*61046927SAndroid Build Coastguard Worker
1149*61046927SAndroid Build Coastguard Worker      $$->declarations.push_tail(&decl->link);
1150*61046927SAndroid Build Coastguard Worker   }
1151*61046927SAndroid Build Coastguard Worker   | PRECISE variable_identifier
1152*61046927SAndroid Build Coastguard Worker   {
1153*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
1154*61046927SAndroid Build Coastguard Worker      ast_declaration *decl = new(ctx) ast_declaration($2, NULL, NULL);
1155*61046927SAndroid Build Coastguard Worker      decl->set_location(@2);
1156*61046927SAndroid Build Coastguard Worker
1157*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_declarator_list(NULL);
1158*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @2);
1159*61046927SAndroid Build Coastguard Worker      $$->precise = true;
1160*61046927SAndroid Build Coastguard Worker
1161*61046927SAndroid Build Coastguard Worker      $$->declarations.push_tail(&decl->link);
1162*61046927SAndroid Build Coastguard Worker   }
1163*61046927SAndroid Build Coastguard Worker   ;
1164*61046927SAndroid Build Coastguard Worker
1165*61046927SAndroid Build Coastguard Workerfully_specified_type:
1166*61046927SAndroid Build Coastguard Worker   type_specifier
1167*61046927SAndroid Build Coastguard Worker   {
1168*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
1169*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_fully_specified_type();
1170*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
1171*61046927SAndroid Build Coastguard Worker      $$->specifier = $1;
1172*61046927SAndroid Build Coastguard Worker   }
1173*61046927SAndroid Build Coastguard Worker   | type_qualifier type_specifier
1174*61046927SAndroid Build Coastguard Worker   {
1175*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
1176*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_fully_specified_type();
1177*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @2);
1178*61046927SAndroid Build Coastguard Worker      $$->qualifier = $1;
1179*61046927SAndroid Build Coastguard Worker      if (!$$->qualifier.push_to_global(& @1, state)) {
1180*61046927SAndroid Build Coastguard Worker         YYERROR;
1181*61046927SAndroid Build Coastguard Worker      }
1182*61046927SAndroid Build Coastguard Worker      $$->specifier = $2;
1183*61046927SAndroid Build Coastguard Worker      if ($$->specifier->structure != NULL &&
1184*61046927SAndroid Build Coastguard Worker          $$->specifier->structure->is_declaration) {
1185*61046927SAndroid Build Coastguard Worker            $$->specifier->structure->layout = &$$->qualifier;
1186*61046927SAndroid Build Coastguard Worker      }
1187*61046927SAndroid Build Coastguard Worker   }
1188*61046927SAndroid Build Coastguard Worker   ;
1189*61046927SAndroid Build Coastguard Worker
1190*61046927SAndroid Build Coastguard Workerlayout_qualifier:
1191*61046927SAndroid Build Coastguard Worker   LAYOUT_TOK '(' layout_qualifier_id_list ')'
1192*61046927SAndroid Build Coastguard Worker   {
1193*61046927SAndroid Build Coastguard Worker      $$ = $3;
1194*61046927SAndroid Build Coastguard Worker   }
1195*61046927SAndroid Build Coastguard Worker   ;
1196*61046927SAndroid Build Coastguard Worker
1197*61046927SAndroid Build Coastguard Workerlayout_qualifier_id_list:
1198*61046927SAndroid Build Coastguard Worker   layout_qualifier_id
1199*61046927SAndroid Build Coastguard Worker   | layout_qualifier_id_list ',' layout_qualifier_id
1200*61046927SAndroid Build Coastguard Worker   {
1201*61046927SAndroid Build Coastguard Worker      $$ = $1;
1202*61046927SAndroid Build Coastguard Worker      if (!$$.merge_qualifier(& @3, state, $3, true)) {
1203*61046927SAndroid Build Coastguard Worker         YYERROR;
1204*61046927SAndroid Build Coastguard Worker      }
1205*61046927SAndroid Build Coastguard Worker   }
1206*61046927SAndroid Build Coastguard Worker   ;
1207*61046927SAndroid Build Coastguard Worker
1208*61046927SAndroid Build Coastguard Workerlayout_qualifier_id:
1209*61046927SAndroid Build Coastguard Worker   any_identifier
1210*61046927SAndroid Build Coastguard Worker   {
1211*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
1212*61046927SAndroid Build Coastguard Worker
1213*61046927SAndroid Build Coastguard Worker      /* Layout qualifiers for ARB_fragment_coord_conventions. */
1214*61046927SAndroid Build Coastguard Worker      if (!$$.flags.i && (state->ARB_fragment_coord_conventions_enable ||
1215*61046927SAndroid Build Coastguard Worker                          state->is_version(150, 0))) {
1216*61046927SAndroid Build Coastguard Worker         if (match_layout_qualifier($1, "origin_upper_left", state) == 0) {
1217*61046927SAndroid Build Coastguard Worker            $$.flags.q.origin_upper_left = 1;
1218*61046927SAndroid Build Coastguard Worker         } else if (match_layout_qualifier($1, "pixel_center_integer",
1219*61046927SAndroid Build Coastguard Worker                                           state) == 0) {
1220*61046927SAndroid Build Coastguard Worker            $$.flags.q.pixel_center_integer = 1;
1221*61046927SAndroid Build Coastguard Worker         }
1222*61046927SAndroid Build Coastguard Worker
1223*61046927SAndroid Build Coastguard Worker         if ($$.flags.i && state->ARB_fragment_coord_conventions_warn) {
1224*61046927SAndroid Build Coastguard Worker            _mesa_glsl_warning(& @1, state,
1225*61046927SAndroid Build Coastguard Worker                               "GL_ARB_fragment_coord_conventions layout "
1226*61046927SAndroid Build Coastguard Worker                               "identifier `%s' used", $1);
1227*61046927SAndroid Build Coastguard Worker         }
1228*61046927SAndroid Build Coastguard Worker      }
1229*61046927SAndroid Build Coastguard Worker
1230*61046927SAndroid Build Coastguard Worker      /* Layout qualifiers for AMD/ARB_conservative_depth. */
1231*61046927SAndroid Build Coastguard Worker      if (!$$.flags.i &&
1232*61046927SAndroid Build Coastguard Worker          (state->AMD_conservative_depth_enable ||
1233*61046927SAndroid Build Coastguard Worker           state->ARB_conservative_depth_enable ||
1234*61046927SAndroid Build Coastguard Worker           state->is_version(420, 0))) {
1235*61046927SAndroid Build Coastguard Worker         if (match_layout_qualifier($1, "depth_any", state) == 0) {
1236*61046927SAndroid Build Coastguard Worker            $$.flags.q.depth_type = 1;
1237*61046927SAndroid Build Coastguard Worker            $$.depth_type = ast_depth_any;
1238*61046927SAndroid Build Coastguard Worker         } else if (match_layout_qualifier($1, "depth_greater", state) == 0) {
1239*61046927SAndroid Build Coastguard Worker            $$.flags.q.depth_type = 1;
1240*61046927SAndroid Build Coastguard Worker            $$.depth_type = ast_depth_greater;
1241*61046927SAndroid Build Coastguard Worker         } else if (match_layout_qualifier($1, "depth_less", state) == 0) {
1242*61046927SAndroid Build Coastguard Worker            $$.flags.q.depth_type = 1;
1243*61046927SAndroid Build Coastguard Worker            $$.depth_type = ast_depth_less;
1244*61046927SAndroid Build Coastguard Worker         } else if (match_layout_qualifier($1, "depth_unchanged",
1245*61046927SAndroid Build Coastguard Worker                                           state) == 0) {
1246*61046927SAndroid Build Coastguard Worker            $$.flags.q.depth_type = 1;
1247*61046927SAndroid Build Coastguard Worker            $$.depth_type = ast_depth_unchanged;
1248*61046927SAndroid Build Coastguard Worker         }
1249*61046927SAndroid Build Coastguard Worker
1250*61046927SAndroid Build Coastguard Worker         if ($$.flags.i && state->AMD_conservative_depth_warn) {
1251*61046927SAndroid Build Coastguard Worker            _mesa_glsl_warning(& @1, state,
1252*61046927SAndroid Build Coastguard Worker                               "GL_AMD_conservative_depth "
1253*61046927SAndroid Build Coastguard Worker                               "layout qualifier `%s' is used", $1);
1254*61046927SAndroid Build Coastguard Worker         }
1255*61046927SAndroid Build Coastguard Worker         if ($$.flags.i && state->ARB_conservative_depth_warn) {
1256*61046927SAndroid Build Coastguard Worker            _mesa_glsl_warning(& @1, state,
1257*61046927SAndroid Build Coastguard Worker                               "GL_ARB_conservative_depth "
1258*61046927SAndroid Build Coastguard Worker                               "layout qualifier `%s' is used", $1);
1259*61046927SAndroid Build Coastguard Worker         }
1260*61046927SAndroid Build Coastguard Worker      }
1261*61046927SAndroid Build Coastguard Worker
1262*61046927SAndroid Build Coastguard Worker      /* See also interface_block_layout_qualifier. */
1263*61046927SAndroid Build Coastguard Worker      if (!$$.flags.i && state->has_uniform_buffer_objects()) {
1264*61046927SAndroid Build Coastguard Worker         if (match_layout_qualifier($1, "std140", state) == 0) {
1265*61046927SAndroid Build Coastguard Worker            $$.flags.q.std140 = 1;
1266*61046927SAndroid Build Coastguard Worker         } else if (match_layout_qualifier($1, "shared", state) == 0) {
1267*61046927SAndroid Build Coastguard Worker            $$.flags.q.shared = 1;
1268*61046927SAndroid Build Coastguard Worker         } else if (match_layout_qualifier($1, "std430", state) == 0) {
1269*61046927SAndroid Build Coastguard Worker            $$.flags.q.std430 = 1;
1270*61046927SAndroid Build Coastguard Worker         } else if (match_layout_qualifier($1, "column_major", state) == 0) {
1271*61046927SAndroid Build Coastguard Worker            $$.flags.q.column_major = 1;
1272*61046927SAndroid Build Coastguard Worker         /* "row_major" is a reserved word in GLSL 1.30+. Its token is parsed
1273*61046927SAndroid Build Coastguard Worker          * below in the interface_block_layout_qualifier rule.
1274*61046927SAndroid Build Coastguard Worker          *
1275*61046927SAndroid Build Coastguard Worker          * It is not a reserved word in GLSL ES 3.00, so it's handled here as
1276*61046927SAndroid Build Coastguard Worker          * an identifier.
1277*61046927SAndroid Build Coastguard Worker          *
1278*61046927SAndroid Build Coastguard Worker          * Also, this takes care of alternate capitalizations of
1279*61046927SAndroid Build Coastguard Worker          * "row_major" (which is necessary because layout qualifiers
1280*61046927SAndroid Build Coastguard Worker          * are case-insensitive in desktop GLSL).
1281*61046927SAndroid Build Coastguard Worker          */
1282*61046927SAndroid Build Coastguard Worker         } else if (match_layout_qualifier($1, "row_major", state) == 0) {
1283*61046927SAndroid Build Coastguard Worker            $$.flags.q.row_major = 1;
1284*61046927SAndroid Build Coastguard Worker         /* "packed" is a reserved word in GLSL, and its token is
1285*61046927SAndroid Build Coastguard Worker          * parsed below in the interface_block_layout_qualifier rule.
1286*61046927SAndroid Build Coastguard Worker          * However, we must take care of alternate capitalizations of
1287*61046927SAndroid Build Coastguard Worker          * "packed", because layout qualifiers are case-insensitive
1288*61046927SAndroid Build Coastguard Worker          * in desktop GLSL.
1289*61046927SAndroid Build Coastguard Worker          */
1290*61046927SAndroid Build Coastguard Worker         } else if (match_layout_qualifier($1, "packed", state) == 0) {
1291*61046927SAndroid Build Coastguard Worker           $$.flags.q.packed = 1;
1292*61046927SAndroid Build Coastguard Worker         }
1293*61046927SAndroid Build Coastguard Worker
1294*61046927SAndroid Build Coastguard Worker         if ($$.flags.i && state->ARB_uniform_buffer_object_warn) {
1295*61046927SAndroid Build Coastguard Worker            _mesa_glsl_warning(& @1, state,
1296*61046927SAndroid Build Coastguard Worker                               "#version 140 / GL_ARB_uniform_buffer_object "
1297*61046927SAndroid Build Coastguard Worker                               "layout qualifier `%s' is used", $1);
1298*61046927SAndroid Build Coastguard Worker         }
1299*61046927SAndroid Build Coastguard Worker      }
1300*61046927SAndroid Build Coastguard Worker
1301*61046927SAndroid Build Coastguard Worker      /* Layout qualifiers for GLSL 1.50 geometry shaders. */
1302*61046927SAndroid Build Coastguard Worker      if (!$$.flags.i) {
1303*61046927SAndroid Build Coastguard Worker         static const struct {
1304*61046927SAndroid Build Coastguard Worker            const char *s;
1305*61046927SAndroid Build Coastguard Worker            GLenum e;
1306*61046927SAndroid Build Coastguard Worker         } map[] = {
1307*61046927SAndroid Build Coastguard Worker                 { "points", GL_POINTS },
1308*61046927SAndroid Build Coastguard Worker                 { "lines", GL_LINES },
1309*61046927SAndroid Build Coastguard Worker                 { "lines_adjacency", GL_LINES_ADJACENCY },
1310*61046927SAndroid Build Coastguard Worker                 { "line_strip", GL_LINE_STRIP },
1311*61046927SAndroid Build Coastguard Worker                 { "triangles", GL_TRIANGLES },
1312*61046927SAndroid Build Coastguard Worker                 { "triangles_adjacency", GL_TRIANGLES_ADJACENCY },
1313*61046927SAndroid Build Coastguard Worker                 { "triangle_strip", GL_TRIANGLE_STRIP },
1314*61046927SAndroid Build Coastguard Worker         };
1315*61046927SAndroid Build Coastguard Worker         for (unsigned i = 0; i < ARRAY_SIZE(map); i++) {
1316*61046927SAndroid Build Coastguard Worker            if (match_layout_qualifier($1, map[i].s, state) == 0) {
1317*61046927SAndroid Build Coastguard Worker               $$.flags.q.prim_type = 1;
1318*61046927SAndroid Build Coastguard Worker               $$.prim_type = map[i].e;
1319*61046927SAndroid Build Coastguard Worker               break;
1320*61046927SAndroid Build Coastguard Worker            }
1321*61046927SAndroid Build Coastguard Worker         }
1322*61046927SAndroid Build Coastguard Worker
1323*61046927SAndroid Build Coastguard Worker         if ($$.flags.i && !state->has_geometry_shader() &&
1324*61046927SAndroid Build Coastguard Worker             !state->has_tessellation_shader()) {
1325*61046927SAndroid Build Coastguard Worker            _mesa_glsl_error(& @1, state, "#version 150 layout "
1326*61046927SAndroid Build Coastguard Worker                             "qualifier `%s' used", $1);
1327*61046927SAndroid Build Coastguard Worker         }
1328*61046927SAndroid Build Coastguard Worker      }
1329*61046927SAndroid Build Coastguard Worker
1330*61046927SAndroid Build Coastguard Worker      /* Layout qualifiers for ARB_shader_image_load_store. */
1331*61046927SAndroid Build Coastguard Worker      if (state->has_shader_image_load_store()) {
1332*61046927SAndroid Build Coastguard Worker         if (!$$.flags.i) {
1333*61046927SAndroid Build Coastguard Worker            static const struct {
1334*61046927SAndroid Build Coastguard Worker               const char *name;
1335*61046927SAndroid Build Coastguard Worker               enum pipe_format format;
1336*61046927SAndroid Build Coastguard Worker               glsl_base_type base_type;
1337*61046927SAndroid Build Coastguard Worker               /** Minimum desktop GLSL version required for the image
1338*61046927SAndroid Build Coastguard Worker                * format.  Use 130 if already present in the original
1339*61046927SAndroid Build Coastguard Worker                * ARB extension.
1340*61046927SAndroid Build Coastguard Worker                */
1341*61046927SAndroid Build Coastguard Worker               unsigned required_glsl;
1342*61046927SAndroid Build Coastguard Worker               /** Minimum GLSL ES version required for the image format. */
1343*61046927SAndroid Build Coastguard Worker               unsigned required_essl;
1344*61046927SAndroid Build Coastguard Worker               /* NV_image_formats */
1345*61046927SAndroid Build Coastguard Worker               bool nv_image_formats;
1346*61046927SAndroid Build Coastguard Worker               bool ext_qualifiers;
1347*61046927SAndroid Build Coastguard Worker            } map[] = {
1348*61046927SAndroid Build Coastguard Worker               { "rgba32f", PIPE_FORMAT_R32G32B32A32_FLOAT, GLSL_TYPE_FLOAT, 130, 310, false, false },
1349*61046927SAndroid Build Coastguard Worker               { "rgba16f", PIPE_FORMAT_R16G16B16A16_FLOAT, GLSL_TYPE_FLOAT, 130, 310, false, false },
1350*61046927SAndroid Build Coastguard Worker               { "rg32f", PIPE_FORMAT_R32G32_FLOAT, GLSL_TYPE_FLOAT, 130, 0, true, false },
1351*61046927SAndroid Build Coastguard Worker               { "rg16f", PIPE_FORMAT_R16G16_FLOAT, GLSL_TYPE_FLOAT, 130, 0, true, false },
1352*61046927SAndroid Build Coastguard Worker               { "r11f_g11f_b10f", PIPE_FORMAT_R11G11B10_FLOAT, GLSL_TYPE_FLOAT, 130, 0, true, false },
1353*61046927SAndroid Build Coastguard Worker               { "r32f", PIPE_FORMAT_R32_FLOAT, GLSL_TYPE_FLOAT, 130, 310, false, false },
1354*61046927SAndroid Build Coastguard Worker               { "r16f", PIPE_FORMAT_R16_FLOAT, GLSL_TYPE_FLOAT, 130, 0, true, false },
1355*61046927SAndroid Build Coastguard Worker               { "rgba32ui", PIPE_FORMAT_R32G32B32A32_UINT, GLSL_TYPE_UINT, 130, 310, false, false },
1356*61046927SAndroid Build Coastguard Worker               { "rgba16ui", PIPE_FORMAT_R16G16B16A16_UINT, GLSL_TYPE_UINT, 130, 310, false, false },
1357*61046927SAndroid Build Coastguard Worker               { "rgb10_a2ui", PIPE_FORMAT_R10G10B10A2_UINT, GLSL_TYPE_UINT, 130, 0, true, false },
1358*61046927SAndroid Build Coastguard Worker               { "rgba8ui", PIPE_FORMAT_R8G8B8A8_UINT, GLSL_TYPE_UINT, 130, 310, false, false },
1359*61046927SAndroid Build Coastguard Worker               { "rg32ui", PIPE_FORMAT_R32G32_UINT, GLSL_TYPE_UINT, 130, 0, true, false },
1360*61046927SAndroid Build Coastguard Worker               { "rg16ui", PIPE_FORMAT_R16G16_UINT, GLSL_TYPE_UINT, 130, 0, true, false },
1361*61046927SAndroid Build Coastguard Worker               { "rg8ui", PIPE_FORMAT_R8G8_UINT, GLSL_TYPE_UINT, 130, 0, true, false },
1362*61046927SAndroid Build Coastguard Worker               { "r32ui", PIPE_FORMAT_R32_UINT, GLSL_TYPE_UINT, 130, 310, false, false },
1363*61046927SAndroid Build Coastguard Worker               { "r16ui", PIPE_FORMAT_R16_UINT, GLSL_TYPE_UINT, 130, 0, true, false },
1364*61046927SAndroid Build Coastguard Worker               { "r8ui", PIPE_FORMAT_R8_UINT, GLSL_TYPE_UINT, 130, 0, true, false },
1365*61046927SAndroid Build Coastguard Worker               { "rgba32i", PIPE_FORMAT_R32G32B32A32_SINT, GLSL_TYPE_INT, 130, 310, false, false },
1366*61046927SAndroid Build Coastguard Worker               { "rgba16i", PIPE_FORMAT_R16G16B16A16_SINT, GLSL_TYPE_INT, 130, 310, false, false },
1367*61046927SAndroid Build Coastguard Worker               { "rgba8i", PIPE_FORMAT_R8G8B8A8_SINT, GLSL_TYPE_INT, 130, 310, false, false },
1368*61046927SAndroid Build Coastguard Worker               { "rg32i", PIPE_FORMAT_R32G32_SINT, GLSL_TYPE_INT, 130, 0, true, false },
1369*61046927SAndroid Build Coastguard Worker               { "rg16i", PIPE_FORMAT_R16G16_SINT, GLSL_TYPE_INT, 130, 0, true, false },
1370*61046927SAndroid Build Coastguard Worker               { "rg8i", PIPE_FORMAT_R8G8_SINT, GLSL_TYPE_INT, 130, 0, true, false },
1371*61046927SAndroid Build Coastguard Worker               { "r32i", PIPE_FORMAT_R32_SINT, GLSL_TYPE_INT, 130, 310, false, false },
1372*61046927SAndroid Build Coastguard Worker               { "r16i", PIPE_FORMAT_R16_SINT, GLSL_TYPE_INT, 130, 0, true, false },
1373*61046927SAndroid Build Coastguard Worker               { "r8i", PIPE_FORMAT_R8_SINT, GLSL_TYPE_INT, 130, 0, true, false },
1374*61046927SAndroid Build Coastguard Worker               { "rgba16", PIPE_FORMAT_R16G16B16A16_UNORM, GLSL_TYPE_FLOAT, 130, 0, true, false },
1375*61046927SAndroid Build Coastguard Worker               { "rgb10_a2", PIPE_FORMAT_R10G10B10A2_UNORM, GLSL_TYPE_FLOAT, 130, 0, true, false },
1376*61046927SAndroid Build Coastguard Worker               { "rgba8", PIPE_FORMAT_R8G8B8A8_UNORM, GLSL_TYPE_FLOAT, 130, 310, false, false },
1377*61046927SAndroid Build Coastguard Worker               { "rg16", PIPE_FORMAT_R16G16_UNORM, GLSL_TYPE_FLOAT, 130, 0, true, false },
1378*61046927SAndroid Build Coastguard Worker               { "rg8", PIPE_FORMAT_R8G8_UNORM, GLSL_TYPE_FLOAT, 130, 0, true, false },
1379*61046927SAndroid Build Coastguard Worker               { "r16", PIPE_FORMAT_R16_UNORM, GLSL_TYPE_FLOAT, 130, 0, true, false },
1380*61046927SAndroid Build Coastguard Worker               { "r8", PIPE_FORMAT_R8_UNORM, GLSL_TYPE_FLOAT, 130, 0, true, false },
1381*61046927SAndroid Build Coastguard Worker               { "rgba16_snorm", PIPE_FORMAT_R16G16B16A16_SNORM, GLSL_TYPE_FLOAT, 130, 0, true, false },
1382*61046927SAndroid Build Coastguard Worker               { "rgba8_snorm", PIPE_FORMAT_R8G8B8A8_SNORM, GLSL_TYPE_FLOAT, 130, 310, false, false },
1383*61046927SAndroid Build Coastguard Worker               { "rg16_snorm", PIPE_FORMAT_R16G16_SNORM, GLSL_TYPE_FLOAT, 130, 0, true, false },
1384*61046927SAndroid Build Coastguard Worker               { "rg8_snorm", PIPE_FORMAT_R8G8_SNORM, GLSL_TYPE_FLOAT, 130, 0, true, false },
1385*61046927SAndroid Build Coastguard Worker               { "r16_snorm", PIPE_FORMAT_R16_SNORM, GLSL_TYPE_FLOAT, 130, 0, true, false },
1386*61046927SAndroid Build Coastguard Worker               { "r8_snorm", PIPE_FORMAT_R8_SNORM, GLSL_TYPE_FLOAT, 130, 0, true, false },
1387*61046927SAndroid Build Coastguard Worker
1388*61046927SAndroid Build Coastguard Worker               /* From GL_EXT_shader_image_load_store: */
1389*61046927SAndroid Build Coastguard Worker               /* base_type is incorrect but it'll be patched later when we know
1390*61046927SAndroid Build Coastguard Worker                * the variable type. See ast_to_hir.cpp */
1391*61046927SAndroid Build Coastguard Worker               { "size1x8", PIPE_FORMAT_R8_SINT, GLSL_TYPE_VOID, 130, 0, false, true },
1392*61046927SAndroid Build Coastguard Worker               { "size1x16", PIPE_FORMAT_R16_SINT, GLSL_TYPE_VOID, 130, 0, false, true },
1393*61046927SAndroid Build Coastguard Worker               { "size1x32", PIPE_FORMAT_R32_SINT, GLSL_TYPE_VOID, 130, 0, false, true },
1394*61046927SAndroid Build Coastguard Worker               { "size2x32", PIPE_FORMAT_R32G32_SINT, GLSL_TYPE_VOID, 130, 0, false, true },
1395*61046927SAndroid Build Coastguard Worker               { "size4x32", PIPE_FORMAT_R32G32B32A32_SINT, GLSL_TYPE_VOID, 130, 0, false, true },
1396*61046927SAndroid Build Coastguard Worker            };
1397*61046927SAndroid Build Coastguard Worker
1398*61046927SAndroid Build Coastguard Worker            for (unsigned i = 0; i < ARRAY_SIZE(map); i++) {
1399*61046927SAndroid Build Coastguard Worker               if ((state->is_version(map[i].required_glsl,
1400*61046927SAndroid Build Coastguard Worker                                      map[i].required_essl) ||
1401*61046927SAndroid Build Coastguard Worker                    (state->NV_image_formats_enable &&
1402*61046927SAndroid Build Coastguard Worker                     map[i].nv_image_formats)) &&
1403*61046927SAndroid Build Coastguard Worker                   match_layout_qualifier($1, map[i].name, state) == 0) {
1404*61046927SAndroid Build Coastguard Worker                  /* Skip ARB_shader_image_load_store qualifiers if not enabled */
1405*61046927SAndroid Build Coastguard Worker                  if (!map[i].ext_qualifiers && !(state->ARB_shader_image_load_store_enable ||
1406*61046927SAndroid Build Coastguard Worker                                                  state->is_version(420, 310))) {
1407*61046927SAndroid Build Coastguard Worker                     continue;
1408*61046927SAndroid Build Coastguard Worker                  }
1409*61046927SAndroid Build Coastguard Worker                  /* Skip EXT_shader_image_load_store qualifiers if not enabled */
1410*61046927SAndroid Build Coastguard Worker                  if (map[i].ext_qualifiers && !state->EXT_shader_image_load_store_enable) {
1411*61046927SAndroid Build Coastguard Worker                     continue;
1412*61046927SAndroid Build Coastguard Worker                  }
1413*61046927SAndroid Build Coastguard Worker                  $$.flags.q.explicit_image_format = 1;
1414*61046927SAndroid Build Coastguard Worker                  $$.image_format = map[i].format;
1415*61046927SAndroid Build Coastguard Worker                  $$.image_base_type = map[i].base_type;
1416*61046927SAndroid Build Coastguard Worker                  break;
1417*61046927SAndroid Build Coastguard Worker               }
1418*61046927SAndroid Build Coastguard Worker            }
1419*61046927SAndroid Build Coastguard Worker         }
1420*61046927SAndroid Build Coastguard Worker      }
1421*61046927SAndroid Build Coastguard Worker
1422*61046927SAndroid Build Coastguard Worker      if (!$$.flags.i) {
1423*61046927SAndroid Build Coastguard Worker         if (match_layout_qualifier($1, "early_fragment_tests", state) == 0) {
1424*61046927SAndroid Build Coastguard Worker            /* From section 4.4.1.3 of the GLSL 4.50 specification
1425*61046927SAndroid Build Coastguard Worker             * (Fragment Shader Inputs):
1426*61046927SAndroid Build Coastguard Worker             *
1427*61046927SAndroid Build Coastguard Worker             *  "Fragment shaders also allow the following layout
1428*61046927SAndroid Build Coastguard Worker             *   qualifier on in only (not with variable declarations)
1429*61046927SAndroid Build Coastguard Worker             *     layout-qualifier-id
1430*61046927SAndroid Build Coastguard Worker             *        early_fragment_tests
1431*61046927SAndroid Build Coastguard Worker             *   [...]"
1432*61046927SAndroid Build Coastguard Worker             */
1433*61046927SAndroid Build Coastguard Worker            if (state->stage != MESA_SHADER_FRAGMENT) {
1434*61046927SAndroid Build Coastguard Worker               _mesa_glsl_error(& @1, state,
1435*61046927SAndroid Build Coastguard Worker                                "early_fragment_tests layout qualifier only "
1436*61046927SAndroid Build Coastguard Worker                                "valid in fragment shaders");
1437*61046927SAndroid Build Coastguard Worker            }
1438*61046927SAndroid Build Coastguard Worker
1439*61046927SAndroid Build Coastguard Worker            $$.flags.q.early_fragment_tests = 1;
1440*61046927SAndroid Build Coastguard Worker         }
1441*61046927SAndroid Build Coastguard Worker
1442*61046927SAndroid Build Coastguard Worker         if (match_layout_qualifier($1, "inner_coverage", state) == 0) {
1443*61046927SAndroid Build Coastguard Worker            if (state->stage != MESA_SHADER_FRAGMENT) {
1444*61046927SAndroid Build Coastguard Worker               _mesa_glsl_error(& @1, state,
1445*61046927SAndroid Build Coastguard Worker                                "inner_coverage layout qualifier only "
1446*61046927SAndroid Build Coastguard Worker                                "valid in fragment shaders");
1447*61046927SAndroid Build Coastguard Worker            }
1448*61046927SAndroid Build Coastguard Worker
1449*61046927SAndroid Build Coastguard Worker            if (state->INTEL_conservative_rasterization_enable) {
1450*61046927SAndroid Build Coastguard Worker               $$.flags.q.inner_coverage = 1;
1451*61046927SAndroid Build Coastguard Worker            } else {
1452*61046927SAndroid Build Coastguard Worker               _mesa_glsl_error(& @1, state,
1453*61046927SAndroid Build Coastguard Worker                                "inner_coverage layout qualifier present, "
1454*61046927SAndroid Build Coastguard Worker                                "but the INTEL_conservative_rasterization extension "
1455*61046927SAndroid Build Coastguard Worker                                "is not enabled.");
1456*61046927SAndroid Build Coastguard Worker            }
1457*61046927SAndroid Build Coastguard Worker         }
1458*61046927SAndroid Build Coastguard Worker
1459*61046927SAndroid Build Coastguard Worker         if (match_layout_qualifier($1, "post_depth_coverage", state) == 0) {
1460*61046927SAndroid Build Coastguard Worker            if (state->stage != MESA_SHADER_FRAGMENT) {
1461*61046927SAndroid Build Coastguard Worker               _mesa_glsl_error(& @1, state,
1462*61046927SAndroid Build Coastguard Worker                                "post_depth_coverage layout qualifier only "
1463*61046927SAndroid Build Coastguard Worker                                "valid in fragment shaders");
1464*61046927SAndroid Build Coastguard Worker            }
1465*61046927SAndroid Build Coastguard Worker
1466*61046927SAndroid Build Coastguard Worker            if (state->ARB_post_depth_coverage_enable ||
1467*61046927SAndroid Build Coastguard Worker                state->INTEL_conservative_rasterization_enable) {
1468*61046927SAndroid Build Coastguard Worker               $$.flags.q.post_depth_coverage = 1;
1469*61046927SAndroid Build Coastguard Worker            } else {
1470*61046927SAndroid Build Coastguard Worker               _mesa_glsl_error(& @1, state,
1471*61046927SAndroid Build Coastguard Worker                                "post_depth_coverage layout qualifier present, "
1472*61046927SAndroid Build Coastguard Worker                                "but the GL_ARB_post_depth_coverage extension "
1473*61046927SAndroid Build Coastguard Worker                                "is not enabled.");
1474*61046927SAndroid Build Coastguard Worker            }
1475*61046927SAndroid Build Coastguard Worker         }
1476*61046927SAndroid Build Coastguard Worker
1477*61046927SAndroid Build Coastguard Worker         if ($$.flags.q.post_depth_coverage && $$.flags.q.inner_coverage) {
1478*61046927SAndroid Build Coastguard Worker            _mesa_glsl_error(& @1, state,
1479*61046927SAndroid Build Coastguard Worker                             "post_depth_coverage & inner_coverage layout qualifiers "
1480*61046927SAndroid Build Coastguard Worker                             "are mutually exclusive");
1481*61046927SAndroid Build Coastguard Worker         }
1482*61046927SAndroid Build Coastguard Worker      }
1483*61046927SAndroid Build Coastguard Worker
1484*61046927SAndroid Build Coastguard Worker      const bool pixel_interlock_ordered = match_layout_qualifier($1,
1485*61046927SAndroid Build Coastguard Worker         "pixel_interlock_ordered", state) == 0;
1486*61046927SAndroid Build Coastguard Worker      const bool pixel_interlock_unordered = match_layout_qualifier($1,
1487*61046927SAndroid Build Coastguard Worker         "pixel_interlock_unordered", state) == 0;
1488*61046927SAndroid Build Coastguard Worker      const bool sample_interlock_ordered = match_layout_qualifier($1,
1489*61046927SAndroid Build Coastguard Worker         "sample_interlock_ordered", state) == 0;
1490*61046927SAndroid Build Coastguard Worker      const bool sample_interlock_unordered = match_layout_qualifier($1,
1491*61046927SAndroid Build Coastguard Worker         "sample_interlock_unordered", state) == 0;
1492*61046927SAndroid Build Coastguard Worker
1493*61046927SAndroid Build Coastguard Worker      if (pixel_interlock_ordered + pixel_interlock_unordered +
1494*61046927SAndroid Build Coastguard Worker          sample_interlock_ordered + sample_interlock_unordered > 0 &&
1495*61046927SAndroid Build Coastguard Worker          state->stage != MESA_SHADER_FRAGMENT) {
1496*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(& @1, state, "interlock layout qualifiers: "
1497*61046927SAndroid Build Coastguard Worker                          "pixel_interlock_ordered, pixel_interlock_unordered, "
1498*61046927SAndroid Build Coastguard Worker                          "sample_interlock_ordered and sample_interlock_unordered, "
1499*61046927SAndroid Build Coastguard Worker                          "only valid in fragment shader input layout declaration.");
1500*61046927SAndroid Build Coastguard Worker      } else if (pixel_interlock_ordered + pixel_interlock_unordered +
1501*61046927SAndroid Build Coastguard Worker                 sample_interlock_ordered + sample_interlock_unordered > 0 &&
1502*61046927SAndroid Build Coastguard Worker                 !state->ARB_fragment_shader_interlock_enable &&
1503*61046927SAndroid Build Coastguard Worker                 !state->NV_fragment_shader_interlock_enable) {
1504*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(& @1, state,
1505*61046927SAndroid Build Coastguard Worker                          "interlock layout qualifier present, but the "
1506*61046927SAndroid Build Coastguard Worker                          "GL_ARB_fragment_shader_interlock or "
1507*61046927SAndroid Build Coastguard Worker                          "GL_NV_fragment_shader_interlock extension is not "
1508*61046927SAndroid Build Coastguard Worker                          "enabled.");
1509*61046927SAndroid Build Coastguard Worker      } else {
1510*61046927SAndroid Build Coastguard Worker         $$.flags.q.pixel_interlock_ordered = pixel_interlock_ordered;
1511*61046927SAndroid Build Coastguard Worker         $$.flags.q.pixel_interlock_unordered = pixel_interlock_unordered;
1512*61046927SAndroid Build Coastguard Worker         $$.flags.q.sample_interlock_ordered = sample_interlock_ordered;
1513*61046927SAndroid Build Coastguard Worker         $$.flags.q.sample_interlock_unordered = sample_interlock_unordered;
1514*61046927SAndroid Build Coastguard Worker      }
1515*61046927SAndroid Build Coastguard Worker
1516*61046927SAndroid Build Coastguard Worker      /* Layout qualifiers for tessellation evaluation shaders. */
1517*61046927SAndroid Build Coastguard Worker      if (!$$.flags.i) {
1518*61046927SAndroid Build Coastguard Worker         static const struct {
1519*61046927SAndroid Build Coastguard Worker            const char *s;
1520*61046927SAndroid Build Coastguard Worker            GLenum e;
1521*61046927SAndroid Build Coastguard Worker         } map[] = {
1522*61046927SAndroid Build Coastguard Worker                 /* triangles already parsed by gs-specific code */
1523*61046927SAndroid Build Coastguard Worker                 { "quads", GL_QUADS },
1524*61046927SAndroid Build Coastguard Worker                 { "isolines", GL_ISOLINES },
1525*61046927SAndroid Build Coastguard Worker         };
1526*61046927SAndroid Build Coastguard Worker         for (unsigned i = 0; i < ARRAY_SIZE(map); i++) {
1527*61046927SAndroid Build Coastguard Worker            if (match_layout_qualifier($1, map[i].s, state) == 0) {
1528*61046927SAndroid Build Coastguard Worker               $$.flags.q.prim_type = 1;
1529*61046927SAndroid Build Coastguard Worker               $$.prim_type = map[i].e;
1530*61046927SAndroid Build Coastguard Worker               break;
1531*61046927SAndroid Build Coastguard Worker            }
1532*61046927SAndroid Build Coastguard Worker         }
1533*61046927SAndroid Build Coastguard Worker
1534*61046927SAndroid Build Coastguard Worker         if ($$.flags.i && !state->has_tessellation_shader()) {
1535*61046927SAndroid Build Coastguard Worker            _mesa_glsl_error(& @1, state,
1536*61046927SAndroid Build Coastguard Worker                             "primitive mode qualifier `%s' requires "
1537*61046927SAndroid Build Coastguard Worker                             "GLSL 4.00 or ARB_tessellation_shader", $1);
1538*61046927SAndroid Build Coastguard Worker         }
1539*61046927SAndroid Build Coastguard Worker      }
1540*61046927SAndroid Build Coastguard Worker      if (!$$.flags.i) {
1541*61046927SAndroid Build Coastguard Worker         static const struct {
1542*61046927SAndroid Build Coastguard Worker            const char *s;
1543*61046927SAndroid Build Coastguard Worker            enum gl_tess_spacing e;
1544*61046927SAndroid Build Coastguard Worker         } map[] = {
1545*61046927SAndroid Build Coastguard Worker                 { "equal_spacing", TESS_SPACING_EQUAL },
1546*61046927SAndroid Build Coastguard Worker                 { "fractional_odd_spacing", TESS_SPACING_FRACTIONAL_ODD },
1547*61046927SAndroid Build Coastguard Worker                 { "fractional_even_spacing", TESS_SPACING_FRACTIONAL_EVEN },
1548*61046927SAndroid Build Coastguard Worker         };
1549*61046927SAndroid Build Coastguard Worker         for (unsigned i = 0; i < ARRAY_SIZE(map); i++) {
1550*61046927SAndroid Build Coastguard Worker            if (match_layout_qualifier($1, map[i].s, state) == 0) {
1551*61046927SAndroid Build Coastguard Worker               $$.flags.q.vertex_spacing = 1;
1552*61046927SAndroid Build Coastguard Worker               $$.vertex_spacing = map[i].e;
1553*61046927SAndroid Build Coastguard Worker               break;
1554*61046927SAndroid Build Coastguard Worker            }
1555*61046927SAndroid Build Coastguard Worker         }
1556*61046927SAndroid Build Coastguard Worker
1557*61046927SAndroid Build Coastguard Worker         if ($$.flags.i && !state->has_tessellation_shader()) {
1558*61046927SAndroid Build Coastguard Worker            _mesa_glsl_error(& @1, state,
1559*61046927SAndroid Build Coastguard Worker                             "vertex spacing qualifier `%s' requires "
1560*61046927SAndroid Build Coastguard Worker                             "GLSL 4.00 or ARB_tessellation_shader", $1);
1561*61046927SAndroid Build Coastguard Worker         }
1562*61046927SAndroid Build Coastguard Worker      }
1563*61046927SAndroid Build Coastguard Worker      if (!$$.flags.i) {
1564*61046927SAndroid Build Coastguard Worker         if (match_layout_qualifier($1, "cw", state) == 0) {
1565*61046927SAndroid Build Coastguard Worker            $$.flags.q.ordering = 1;
1566*61046927SAndroid Build Coastguard Worker            $$.ordering = GL_CW;
1567*61046927SAndroid Build Coastguard Worker         } else if (match_layout_qualifier($1, "ccw", state) == 0) {
1568*61046927SAndroid Build Coastguard Worker            $$.flags.q.ordering = 1;
1569*61046927SAndroid Build Coastguard Worker            $$.ordering = GL_CCW;
1570*61046927SAndroid Build Coastguard Worker         }
1571*61046927SAndroid Build Coastguard Worker
1572*61046927SAndroid Build Coastguard Worker         if ($$.flags.i && !state->has_tessellation_shader()) {
1573*61046927SAndroid Build Coastguard Worker            _mesa_glsl_error(& @1, state,
1574*61046927SAndroid Build Coastguard Worker                             "ordering qualifier `%s' requires "
1575*61046927SAndroid Build Coastguard Worker                             "GLSL 4.00 or ARB_tessellation_shader", $1);
1576*61046927SAndroid Build Coastguard Worker         }
1577*61046927SAndroid Build Coastguard Worker      }
1578*61046927SAndroid Build Coastguard Worker      if (!$$.flags.i) {
1579*61046927SAndroid Build Coastguard Worker         if (match_layout_qualifier($1, "point_mode", state) == 0) {
1580*61046927SAndroid Build Coastguard Worker            $$.flags.q.point_mode = 1;
1581*61046927SAndroid Build Coastguard Worker            $$.point_mode = true;
1582*61046927SAndroid Build Coastguard Worker         }
1583*61046927SAndroid Build Coastguard Worker
1584*61046927SAndroid Build Coastguard Worker         if ($$.flags.i && !state->has_tessellation_shader()) {
1585*61046927SAndroid Build Coastguard Worker            _mesa_glsl_error(& @1, state,
1586*61046927SAndroid Build Coastguard Worker                             "qualifier `point_mode' requires "
1587*61046927SAndroid Build Coastguard Worker                             "GLSL 4.00 or ARB_tessellation_shader");
1588*61046927SAndroid Build Coastguard Worker         }
1589*61046927SAndroid Build Coastguard Worker      }
1590*61046927SAndroid Build Coastguard Worker
1591*61046927SAndroid Build Coastguard Worker      if (!$$.flags.i) {
1592*61046927SAndroid Build Coastguard Worker         static const struct {
1593*61046927SAndroid Build Coastguard Worker            const char *s;
1594*61046927SAndroid Build Coastguard Worker            uint32_t mask;
1595*61046927SAndroid Build Coastguard Worker         } map[] = {
1596*61046927SAndroid Build Coastguard Worker                 { "blend_support_multiply",       BITFIELD_BIT(BLEND_MULTIPLY) },
1597*61046927SAndroid Build Coastguard Worker                 { "blend_support_screen",         BITFIELD_BIT(BLEND_SCREEN) },
1598*61046927SAndroid Build Coastguard Worker                 { "blend_support_overlay",        BITFIELD_BIT(BLEND_OVERLAY) },
1599*61046927SAndroid Build Coastguard Worker                 { "blend_support_darken",         BITFIELD_BIT(BLEND_DARKEN) },
1600*61046927SAndroid Build Coastguard Worker                 { "blend_support_lighten",        BITFIELD_BIT(BLEND_LIGHTEN) },
1601*61046927SAndroid Build Coastguard Worker                 { "blend_support_colordodge",     BITFIELD_BIT(BLEND_COLORDODGE) },
1602*61046927SAndroid Build Coastguard Worker                 { "blend_support_colorburn",      BITFIELD_BIT(BLEND_COLORBURN) },
1603*61046927SAndroid Build Coastguard Worker                 { "blend_support_hardlight",      BITFIELD_BIT(BLEND_HARDLIGHT) },
1604*61046927SAndroid Build Coastguard Worker                 { "blend_support_softlight",      BITFIELD_BIT(BLEND_SOFTLIGHT) },
1605*61046927SAndroid Build Coastguard Worker                 { "blend_support_difference",     BITFIELD_BIT(BLEND_DIFFERENCE) },
1606*61046927SAndroid Build Coastguard Worker                 { "blend_support_exclusion",      BITFIELD_BIT(BLEND_EXCLUSION) },
1607*61046927SAndroid Build Coastguard Worker                 { "blend_support_hsl_hue",        BITFIELD_BIT(BLEND_HSL_HUE) },
1608*61046927SAndroid Build Coastguard Worker                 { "blend_support_hsl_saturation", BITFIELD_BIT(BLEND_HSL_SATURATION) },
1609*61046927SAndroid Build Coastguard Worker                 { "blend_support_hsl_color",      BITFIELD_BIT(BLEND_HSL_COLOR) },
1610*61046927SAndroid Build Coastguard Worker                 { "blend_support_hsl_luminosity", BITFIELD_BIT(BLEND_HSL_LUMINOSITY) },
1611*61046927SAndroid Build Coastguard Worker                 { "blend_support_all_equations",  (1u << (BLEND_HSL_LUMINOSITY + 1)) - 2 },
1612*61046927SAndroid Build Coastguard Worker         };
1613*61046927SAndroid Build Coastguard Worker         for (unsigned i = 0; i < ARRAY_SIZE(map); i++) {
1614*61046927SAndroid Build Coastguard Worker            if (match_layout_qualifier($1, map[i].s, state) == 0) {
1615*61046927SAndroid Build Coastguard Worker               $$.flags.q.blend_support = 1;
1616*61046927SAndroid Build Coastguard Worker               state->fs_blend_support |= map[i].mask;
1617*61046927SAndroid Build Coastguard Worker               break;
1618*61046927SAndroid Build Coastguard Worker            }
1619*61046927SAndroid Build Coastguard Worker         }
1620*61046927SAndroid Build Coastguard Worker
1621*61046927SAndroid Build Coastguard Worker         if ($$.flags.i &&
1622*61046927SAndroid Build Coastguard Worker             !state->KHR_blend_equation_advanced_enable &&
1623*61046927SAndroid Build Coastguard Worker             !state->is_version(0, 320)) {
1624*61046927SAndroid Build Coastguard Worker            _mesa_glsl_error(& @1, state,
1625*61046927SAndroid Build Coastguard Worker                             "advanced blending layout qualifiers require "
1626*61046927SAndroid Build Coastguard Worker                             "ESSL 3.20 or KHR_blend_equation_advanced");
1627*61046927SAndroid Build Coastguard Worker         }
1628*61046927SAndroid Build Coastguard Worker
1629*61046927SAndroid Build Coastguard Worker         if ($$.flags.i && state->stage != MESA_SHADER_FRAGMENT) {
1630*61046927SAndroid Build Coastguard Worker            _mesa_glsl_error(& @1, state,
1631*61046927SAndroid Build Coastguard Worker                             "advanced blending layout qualifiers only "
1632*61046927SAndroid Build Coastguard Worker                             "valid in fragment shaders");
1633*61046927SAndroid Build Coastguard Worker         }
1634*61046927SAndroid Build Coastguard Worker      }
1635*61046927SAndroid Build Coastguard Worker
1636*61046927SAndroid Build Coastguard Worker      /* Layout qualifiers for ARB_compute_variable_group_size. */
1637*61046927SAndroid Build Coastguard Worker      if (!$$.flags.i) {
1638*61046927SAndroid Build Coastguard Worker         if (match_layout_qualifier($1, "local_size_variable", state) == 0) {
1639*61046927SAndroid Build Coastguard Worker            $$.flags.q.local_size_variable = 1;
1640*61046927SAndroid Build Coastguard Worker         }
1641*61046927SAndroid Build Coastguard Worker
1642*61046927SAndroid Build Coastguard Worker         if ($$.flags.i && !state->ARB_compute_variable_group_size_enable) {
1643*61046927SAndroid Build Coastguard Worker            _mesa_glsl_error(& @1, state,
1644*61046927SAndroid Build Coastguard Worker                             "qualifier `local_size_variable` requires "
1645*61046927SAndroid Build Coastguard Worker                             "ARB_compute_variable_group_size");
1646*61046927SAndroid Build Coastguard Worker         }
1647*61046927SAndroid Build Coastguard Worker      }
1648*61046927SAndroid Build Coastguard Worker
1649*61046927SAndroid Build Coastguard Worker      /* Layout qualifiers for ARB_bindless_texture. */
1650*61046927SAndroid Build Coastguard Worker      if (!$$.flags.i) {
1651*61046927SAndroid Build Coastguard Worker         if (match_layout_qualifier($1, "bindless_sampler", state) == 0)
1652*61046927SAndroid Build Coastguard Worker            $$.flags.q.bindless_sampler = 1;
1653*61046927SAndroid Build Coastguard Worker         if (match_layout_qualifier($1, "bound_sampler", state) == 0)
1654*61046927SAndroid Build Coastguard Worker            $$.flags.q.bound_sampler = 1;
1655*61046927SAndroid Build Coastguard Worker
1656*61046927SAndroid Build Coastguard Worker         if (state->has_shader_image_load_store()) {
1657*61046927SAndroid Build Coastguard Worker            if (match_layout_qualifier($1, "bindless_image", state) == 0)
1658*61046927SAndroid Build Coastguard Worker               $$.flags.q.bindless_image = 1;
1659*61046927SAndroid Build Coastguard Worker            if (match_layout_qualifier($1, "bound_image", state) == 0)
1660*61046927SAndroid Build Coastguard Worker               $$.flags.q.bound_image = 1;
1661*61046927SAndroid Build Coastguard Worker         }
1662*61046927SAndroid Build Coastguard Worker
1663*61046927SAndroid Build Coastguard Worker         if ($$.flags.i && !state->has_bindless()) {
1664*61046927SAndroid Build Coastguard Worker            _mesa_glsl_error(& @1, state,
1665*61046927SAndroid Build Coastguard Worker                             "qualifier `%s` requires "
1666*61046927SAndroid Build Coastguard Worker                             "ARB_bindless_texture", $1);
1667*61046927SAndroid Build Coastguard Worker         }
1668*61046927SAndroid Build Coastguard Worker      }
1669*61046927SAndroid Build Coastguard Worker
1670*61046927SAndroid Build Coastguard Worker      if (!$$.flags.i &&
1671*61046927SAndroid Build Coastguard Worker          state->EXT_shader_framebuffer_fetch_non_coherent_enable) {
1672*61046927SAndroid Build Coastguard Worker         if (match_layout_qualifier($1, "noncoherent", state) == 0)
1673*61046927SAndroid Build Coastguard Worker            $$.flags.q.non_coherent = 1;
1674*61046927SAndroid Build Coastguard Worker      }
1675*61046927SAndroid Build Coastguard Worker
1676*61046927SAndroid Build Coastguard Worker      // Layout qualifiers for NV_compute_shader_derivatives.
1677*61046927SAndroid Build Coastguard Worker      if (!$$.flags.i) {
1678*61046927SAndroid Build Coastguard Worker         if (match_layout_qualifier($1, "derivative_group_quadsNV", state) == 0) {
1679*61046927SAndroid Build Coastguard Worker            $$.flags.q.derivative_group = 1;
1680*61046927SAndroid Build Coastguard Worker            $$.derivative_group = DERIVATIVE_GROUP_QUADS;
1681*61046927SAndroid Build Coastguard Worker         } else if (match_layout_qualifier($1, "derivative_group_linearNV", state) == 0) {
1682*61046927SAndroid Build Coastguard Worker            $$.flags.q.derivative_group = 1;
1683*61046927SAndroid Build Coastguard Worker            $$.derivative_group = DERIVATIVE_GROUP_LINEAR;
1684*61046927SAndroid Build Coastguard Worker         }
1685*61046927SAndroid Build Coastguard Worker
1686*61046927SAndroid Build Coastguard Worker         if ($$.flags.i) {
1687*61046927SAndroid Build Coastguard Worker            if (!state->has_compute_shader()) {
1688*61046927SAndroid Build Coastguard Worker               _mesa_glsl_error(& @1, state,
1689*61046927SAndroid Build Coastguard Worker                                "qualifier `%s' requires "
1690*61046927SAndroid Build Coastguard Worker                                "a compute shader", $1);
1691*61046927SAndroid Build Coastguard Worker            }
1692*61046927SAndroid Build Coastguard Worker
1693*61046927SAndroid Build Coastguard Worker            if (!state->NV_compute_shader_derivatives_enable) {
1694*61046927SAndroid Build Coastguard Worker               _mesa_glsl_error(& @1, state,
1695*61046927SAndroid Build Coastguard Worker                                "qualifier `%s' requires "
1696*61046927SAndroid Build Coastguard Worker                                "NV_compute_shader_derivatives", $1);
1697*61046927SAndroid Build Coastguard Worker            }
1698*61046927SAndroid Build Coastguard Worker
1699*61046927SAndroid Build Coastguard Worker            if (state->NV_compute_shader_derivatives_warn) {
1700*61046927SAndroid Build Coastguard Worker               _mesa_glsl_warning(& @1, state,
1701*61046927SAndroid Build Coastguard Worker                                  "NV_compute_shader_derivatives layout "
1702*61046927SAndroid Build Coastguard Worker                                  "qualifier `%s' used", $1);
1703*61046927SAndroid Build Coastguard Worker            }
1704*61046927SAndroid Build Coastguard Worker         }
1705*61046927SAndroid Build Coastguard Worker      }
1706*61046927SAndroid Build Coastguard Worker
1707*61046927SAndroid Build Coastguard Worker      /* Layout qualifier for NV_viewport_array2. */
1708*61046927SAndroid Build Coastguard Worker      if (!$$.flags.i && state->stage != MESA_SHADER_FRAGMENT) {
1709*61046927SAndroid Build Coastguard Worker         if (match_layout_qualifier($1, "viewport_relative", state) == 0) {
1710*61046927SAndroid Build Coastguard Worker            $$.flags.q.viewport_relative = 1;
1711*61046927SAndroid Build Coastguard Worker         }
1712*61046927SAndroid Build Coastguard Worker
1713*61046927SAndroid Build Coastguard Worker         if ($$.flags.i && !state->NV_viewport_array2_enable) {
1714*61046927SAndroid Build Coastguard Worker            _mesa_glsl_error(& @1, state,
1715*61046927SAndroid Build Coastguard Worker                             "qualifier `%s' requires "
1716*61046927SAndroid Build Coastguard Worker                             "GL_NV_viewport_array2", $1);
1717*61046927SAndroid Build Coastguard Worker         }
1718*61046927SAndroid Build Coastguard Worker
1719*61046927SAndroid Build Coastguard Worker         if ($$.flags.i && state->NV_viewport_array2_warn) {
1720*61046927SAndroid Build Coastguard Worker            _mesa_glsl_warning(& @1, state,
1721*61046927SAndroid Build Coastguard Worker                               "GL_NV_viewport_array2 layout "
1722*61046927SAndroid Build Coastguard Worker                               "identifier `%s' used", $1);
1723*61046927SAndroid Build Coastguard Worker         }
1724*61046927SAndroid Build Coastguard Worker      }
1725*61046927SAndroid Build Coastguard Worker
1726*61046927SAndroid Build Coastguard Worker      if (!$$.flags.i) {
1727*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(& @1, state, "unrecognized layout identifier "
1728*61046927SAndroid Build Coastguard Worker                          "`%s'", $1);
1729*61046927SAndroid Build Coastguard Worker         YYERROR;
1730*61046927SAndroid Build Coastguard Worker      }
1731*61046927SAndroid Build Coastguard Worker   }
1732*61046927SAndroid Build Coastguard Worker   | any_identifier '=' constant_expression
1733*61046927SAndroid Build Coastguard Worker   {
1734*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
1735*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
1736*61046927SAndroid Build Coastguard Worker
1737*61046927SAndroid Build Coastguard Worker      if ($3->oper != ast_int_constant &&
1738*61046927SAndroid Build Coastguard Worker          $3->oper != ast_uint_constant &&
1739*61046927SAndroid Build Coastguard Worker          !state->has_enhanced_layouts()) {
1740*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(& @1, state,
1741*61046927SAndroid Build Coastguard Worker                          "compile-time constant expressions require "
1742*61046927SAndroid Build Coastguard Worker                          "GLSL 4.40 or ARB_enhanced_layouts");
1743*61046927SAndroid Build Coastguard Worker      }
1744*61046927SAndroid Build Coastguard Worker
1745*61046927SAndroid Build Coastguard Worker      if (match_layout_qualifier("align", $1, state) == 0) {
1746*61046927SAndroid Build Coastguard Worker         if (!state->has_enhanced_layouts()) {
1747*61046927SAndroid Build Coastguard Worker            _mesa_glsl_error(& @1, state,
1748*61046927SAndroid Build Coastguard Worker                             "align qualifier requires "
1749*61046927SAndroid Build Coastguard Worker                             "GLSL 4.40 or ARB_enhanced_layouts");
1750*61046927SAndroid Build Coastguard Worker         } else {
1751*61046927SAndroid Build Coastguard Worker            $$.flags.q.explicit_align = 1;
1752*61046927SAndroid Build Coastguard Worker            $$.align = $3;
1753*61046927SAndroid Build Coastguard Worker         }
1754*61046927SAndroid Build Coastguard Worker      }
1755*61046927SAndroid Build Coastguard Worker
1756*61046927SAndroid Build Coastguard Worker      if (match_layout_qualifier("location", $1, state) == 0) {
1757*61046927SAndroid Build Coastguard Worker         $$.flags.q.explicit_location = 1;
1758*61046927SAndroid Build Coastguard Worker
1759*61046927SAndroid Build Coastguard Worker         if ($$.flags.q.attribute == 1 &&
1760*61046927SAndroid Build Coastguard Worker             state->ARB_explicit_attrib_location_warn) {
1761*61046927SAndroid Build Coastguard Worker            _mesa_glsl_warning(& @1, state,
1762*61046927SAndroid Build Coastguard Worker                               "GL_ARB_explicit_attrib_location layout "
1763*61046927SAndroid Build Coastguard Worker                               "identifier `%s' used", $1);
1764*61046927SAndroid Build Coastguard Worker         }
1765*61046927SAndroid Build Coastguard Worker         $$.location = $3;
1766*61046927SAndroid Build Coastguard Worker      }
1767*61046927SAndroid Build Coastguard Worker
1768*61046927SAndroid Build Coastguard Worker      if (match_layout_qualifier("num_views", $1, state) == 0) {
1769*61046927SAndroid Build Coastguard Worker         $$.flags.q.explicit_numviews = 1;
1770*61046927SAndroid Build Coastguard Worker         $$.num_views = $3;
1771*61046927SAndroid Build Coastguard Worker      }
1772*61046927SAndroid Build Coastguard Worker
1773*61046927SAndroid Build Coastguard Worker      if (match_layout_qualifier("component", $1, state) == 0) {
1774*61046927SAndroid Build Coastguard Worker         if (!state->has_enhanced_layouts()) {
1775*61046927SAndroid Build Coastguard Worker            _mesa_glsl_error(& @1, state,
1776*61046927SAndroid Build Coastguard Worker                             "component qualifier requires "
1777*61046927SAndroid Build Coastguard Worker                             "GLSL 4.40 or ARB_enhanced_layouts");
1778*61046927SAndroid Build Coastguard Worker         } else {
1779*61046927SAndroid Build Coastguard Worker            $$.flags.q.explicit_component = 1;
1780*61046927SAndroid Build Coastguard Worker            $$.component = $3;
1781*61046927SAndroid Build Coastguard Worker         }
1782*61046927SAndroid Build Coastguard Worker      }
1783*61046927SAndroid Build Coastguard Worker
1784*61046927SAndroid Build Coastguard Worker      if (match_layout_qualifier("index", $1, state) == 0) {
1785*61046927SAndroid Build Coastguard Worker         if (state->es_shader && !state->EXT_blend_func_extended_enable) {
1786*61046927SAndroid Build Coastguard Worker            _mesa_glsl_error(& @3, state, "index layout qualifier requires EXT_blend_func_extended");
1787*61046927SAndroid Build Coastguard Worker            YYERROR;
1788*61046927SAndroid Build Coastguard Worker         }
1789*61046927SAndroid Build Coastguard Worker
1790*61046927SAndroid Build Coastguard Worker         $$.flags.q.explicit_index = 1;
1791*61046927SAndroid Build Coastguard Worker         $$.index = $3;
1792*61046927SAndroid Build Coastguard Worker      }
1793*61046927SAndroid Build Coastguard Worker
1794*61046927SAndroid Build Coastguard Worker      if ((state->has_420pack_or_es31() ||
1795*61046927SAndroid Build Coastguard Worker           state->has_atomic_counters() ||
1796*61046927SAndroid Build Coastguard Worker           state->has_shader_storage_buffer_objects()) &&
1797*61046927SAndroid Build Coastguard Worker          match_layout_qualifier("binding", $1, state) == 0) {
1798*61046927SAndroid Build Coastguard Worker         $$.flags.q.explicit_binding = 1;
1799*61046927SAndroid Build Coastguard Worker         $$.binding = $3;
1800*61046927SAndroid Build Coastguard Worker      }
1801*61046927SAndroid Build Coastguard Worker
1802*61046927SAndroid Build Coastguard Worker      if ((state->has_atomic_counters() ||
1803*61046927SAndroid Build Coastguard Worker           state->has_enhanced_layouts()) &&
1804*61046927SAndroid Build Coastguard Worker          match_layout_qualifier("offset", $1, state) == 0) {
1805*61046927SAndroid Build Coastguard Worker         $$.flags.q.explicit_offset = 1;
1806*61046927SAndroid Build Coastguard Worker         $$.offset = $3;
1807*61046927SAndroid Build Coastguard Worker      }
1808*61046927SAndroid Build Coastguard Worker
1809*61046927SAndroid Build Coastguard Worker      if (match_layout_qualifier("max_vertices", $1, state) == 0) {
1810*61046927SAndroid Build Coastguard Worker         $$.flags.q.max_vertices = 1;
1811*61046927SAndroid Build Coastguard Worker         $$.max_vertices = new(ctx) ast_layout_expression(@1, $3);
1812*61046927SAndroid Build Coastguard Worker         if (!state->has_geometry_shader()) {
1813*61046927SAndroid Build Coastguard Worker            _mesa_glsl_error(& @3, state,
1814*61046927SAndroid Build Coastguard Worker                             "#version 150 max_vertices qualifier "
1815*61046927SAndroid Build Coastguard Worker                             "specified");
1816*61046927SAndroid Build Coastguard Worker         }
1817*61046927SAndroid Build Coastguard Worker      }
1818*61046927SAndroid Build Coastguard Worker
1819*61046927SAndroid Build Coastguard Worker      if (state->stage == MESA_SHADER_GEOMETRY) {
1820*61046927SAndroid Build Coastguard Worker         if (match_layout_qualifier("stream", $1, state) == 0 &&
1821*61046927SAndroid Build Coastguard Worker             state->check_explicit_attrib_stream_allowed(& @3)) {
1822*61046927SAndroid Build Coastguard Worker            $$.flags.q.stream = 1;
1823*61046927SAndroid Build Coastguard Worker            $$.flags.q.explicit_stream = 1;
1824*61046927SAndroid Build Coastguard Worker            $$.stream = $3;
1825*61046927SAndroid Build Coastguard Worker         }
1826*61046927SAndroid Build Coastguard Worker      }
1827*61046927SAndroid Build Coastguard Worker
1828*61046927SAndroid Build Coastguard Worker      if (state->has_enhanced_layouts()) {
1829*61046927SAndroid Build Coastguard Worker         if (match_layout_qualifier("xfb_buffer", $1, state) == 0) {
1830*61046927SAndroid Build Coastguard Worker            $$.flags.q.xfb_buffer = 1;
1831*61046927SAndroid Build Coastguard Worker            $$.flags.q.explicit_xfb_buffer = 1;
1832*61046927SAndroid Build Coastguard Worker            $$.xfb_buffer = $3;
1833*61046927SAndroid Build Coastguard Worker         }
1834*61046927SAndroid Build Coastguard Worker
1835*61046927SAndroid Build Coastguard Worker         if (match_layout_qualifier("xfb_offset", $1, state) == 0) {
1836*61046927SAndroid Build Coastguard Worker            $$.flags.q.explicit_xfb_offset = 1;
1837*61046927SAndroid Build Coastguard Worker            $$.offset = $3;
1838*61046927SAndroid Build Coastguard Worker         }
1839*61046927SAndroid Build Coastguard Worker
1840*61046927SAndroid Build Coastguard Worker         if (match_layout_qualifier("xfb_stride", $1, state) == 0) {
1841*61046927SAndroid Build Coastguard Worker            $$.flags.q.xfb_stride = 1;
1842*61046927SAndroid Build Coastguard Worker            $$.flags.q.explicit_xfb_stride = 1;
1843*61046927SAndroid Build Coastguard Worker            $$.xfb_stride = $3;
1844*61046927SAndroid Build Coastguard Worker         }
1845*61046927SAndroid Build Coastguard Worker      }
1846*61046927SAndroid Build Coastguard Worker
1847*61046927SAndroid Build Coastguard Worker      static const char * const local_size_qualifiers[3] = {
1848*61046927SAndroid Build Coastguard Worker         "local_size_x",
1849*61046927SAndroid Build Coastguard Worker         "local_size_y",
1850*61046927SAndroid Build Coastguard Worker         "local_size_z",
1851*61046927SAndroid Build Coastguard Worker      };
1852*61046927SAndroid Build Coastguard Worker      for (int i = 0; i < 3; i++) {
1853*61046927SAndroid Build Coastguard Worker         if (match_layout_qualifier(local_size_qualifiers[i], $1,
1854*61046927SAndroid Build Coastguard Worker                                    state) == 0) {
1855*61046927SAndroid Build Coastguard Worker            if (!state->has_compute_shader()) {
1856*61046927SAndroid Build Coastguard Worker               _mesa_glsl_error(& @3, state,
1857*61046927SAndroid Build Coastguard Worker                                "%s qualifier requires GLSL 4.30 or "
1858*61046927SAndroid Build Coastguard Worker                                "GLSL ES 3.10 or ARB_compute_shader",
1859*61046927SAndroid Build Coastguard Worker                                local_size_qualifiers[i]);
1860*61046927SAndroid Build Coastguard Worker               YYERROR;
1861*61046927SAndroid Build Coastguard Worker            } else {
1862*61046927SAndroid Build Coastguard Worker               $$.flags.q.local_size |= (1 << i);
1863*61046927SAndroid Build Coastguard Worker               $$.local_size[i] = new(ctx) ast_layout_expression(@1, $3);
1864*61046927SAndroid Build Coastguard Worker            }
1865*61046927SAndroid Build Coastguard Worker            break;
1866*61046927SAndroid Build Coastguard Worker         }
1867*61046927SAndroid Build Coastguard Worker      }
1868*61046927SAndroid Build Coastguard Worker
1869*61046927SAndroid Build Coastguard Worker      if (match_layout_qualifier("invocations", $1, state) == 0) {
1870*61046927SAndroid Build Coastguard Worker         $$.flags.q.invocations = 1;
1871*61046927SAndroid Build Coastguard Worker         $$.invocations = new(ctx) ast_layout_expression(@1, $3);
1872*61046927SAndroid Build Coastguard Worker         if (!state->is_version(400, 320) &&
1873*61046927SAndroid Build Coastguard Worker             !state->ARB_gpu_shader5_enable &&
1874*61046927SAndroid Build Coastguard Worker             !state->OES_geometry_shader_enable &&
1875*61046927SAndroid Build Coastguard Worker             !state->EXT_geometry_shader_enable) {
1876*61046927SAndroid Build Coastguard Worker            _mesa_glsl_error(& @3, state,
1877*61046927SAndroid Build Coastguard Worker                             "GL_ARB_gpu_shader5 invocations "
1878*61046927SAndroid Build Coastguard Worker                             "qualifier specified");
1879*61046927SAndroid Build Coastguard Worker         }
1880*61046927SAndroid Build Coastguard Worker      }
1881*61046927SAndroid Build Coastguard Worker
1882*61046927SAndroid Build Coastguard Worker      /* Layout qualifiers for tessellation control shaders. */
1883*61046927SAndroid Build Coastguard Worker      if (match_layout_qualifier("vertices", $1, state) == 0) {
1884*61046927SAndroid Build Coastguard Worker         $$.flags.q.vertices = 1;
1885*61046927SAndroid Build Coastguard Worker         $$.vertices = new(ctx) ast_layout_expression(@1, $3);
1886*61046927SAndroid Build Coastguard Worker         if (!state->has_tessellation_shader()) {
1887*61046927SAndroid Build Coastguard Worker            _mesa_glsl_error(& @1, state,
1888*61046927SAndroid Build Coastguard Worker                             "vertices qualifier requires GLSL 4.00 or "
1889*61046927SAndroid Build Coastguard Worker                             "ARB_tessellation_shader");
1890*61046927SAndroid Build Coastguard Worker         }
1891*61046927SAndroid Build Coastguard Worker      }
1892*61046927SAndroid Build Coastguard Worker
1893*61046927SAndroid Build Coastguard Worker      /* If the identifier didn't match any known layout identifiers,
1894*61046927SAndroid Build Coastguard Worker       * emit an error.
1895*61046927SAndroid Build Coastguard Worker       */
1896*61046927SAndroid Build Coastguard Worker      if (!$$.flags.i) {
1897*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(& @1, state, "unrecognized layout identifier "
1898*61046927SAndroid Build Coastguard Worker                          "`%s'", $1);
1899*61046927SAndroid Build Coastguard Worker         YYERROR;
1900*61046927SAndroid Build Coastguard Worker      }
1901*61046927SAndroid Build Coastguard Worker   }
1902*61046927SAndroid Build Coastguard Worker   | interface_block_layout_qualifier
1903*61046927SAndroid Build Coastguard Worker   {
1904*61046927SAndroid Build Coastguard Worker      $$ = $1;
1905*61046927SAndroid Build Coastguard Worker      /* Layout qualifiers for ARB_uniform_buffer_object. */
1906*61046927SAndroid Build Coastguard Worker      if ($$.flags.q.uniform && !state->has_uniform_buffer_objects()) {
1907*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(& @1, state,
1908*61046927SAndroid Build Coastguard Worker                          "#version 140 / GL_ARB_uniform_buffer_object "
1909*61046927SAndroid Build Coastguard Worker                          "layout qualifier `uniform' is used");
1910*61046927SAndroid Build Coastguard Worker      } else if ($$.flags.q.uniform && state->ARB_uniform_buffer_object_warn) {
1911*61046927SAndroid Build Coastguard Worker         _mesa_glsl_warning(& @1, state,
1912*61046927SAndroid Build Coastguard Worker                            "#version 140 / GL_ARB_uniform_buffer_object "
1913*61046927SAndroid Build Coastguard Worker                            "layout qualifier `uniform' is used");
1914*61046927SAndroid Build Coastguard Worker      }
1915*61046927SAndroid Build Coastguard Worker   }
1916*61046927SAndroid Build Coastguard Worker   ;
1917*61046927SAndroid Build Coastguard Worker
1918*61046927SAndroid Build Coastguard Worker/* This is a separate language rule because we parse these as tokens
1919*61046927SAndroid Build Coastguard Worker * (due to them being reserved keywords) instead of identifiers like
1920*61046927SAndroid Build Coastguard Worker * most qualifiers.  See the any_identifier path of
1921*61046927SAndroid Build Coastguard Worker * layout_qualifier_id for the others.
1922*61046927SAndroid Build Coastguard Worker *
1923*61046927SAndroid Build Coastguard Worker * Note that since layout qualifiers are case-insensitive in desktop
1924*61046927SAndroid Build Coastguard Worker * GLSL, all of these qualifiers need to be handled as identifiers as
1925*61046927SAndroid Build Coastguard Worker * well (by the any_identifier path of layout_qualifier_id).
1926*61046927SAndroid Build Coastguard Worker */
1927*61046927SAndroid Build Coastguard Workerinterface_block_layout_qualifier:
1928*61046927SAndroid Build Coastguard Worker   ROW_MAJOR
1929*61046927SAndroid Build Coastguard Worker   {
1930*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
1931*61046927SAndroid Build Coastguard Worker      $$.flags.q.row_major = 1;
1932*61046927SAndroid Build Coastguard Worker   }
1933*61046927SAndroid Build Coastguard Worker   | PACKED_TOK
1934*61046927SAndroid Build Coastguard Worker   {
1935*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
1936*61046927SAndroid Build Coastguard Worker      $$.flags.q.packed = 1;
1937*61046927SAndroid Build Coastguard Worker   }
1938*61046927SAndroid Build Coastguard Worker   | SHARED
1939*61046927SAndroid Build Coastguard Worker   {
1940*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
1941*61046927SAndroid Build Coastguard Worker      $$.flags.q.shared = 1;
1942*61046927SAndroid Build Coastguard Worker   }
1943*61046927SAndroid Build Coastguard Worker   ;
1944*61046927SAndroid Build Coastguard Worker
1945*61046927SAndroid Build Coastguard Workersubroutine_qualifier:
1946*61046927SAndroid Build Coastguard Worker   SUBROUTINE
1947*61046927SAndroid Build Coastguard Worker   {
1948*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
1949*61046927SAndroid Build Coastguard Worker      $$.flags.q.subroutine = 1;
1950*61046927SAndroid Build Coastguard Worker   }
1951*61046927SAndroid Build Coastguard Worker   | SUBROUTINE '(' subroutine_type_list ')'
1952*61046927SAndroid Build Coastguard Worker   {
1953*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
1954*61046927SAndroid Build Coastguard Worker      $$.flags.q.subroutine = 1;
1955*61046927SAndroid Build Coastguard Worker      $$.subroutine_list = $3;
1956*61046927SAndroid Build Coastguard Worker   }
1957*61046927SAndroid Build Coastguard Worker   ;
1958*61046927SAndroid Build Coastguard Worker
1959*61046927SAndroid Build Coastguard Workersubroutine_type_list:
1960*61046927SAndroid Build Coastguard Worker   any_identifier
1961*61046927SAndroid Build Coastguard Worker   {
1962*61046927SAndroid Build Coastguard Worker        linear_ctx *ctx = state->linalloc;
1963*61046927SAndroid Build Coastguard Worker        ast_declaration *decl = new(ctx)  ast_declaration($1, NULL, NULL);
1964*61046927SAndroid Build Coastguard Worker        decl->set_location(@1);
1965*61046927SAndroid Build Coastguard Worker
1966*61046927SAndroid Build Coastguard Worker        $$ = new(ctx) ast_subroutine_list();
1967*61046927SAndroid Build Coastguard Worker        $$->declarations.push_tail(&decl->link);
1968*61046927SAndroid Build Coastguard Worker   }
1969*61046927SAndroid Build Coastguard Worker   | subroutine_type_list ',' any_identifier
1970*61046927SAndroid Build Coastguard Worker   {
1971*61046927SAndroid Build Coastguard Worker        linear_ctx *ctx = state->linalloc;
1972*61046927SAndroid Build Coastguard Worker        ast_declaration *decl = new(ctx)  ast_declaration($3, NULL, NULL);
1973*61046927SAndroid Build Coastguard Worker        decl->set_location(@3);
1974*61046927SAndroid Build Coastguard Worker
1975*61046927SAndroid Build Coastguard Worker        $$ = $1;
1976*61046927SAndroid Build Coastguard Worker        $$->declarations.push_tail(&decl->link);
1977*61046927SAndroid Build Coastguard Worker   }
1978*61046927SAndroid Build Coastguard Worker   ;
1979*61046927SAndroid Build Coastguard Worker
1980*61046927SAndroid Build Coastguard Workerinterpolation_qualifier:
1981*61046927SAndroid Build Coastguard Worker   SMOOTH
1982*61046927SAndroid Build Coastguard Worker   {
1983*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
1984*61046927SAndroid Build Coastguard Worker      $$.flags.q.smooth = 1;
1985*61046927SAndroid Build Coastguard Worker   }
1986*61046927SAndroid Build Coastguard Worker   | FLAT
1987*61046927SAndroid Build Coastguard Worker   {
1988*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
1989*61046927SAndroid Build Coastguard Worker      $$.flags.q.flat = 1;
1990*61046927SAndroid Build Coastguard Worker   }
1991*61046927SAndroid Build Coastguard Worker   | NOPERSPECTIVE
1992*61046927SAndroid Build Coastguard Worker   {
1993*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
1994*61046927SAndroid Build Coastguard Worker      $$.flags.q.noperspective = 1;
1995*61046927SAndroid Build Coastguard Worker   }
1996*61046927SAndroid Build Coastguard Worker   ;
1997*61046927SAndroid Build Coastguard Worker
1998*61046927SAndroid Build Coastguard Workertype_qualifier:
1999*61046927SAndroid Build Coastguard Worker   /* Single qualifiers */
2000*61046927SAndroid Build Coastguard Worker   INVARIANT
2001*61046927SAndroid Build Coastguard Worker   {
2002*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2003*61046927SAndroid Build Coastguard Worker      $$.flags.q.invariant = 1;
2004*61046927SAndroid Build Coastguard Worker   }
2005*61046927SAndroid Build Coastguard Worker   | PRECISE
2006*61046927SAndroid Build Coastguard Worker   {
2007*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2008*61046927SAndroid Build Coastguard Worker      $$.flags.q.precise = 1;
2009*61046927SAndroid Build Coastguard Worker   }
2010*61046927SAndroid Build Coastguard Worker   | auxiliary_storage_qualifier
2011*61046927SAndroid Build Coastguard Worker   | storage_qualifier
2012*61046927SAndroid Build Coastguard Worker   | interpolation_qualifier
2013*61046927SAndroid Build Coastguard Worker   | layout_qualifier
2014*61046927SAndroid Build Coastguard Worker   | memory_qualifier
2015*61046927SAndroid Build Coastguard Worker   | subroutine_qualifier
2016*61046927SAndroid Build Coastguard Worker   | precision_qualifier
2017*61046927SAndroid Build Coastguard Worker   {
2018*61046927SAndroid Build Coastguard Worker      memset(&$$, 0, sizeof($$));
2019*61046927SAndroid Build Coastguard Worker      $$.precision = $1;
2020*61046927SAndroid Build Coastguard Worker   }
2021*61046927SAndroid Build Coastguard Worker
2022*61046927SAndroid Build Coastguard Worker   /* Multiple qualifiers:
2023*61046927SAndroid Build Coastguard Worker    * In GLSL 4.20, these can be specified in any order.  In earlier versions,
2024*61046927SAndroid Build Coastguard Worker    * they appear in this order (see GLSL 1.50 section 4.7 & comments below):
2025*61046927SAndroid Build Coastguard Worker    *
2026*61046927SAndroid Build Coastguard Worker    *    invariant interpolation auxiliary storage precision  ...or...
2027*61046927SAndroid Build Coastguard Worker    *    layout storage precision
2028*61046927SAndroid Build Coastguard Worker    *
2029*61046927SAndroid Build Coastguard Worker    * Each qualifier's rule ensures that the accumulated qualifiers on the right
2030*61046927SAndroid Build Coastguard Worker    * side don't contain any that must appear on the left hand side.
2031*61046927SAndroid Build Coastguard Worker    * For example, when processing a storage qualifier, we check that there are
2032*61046927SAndroid Build Coastguard Worker    * no auxiliary, interpolation, layout, invariant, or precise qualifiers to the right.
2033*61046927SAndroid Build Coastguard Worker    */
2034*61046927SAndroid Build Coastguard Worker   | PRECISE type_qualifier
2035*61046927SAndroid Build Coastguard Worker   {
2036*61046927SAndroid Build Coastguard Worker      if ($2.flags.q.precise)
2037*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(&@1, state, "duplicate \"precise\" qualifier");
2038*61046927SAndroid Build Coastguard Worker
2039*61046927SAndroid Build Coastguard Worker      $$ = $2;
2040*61046927SAndroid Build Coastguard Worker      $$.flags.q.precise = 1;
2041*61046927SAndroid Build Coastguard Worker   }
2042*61046927SAndroid Build Coastguard Worker   | INVARIANT type_qualifier
2043*61046927SAndroid Build Coastguard Worker   {
2044*61046927SAndroid Build Coastguard Worker      if ($2.flags.q.invariant)
2045*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(&@1, state, "duplicate \"invariant\" qualifier");
2046*61046927SAndroid Build Coastguard Worker
2047*61046927SAndroid Build Coastguard Worker      if (!state->has_420pack_or_es31() && $2.flags.q.precise)
2048*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(&@1, state,
2049*61046927SAndroid Build Coastguard Worker                          "\"invariant\" must come after \"precise\"");
2050*61046927SAndroid Build Coastguard Worker
2051*61046927SAndroid Build Coastguard Worker      $$ = $2;
2052*61046927SAndroid Build Coastguard Worker      $$.flags.q.invariant = 1;
2053*61046927SAndroid Build Coastguard Worker
2054*61046927SAndroid Build Coastguard Worker      /* GLSL ES 3.00 spec, section 4.6.1 "The Invariant Qualifier":
2055*61046927SAndroid Build Coastguard Worker       *
2056*61046927SAndroid Build Coastguard Worker       * "Only variables output from a shader can be candidates for invariance.
2057*61046927SAndroid Build Coastguard Worker       * This includes user-defined output variables and the built-in output
2058*61046927SAndroid Build Coastguard Worker       * variables. As only outputs can be declared as invariant, an invariant
2059*61046927SAndroid Build Coastguard Worker       * output from one shader stage will still match an input of a subsequent
2060*61046927SAndroid Build Coastguard Worker       * stage without the input being declared as invariant."
2061*61046927SAndroid Build Coastguard Worker       *
2062*61046927SAndroid Build Coastguard Worker       * On the desktop side, this text first appears in GLSL 4.20.
2063*61046927SAndroid Build Coastguard Worker       */
2064*61046927SAndroid Build Coastguard Worker      if (state->is_version(420, 300) && $$.flags.q.in)
2065*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(&@1, state, "invariant qualifiers cannot be used with shader inputs");
2066*61046927SAndroid Build Coastguard Worker   }
2067*61046927SAndroid Build Coastguard Worker   | interpolation_qualifier type_qualifier
2068*61046927SAndroid Build Coastguard Worker   {
2069*61046927SAndroid Build Coastguard Worker      /* Section 4.3 of the GLSL 1.40 specification states:
2070*61046927SAndroid Build Coastguard Worker       * "...qualified with one of these interpolation qualifiers"
2071*61046927SAndroid Build Coastguard Worker       *
2072*61046927SAndroid Build Coastguard Worker       * GLSL 1.30 claims to allow "one or more", but insists that:
2073*61046927SAndroid Build Coastguard Worker       * "These interpolation qualifiers may only precede the qualifiers in,
2074*61046927SAndroid Build Coastguard Worker       *  centroid in, out, or centroid out in a declaration."
2075*61046927SAndroid Build Coastguard Worker       *
2076*61046927SAndroid Build Coastguard Worker       * ...which means that e.g. smooth can't precede smooth, so there can be
2077*61046927SAndroid Build Coastguard Worker       * only one after all, and the 1.40 text is a clarification, not a change.
2078*61046927SAndroid Build Coastguard Worker       */
2079*61046927SAndroid Build Coastguard Worker      if ($2.has_interpolation())
2080*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(&@1, state, "duplicate interpolation qualifier");
2081*61046927SAndroid Build Coastguard Worker
2082*61046927SAndroid Build Coastguard Worker      if (!state->has_420pack_or_es31() &&
2083*61046927SAndroid Build Coastguard Worker          ($2.flags.q.precise || $2.flags.q.invariant)) {
2084*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(&@1, state, "interpolation qualifiers must come "
2085*61046927SAndroid Build Coastguard Worker                          "after \"precise\" or \"invariant\"");
2086*61046927SAndroid Build Coastguard Worker      }
2087*61046927SAndroid Build Coastguard Worker
2088*61046927SAndroid Build Coastguard Worker      $$ = $1;
2089*61046927SAndroid Build Coastguard Worker      $$.merge_qualifier(&@1, state, $2, false);
2090*61046927SAndroid Build Coastguard Worker   }
2091*61046927SAndroid Build Coastguard Worker   | layout_qualifier type_qualifier
2092*61046927SAndroid Build Coastguard Worker   {
2093*61046927SAndroid Build Coastguard Worker      /* In the absence of ARB_shading_language_420pack, layout qualifiers may
2094*61046927SAndroid Build Coastguard Worker       * appear no later than auxiliary storage qualifiers. There is no
2095*61046927SAndroid Build Coastguard Worker       * particularly clear spec language mandating this, but in all examples
2096*61046927SAndroid Build Coastguard Worker       * the layout qualifier precedes the storage qualifier.
2097*61046927SAndroid Build Coastguard Worker       *
2098*61046927SAndroid Build Coastguard Worker       * We allow combinations of layout with interpolation, invariant or
2099*61046927SAndroid Build Coastguard Worker       * precise qualifiers since these are useful in ARB_separate_shader_objects.
2100*61046927SAndroid Build Coastguard Worker       * There is no clear spec guidance on this either.
2101*61046927SAndroid Build Coastguard Worker       */
2102*61046927SAndroid Build Coastguard Worker      $$ = $1;
2103*61046927SAndroid Build Coastguard Worker      $$.merge_qualifier(& @1, state, $2, false, $2.has_layout());
2104*61046927SAndroid Build Coastguard Worker   }
2105*61046927SAndroid Build Coastguard Worker   | subroutine_qualifier type_qualifier
2106*61046927SAndroid Build Coastguard Worker   {
2107*61046927SAndroid Build Coastguard Worker      $$ = $1;
2108*61046927SAndroid Build Coastguard Worker      $$.merge_qualifier(&@1, state, $2, false);
2109*61046927SAndroid Build Coastguard Worker   }
2110*61046927SAndroid Build Coastguard Worker   | auxiliary_storage_qualifier type_qualifier
2111*61046927SAndroid Build Coastguard Worker   {
2112*61046927SAndroid Build Coastguard Worker      if ($2.has_auxiliary_storage()) {
2113*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(&@1, state,
2114*61046927SAndroid Build Coastguard Worker                          "duplicate auxiliary storage qualifier (centroid or sample)");
2115*61046927SAndroid Build Coastguard Worker      }
2116*61046927SAndroid Build Coastguard Worker
2117*61046927SAndroid Build Coastguard Worker      if ((!state->has_420pack_or_es31() && !state->EXT_gpu_shader4_enable) &&
2118*61046927SAndroid Build Coastguard Worker          ($2.flags.q.precise || $2.flags.q.invariant ||
2119*61046927SAndroid Build Coastguard Worker           $2.has_interpolation() || $2.has_layout())) {
2120*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(&@1, state, "auxiliary storage qualifiers must come "
2121*61046927SAndroid Build Coastguard Worker                          "just before storage qualifiers");
2122*61046927SAndroid Build Coastguard Worker      }
2123*61046927SAndroid Build Coastguard Worker      $$ = $1;
2124*61046927SAndroid Build Coastguard Worker      $$.merge_qualifier(&@1, state, $2, false);
2125*61046927SAndroid Build Coastguard Worker   }
2126*61046927SAndroid Build Coastguard Worker   | storage_qualifier type_qualifier
2127*61046927SAndroid Build Coastguard Worker   {
2128*61046927SAndroid Build Coastguard Worker      /* Section 4.3 of the GLSL 1.20 specification states:
2129*61046927SAndroid Build Coastguard Worker       * "Variable declarations may have a storage qualifier specified..."
2130*61046927SAndroid Build Coastguard Worker       *  1.30 clarifies this to "may have one storage qualifier".
2131*61046927SAndroid Build Coastguard Worker       *
2132*61046927SAndroid Build Coastguard Worker       * GL_EXT_gpu_shader4 allows "varying out" in fragment shaders.
2133*61046927SAndroid Build Coastguard Worker       */
2134*61046927SAndroid Build Coastguard Worker      if ($2.has_storage() &&
2135*61046927SAndroid Build Coastguard Worker          (!state->EXT_gpu_shader4_enable ||
2136*61046927SAndroid Build Coastguard Worker           state->stage != MESA_SHADER_FRAGMENT ||
2137*61046927SAndroid Build Coastguard Worker           !$1.flags.q.varying || !$2.flags.q.out))
2138*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(&@1, state, "duplicate storage qualifier");
2139*61046927SAndroid Build Coastguard Worker
2140*61046927SAndroid Build Coastguard Worker      if (!state->has_420pack_or_es31() &&
2141*61046927SAndroid Build Coastguard Worker          ($2.flags.q.precise || $2.flags.q.invariant || $2.has_interpolation() ||
2142*61046927SAndroid Build Coastguard Worker           $2.has_layout() || $2.has_auxiliary_storage())) {
2143*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(&@1, state, "storage qualifiers must come after "
2144*61046927SAndroid Build Coastguard Worker                          "precise, invariant, interpolation, layout and auxiliary "
2145*61046927SAndroid Build Coastguard Worker                          "storage qualifiers");
2146*61046927SAndroid Build Coastguard Worker      }
2147*61046927SAndroid Build Coastguard Worker
2148*61046927SAndroid Build Coastguard Worker      $$ = $1;
2149*61046927SAndroid Build Coastguard Worker      $$.merge_qualifier(&@1, state, $2, false);
2150*61046927SAndroid Build Coastguard Worker   }
2151*61046927SAndroid Build Coastguard Worker   | precision_qualifier type_qualifier
2152*61046927SAndroid Build Coastguard Worker   {
2153*61046927SAndroid Build Coastguard Worker      if ($2.precision != ast_precision_none)
2154*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(&@1, state, "duplicate precision qualifier");
2155*61046927SAndroid Build Coastguard Worker
2156*61046927SAndroid Build Coastguard Worker      if (!(state->has_420pack_or_es31()) &&
2157*61046927SAndroid Build Coastguard Worker          $2.flags.i != 0)
2158*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(&@1, state, "precision qualifiers must come last");
2159*61046927SAndroid Build Coastguard Worker
2160*61046927SAndroid Build Coastguard Worker      $$ = $2;
2161*61046927SAndroid Build Coastguard Worker      $$.precision = $1;
2162*61046927SAndroid Build Coastguard Worker   }
2163*61046927SAndroid Build Coastguard Worker   | memory_qualifier type_qualifier
2164*61046927SAndroid Build Coastguard Worker   {
2165*61046927SAndroid Build Coastguard Worker      $$ = $1;
2166*61046927SAndroid Build Coastguard Worker      $$.merge_qualifier(&@1, state, $2, false);
2167*61046927SAndroid Build Coastguard Worker   }
2168*61046927SAndroid Build Coastguard Worker   ;
2169*61046927SAndroid Build Coastguard Worker
2170*61046927SAndroid Build Coastguard Workerauxiliary_storage_qualifier:
2171*61046927SAndroid Build Coastguard Worker   CENTROID
2172*61046927SAndroid Build Coastguard Worker   {
2173*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2174*61046927SAndroid Build Coastguard Worker      $$.flags.q.centroid = 1;
2175*61046927SAndroid Build Coastguard Worker   }
2176*61046927SAndroid Build Coastguard Worker   | SAMPLE
2177*61046927SAndroid Build Coastguard Worker   {
2178*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2179*61046927SAndroid Build Coastguard Worker      $$.flags.q.sample = 1;
2180*61046927SAndroid Build Coastguard Worker   }
2181*61046927SAndroid Build Coastguard Worker   | PATCH
2182*61046927SAndroid Build Coastguard Worker   {
2183*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2184*61046927SAndroid Build Coastguard Worker      $$.flags.q.patch = 1;
2185*61046927SAndroid Build Coastguard Worker   }
2186*61046927SAndroid Build Coastguard Worker
2187*61046927SAndroid Build Coastguard Workerstorage_qualifier:
2188*61046927SAndroid Build Coastguard Worker   CONST_TOK
2189*61046927SAndroid Build Coastguard Worker   {
2190*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2191*61046927SAndroid Build Coastguard Worker      $$.flags.q.constant = 1;
2192*61046927SAndroid Build Coastguard Worker   }
2193*61046927SAndroid Build Coastguard Worker   | ATTRIBUTE
2194*61046927SAndroid Build Coastguard Worker   {
2195*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2196*61046927SAndroid Build Coastguard Worker      $$.flags.q.attribute = 1;
2197*61046927SAndroid Build Coastguard Worker   }
2198*61046927SAndroid Build Coastguard Worker   | VARYING
2199*61046927SAndroid Build Coastguard Worker   {
2200*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2201*61046927SAndroid Build Coastguard Worker      $$.flags.q.varying = 1;
2202*61046927SAndroid Build Coastguard Worker   }
2203*61046927SAndroid Build Coastguard Worker   | IN_TOK
2204*61046927SAndroid Build Coastguard Worker   {
2205*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2206*61046927SAndroid Build Coastguard Worker      $$.flags.q.in = 1;
2207*61046927SAndroid Build Coastguard Worker   }
2208*61046927SAndroid Build Coastguard Worker   | OUT_TOK
2209*61046927SAndroid Build Coastguard Worker   {
2210*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2211*61046927SAndroid Build Coastguard Worker      $$.flags.q.out = 1;
2212*61046927SAndroid Build Coastguard Worker
2213*61046927SAndroid Build Coastguard Worker      if (state->stage == MESA_SHADER_GEOMETRY &&
2214*61046927SAndroid Build Coastguard Worker          state->has_explicit_attrib_stream()) {
2215*61046927SAndroid Build Coastguard Worker         /* Section 4.3.8.2 (Output Layout Qualifiers) of the GLSL 4.00
2216*61046927SAndroid Build Coastguard Worker          * spec says:
2217*61046927SAndroid Build Coastguard Worker          *
2218*61046927SAndroid Build Coastguard Worker          *     "If the block or variable is declared with the stream
2219*61046927SAndroid Build Coastguard Worker          *     identifier, it is associated with the specified stream;
2220*61046927SAndroid Build Coastguard Worker          *     otherwise, it is associated with the current default stream."
2221*61046927SAndroid Build Coastguard Worker          */
2222*61046927SAndroid Build Coastguard Worker          $$.flags.q.stream = 1;
2223*61046927SAndroid Build Coastguard Worker          $$.flags.q.explicit_stream = 0;
2224*61046927SAndroid Build Coastguard Worker          $$.stream = state->out_qualifier->stream;
2225*61046927SAndroid Build Coastguard Worker      }
2226*61046927SAndroid Build Coastguard Worker
2227*61046927SAndroid Build Coastguard Worker      if (state->has_enhanced_layouts() && state->exts->ARB_transform_feedback3) {
2228*61046927SAndroid Build Coastguard Worker          $$.flags.q.xfb_buffer = 1;
2229*61046927SAndroid Build Coastguard Worker          $$.flags.q.explicit_xfb_buffer = 0;
2230*61046927SAndroid Build Coastguard Worker          $$.xfb_buffer = state->out_qualifier->xfb_buffer;
2231*61046927SAndroid Build Coastguard Worker      }
2232*61046927SAndroid Build Coastguard Worker   }
2233*61046927SAndroid Build Coastguard Worker   | INOUT_TOK
2234*61046927SAndroid Build Coastguard Worker   {
2235*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2236*61046927SAndroid Build Coastguard Worker      $$.flags.q.in = 1;
2237*61046927SAndroid Build Coastguard Worker      $$.flags.q.out = 1;
2238*61046927SAndroid Build Coastguard Worker
2239*61046927SAndroid Build Coastguard Worker      if (!state->has_framebuffer_fetch() ||
2240*61046927SAndroid Build Coastguard Worker          !state->is_version(130, 300) ||
2241*61046927SAndroid Build Coastguard Worker          state->stage != MESA_SHADER_FRAGMENT)
2242*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(&@1, state, "A single interface variable cannot be "
2243*61046927SAndroid Build Coastguard Worker                          "declared as both input and output");
2244*61046927SAndroid Build Coastguard Worker   }
2245*61046927SAndroid Build Coastguard Worker   | UNIFORM
2246*61046927SAndroid Build Coastguard Worker   {
2247*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2248*61046927SAndroid Build Coastguard Worker      $$.flags.q.uniform = 1;
2249*61046927SAndroid Build Coastguard Worker   }
2250*61046927SAndroid Build Coastguard Worker   | BUFFER
2251*61046927SAndroid Build Coastguard Worker   {
2252*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2253*61046927SAndroid Build Coastguard Worker      $$.flags.q.buffer = 1;
2254*61046927SAndroid Build Coastguard Worker   }
2255*61046927SAndroid Build Coastguard Worker   | SHARED
2256*61046927SAndroid Build Coastguard Worker   {
2257*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2258*61046927SAndroid Build Coastguard Worker      $$.flags.q.shared_storage = 1;
2259*61046927SAndroid Build Coastguard Worker   }
2260*61046927SAndroid Build Coastguard Worker   ;
2261*61046927SAndroid Build Coastguard Worker
2262*61046927SAndroid Build Coastguard Workermemory_qualifier:
2263*61046927SAndroid Build Coastguard Worker   COHERENT
2264*61046927SAndroid Build Coastguard Worker   {
2265*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2266*61046927SAndroid Build Coastguard Worker      $$.flags.q.coherent = 1;
2267*61046927SAndroid Build Coastguard Worker   }
2268*61046927SAndroid Build Coastguard Worker   | VOLATILE
2269*61046927SAndroid Build Coastguard Worker   {
2270*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2271*61046927SAndroid Build Coastguard Worker      $$.flags.q._volatile = 1;
2272*61046927SAndroid Build Coastguard Worker   }
2273*61046927SAndroid Build Coastguard Worker   | RESTRICT
2274*61046927SAndroid Build Coastguard Worker   {
2275*61046927SAndroid Build Coastguard Worker      STATIC_ASSERT(sizeof($$.flags.q) <= sizeof($$.flags.i));
2276*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2277*61046927SAndroid Build Coastguard Worker      $$.flags.q.restrict_flag = 1;
2278*61046927SAndroid Build Coastguard Worker   }
2279*61046927SAndroid Build Coastguard Worker   | READONLY
2280*61046927SAndroid Build Coastguard Worker   {
2281*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2282*61046927SAndroid Build Coastguard Worker      $$.flags.q.read_only = 1;
2283*61046927SAndroid Build Coastguard Worker   }
2284*61046927SAndroid Build Coastguard Worker   | WRITEONLY
2285*61046927SAndroid Build Coastguard Worker   {
2286*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2287*61046927SAndroid Build Coastguard Worker      $$.flags.q.write_only = 1;
2288*61046927SAndroid Build Coastguard Worker   }
2289*61046927SAndroid Build Coastguard Worker   ;
2290*61046927SAndroid Build Coastguard Worker
2291*61046927SAndroid Build Coastguard Workerarray_specifier:
2292*61046927SAndroid Build Coastguard Worker   '[' ']'
2293*61046927SAndroid Build Coastguard Worker   {
2294*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2295*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_array_specifier(@1, new(ctx) ast_expression(
2296*61046927SAndroid Build Coastguard Worker                                                  ast_unsized_array_dim, NULL,
2297*61046927SAndroid Build Coastguard Worker                                                  NULL, NULL));
2298*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @2);
2299*61046927SAndroid Build Coastguard Worker   }
2300*61046927SAndroid Build Coastguard Worker   | '[' constant_expression ']'
2301*61046927SAndroid Build Coastguard Worker   {
2302*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2303*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_array_specifier(@1, $2);
2304*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
2305*61046927SAndroid Build Coastguard Worker   }
2306*61046927SAndroid Build Coastguard Worker   | array_specifier '[' ']'
2307*61046927SAndroid Build Coastguard Worker   {
2308*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2309*61046927SAndroid Build Coastguard Worker      $$ = $1;
2310*61046927SAndroid Build Coastguard Worker
2311*61046927SAndroid Build Coastguard Worker      if (state->check_arrays_of_arrays_allowed(& @1)) {
2312*61046927SAndroid Build Coastguard Worker         $$->add_dimension(new(ctx) ast_expression(ast_unsized_array_dim, NULL,
2313*61046927SAndroid Build Coastguard Worker                                                   NULL, NULL));
2314*61046927SAndroid Build Coastguard Worker      }
2315*61046927SAndroid Build Coastguard Worker   }
2316*61046927SAndroid Build Coastguard Worker   | array_specifier '[' constant_expression ']'
2317*61046927SAndroid Build Coastguard Worker   {
2318*61046927SAndroid Build Coastguard Worker      $$ = $1;
2319*61046927SAndroid Build Coastguard Worker
2320*61046927SAndroid Build Coastguard Worker      if (state->check_arrays_of_arrays_allowed(& @1)) {
2321*61046927SAndroid Build Coastguard Worker         $$->add_dimension($3);
2322*61046927SAndroid Build Coastguard Worker      }
2323*61046927SAndroid Build Coastguard Worker   }
2324*61046927SAndroid Build Coastguard Worker   ;
2325*61046927SAndroid Build Coastguard Worker
2326*61046927SAndroid Build Coastguard Workertype_specifier:
2327*61046927SAndroid Build Coastguard Worker   type_specifier_nonarray
2328*61046927SAndroid Build Coastguard Worker   | type_specifier_nonarray array_specifier
2329*61046927SAndroid Build Coastguard Worker   {
2330*61046927SAndroid Build Coastguard Worker      $$ = $1;
2331*61046927SAndroid Build Coastguard Worker      $$->array_specifier = $2;
2332*61046927SAndroid Build Coastguard Worker   }
2333*61046927SAndroid Build Coastguard Worker   ;
2334*61046927SAndroid Build Coastguard Worker
2335*61046927SAndroid Build Coastguard Workertype_specifier_nonarray:
2336*61046927SAndroid Build Coastguard Worker   basic_type_specifier_nonarray
2337*61046927SAndroid Build Coastguard Worker   {
2338*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2339*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_type_specifier($1);
2340*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
2341*61046927SAndroid Build Coastguard Worker   }
2342*61046927SAndroid Build Coastguard Worker   | struct_specifier
2343*61046927SAndroid Build Coastguard Worker   {
2344*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2345*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_type_specifier($1);
2346*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
2347*61046927SAndroid Build Coastguard Worker   }
2348*61046927SAndroid Build Coastguard Worker   | TYPE_IDENTIFIER
2349*61046927SAndroid Build Coastguard Worker   {
2350*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2351*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_type_specifier($1);
2352*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
2353*61046927SAndroid Build Coastguard Worker   }
2354*61046927SAndroid Build Coastguard Worker   ;
2355*61046927SAndroid Build Coastguard Worker
2356*61046927SAndroid Build Coastguard Workerbasic_type_specifier_nonarray:
2357*61046927SAndroid Build Coastguard Worker   VOID_TOK                 { $$ = &glsl_type_builtin_void; }
2358*61046927SAndroid Build Coastguard Worker   | BASIC_TYPE_TOK         { $$ = $1; }
2359*61046927SAndroid Build Coastguard Worker   | UNSIGNED BASIC_TYPE_TOK
2360*61046927SAndroid Build Coastguard Worker   {
2361*61046927SAndroid Build Coastguard Worker      if ($2 == &glsl_type_builtin_int) {
2362*61046927SAndroid Build Coastguard Worker         $$ = &glsl_type_builtin_uint;
2363*61046927SAndroid Build Coastguard Worker      } else {
2364*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(&@1, state,
2365*61046927SAndroid Build Coastguard Worker                          "\"unsigned\" is only allowed before \"int\"");
2366*61046927SAndroid Build Coastguard Worker      }
2367*61046927SAndroid Build Coastguard Worker   }
2368*61046927SAndroid Build Coastguard Worker   ;
2369*61046927SAndroid Build Coastguard Worker
2370*61046927SAndroid Build Coastguard Workerprecision_qualifier:
2371*61046927SAndroid Build Coastguard Worker   HIGHP
2372*61046927SAndroid Build Coastguard Worker   {
2373*61046927SAndroid Build Coastguard Worker      state->check_precision_qualifiers_allowed(&@1);
2374*61046927SAndroid Build Coastguard Worker      $$ = ast_precision_high;
2375*61046927SAndroid Build Coastguard Worker   }
2376*61046927SAndroid Build Coastguard Worker   | MEDIUMP
2377*61046927SAndroid Build Coastguard Worker   {
2378*61046927SAndroid Build Coastguard Worker      state->check_precision_qualifiers_allowed(&@1);
2379*61046927SAndroid Build Coastguard Worker      $$ = ast_precision_medium;
2380*61046927SAndroid Build Coastguard Worker   }
2381*61046927SAndroid Build Coastguard Worker   | LOWP
2382*61046927SAndroid Build Coastguard Worker   {
2383*61046927SAndroid Build Coastguard Worker      state->check_precision_qualifiers_allowed(&@1);
2384*61046927SAndroid Build Coastguard Worker      $$ = ast_precision_low;
2385*61046927SAndroid Build Coastguard Worker   }
2386*61046927SAndroid Build Coastguard Worker   ;
2387*61046927SAndroid Build Coastguard Worker
2388*61046927SAndroid Build Coastguard Workerstruct_specifier:
2389*61046927SAndroid Build Coastguard Worker   STRUCT any_identifier '{' struct_declaration_list '}'
2390*61046927SAndroid Build Coastguard Worker   {
2391*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2392*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_struct_specifier($2, $4);
2393*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@2, @5);
2394*61046927SAndroid Build Coastguard Worker      state->symbols->add_type($2, &glsl_type_builtin_void);
2395*61046927SAndroid Build Coastguard Worker   }
2396*61046927SAndroid Build Coastguard Worker   | STRUCT '{' struct_declaration_list '}'
2397*61046927SAndroid Build Coastguard Worker   {
2398*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2399*61046927SAndroid Build Coastguard Worker
2400*61046927SAndroid Build Coastguard Worker      /* All anonymous structs have the same name. This simplifies matching of
2401*61046927SAndroid Build Coastguard Worker       * globals whose type is an unnamed struct.
2402*61046927SAndroid Build Coastguard Worker       *
2403*61046927SAndroid Build Coastguard Worker       * It also avoids a memory leak when the same shader is compiled over and
2404*61046927SAndroid Build Coastguard Worker       * over again.
2405*61046927SAndroid Build Coastguard Worker       */
2406*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_struct_specifier("#anon_struct", $3);
2407*61046927SAndroid Build Coastguard Worker
2408*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@2, @4);
2409*61046927SAndroid Build Coastguard Worker   }
2410*61046927SAndroid Build Coastguard Worker   ;
2411*61046927SAndroid Build Coastguard Worker
2412*61046927SAndroid Build Coastguard Workerstruct_declaration_list:
2413*61046927SAndroid Build Coastguard Worker   struct_declaration
2414*61046927SAndroid Build Coastguard Worker   {
2415*61046927SAndroid Build Coastguard Worker      $$ = $1;
2416*61046927SAndroid Build Coastguard Worker      $1->link.self_link();
2417*61046927SAndroid Build Coastguard Worker   }
2418*61046927SAndroid Build Coastguard Worker   | struct_declaration_list struct_declaration
2419*61046927SAndroid Build Coastguard Worker   {
2420*61046927SAndroid Build Coastguard Worker      $$ = $1;
2421*61046927SAndroid Build Coastguard Worker      $$->link.insert_before(& $2->link);
2422*61046927SAndroid Build Coastguard Worker   }
2423*61046927SAndroid Build Coastguard Worker   ;
2424*61046927SAndroid Build Coastguard Worker
2425*61046927SAndroid Build Coastguard Workerstruct_declaration:
2426*61046927SAndroid Build Coastguard Worker   fully_specified_type struct_declarator_list ';'
2427*61046927SAndroid Build Coastguard Worker   {
2428*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2429*61046927SAndroid Build Coastguard Worker      ast_fully_specified_type *const type = $1;
2430*61046927SAndroid Build Coastguard Worker      type->set_location(@1);
2431*61046927SAndroid Build Coastguard Worker
2432*61046927SAndroid Build Coastguard Worker      if (state->has_bindless()) {
2433*61046927SAndroid Build Coastguard Worker         ast_type_qualifier input_layout_mask;
2434*61046927SAndroid Build Coastguard Worker
2435*61046927SAndroid Build Coastguard Worker         /* Allow to declare qualifiers for images. */
2436*61046927SAndroid Build Coastguard Worker         input_layout_mask.flags.i = 0;
2437*61046927SAndroid Build Coastguard Worker         input_layout_mask.flags.q.coherent = 1;
2438*61046927SAndroid Build Coastguard Worker         input_layout_mask.flags.q._volatile = 1;
2439*61046927SAndroid Build Coastguard Worker         input_layout_mask.flags.q.restrict_flag = 1;
2440*61046927SAndroid Build Coastguard Worker         input_layout_mask.flags.q.read_only = 1;
2441*61046927SAndroid Build Coastguard Worker         input_layout_mask.flags.q.write_only = 1;
2442*61046927SAndroid Build Coastguard Worker         input_layout_mask.flags.q.explicit_image_format = 1;
2443*61046927SAndroid Build Coastguard Worker
2444*61046927SAndroid Build Coastguard Worker         if ((type->qualifier.flags.i & ~input_layout_mask.flags.i) != 0) {
2445*61046927SAndroid Build Coastguard Worker            _mesa_glsl_error(&@1, state,
2446*61046927SAndroid Build Coastguard Worker                             "only precision and image qualifiers may be "
2447*61046927SAndroid Build Coastguard Worker                             "applied to structure members");
2448*61046927SAndroid Build Coastguard Worker         }
2449*61046927SAndroid Build Coastguard Worker      } else {
2450*61046927SAndroid Build Coastguard Worker         if (type->qualifier.flags.i != 0)
2451*61046927SAndroid Build Coastguard Worker            _mesa_glsl_error(&@1, state,
2452*61046927SAndroid Build Coastguard Worker                             "only precision qualifiers may be applied to "
2453*61046927SAndroid Build Coastguard Worker                             "structure members");
2454*61046927SAndroid Build Coastguard Worker      }
2455*61046927SAndroid Build Coastguard Worker
2456*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_declarator_list(type);
2457*61046927SAndroid Build Coastguard Worker      $$->set_location(@2);
2458*61046927SAndroid Build Coastguard Worker
2459*61046927SAndroid Build Coastguard Worker      $$->declarations.push_degenerate_list_at_head(& $2->link);
2460*61046927SAndroid Build Coastguard Worker   }
2461*61046927SAndroid Build Coastguard Worker   ;
2462*61046927SAndroid Build Coastguard Worker
2463*61046927SAndroid Build Coastguard Workerstruct_declarator_list:
2464*61046927SAndroid Build Coastguard Worker   struct_declarator
2465*61046927SAndroid Build Coastguard Worker   {
2466*61046927SAndroid Build Coastguard Worker      $$ = $1;
2467*61046927SAndroid Build Coastguard Worker      $1->link.self_link();
2468*61046927SAndroid Build Coastguard Worker   }
2469*61046927SAndroid Build Coastguard Worker   | struct_declarator_list ',' struct_declarator
2470*61046927SAndroid Build Coastguard Worker   {
2471*61046927SAndroid Build Coastguard Worker      $$ = $1;
2472*61046927SAndroid Build Coastguard Worker      $$->link.insert_before(& $3->link);
2473*61046927SAndroid Build Coastguard Worker   }
2474*61046927SAndroid Build Coastguard Worker   ;
2475*61046927SAndroid Build Coastguard Worker
2476*61046927SAndroid Build Coastguard Workerstruct_declarator:
2477*61046927SAndroid Build Coastguard Worker   any_identifier
2478*61046927SAndroid Build Coastguard Worker   {
2479*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2480*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_declaration($1, NULL, NULL);
2481*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
2482*61046927SAndroid Build Coastguard Worker   }
2483*61046927SAndroid Build Coastguard Worker   | any_identifier array_specifier
2484*61046927SAndroid Build Coastguard Worker   {
2485*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2486*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_declaration($1, $2, NULL);
2487*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @2);
2488*61046927SAndroid Build Coastguard Worker   }
2489*61046927SAndroid Build Coastguard Worker   ;
2490*61046927SAndroid Build Coastguard Worker
2491*61046927SAndroid Build Coastguard Workerinitializer:
2492*61046927SAndroid Build Coastguard Worker   assignment_expression
2493*61046927SAndroid Build Coastguard Worker   | '{' initializer_list '}'
2494*61046927SAndroid Build Coastguard Worker   {
2495*61046927SAndroid Build Coastguard Worker      $$ = $2;
2496*61046927SAndroid Build Coastguard Worker   }
2497*61046927SAndroid Build Coastguard Worker   | '{' initializer_list ',' '}'
2498*61046927SAndroid Build Coastguard Worker   {
2499*61046927SAndroid Build Coastguard Worker      $$ = $2;
2500*61046927SAndroid Build Coastguard Worker   }
2501*61046927SAndroid Build Coastguard Worker   ;
2502*61046927SAndroid Build Coastguard Worker
2503*61046927SAndroid Build Coastguard Workerinitializer_list:
2504*61046927SAndroid Build Coastguard Worker   initializer
2505*61046927SAndroid Build Coastguard Worker   {
2506*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2507*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_aggregate_initializer();
2508*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
2509*61046927SAndroid Build Coastguard Worker      $$->expressions.push_tail(& $1->link);
2510*61046927SAndroid Build Coastguard Worker   }
2511*61046927SAndroid Build Coastguard Worker   | initializer_list ',' initializer
2512*61046927SAndroid Build Coastguard Worker   {
2513*61046927SAndroid Build Coastguard Worker      $1->expressions.push_tail(& $3->link);
2514*61046927SAndroid Build Coastguard Worker   }
2515*61046927SAndroid Build Coastguard Worker   ;
2516*61046927SAndroid Build Coastguard Worker
2517*61046927SAndroid Build Coastguard Workerdeclaration_statement:
2518*61046927SAndroid Build Coastguard Worker   declaration
2519*61046927SAndroid Build Coastguard Worker   ;
2520*61046927SAndroid Build Coastguard Worker
2521*61046927SAndroid Build Coastguard Worker   // Grammar Note: labeled statements for SWITCH only; 'goto' is not
2522*61046927SAndroid Build Coastguard Worker   // supported.
2523*61046927SAndroid Build Coastguard Workerstatement:
2524*61046927SAndroid Build Coastguard Worker   compound_statement        { $$ = (ast_node *) $1; }
2525*61046927SAndroid Build Coastguard Worker   | simple_statement
2526*61046927SAndroid Build Coastguard Worker   ;
2527*61046927SAndroid Build Coastguard Worker
2528*61046927SAndroid Build Coastguard Workersimple_statement:
2529*61046927SAndroid Build Coastguard Worker   declaration_statement
2530*61046927SAndroid Build Coastguard Worker   | expression_statement
2531*61046927SAndroid Build Coastguard Worker   | selection_statement
2532*61046927SAndroid Build Coastguard Worker   | switch_statement
2533*61046927SAndroid Build Coastguard Worker   | iteration_statement
2534*61046927SAndroid Build Coastguard Worker   | jump_statement
2535*61046927SAndroid Build Coastguard Worker   | demote_statement
2536*61046927SAndroid Build Coastguard Worker   ;
2537*61046927SAndroid Build Coastguard Worker
2538*61046927SAndroid Build Coastguard Workercompound_statement:
2539*61046927SAndroid Build Coastguard Worker   '{' '}'
2540*61046927SAndroid Build Coastguard Worker   {
2541*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2542*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_compound_statement(true, NULL);
2543*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @2);
2544*61046927SAndroid Build Coastguard Worker   }
2545*61046927SAndroid Build Coastguard Worker   | '{'
2546*61046927SAndroid Build Coastguard Worker   {
2547*61046927SAndroid Build Coastguard Worker      state->symbols->push_scope();
2548*61046927SAndroid Build Coastguard Worker   }
2549*61046927SAndroid Build Coastguard Worker   statement_list '}'
2550*61046927SAndroid Build Coastguard Worker   {
2551*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2552*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_compound_statement(true, $3);
2553*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @4);
2554*61046927SAndroid Build Coastguard Worker      state->symbols->pop_scope();
2555*61046927SAndroid Build Coastguard Worker   }
2556*61046927SAndroid Build Coastguard Worker   ;
2557*61046927SAndroid Build Coastguard Worker
2558*61046927SAndroid Build Coastguard Workerstatement_no_new_scope:
2559*61046927SAndroid Build Coastguard Worker   compound_statement_no_new_scope { $$ = (ast_node *) $1; }
2560*61046927SAndroid Build Coastguard Worker   | simple_statement
2561*61046927SAndroid Build Coastguard Worker   ;
2562*61046927SAndroid Build Coastguard Worker
2563*61046927SAndroid Build Coastguard Workercompound_statement_no_new_scope:
2564*61046927SAndroid Build Coastguard Worker   '{' '}'
2565*61046927SAndroid Build Coastguard Worker   {
2566*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2567*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_compound_statement(false, NULL);
2568*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @2);
2569*61046927SAndroid Build Coastguard Worker   }
2570*61046927SAndroid Build Coastguard Worker   | '{' statement_list '}'
2571*61046927SAndroid Build Coastguard Worker   {
2572*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2573*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_compound_statement(false, $2);
2574*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
2575*61046927SAndroid Build Coastguard Worker   }
2576*61046927SAndroid Build Coastguard Worker   ;
2577*61046927SAndroid Build Coastguard Worker
2578*61046927SAndroid Build Coastguard Workerstatement_list:
2579*61046927SAndroid Build Coastguard Worker   statement
2580*61046927SAndroid Build Coastguard Worker   {
2581*61046927SAndroid Build Coastguard Worker      if ($1 == NULL) {
2582*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(& @1, state, "<nil> statement");
2583*61046927SAndroid Build Coastguard Worker         assert($1 != NULL);
2584*61046927SAndroid Build Coastguard Worker      }
2585*61046927SAndroid Build Coastguard Worker
2586*61046927SAndroid Build Coastguard Worker      $$ = $1;
2587*61046927SAndroid Build Coastguard Worker      $$->link.self_link();
2588*61046927SAndroid Build Coastguard Worker   }
2589*61046927SAndroid Build Coastguard Worker   | statement_list statement
2590*61046927SAndroid Build Coastguard Worker   {
2591*61046927SAndroid Build Coastguard Worker      if ($2 == NULL) {
2592*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(& @2, state, "<nil> statement");
2593*61046927SAndroid Build Coastguard Worker         assert($2 != NULL);
2594*61046927SAndroid Build Coastguard Worker      }
2595*61046927SAndroid Build Coastguard Worker      $$ = $1;
2596*61046927SAndroid Build Coastguard Worker      $$->link.insert_before(& $2->link);
2597*61046927SAndroid Build Coastguard Worker   }
2598*61046927SAndroid Build Coastguard Worker   | statement_list extension_statement
2599*61046927SAndroid Build Coastguard Worker   {
2600*61046927SAndroid Build Coastguard Worker      if (!state->allow_extension_directive_midshader) {
2601*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(& @1, state,
2602*61046927SAndroid Build Coastguard Worker                          "#extension directive is not allowed "
2603*61046927SAndroid Build Coastguard Worker                          "in the middle of a shader");
2604*61046927SAndroid Build Coastguard Worker         YYERROR;
2605*61046927SAndroid Build Coastguard Worker      }
2606*61046927SAndroid Build Coastguard Worker   }
2607*61046927SAndroid Build Coastguard Worker   ;
2608*61046927SAndroid Build Coastguard Worker
2609*61046927SAndroid Build Coastguard Workerexpression_statement:
2610*61046927SAndroid Build Coastguard Worker   ';'
2611*61046927SAndroid Build Coastguard Worker   {
2612*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2613*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression_statement(NULL);
2614*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
2615*61046927SAndroid Build Coastguard Worker   }
2616*61046927SAndroid Build Coastguard Worker   | expression ';'
2617*61046927SAndroid Build Coastguard Worker   {
2618*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2619*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_expression_statement($1);
2620*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
2621*61046927SAndroid Build Coastguard Worker   }
2622*61046927SAndroid Build Coastguard Worker   ;
2623*61046927SAndroid Build Coastguard Worker
2624*61046927SAndroid Build Coastguard Workerselection_statement:
2625*61046927SAndroid Build Coastguard Worker   IF '(' expression ')' selection_rest_statement
2626*61046927SAndroid Build Coastguard Worker   {
2627*61046927SAndroid Build Coastguard Worker      $$ = new(state->linalloc) ast_selection_statement($3, $5.then_statement,
2628*61046927SAndroid Build Coastguard Worker                                                        $5.else_statement);
2629*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @5);
2630*61046927SAndroid Build Coastguard Worker   }
2631*61046927SAndroid Build Coastguard Worker   ;
2632*61046927SAndroid Build Coastguard Worker
2633*61046927SAndroid Build Coastguard Workerselection_rest_statement:
2634*61046927SAndroid Build Coastguard Worker   statement ELSE statement
2635*61046927SAndroid Build Coastguard Worker   {
2636*61046927SAndroid Build Coastguard Worker      $$.then_statement = $1;
2637*61046927SAndroid Build Coastguard Worker      $$.else_statement = $3;
2638*61046927SAndroid Build Coastguard Worker   }
2639*61046927SAndroid Build Coastguard Worker   | statement %prec THEN
2640*61046927SAndroid Build Coastguard Worker   {
2641*61046927SAndroid Build Coastguard Worker      $$.then_statement = $1;
2642*61046927SAndroid Build Coastguard Worker      $$.else_statement = NULL;
2643*61046927SAndroid Build Coastguard Worker   }
2644*61046927SAndroid Build Coastguard Worker   ;
2645*61046927SAndroid Build Coastguard Worker
2646*61046927SAndroid Build Coastguard Workercondition:
2647*61046927SAndroid Build Coastguard Worker   expression
2648*61046927SAndroid Build Coastguard Worker   {
2649*61046927SAndroid Build Coastguard Worker      $$ = (ast_node *) $1;
2650*61046927SAndroid Build Coastguard Worker   }
2651*61046927SAndroid Build Coastguard Worker   | fully_specified_type any_identifier '=' initializer
2652*61046927SAndroid Build Coastguard Worker   {
2653*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2654*61046927SAndroid Build Coastguard Worker      ast_declaration *decl = new(ctx) ast_declaration($2, NULL, $4);
2655*61046927SAndroid Build Coastguard Worker      ast_declarator_list *declarator = new(ctx) ast_declarator_list($1);
2656*61046927SAndroid Build Coastguard Worker      decl->set_location_range(@2, @4);
2657*61046927SAndroid Build Coastguard Worker      declarator->set_location(@1);
2658*61046927SAndroid Build Coastguard Worker
2659*61046927SAndroid Build Coastguard Worker      declarator->declarations.push_tail(&decl->link);
2660*61046927SAndroid Build Coastguard Worker      $$ = declarator;
2661*61046927SAndroid Build Coastguard Worker   }
2662*61046927SAndroid Build Coastguard Worker   ;
2663*61046927SAndroid Build Coastguard Worker
2664*61046927SAndroid Build Coastguard Worker/*
2665*61046927SAndroid Build Coastguard Worker * switch_statement grammar is based on the syntax described in the body
2666*61046927SAndroid Build Coastguard Worker * of the GLSL spec, not in it's appendix!!!
2667*61046927SAndroid Build Coastguard Worker */
2668*61046927SAndroid Build Coastguard Workerswitch_statement:
2669*61046927SAndroid Build Coastguard Worker   SWITCH '(' expression ')' switch_body
2670*61046927SAndroid Build Coastguard Worker   {
2671*61046927SAndroid Build Coastguard Worker      $$ = new(state->linalloc) ast_switch_statement($3, $5);
2672*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @5);
2673*61046927SAndroid Build Coastguard Worker   }
2674*61046927SAndroid Build Coastguard Worker   ;
2675*61046927SAndroid Build Coastguard Worker
2676*61046927SAndroid Build Coastguard Workerswitch_body:
2677*61046927SAndroid Build Coastguard Worker   '{' '}'
2678*61046927SAndroid Build Coastguard Worker   {
2679*61046927SAndroid Build Coastguard Worker      $$ = new(state->linalloc) ast_switch_body(NULL);
2680*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @2);
2681*61046927SAndroid Build Coastguard Worker   }
2682*61046927SAndroid Build Coastguard Worker   | '{' case_statement_list '}'
2683*61046927SAndroid Build Coastguard Worker   {
2684*61046927SAndroid Build Coastguard Worker      $$ = new(state->linalloc) ast_switch_body($2);
2685*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @3);
2686*61046927SAndroid Build Coastguard Worker   }
2687*61046927SAndroid Build Coastguard Worker   ;
2688*61046927SAndroid Build Coastguard Worker
2689*61046927SAndroid Build Coastguard Workercase_label:
2690*61046927SAndroid Build Coastguard Worker   CASE expression ':'
2691*61046927SAndroid Build Coastguard Worker   {
2692*61046927SAndroid Build Coastguard Worker      $$ = new(state->linalloc) ast_case_label($2);
2693*61046927SAndroid Build Coastguard Worker      $$->set_location(@2);
2694*61046927SAndroid Build Coastguard Worker   }
2695*61046927SAndroid Build Coastguard Worker   | DEFAULT ':'
2696*61046927SAndroid Build Coastguard Worker   {
2697*61046927SAndroid Build Coastguard Worker      $$ = new(state->linalloc) ast_case_label(NULL);
2698*61046927SAndroid Build Coastguard Worker      $$->set_location(@2);
2699*61046927SAndroid Build Coastguard Worker   }
2700*61046927SAndroid Build Coastguard Worker   ;
2701*61046927SAndroid Build Coastguard Worker
2702*61046927SAndroid Build Coastguard Workercase_label_list:
2703*61046927SAndroid Build Coastguard Worker   case_label
2704*61046927SAndroid Build Coastguard Worker   {
2705*61046927SAndroid Build Coastguard Worker      ast_case_label_list *labels = new(state->linalloc) ast_case_label_list();
2706*61046927SAndroid Build Coastguard Worker
2707*61046927SAndroid Build Coastguard Worker      labels->labels.push_tail(& $1->link);
2708*61046927SAndroid Build Coastguard Worker      $$ = labels;
2709*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
2710*61046927SAndroid Build Coastguard Worker   }
2711*61046927SAndroid Build Coastguard Worker   | case_label_list case_label
2712*61046927SAndroid Build Coastguard Worker   {
2713*61046927SAndroid Build Coastguard Worker      $$ = $1;
2714*61046927SAndroid Build Coastguard Worker      $$->labels.push_tail(& $2->link);
2715*61046927SAndroid Build Coastguard Worker   }
2716*61046927SAndroid Build Coastguard Worker   ;
2717*61046927SAndroid Build Coastguard Worker
2718*61046927SAndroid Build Coastguard Workercase_statement:
2719*61046927SAndroid Build Coastguard Worker   case_label_list statement
2720*61046927SAndroid Build Coastguard Worker   {
2721*61046927SAndroid Build Coastguard Worker      ast_case_statement *stmts = new(state->linalloc) ast_case_statement($1);
2722*61046927SAndroid Build Coastguard Worker      stmts->set_location(@2);
2723*61046927SAndroid Build Coastguard Worker
2724*61046927SAndroid Build Coastguard Worker      stmts->stmts.push_tail(& $2->link);
2725*61046927SAndroid Build Coastguard Worker      $$ = stmts;
2726*61046927SAndroid Build Coastguard Worker   }
2727*61046927SAndroid Build Coastguard Worker   | case_statement statement
2728*61046927SAndroid Build Coastguard Worker   {
2729*61046927SAndroid Build Coastguard Worker      $$ = $1;
2730*61046927SAndroid Build Coastguard Worker      $$->stmts.push_tail(& $2->link);
2731*61046927SAndroid Build Coastguard Worker   }
2732*61046927SAndroid Build Coastguard Worker   ;
2733*61046927SAndroid Build Coastguard Worker
2734*61046927SAndroid Build Coastguard Workercase_statement_list:
2735*61046927SAndroid Build Coastguard Worker   case_statement
2736*61046927SAndroid Build Coastguard Worker   {
2737*61046927SAndroid Build Coastguard Worker      ast_case_statement_list *cases= new(state->linalloc) ast_case_statement_list();
2738*61046927SAndroid Build Coastguard Worker      cases->set_location(@1);
2739*61046927SAndroid Build Coastguard Worker
2740*61046927SAndroid Build Coastguard Worker      cases->cases.push_tail(& $1->link);
2741*61046927SAndroid Build Coastguard Worker      $$ = cases;
2742*61046927SAndroid Build Coastguard Worker   }
2743*61046927SAndroid Build Coastguard Worker   | case_statement_list case_statement
2744*61046927SAndroid Build Coastguard Worker   {
2745*61046927SAndroid Build Coastguard Worker      $$ = $1;
2746*61046927SAndroid Build Coastguard Worker      $$->cases.push_tail(& $2->link);
2747*61046927SAndroid Build Coastguard Worker   }
2748*61046927SAndroid Build Coastguard Worker   ;
2749*61046927SAndroid Build Coastguard Worker
2750*61046927SAndroid Build Coastguard Workeriteration_statement:
2751*61046927SAndroid Build Coastguard Worker   WHILE '(' condition ')' statement_no_new_scope
2752*61046927SAndroid Build Coastguard Worker   {
2753*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2754*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_iteration_statement(ast_iteration_statement::ast_while,
2755*61046927SAndroid Build Coastguard Worker                                            NULL, $3, NULL, $5);
2756*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @4);
2757*61046927SAndroid Build Coastguard Worker   }
2758*61046927SAndroid Build Coastguard Worker   | DO statement_no_new_scope WHILE '(' expression ')' ';'
2759*61046927SAndroid Build Coastguard Worker   {
2760*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2761*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_iteration_statement(ast_iteration_statement::ast_do_while,
2762*61046927SAndroid Build Coastguard Worker                                            NULL, $5, NULL, $2);
2763*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @6);
2764*61046927SAndroid Build Coastguard Worker   }
2765*61046927SAndroid Build Coastguard Worker   | FOR '(' for_init_statement for_rest_statement ')' statement_no_new_scope
2766*61046927SAndroid Build Coastguard Worker   {
2767*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2768*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_iteration_statement(ast_iteration_statement::ast_for,
2769*61046927SAndroid Build Coastguard Worker                                            $3, $4.cond, $4.rest, $6);
2770*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @6);
2771*61046927SAndroid Build Coastguard Worker   }
2772*61046927SAndroid Build Coastguard Worker   ;
2773*61046927SAndroid Build Coastguard Worker
2774*61046927SAndroid Build Coastguard Workerfor_init_statement:
2775*61046927SAndroid Build Coastguard Worker   expression_statement
2776*61046927SAndroid Build Coastguard Worker   | declaration_statement
2777*61046927SAndroid Build Coastguard Worker   ;
2778*61046927SAndroid Build Coastguard Worker
2779*61046927SAndroid Build Coastguard Workerconditionopt:
2780*61046927SAndroid Build Coastguard Worker   condition
2781*61046927SAndroid Build Coastguard Worker   | /* empty */
2782*61046927SAndroid Build Coastguard Worker   {
2783*61046927SAndroid Build Coastguard Worker      $$ = NULL;
2784*61046927SAndroid Build Coastguard Worker   }
2785*61046927SAndroid Build Coastguard Worker   ;
2786*61046927SAndroid Build Coastguard Worker
2787*61046927SAndroid Build Coastguard Workerfor_rest_statement:
2788*61046927SAndroid Build Coastguard Worker   conditionopt ';'
2789*61046927SAndroid Build Coastguard Worker   {
2790*61046927SAndroid Build Coastguard Worker      $$.cond = $1;
2791*61046927SAndroid Build Coastguard Worker      $$.rest = NULL;
2792*61046927SAndroid Build Coastguard Worker   }
2793*61046927SAndroid Build Coastguard Worker   | conditionopt ';' expression
2794*61046927SAndroid Build Coastguard Worker   {
2795*61046927SAndroid Build Coastguard Worker      $$.cond = $1;
2796*61046927SAndroid Build Coastguard Worker      $$.rest = $3;
2797*61046927SAndroid Build Coastguard Worker   }
2798*61046927SAndroid Build Coastguard Worker   ;
2799*61046927SAndroid Build Coastguard Worker
2800*61046927SAndroid Build Coastguard Worker   // Grammar Note: No 'goto'. Gotos are not supported.
2801*61046927SAndroid Build Coastguard Workerjump_statement:
2802*61046927SAndroid Build Coastguard Worker   CONTINUE ';'
2803*61046927SAndroid Build Coastguard Worker   {
2804*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2805*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_jump_statement(ast_jump_statement::ast_continue, NULL);
2806*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
2807*61046927SAndroid Build Coastguard Worker   }
2808*61046927SAndroid Build Coastguard Worker   | BREAK ';'
2809*61046927SAndroid Build Coastguard Worker   {
2810*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2811*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_jump_statement(ast_jump_statement::ast_break, NULL);
2812*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
2813*61046927SAndroid Build Coastguard Worker   }
2814*61046927SAndroid Build Coastguard Worker   | RETURN ';'
2815*61046927SAndroid Build Coastguard Worker   {
2816*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2817*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_jump_statement(ast_jump_statement::ast_return, NULL);
2818*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
2819*61046927SAndroid Build Coastguard Worker   }
2820*61046927SAndroid Build Coastguard Worker   | RETURN expression ';'
2821*61046927SAndroid Build Coastguard Worker   {
2822*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2823*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_jump_statement(ast_jump_statement::ast_return, $2);
2824*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @2);
2825*61046927SAndroid Build Coastguard Worker   }
2826*61046927SAndroid Build Coastguard Worker   | DISCARD ';' // Fragment shader only.
2827*61046927SAndroid Build Coastguard Worker   {
2828*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2829*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_jump_statement(ast_jump_statement::ast_discard, NULL);
2830*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
2831*61046927SAndroid Build Coastguard Worker   }
2832*61046927SAndroid Build Coastguard Worker   ;
2833*61046927SAndroid Build Coastguard Worker
2834*61046927SAndroid Build Coastguard Workerdemote_statement:
2835*61046927SAndroid Build Coastguard Worker   DEMOTE ';'
2836*61046927SAndroid Build Coastguard Worker   {
2837*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2838*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_demote_statement();
2839*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
2840*61046927SAndroid Build Coastguard Worker   }
2841*61046927SAndroid Build Coastguard Worker   ;
2842*61046927SAndroid Build Coastguard Worker
2843*61046927SAndroid Build Coastguard Workerexternal_declaration:
2844*61046927SAndroid Build Coastguard Worker   function_definition      { $$ = $1; }
2845*61046927SAndroid Build Coastguard Worker   | declaration            { $$ = $1; }
2846*61046927SAndroid Build Coastguard Worker   | pragma_statement       { $$ = $1; }
2847*61046927SAndroid Build Coastguard Worker   | layout_defaults        { $$ = $1; }
2848*61046927SAndroid Build Coastguard Worker   | ';'                    { $$ = NULL; }
2849*61046927SAndroid Build Coastguard Worker   ;
2850*61046927SAndroid Build Coastguard Worker
2851*61046927SAndroid Build Coastguard Workerfunction_definition:
2852*61046927SAndroid Build Coastguard Worker   function_prototype compound_statement_no_new_scope
2853*61046927SAndroid Build Coastguard Worker   {
2854*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2855*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_function_definition();
2856*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @2);
2857*61046927SAndroid Build Coastguard Worker      $$->prototype = $1;
2858*61046927SAndroid Build Coastguard Worker      $$->body = $2;
2859*61046927SAndroid Build Coastguard Worker
2860*61046927SAndroid Build Coastguard Worker      state->symbols->pop_scope();
2861*61046927SAndroid Build Coastguard Worker   }
2862*61046927SAndroid Build Coastguard Worker   ;
2863*61046927SAndroid Build Coastguard Worker
2864*61046927SAndroid Build Coastguard Worker/* layout_qualifieropt is packed into this rule */
2865*61046927SAndroid Build Coastguard Workerinterface_block:
2866*61046927SAndroid Build Coastguard Worker   basic_interface_block
2867*61046927SAndroid Build Coastguard Worker   {
2868*61046927SAndroid Build Coastguard Worker      $$ = $1;
2869*61046927SAndroid Build Coastguard Worker   }
2870*61046927SAndroid Build Coastguard Worker   | layout_qualifier interface_block
2871*61046927SAndroid Build Coastguard Worker   {
2872*61046927SAndroid Build Coastguard Worker      ast_interface_block *block = (ast_interface_block *) $2;
2873*61046927SAndroid Build Coastguard Worker
2874*61046927SAndroid Build Coastguard Worker      if (!$1.merge_qualifier(& @1, state, block->layout, false,
2875*61046927SAndroid Build Coastguard Worker                              block->layout.has_layout())) {
2876*61046927SAndroid Build Coastguard Worker         YYERROR;
2877*61046927SAndroid Build Coastguard Worker      }
2878*61046927SAndroid Build Coastguard Worker
2879*61046927SAndroid Build Coastguard Worker      block->layout = $1;
2880*61046927SAndroid Build Coastguard Worker
2881*61046927SAndroid Build Coastguard Worker      $$ = block;
2882*61046927SAndroid Build Coastguard Worker   }
2883*61046927SAndroid Build Coastguard Worker   | memory_qualifier interface_block
2884*61046927SAndroid Build Coastguard Worker   {
2885*61046927SAndroid Build Coastguard Worker      ast_interface_block *block = (ast_interface_block *)$2;
2886*61046927SAndroid Build Coastguard Worker
2887*61046927SAndroid Build Coastguard Worker      if (!block->default_layout.flags.q.buffer) {
2888*61046927SAndroid Build Coastguard Worker            _mesa_glsl_error(& @1, state,
2889*61046927SAndroid Build Coastguard Worker                             "memory qualifiers can only be used in the "
2890*61046927SAndroid Build Coastguard Worker                             "declaration of shader storage blocks");
2891*61046927SAndroid Build Coastguard Worker      }
2892*61046927SAndroid Build Coastguard Worker      if (!$1.merge_qualifier(& @1, state, block->layout, false)) {
2893*61046927SAndroid Build Coastguard Worker         YYERROR;
2894*61046927SAndroid Build Coastguard Worker      }
2895*61046927SAndroid Build Coastguard Worker      block->layout = $1;
2896*61046927SAndroid Build Coastguard Worker      $$ = block;
2897*61046927SAndroid Build Coastguard Worker   }
2898*61046927SAndroid Build Coastguard Worker   ;
2899*61046927SAndroid Build Coastguard Worker
2900*61046927SAndroid Build Coastguard Workerbasic_interface_block:
2901*61046927SAndroid Build Coastguard Worker   interface_qualifier NEW_IDENTIFIER '{' member_list '}' instance_name_opt ';'
2902*61046927SAndroid Build Coastguard Worker   {
2903*61046927SAndroid Build Coastguard Worker      ast_interface_block *const block = $6;
2904*61046927SAndroid Build Coastguard Worker
2905*61046927SAndroid Build Coastguard Worker      if ($1.flags.q.uniform) {
2906*61046927SAndroid Build Coastguard Worker         block->default_layout = *state->default_uniform_qualifier;
2907*61046927SAndroid Build Coastguard Worker      } else if ($1.flags.q.buffer) {
2908*61046927SAndroid Build Coastguard Worker         block->default_layout = *state->default_shader_storage_qualifier;
2909*61046927SAndroid Build Coastguard Worker      }
2910*61046927SAndroid Build Coastguard Worker      block->block_name = $2;
2911*61046927SAndroid Build Coastguard Worker      block->declarations.push_degenerate_list_at_head(& $4->link);
2912*61046927SAndroid Build Coastguard Worker
2913*61046927SAndroid Build Coastguard Worker      _mesa_ast_process_interface_block(& @1, state, block, $1);
2914*61046927SAndroid Build Coastguard Worker
2915*61046927SAndroid Build Coastguard Worker      $$ = block;
2916*61046927SAndroid Build Coastguard Worker   }
2917*61046927SAndroid Build Coastguard Worker   ;
2918*61046927SAndroid Build Coastguard Worker
2919*61046927SAndroid Build Coastguard Workerinterface_qualifier:
2920*61046927SAndroid Build Coastguard Worker   IN_TOK
2921*61046927SAndroid Build Coastguard Worker   {
2922*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2923*61046927SAndroid Build Coastguard Worker      $$.flags.q.in = 1;
2924*61046927SAndroid Build Coastguard Worker   }
2925*61046927SAndroid Build Coastguard Worker   | OUT_TOK
2926*61046927SAndroid Build Coastguard Worker   {
2927*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2928*61046927SAndroid Build Coastguard Worker      $$.flags.q.out = 1;
2929*61046927SAndroid Build Coastguard Worker   }
2930*61046927SAndroid Build Coastguard Worker   | UNIFORM
2931*61046927SAndroid Build Coastguard Worker   {
2932*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2933*61046927SAndroid Build Coastguard Worker      $$.flags.q.uniform = 1;
2934*61046927SAndroid Build Coastguard Worker   }
2935*61046927SAndroid Build Coastguard Worker   | BUFFER
2936*61046927SAndroid Build Coastguard Worker   {
2937*61046927SAndroid Build Coastguard Worker      memset(& $$, 0, sizeof($$));
2938*61046927SAndroid Build Coastguard Worker      $$.flags.q.buffer = 1;
2939*61046927SAndroid Build Coastguard Worker   }
2940*61046927SAndroid Build Coastguard Worker   | auxiliary_storage_qualifier interface_qualifier
2941*61046927SAndroid Build Coastguard Worker   {
2942*61046927SAndroid Build Coastguard Worker      if (!$1.flags.q.patch) {
2943*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(&@1, state, "invalid interface qualifier");
2944*61046927SAndroid Build Coastguard Worker      }
2945*61046927SAndroid Build Coastguard Worker      if ($2.has_auxiliary_storage()) {
2946*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(&@1, state, "duplicate patch qualifier");
2947*61046927SAndroid Build Coastguard Worker      }
2948*61046927SAndroid Build Coastguard Worker      $$ = $2;
2949*61046927SAndroid Build Coastguard Worker      $$.flags.q.patch = 1;
2950*61046927SAndroid Build Coastguard Worker   }
2951*61046927SAndroid Build Coastguard Worker   ;
2952*61046927SAndroid Build Coastguard Worker
2953*61046927SAndroid Build Coastguard Workerinstance_name_opt:
2954*61046927SAndroid Build Coastguard Worker   /* empty */
2955*61046927SAndroid Build Coastguard Worker   {
2956*61046927SAndroid Build Coastguard Worker      $$ = new(state->linalloc) ast_interface_block(NULL, NULL);
2957*61046927SAndroid Build Coastguard Worker   }
2958*61046927SAndroid Build Coastguard Worker   | NEW_IDENTIFIER
2959*61046927SAndroid Build Coastguard Worker   {
2960*61046927SAndroid Build Coastguard Worker      $$ = new(state->linalloc) ast_interface_block($1, NULL);
2961*61046927SAndroid Build Coastguard Worker      $$->set_location(@1);
2962*61046927SAndroid Build Coastguard Worker   }
2963*61046927SAndroid Build Coastguard Worker   | NEW_IDENTIFIER array_specifier
2964*61046927SAndroid Build Coastguard Worker   {
2965*61046927SAndroid Build Coastguard Worker      $$ = new(state->linalloc) ast_interface_block($1, $2);
2966*61046927SAndroid Build Coastguard Worker      $$->set_location_range(@1, @2);
2967*61046927SAndroid Build Coastguard Worker   }
2968*61046927SAndroid Build Coastguard Worker   ;
2969*61046927SAndroid Build Coastguard Worker
2970*61046927SAndroid Build Coastguard Workermember_list:
2971*61046927SAndroid Build Coastguard Worker   member_declaration
2972*61046927SAndroid Build Coastguard Worker   {
2973*61046927SAndroid Build Coastguard Worker      $$ = $1;
2974*61046927SAndroid Build Coastguard Worker      $1->link.self_link();
2975*61046927SAndroid Build Coastguard Worker   }
2976*61046927SAndroid Build Coastguard Worker   | member_declaration member_list
2977*61046927SAndroid Build Coastguard Worker   {
2978*61046927SAndroid Build Coastguard Worker      $$ = $1;
2979*61046927SAndroid Build Coastguard Worker      $2->link.insert_before(& $$->link);
2980*61046927SAndroid Build Coastguard Worker   }
2981*61046927SAndroid Build Coastguard Worker   ;
2982*61046927SAndroid Build Coastguard Worker
2983*61046927SAndroid Build Coastguard Workermember_declaration:
2984*61046927SAndroid Build Coastguard Worker   fully_specified_type struct_declarator_list ';'
2985*61046927SAndroid Build Coastguard Worker   {
2986*61046927SAndroid Build Coastguard Worker      linear_ctx *ctx = state->linalloc;
2987*61046927SAndroid Build Coastguard Worker      ast_fully_specified_type *type = $1;
2988*61046927SAndroid Build Coastguard Worker      type->set_location(@1);
2989*61046927SAndroid Build Coastguard Worker
2990*61046927SAndroid Build Coastguard Worker      if (type->qualifier.flags.q.attribute) {
2991*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(& @1, state,
2992*61046927SAndroid Build Coastguard Worker                          "keyword 'attribute' cannot be used with "
2993*61046927SAndroid Build Coastguard Worker                          "interface block member");
2994*61046927SAndroid Build Coastguard Worker      } else if (type->qualifier.flags.q.varying) {
2995*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(& @1, state,
2996*61046927SAndroid Build Coastguard Worker                          "keyword 'varying' cannot be used with "
2997*61046927SAndroid Build Coastguard Worker                          "interface block member");
2998*61046927SAndroid Build Coastguard Worker      }
2999*61046927SAndroid Build Coastguard Worker
3000*61046927SAndroid Build Coastguard Worker      $$ = new(ctx) ast_declarator_list(type);
3001*61046927SAndroid Build Coastguard Worker      $$->set_location(@2);
3002*61046927SAndroid Build Coastguard Worker
3003*61046927SAndroid Build Coastguard Worker      $$->declarations.push_degenerate_list_at_head(& $2->link);
3004*61046927SAndroid Build Coastguard Worker   }
3005*61046927SAndroid Build Coastguard Worker   ;
3006*61046927SAndroid Build Coastguard Worker
3007*61046927SAndroid Build Coastguard Workerlayout_uniform_defaults:
3008*61046927SAndroid Build Coastguard Worker   layout_qualifier layout_uniform_defaults
3009*61046927SAndroid Build Coastguard Worker   {
3010*61046927SAndroid Build Coastguard Worker      $$ = $1;
3011*61046927SAndroid Build Coastguard Worker      if (!$$.merge_qualifier(& @1, state, $2, false, true)) {
3012*61046927SAndroid Build Coastguard Worker         YYERROR;
3013*61046927SAndroid Build Coastguard Worker      }
3014*61046927SAndroid Build Coastguard Worker   }
3015*61046927SAndroid Build Coastguard Worker   | layout_qualifier UNIFORM ';'
3016*61046927SAndroid Build Coastguard Worker   ;
3017*61046927SAndroid Build Coastguard Worker
3018*61046927SAndroid Build Coastguard Workerlayout_buffer_defaults:
3019*61046927SAndroid Build Coastguard Worker   layout_qualifier layout_buffer_defaults
3020*61046927SAndroid Build Coastguard Worker   {
3021*61046927SAndroid Build Coastguard Worker      $$ = $1;
3022*61046927SAndroid Build Coastguard Worker      if (!$$.merge_qualifier(& @1, state, $2, false, true)) {
3023*61046927SAndroid Build Coastguard Worker         YYERROR;
3024*61046927SAndroid Build Coastguard Worker      }
3025*61046927SAndroid Build Coastguard Worker   }
3026*61046927SAndroid Build Coastguard Worker   | layout_qualifier BUFFER ';'
3027*61046927SAndroid Build Coastguard Worker   ;
3028*61046927SAndroid Build Coastguard Worker
3029*61046927SAndroid Build Coastguard Workerlayout_in_defaults:
3030*61046927SAndroid Build Coastguard Worker   layout_qualifier layout_in_defaults
3031*61046927SAndroid Build Coastguard Worker   {
3032*61046927SAndroid Build Coastguard Worker      $$ = $1;
3033*61046927SAndroid Build Coastguard Worker      if (!$$.merge_qualifier(& @1, state, $2, false, true)) {
3034*61046927SAndroid Build Coastguard Worker         YYERROR;
3035*61046927SAndroid Build Coastguard Worker      }
3036*61046927SAndroid Build Coastguard Worker      if (!$$.validate_in_qualifier(& @1, state)) {
3037*61046927SAndroid Build Coastguard Worker         YYERROR;
3038*61046927SAndroid Build Coastguard Worker      }
3039*61046927SAndroid Build Coastguard Worker   }
3040*61046927SAndroid Build Coastguard Worker   | layout_qualifier IN_TOK ';'
3041*61046927SAndroid Build Coastguard Worker   {
3042*61046927SAndroid Build Coastguard Worker      if (!$1.validate_in_qualifier(& @1, state)) {
3043*61046927SAndroid Build Coastguard Worker         YYERROR;
3044*61046927SAndroid Build Coastguard Worker      }
3045*61046927SAndroid Build Coastguard Worker   }
3046*61046927SAndroid Build Coastguard Worker   ;
3047*61046927SAndroid Build Coastguard Worker
3048*61046927SAndroid Build Coastguard Workerlayout_out_defaults:
3049*61046927SAndroid Build Coastguard Worker   layout_qualifier layout_out_defaults
3050*61046927SAndroid Build Coastguard Worker   {
3051*61046927SAndroid Build Coastguard Worker      $$ = $1;
3052*61046927SAndroid Build Coastguard Worker      if (!$$.merge_qualifier(& @1, state, $2, false, true)) {
3053*61046927SAndroid Build Coastguard Worker         YYERROR;
3054*61046927SAndroid Build Coastguard Worker      }
3055*61046927SAndroid Build Coastguard Worker      if (!$$.validate_out_qualifier(& @1, state)) {
3056*61046927SAndroid Build Coastguard Worker         YYERROR;
3057*61046927SAndroid Build Coastguard Worker      }
3058*61046927SAndroid Build Coastguard Worker   }
3059*61046927SAndroid Build Coastguard Worker   | layout_qualifier OUT_TOK ';'
3060*61046927SAndroid Build Coastguard Worker   {
3061*61046927SAndroid Build Coastguard Worker      if (!$1.validate_out_qualifier(& @1, state)) {
3062*61046927SAndroid Build Coastguard Worker         YYERROR;
3063*61046927SAndroid Build Coastguard Worker      }
3064*61046927SAndroid Build Coastguard Worker   }
3065*61046927SAndroid Build Coastguard Worker   ;
3066*61046927SAndroid Build Coastguard Worker
3067*61046927SAndroid Build Coastguard Workerlayout_defaults:
3068*61046927SAndroid Build Coastguard Worker   layout_uniform_defaults
3069*61046927SAndroid Build Coastguard Worker   {
3070*61046927SAndroid Build Coastguard Worker      $$ = NULL;
3071*61046927SAndroid Build Coastguard Worker      if (!state->default_uniform_qualifier->
3072*61046927SAndroid Build Coastguard Worker             merge_qualifier(& @1, state, $1, false)) {
3073*61046927SAndroid Build Coastguard Worker         YYERROR;
3074*61046927SAndroid Build Coastguard Worker      }
3075*61046927SAndroid Build Coastguard Worker      if (!state->default_uniform_qualifier->
3076*61046927SAndroid Build Coastguard Worker             push_to_global(& @1, state)) {
3077*61046927SAndroid Build Coastguard Worker         YYERROR;
3078*61046927SAndroid Build Coastguard Worker      }
3079*61046927SAndroid Build Coastguard Worker   }
3080*61046927SAndroid Build Coastguard Worker   | layout_buffer_defaults
3081*61046927SAndroid Build Coastguard Worker   {
3082*61046927SAndroid Build Coastguard Worker      $$ = NULL;
3083*61046927SAndroid Build Coastguard Worker      if (!state->default_shader_storage_qualifier->
3084*61046927SAndroid Build Coastguard Worker             merge_qualifier(& @1, state, $1, false)) {
3085*61046927SAndroid Build Coastguard Worker         YYERROR;
3086*61046927SAndroid Build Coastguard Worker      }
3087*61046927SAndroid Build Coastguard Worker      if (!state->default_shader_storage_qualifier->
3088*61046927SAndroid Build Coastguard Worker             push_to_global(& @1, state)) {
3089*61046927SAndroid Build Coastguard Worker         YYERROR;
3090*61046927SAndroid Build Coastguard Worker      }
3091*61046927SAndroid Build Coastguard Worker
3092*61046927SAndroid Build Coastguard Worker      /* From the GLSL 4.50 spec, section 4.4.5:
3093*61046927SAndroid Build Coastguard Worker       *
3094*61046927SAndroid Build Coastguard Worker       *     "It is a compile-time error to specify the binding identifier for
3095*61046927SAndroid Build Coastguard Worker       *     the global scope or for block member declarations."
3096*61046927SAndroid Build Coastguard Worker       */
3097*61046927SAndroid Build Coastguard Worker      if (state->default_shader_storage_qualifier->flags.q.explicit_binding) {
3098*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(& @1, state,
3099*61046927SAndroid Build Coastguard Worker                          "binding qualifier cannot be set for default layout");
3100*61046927SAndroid Build Coastguard Worker      }
3101*61046927SAndroid Build Coastguard Worker   }
3102*61046927SAndroid Build Coastguard Worker   | layout_in_defaults
3103*61046927SAndroid Build Coastguard Worker   {
3104*61046927SAndroid Build Coastguard Worker      $$ = NULL;
3105*61046927SAndroid Build Coastguard Worker      if (!$1.merge_into_in_qualifier(& @1, state, $$)) {
3106*61046927SAndroid Build Coastguard Worker         YYERROR;
3107*61046927SAndroid Build Coastguard Worker      }
3108*61046927SAndroid Build Coastguard Worker      if (!state->in_qualifier->push_to_global(& @1, state)) {
3109*61046927SAndroid Build Coastguard Worker         YYERROR;
3110*61046927SAndroid Build Coastguard Worker      }
3111*61046927SAndroid Build Coastguard Worker   }
3112*61046927SAndroid Build Coastguard Worker   | layout_out_defaults
3113*61046927SAndroid Build Coastguard Worker   {
3114*61046927SAndroid Build Coastguard Worker      $$ = NULL;
3115*61046927SAndroid Build Coastguard Worker      if (!$1.merge_into_out_qualifier(& @1, state, $$)) {
3116*61046927SAndroid Build Coastguard Worker         YYERROR;
3117*61046927SAndroid Build Coastguard Worker      }
3118*61046927SAndroid Build Coastguard Worker      if (!state->out_qualifier->push_to_global(& @1, state)) {
3119*61046927SAndroid Build Coastguard Worker         YYERROR;
3120*61046927SAndroid Build Coastguard Worker      }
3121*61046927SAndroid Build Coastguard Worker
3122*61046927SAndroid Build Coastguard Worker      (void)yynerrs;
3123*61046927SAndroid Build Coastguard Worker   }
3124*61046927SAndroid Build Coastguard Worker   ;
3125