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