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