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