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 <ctype.h> 25*61046927SAndroid Build Coastguard Worker#include <limits.h> 26*61046927SAndroid Build Coastguard Worker#include "util/strtod.h" 27*61046927SAndroid Build Coastguard Worker#include "ast.h" 28*61046927SAndroid Build Coastguard Worker#include "glsl_parser_extras.h" 29*61046927SAndroid Build Coastguard Worker#include "glsl_parser.h" 30*61046927SAndroid Build Coastguard Worker#include "main/consts_exts.h" 31*61046927SAndroid Build Coastguard Worker 32*61046927SAndroid Build Coastguard Workerstatic int classify_identifier(struct _mesa_glsl_parse_state *, const char *, 33*61046927SAndroid Build Coastguard Worker unsigned name_len, YYSTYPE *output); 34*61046927SAndroid Build Coastguard Worker 35*61046927SAndroid Build Coastguard Worker#ifdef _MSC_VER 36*61046927SAndroid Build Coastguard Worker#define YY_NO_UNISTD_H 37*61046927SAndroid Build Coastguard Worker#endif 38*61046927SAndroid Build Coastguard Worker 39*61046927SAndroid Build Coastguard Worker#define YY_NO_INPUT 40*61046927SAndroid Build Coastguard Worker#define YY_USER_ACTION \ 41*61046927SAndroid Build Coastguard Worker do { \ 42*61046927SAndroid Build Coastguard Worker yylloc->first_column = yycolumn + 1; \ 43*61046927SAndroid Build Coastguard Worker yylloc->first_line = yylloc->last_line = yylineno + 1; \ 44*61046927SAndroid Build Coastguard Worker yycolumn += yyleng; \ 45*61046927SAndroid Build Coastguard Worker yylloc->last_column = yycolumn + 1; \ 46*61046927SAndroid Build Coastguard Worker } while(0); 47*61046927SAndroid Build Coastguard Worker 48*61046927SAndroid Build Coastguard Worker#define YY_USER_INIT yylineno = 0; yycolumn = 0; yylloc->source = 0; \ 49*61046927SAndroid Build Coastguard Worker yylloc->path = NULL; 50*61046927SAndroid Build Coastguard Worker 51*61046927SAndroid Build Coastguard Worker/* A macro for handling reserved words and keywords across language versions. 52*61046927SAndroid Build Coastguard Worker * 53*61046927SAndroid Build Coastguard Worker * Certain words start out as identifiers, become reserved words in 54*61046927SAndroid Build Coastguard Worker * later language revisions, and finally become language keywords. 55*61046927SAndroid Build Coastguard Worker * This may happen at different times in desktop GLSL and GLSL ES. 56*61046927SAndroid Build Coastguard Worker * 57*61046927SAndroid Build Coastguard Worker * For example, consider the following lexer rule: 58*61046927SAndroid Build Coastguard Worker * samplerBuffer KEYWORD(130, 0, 140, 0, SAMPLERBUFFER) 59*61046927SAndroid Build Coastguard Worker * 60*61046927SAndroid Build Coastguard Worker * This means that "samplerBuffer" will be treated as: 61*61046927SAndroid Build Coastguard Worker * - a keyword (SAMPLERBUFFER token) ...in GLSL >= 1.40 62*61046927SAndroid Build Coastguard Worker * - a reserved word - error ...in GLSL >= 1.30 63*61046927SAndroid Build Coastguard Worker * - an identifier ...in GLSL < 1.30 or GLSL ES 64*61046927SAndroid Build Coastguard Worker */ 65*61046927SAndroid Build Coastguard Worker#define KEYWORD(reserved_glsl, reserved_glsl_es, \ 66*61046927SAndroid Build Coastguard Worker allowed_glsl, allowed_glsl_es, token) \ 67*61046927SAndroid Build Coastguard Worker KEYWORD_WITH_ALT(reserved_glsl, reserved_glsl_es, \ 68*61046927SAndroid Build Coastguard Worker allowed_glsl, allowed_glsl_es, false, token) 69*61046927SAndroid Build Coastguard Worker 70*61046927SAndroid Build Coastguard Worker/** 71*61046927SAndroid Build Coastguard Worker * Like the KEYWORD macro, but the word is also treated as a keyword 72*61046927SAndroid Build Coastguard Worker * if the given boolean expression is true. 73*61046927SAndroid Build Coastguard Worker */ 74*61046927SAndroid Build Coastguard Worker#define KEYWORD_WITH_ALT(reserved_glsl, reserved_glsl_es, \ 75*61046927SAndroid Build Coastguard Worker allowed_glsl, allowed_glsl_es, \ 76*61046927SAndroid Build Coastguard Worker alt_expr, token) \ 77*61046927SAndroid Build Coastguard Worker do { \ 78*61046927SAndroid Build Coastguard Worker if (yyextra->is_version(allowed_glsl, allowed_glsl_es) \ 79*61046927SAndroid Build Coastguard Worker || (alt_expr)) { \ 80*61046927SAndroid Build Coastguard Worker return token; \ 81*61046927SAndroid Build Coastguard Worker } else if (yyextra->is_version(reserved_glsl, \ 82*61046927SAndroid Build Coastguard Worker reserved_glsl_es)) { \ 83*61046927SAndroid Build Coastguard Worker _mesa_glsl_error(yylloc, yyextra, \ 84*61046927SAndroid Build Coastguard Worker "illegal use of reserved word `%s'", yytext); \ 85*61046927SAndroid Build Coastguard Worker return ERROR_TOK; \ 86*61046927SAndroid Build Coastguard Worker } else { \ 87*61046927SAndroid Build Coastguard Worker return classify_identifier(yyextra, yytext, yyleng, yylval); \ 88*61046927SAndroid Build Coastguard Worker } \ 89*61046927SAndroid Build Coastguard Worker } while (0) 90*61046927SAndroid Build Coastguard Worker 91*61046927SAndroid Build Coastguard Worker/** 92*61046927SAndroid Build Coastguard Worker * Like KEYWORD_WITH_ALT, but used for built-in GLSL types 93*61046927SAndroid Build Coastguard Worker */ 94*61046927SAndroid Build Coastguard Worker#define TYPE_WITH_ALT(reserved_glsl, reserved_glsl_es, \ 95*61046927SAndroid Build Coastguard Worker allowed_glsl, allowed_glsl_es, \ 96*61046927SAndroid Build Coastguard Worker alt_expr, gtype) \ 97*61046927SAndroid Build Coastguard Worker do { \ 98*61046927SAndroid Build Coastguard Worker if (yyextra->is_version(allowed_glsl, allowed_glsl_es) \ 99*61046927SAndroid Build Coastguard Worker || (alt_expr)) { \ 100*61046927SAndroid Build Coastguard Worker yylval->type = gtype; \ 101*61046927SAndroid Build Coastguard Worker return BASIC_TYPE_TOK; \ 102*61046927SAndroid Build Coastguard Worker } else if (yyextra->is_version(reserved_glsl, \ 103*61046927SAndroid Build Coastguard Worker reserved_glsl_es)) { \ 104*61046927SAndroid Build Coastguard Worker _mesa_glsl_error(yylloc, yyextra, \ 105*61046927SAndroid Build Coastguard Worker "illegal use of reserved word `%s'", yytext); \ 106*61046927SAndroid Build Coastguard Worker return ERROR_TOK; \ 107*61046927SAndroid Build Coastguard Worker } else { \ 108*61046927SAndroid Build Coastguard Worker return classify_identifier(yyextra, yytext, yyleng, yylval); \ 109*61046927SAndroid Build Coastguard Worker } \ 110*61046927SAndroid Build Coastguard Worker } while (0) 111*61046927SAndroid Build Coastguard Worker 112*61046927SAndroid Build Coastguard Worker#define TYPE(reserved_glsl, reserved_glsl_es, \ 113*61046927SAndroid Build Coastguard Worker allowed_glsl, allowed_glsl_es, \ 114*61046927SAndroid Build Coastguard Worker gtype) \ 115*61046927SAndroid Build Coastguard Worker TYPE_WITH_ALT(reserved_glsl, reserved_glsl_es, \ 116*61046927SAndroid Build Coastguard Worker allowed_glsl, allowed_glsl_es, \ 117*61046927SAndroid Build Coastguard Worker false, gtype) 118*61046927SAndroid Build Coastguard Worker 119*61046927SAndroid Build Coastguard Worker/** 120*61046927SAndroid Build Coastguard Worker * A macro for handling keywords that have been present in GLSL since 121*61046927SAndroid Build Coastguard Worker * its origin, but were changed into reserved words in later versions. 122*61046927SAndroid Build Coastguard Worker */ 123*61046927SAndroid Build Coastguard Worker#define DEPRECATED_KEYWORD(token, state, reserved_glsl, \ 124*61046927SAndroid Build Coastguard Worker reserved_glsl_es) \ 125*61046927SAndroid Build Coastguard Worker do { \ 126*61046927SAndroid Build Coastguard Worker if (yyextra->is_version(reserved_glsl, reserved_glsl_es) && \ 127*61046927SAndroid Build Coastguard Worker !state->compat_shader) { \ 128*61046927SAndroid Build Coastguard Worker _mesa_glsl_error(yylloc, yyextra, \ 129*61046927SAndroid Build Coastguard Worker "illegal use of reserved word `%s'", yytext); \ 130*61046927SAndroid Build Coastguard Worker return ERROR_TOK; \ 131*61046927SAndroid Build Coastguard Worker } else { \ 132*61046927SAndroid Build Coastguard Worker return token; \ 133*61046927SAndroid Build Coastguard Worker } \ 134*61046927SAndroid Build Coastguard Worker } while (0) 135*61046927SAndroid Build Coastguard Worker 136*61046927SAndroid Build Coastguard Worker/** 137*61046927SAndroid Build Coastguard Worker * Like DEPRECATED_KEYWORD, but for types 138*61046927SAndroid Build Coastguard Worker */ 139*61046927SAndroid Build Coastguard Worker#define DEPRECATED_ES_TYPE_WITH_ALT(alt_expr, gtype) \ 140*61046927SAndroid Build Coastguard Worker do { \ 141*61046927SAndroid Build Coastguard Worker if (yyextra->is_version(0, 300)) { \ 142*61046927SAndroid Build Coastguard Worker _mesa_glsl_error(yylloc, yyextra, \ 143*61046927SAndroid Build Coastguard Worker "illegal use of reserved word `%s'", yytext); \ 144*61046927SAndroid Build Coastguard Worker return ERROR_TOK; \ 145*61046927SAndroid Build Coastguard Worker } else if (alt_expr) { \ 146*61046927SAndroid Build Coastguard Worker yylval->type = gtype; \ 147*61046927SAndroid Build Coastguard Worker return BASIC_TYPE_TOK; \ 148*61046927SAndroid Build Coastguard Worker } else { \ 149*61046927SAndroid Build Coastguard Worker return classify_identifier(yyextra, yytext, yyleng, yylval); \ 150*61046927SAndroid Build Coastguard Worker } \ 151*61046927SAndroid Build Coastguard Worker } while (0) 152*61046927SAndroid Build Coastguard Worker 153*61046927SAndroid Build Coastguard Worker#define DEPRECATED_ES_TYPE(gtype) \ 154*61046927SAndroid Build Coastguard Worker DEPRECATED_ES_TYPE_WITH_ALT(true, gtype) 155*61046927SAndroid Build Coastguard Worker 156*61046927SAndroid Build Coastguard Workerstatic int 157*61046927SAndroid Build Coastguard Workerliteral_integer(char *text, int len, struct _mesa_glsl_parse_state *state, 158*61046927SAndroid Build Coastguard Worker YYSTYPE *lval, YYLTYPE *lloc, int base) 159*61046927SAndroid Build Coastguard Worker{ 160*61046927SAndroid Build Coastguard Worker bool is_uint = (text[len - 1] == 'u' || 161*61046927SAndroid Build Coastguard Worker text[len - 1] == 'U'); 162*61046927SAndroid Build Coastguard Worker bool is_long = (text[len - 1] == 'l' || text[len - 1] == 'L'); 163*61046927SAndroid Build Coastguard Worker const char *digits = text; 164*61046927SAndroid Build Coastguard Worker 165*61046927SAndroid Build Coastguard Worker if (is_long) 166*61046927SAndroid Build Coastguard Worker is_uint = (text[len - 2] == 'u' && text[len - 1] == 'l') || 167*61046927SAndroid Build Coastguard Worker (text[len - 2] == 'U' && text[len - 1] == 'L'); 168*61046927SAndroid Build Coastguard Worker /* Skip "0x" */ 169*61046927SAndroid Build Coastguard Worker if (base == 16) 170*61046927SAndroid Build Coastguard Worker digits += 2; 171*61046927SAndroid Build Coastguard Worker 172*61046927SAndroid Build Coastguard Worker unsigned long long value = strtoull(digits, NULL, base); 173*61046927SAndroid Build Coastguard Worker 174*61046927SAndroid Build Coastguard Worker if (is_long) 175*61046927SAndroid Build Coastguard Worker lval->n64 = (int64_t)value; 176*61046927SAndroid Build Coastguard Worker else 177*61046927SAndroid Build Coastguard Worker lval->n = (int)value; 178*61046927SAndroid Build Coastguard Worker 179*61046927SAndroid Build Coastguard Worker if (is_long && !is_uint && base == 10 && value > (uint64_t)LLONG_MAX + 1) { 180*61046927SAndroid Build Coastguard Worker /* Tries to catch unintentionally providing a negative value. */ 181*61046927SAndroid Build Coastguard Worker _mesa_glsl_warning(lloc, state, 182*61046927SAndroid Build Coastguard Worker "signed literal value `%s' is interpreted as %lld", 183*61046927SAndroid Build Coastguard Worker text, lval->n64); 184*61046927SAndroid Build Coastguard Worker } else if (!is_long && value > UINT_MAX) { 185*61046927SAndroid Build Coastguard Worker /* Note that signed 0xffffffff is valid, not out of range! */ 186*61046927SAndroid Build Coastguard Worker if (state->is_version(130, 300)) { 187*61046927SAndroid Build Coastguard Worker _mesa_glsl_error(lloc, state, 188*61046927SAndroid Build Coastguard Worker "literal value `%s' out of range", text); 189*61046927SAndroid Build Coastguard Worker } else { 190*61046927SAndroid Build Coastguard Worker _mesa_glsl_warning(lloc, state, 191*61046927SAndroid Build Coastguard Worker "literal value `%s' out of range", text); 192*61046927SAndroid Build Coastguard Worker } 193*61046927SAndroid Build Coastguard Worker } else if (base == 10 && !is_uint && (unsigned)value > (unsigned)INT_MAX + 1) { 194*61046927SAndroid Build Coastguard Worker /* Tries to catch unintentionally providing a negative value. 195*61046927SAndroid Build Coastguard Worker * Note that -2147483648 is parsed as -(2147483648), so we don't 196*61046927SAndroid Build Coastguard Worker * want to warn for INT_MAX. 197*61046927SAndroid Build Coastguard Worker */ 198*61046927SAndroid Build Coastguard Worker _mesa_glsl_warning(lloc, state, 199*61046927SAndroid Build Coastguard Worker "signed literal value `%s' is interpreted as %d", 200*61046927SAndroid Build Coastguard Worker text, lval->n); 201*61046927SAndroid Build Coastguard Worker } 202*61046927SAndroid Build Coastguard Worker if (is_long) 203*61046927SAndroid Build Coastguard Worker return is_uint ? UINT64CONSTANT : INT64CONSTANT; 204*61046927SAndroid Build Coastguard Worker else 205*61046927SAndroid Build Coastguard Worker return is_uint ? UINTCONSTANT : INTCONSTANT; 206*61046927SAndroid Build Coastguard Worker} 207*61046927SAndroid Build Coastguard Worker 208*61046927SAndroid Build Coastguard Worker#define LITERAL_INTEGER(base) \ 209*61046927SAndroid Build Coastguard Worker literal_integer(yytext, yyleng, yyextra, yylval, yylloc, base) 210*61046927SAndroid Build Coastguard Worker 211*61046927SAndroid Build Coastguard Worker%} 212*61046927SAndroid Build Coastguard Worker 213*61046927SAndroid Build Coastguard Worker%option bison-bridge bison-locations reentrant noyywrap 214*61046927SAndroid Build Coastguard Worker%option nounput noyy_top_state 215*61046927SAndroid Build Coastguard Worker%option never-interactive 216*61046927SAndroid Build Coastguard Worker%option prefix="_mesa_glsl_lexer_" 217*61046927SAndroid Build Coastguard Worker%option extra-type="struct _mesa_glsl_parse_state *" 218*61046927SAndroid Build Coastguard Worker%option warn nodefault 219*61046927SAndroid Build Coastguard Worker 220*61046927SAndroid Build Coastguard Worker /* Note: When adding any start conditions to this list, you must also 221*61046927SAndroid Build Coastguard Worker * update the "Internal compiler error" catch-all rule near the end of 222*61046927SAndroid Build Coastguard Worker * this file. */ 223*61046927SAndroid Build Coastguard Worker%x PP PRAGMA 224*61046927SAndroid Build Coastguard Worker 225*61046927SAndroid Build Coastguard WorkerDEC_INT [1-9][0-9]* 226*61046927SAndroid Build Coastguard WorkerHEX_INT 0[xX][0-9a-fA-F]+ 227*61046927SAndroid Build Coastguard WorkerOCT_INT 0[0-7]* 228*61046927SAndroid Build Coastguard WorkerINT ({DEC_INT}|{HEX_INT}|{OCT_INT}) 229*61046927SAndroid Build Coastguard WorkerSPC [ \t]* 230*61046927SAndroid Build Coastguard WorkerSPCP [ \t]+ 231*61046927SAndroid Build Coastguard WorkerHASH ^{SPC}#{SPC} 232*61046927SAndroid Build Coastguard WorkerPATH ["][./ _A-Za-z0-9]*["] 233*61046927SAndroid Build Coastguard Worker%% 234*61046927SAndroid Build Coastguard Worker 235*61046927SAndroid Build Coastguard Worker[ \r\t]+ ; 236*61046927SAndroid Build Coastguard Worker 237*61046927SAndroid Build Coastguard Worker /* Preprocessor tokens. */ 238*61046927SAndroid Build Coastguard Worker^[ \t]*#[ \t]*$ ; 239*61046927SAndroid Build Coastguard Worker^[ \t]*#[ \t]*version { BEGIN PP; return VERSION_TOK; } 240*61046927SAndroid Build Coastguard Worker^[ \t]*#[ \t]*extension { BEGIN PP; return EXTENSION; } 241*61046927SAndroid Build Coastguard Worker{HASH}include { 242*61046927SAndroid Build Coastguard Worker if (!yyextra->ARB_shading_language_include_enable) { 243*61046927SAndroid Build Coastguard Worker struct _mesa_glsl_parse_state *state = yyextra; 244*61046927SAndroid Build Coastguard Worker _mesa_glsl_error(yylloc, state, 245*61046927SAndroid Build Coastguard Worker "ARB_shading_language_include required " 246*61046927SAndroid Build Coastguard Worker "to use #include"); 247*61046927SAndroid Build Coastguard Worker } 248*61046927SAndroid Build Coastguard Worker} 249*61046927SAndroid Build Coastguard Worker{HASH}line{SPCP}{INT}{SPCP}{INT}{SPC}$ { 250*61046927SAndroid Build Coastguard Worker /* Eat characters until the first digit is 251*61046927SAndroid Build Coastguard Worker * encountered 252*61046927SAndroid Build Coastguard Worker */ 253*61046927SAndroid Build Coastguard Worker char *ptr = yytext; 254*61046927SAndroid Build Coastguard Worker while (!isdigit(*ptr)) 255*61046927SAndroid Build Coastguard Worker ptr++; 256*61046927SAndroid Build Coastguard Worker 257*61046927SAndroid Build Coastguard Worker /* Subtract one from the line number because 258*61046927SAndroid Build Coastguard Worker * yylineno is zero-based instead of 259*61046927SAndroid Build Coastguard Worker * one-based. 260*61046927SAndroid Build Coastguard Worker */ 261*61046927SAndroid Build Coastguard Worker yylineno = strtol(ptr, &ptr, 0) - 1; 262*61046927SAndroid Build Coastguard Worker 263*61046927SAndroid Build Coastguard Worker /* From GLSL 3.30 and GLSL ES on, after processing the 264*61046927SAndroid Build Coastguard Worker * line directive (including its new-line), the implementation 265*61046927SAndroid Build Coastguard Worker * will behave as if it is compiling at the line number passed 266*61046927SAndroid Build Coastguard Worker * as argument. It was line number + 1 in older specifications. 267*61046927SAndroid Build Coastguard Worker */ 268*61046927SAndroid Build Coastguard Worker if (yyextra->is_version(330, 100)) 269*61046927SAndroid Build Coastguard Worker yylineno--; 270*61046927SAndroid Build Coastguard Worker 271*61046927SAndroid Build Coastguard Worker yylloc->source = strtol(ptr, NULL, 0); 272*61046927SAndroid Build Coastguard Worker yylloc->path = NULL; 273*61046927SAndroid Build Coastguard Worker } 274*61046927SAndroid Build Coastguard Worker{HASH}line{SPCP}{INT}{SPCP}{PATH}{SPC}$ { 275*61046927SAndroid Build Coastguard Worker if (!yyextra->ARB_shading_language_include_enable) { 276*61046927SAndroid Build Coastguard Worker struct _mesa_glsl_parse_state *state = yyextra; 277*61046927SAndroid Build Coastguard Worker _mesa_glsl_error(yylloc, state, 278*61046927SAndroid Build Coastguard Worker "ARB_shading_language_include required " 279*61046927SAndroid Build Coastguard Worker "to use #line <line> \"<path>\""); 280*61046927SAndroid Build Coastguard Worker } 281*61046927SAndroid Build Coastguard Worker 282*61046927SAndroid Build Coastguard Worker /* Eat characters until the first digit is 283*61046927SAndroid Build Coastguard Worker * encountered 284*61046927SAndroid Build Coastguard Worker */ 285*61046927SAndroid Build Coastguard Worker char *ptr = yytext; 286*61046927SAndroid Build Coastguard Worker while (!isdigit(*ptr)) 287*61046927SAndroid Build Coastguard Worker ptr++; 288*61046927SAndroid Build Coastguard Worker 289*61046927SAndroid Build Coastguard Worker /* Subtract one from the line number because 290*61046927SAndroid Build Coastguard Worker * yylineno is zero-based instead of 291*61046927SAndroid Build Coastguard Worker * one-based. 292*61046927SAndroid Build Coastguard Worker */ 293*61046927SAndroid Build Coastguard Worker yylineno = strtol(ptr, &ptr, 0) - 1; 294*61046927SAndroid Build Coastguard Worker 295*61046927SAndroid Build Coastguard Worker /* From GLSL 3.30 and GLSL ES on, after processing the 296*61046927SAndroid Build Coastguard Worker * line directive (including its new-line), the implementation 297*61046927SAndroid Build Coastguard Worker * will behave as if it is compiling at the line number passed 298*61046927SAndroid Build Coastguard Worker * as argument. It was line number + 1 in older specifications. 299*61046927SAndroid Build Coastguard Worker */ 300*61046927SAndroid Build Coastguard Worker if (yyextra->is_version(330, 100)) 301*61046927SAndroid Build Coastguard Worker yylineno--; 302*61046927SAndroid Build Coastguard Worker 303*61046927SAndroid Build Coastguard Worker while (isspace(*ptr)) 304*61046927SAndroid Build Coastguard Worker ptr++; 305*61046927SAndroid Build Coastguard Worker 306*61046927SAndroid Build Coastguard Worker /* Skip over leading " */ 307*61046927SAndroid Build Coastguard Worker ptr++; 308*61046927SAndroid Build Coastguard Worker 309*61046927SAndroid Build Coastguard Worker char *end = strrchr(ptr, '"'); 310*61046927SAndroid Build Coastguard Worker int path_len = (end - ptr) + 1; 311*61046927SAndroid Build Coastguard Worker linear_ctx *mem_ctx = yyextra->linalloc; 312*61046927SAndroid Build Coastguard Worker yylloc->path = (char *) linear_alloc_child(mem_ctx, path_len); 313*61046927SAndroid Build Coastguard Worker memcpy(yylloc->path, ptr, path_len); 314*61046927SAndroid Build Coastguard Worker yylloc->path[path_len - 1] = '\0'; 315*61046927SAndroid Build Coastguard Worker } 316*61046927SAndroid Build Coastguard Worker{HASH}line{SPCP}{INT}{SPC}$ { 317*61046927SAndroid Build Coastguard Worker /* Eat characters until the first digit is 318*61046927SAndroid Build Coastguard Worker * encountered 319*61046927SAndroid Build Coastguard Worker */ 320*61046927SAndroid Build Coastguard Worker char *ptr = yytext; 321*61046927SAndroid Build Coastguard Worker while (!isdigit(*ptr)) 322*61046927SAndroid Build Coastguard Worker ptr++; 323*61046927SAndroid Build Coastguard Worker 324*61046927SAndroid Build Coastguard Worker /* Subtract one from the line number because 325*61046927SAndroid Build Coastguard Worker * yylineno is zero-based instead of 326*61046927SAndroid Build Coastguard Worker * one-based. 327*61046927SAndroid Build Coastguard Worker */ 328*61046927SAndroid Build Coastguard Worker yylineno = strtol(ptr, &ptr, 0) - 1; 329*61046927SAndroid Build Coastguard Worker 330*61046927SAndroid Build Coastguard Worker /* From GLSL 3.30 and GLSL ES on, after processing the 331*61046927SAndroid Build Coastguard Worker * line directive (including its new-line), the implementation 332*61046927SAndroid Build Coastguard Worker * will behave as if it is compiling at the line number passed 333*61046927SAndroid Build Coastguard Worker * as argument. It was line number + 1 in older specifications. 334*61046927SAndroid Build Coastguard Worker */ 335*61046927SAndroid Build Coastguard Worker if (yyextra->is_version(330, 100)) 336*61046927SAndroid Build Coastguard Worker yylineno--; 337*61046927SAndroid Build Coastguard Worker } 338*61046927SAndroid Build Coastguard Worker^{SPC}#{SPC}pragma{SPCP}debug{SPC}\({SPC}on{SPC}\) { 339*61046927SAndroid Build Coastguard Worker BEGIN PP; 340*61046927SAndroid Build Coastguard Worker return PRAGMA_DEBUG_ON; 341*61046927SAndroid Build Coastguard Worker } 342*61046927SAndroid Build Coastguard Worker^{SPC}#{SPC}pragma{SPCP}debug{SPC}\({SPC}off{SPC}\) { 343*61046927SAndroid Build Coastguard Worker BEGIN PP; 344*61046927SAndroid Build Coastguard Worker return PRAGMA_DEBUG_OFF; 345*61046927SAndroid Build Coastguard Worker } 346*61046927SAndroid Build Coastguard Worker^{SPC}#{SPC}pragma{SPCP}optimize{SPC}\({SPC}on{SPC}\) { 347*61046927SAndroid Build Coastguard Worker BEGIN PP; 348*61046927SAndroid Build Coastguard Worker return PRAGMA_OPTIMIZE_ON; 349*61046927SAndroid Build Coastguard Worker } 350*61046927SAndroid Build Coastguard Worker^{SPC}#{SPC}pragma{SPCP}optimize{SPC}\({SPC}off{SPC}\) { 351*61046927SAndroid Build Coastguard Worker BEGIN PP; 352*61046927SAndroid Build Coastguard Worker return PRAGMA_OPTIMIZE_OFF; 353*61046927SAndroid Build Coastguard Worker } 354*61046927SAndroid Build Coastguard Worker^{SPC}#{SPC}pragma{SPCP}warning{SPC}\({SPC}on{SPC}\) { 355*61046927SAndroid Build Coastguard Worker BEGIN PP; 356*61046927SAndroid Build Coastguard Worker return PRAGMA_WARNING_ON; 357*61046927SAndroid Build Coastguard Worker } 358*61046927SAndroid Build Coastguard Worker^{SPC}#{SPC}pragma{SPCP}warning{SPC}\({SPC}off{SPC}\) { 359*61046927SAndroid Build Coastguard Worker BEGIN PP; 360*61046927SAndroid Build Coastguard Worker return PRAGMA_WARNING_OFF; 361*61046927SAndroid Build Coastguard Worker } 362*61046927SAndroid Build Coastguard Worker^{SPC}#{SPC}pragma{SPCP}STDGL{SPCP}invariant{SPC}\({SPC}all{SPC}\) { 363*61046927SAndroid Build Coastguard Worker BEGIN PP; 364*61046927SAndroid Build Coastguard Worker return PRAGMA_INVARIANT_ALL; 365*61046927SAndroid Build Coastguard Worker } 366*61046927SAndroid Build Coastguard Worker^{SPC}#{SPC}pragma{SPCP} { BEGIN PRAGMA; } 367*61046927SAndroid Build Coastguard Worker 368*61046927SAndroid Build Coastguard Worker<PRAGMA>\n { BEGIN 0; yylineno++; yycolumn = 0; } 369*61046927SAndroid Build Coastguard Worker<PRAGMA>. { } 370*61046927SAndroid Build Coastguard Worker 371*61046927SAndroid Build Coastguard Worker<PP>\/\/[^\n]* { } 372*61046927SAndroid Build Coastguard Worker<PP>[ \t\r]* { } 373*61046927SAndroid Build Coastguard Worker<PP>: return COLON; 374*61046927SAndroid Build Coastguard Worker<PP>[_a-zA-Z][_a-zA-Z0-9]* { 375*61046927SAndroid Build Coastguard Worker /* We're not doing linear_strdup here, to avoid an implicit call 376*61046927SAndroid Build Coastguard Worker * on strlen() for the length of the string, as this is already 377*61046927SAndroid Build Coastguard Worker * found by flex and stored in yyleng 378*61046927SAndroid Build Coastguard Worker */ 379*61046927SAndroid Build Coastguard Worker linear_ctx *mem_ctx = yyextra->linalloc; 380*61046927SAndroid Build Coastguard Worker char *id = (char *) linear_alloc_child(mem_ctx, yyleng + 1); 381*61046927SAndroid Build Coastguard Worker memcpy(id, yytext, yyleng + 1); 382*61046927SAndroid Build Coastguard Worker yylval->identifier = id; 383*61046927SAndroid Build Coastguard Worker return IDENTIFIER; 384*61046927SAndroid Build Coastguard Worker } 385*61046927SAndroid Build Coastguard Worker<PP>[1-9][0-9]* { 386*61046927SAndroid Build Coastguard Worker yylval->n = strtol(yytext, NULL, 10); 387*61046927SAndroid Build Coastguard Worker return INTCONSTANT; 388*61046927SAndroid Build Coastguard Worker } 389*61046927SAndroid Build Coastguard Worker<PP>0 { 390*61046927SAndroid Build Coastguard Worker yylval->n = 0; 391*61046927SAndroid Build Coastguard Worker return INTCONSTANT; 392*61046927SAndroid Build Coastguard Worker } 393*61046927SAndroid Build Coastguard Worker<PP>\n { BEGIN 0; yylineno++; yycolumn = 0; return EOL; } 394*61046927SAndroid Build Coastguard Worker<PP>. { return yytext[0]; } 395*61046927SAndroid Build Coastguard Worker 396*61046927SAndroid Build Coastguard Worker\n { yylineno++; yycolumn = 0; } 397*61046927SAndroid Build Coastguard Worker 398*61046927SAndroid Build Coastguard Workerattribute DEPRECATED_KEYWORD(ATTRIBUTE, yyextra, 420, 300); 399*61046927SAndroid Build Coastguard Workerconst return CONST_TOK; 400*61046927SAndroid Build Coastguard Workerbool { yylval->type = &glsl_type_builtin_bool; return BASIC_TYPE_TOK; } 401*61046927SAndroid Build Coastguard Workerfloat { yylval->type = &glsl_type_builtin_float; return BASIC_TYPE_TOK; } 402*61046927SAndroid Build Coastguard Workerint { yylval->type = &glsl_type_builtin_int; return BASIC_TYPE_TOK; } 403*61046927SAndroid Build Coastguard Workeruint TYPE(130, 300, 130, 300, &glsl_type_builtin_uint); 404*61046927SAndroid Build Coastguard Worker 405*61046927SAndroid Build Coastguard Workerbreak return BREAK; 406*61046927SAndroid Build Coastguard Workercontinue return CONTINUE; 407*61046927SAndroid Build Coastguard Workerdo return DO; 408*61046927SAndroid Build Coastguard Workerwhile return WHILE; 409*61046927SAndroid Build Coastguard Workerelse return ELSE; 410*61046927SAndroid Build Coastguard Workerfor return FOR; 411*61046927SAndroid Build Coastguard Workerif return IF; 412*61046927SAndroid Build Coastguard Workerdiscard return DISCARD; 413*61046927SAndroid Build Coastguard Workerreturn return RETURN; 414*61046927SAndroid Build Coastguard Workerdemote KEYWORD_WITH_ALT(0, 0, 0, 0, yyextra->EXT_demote_to_helper_invocation_enable, DEMOTE); 415*61046927SAndroid Build Coastguard Worker 416*61046927SAndroid Build Coastguard Workerbvec2 { yylval->type = &glsl_type_builtin_bvec2; return BASIC_TYPE_TOK; } 417*61046927SAndroid Build Coastguard Workerbvec3 { yylval->type = &glsl_type_builtin_bvec3; return BASIC_TYPE_TOK; } 418*61046927SAndroid Build Coastguard Workerbvec4 { yylval->type = &glsl_type_builtin_bvec4; return BASIC_TYPE_TOK; } 419*61046927SAndroid Build Coastguard Workerivec2 { yylval->type = &glsl_type_builtin_ivec2; return BASIC_TYPE_TOK; } 420*61046927SAndroid Build Coastguard Workerivec3 { yylval->type = &glsl_type_builtin_ivec3; return BASIC_TYPE_TOK; } 421*61046927SAndroid Build Coastguard Workerivec4 { yylval->type = &glsl_type_builtin_ivec4; return BASIC_TYPE_TOK; } 422*61046927SAndroid Build Coastguard Workeruvec2 TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable, &glsl_type_builtin_uvec2); 423*61046927SAndroid Build Coastguard Workeruvec3 TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable, &glsl_type_builtin_uvec3); 424*61046927SAndroid Build Coastguard Workeruvec4 TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable, &glsl_type_builtin_uvec4); 425*61046927SAndroid Build Coastguard Workervec2 { yylval->type = &glsl_type_builtin_vec2; return BASIC_TYPE_TOK; } 426*61046927SAndroid Build Coastguard Workervec3 { yylval->type = &glsl_type_builtin_vec3; return BASIC_TYPE_TOK; } 427*61046927SAndroid Build Coastguard Workervec4 { yylval->type = &glsl_type_builtin_vec4; return BASIC_TYPE_TOK; } 428*61046927SAndroid Build Coastguard Workermat2 { yylval->type = &glsl_type_builtin_mat2; return BASIC_TYPE_TOK; } 429*61046927SAndroid Build Coastguard Workermat3 { yylval->type = &glsl_type_builtin_mat3; return BASIC_TYPE_TOK; } 430*61046927SAndroid Build Coastguard Workermat4 { yylval->type = &glsl_type_builtin_mat4; return BASIC_TYPE_TOK; } 431*61046927SAndroid Build Coastguard Workermat2x2 TYPE(120, 300, 120, 300, &glsl_type_builtin_mat2); 432*61046927SAndroid Build Coastguard Workermat2x3 TYPE(120, 300, 120, 300, &glsl_type_builtin_mat2x3); 433*61046927SAndroid Build Coastguard Workermat2x4 TYPE(120, 300, 120, 300, &glsl_type_builtin_mat2x4); 434*61046927SAndroid Build Coastguard Workermat3x2 TYPE(120, 300, 120, 300, &glsl_type_builtin_mat3x2); 435*61046927SAndroid Build Coastguard Workermat3x3 TYPE(120, 300, 120, 300, &glsl_type_builtin_mat3); 436*61046927SAndroid Build Coastguard Workermat3x4 TYPE(120, 300, 120, 300, &glsl_type_builtin_mat3x4); 437*61046927SAndroid Build Coastguard Workermat4x2 TYPE(120, 300, 120, 300, &glsl_type_builtin_mat4x2); 438*61046927SAndroid Build Coastguard Workermat4x3 TYPE(120, 300, 120, 300, &glsl_type_builtin_mat4x3); 439*61046927SAndroid Build Coastguard Workermat4x4 TYPE(120, 300, 120, 300, &glsl_type_builtin_mat4); 440*61046927SAndroid Build Coastguard Worker 441*61046927SAndroid Build Coastguard Workerin return IN_TOK; 442*61046927SAndroid Build Coastguard Workerout return OUT_TOK; 443*61046927SAndroid Build Coastguard Workerinout return INOUT_TOK; 444*61046927SAndroid Build Coastguard Workeruniform return UNIFORM; 445*61046927SAndroid Build Coastguard Workerbuffer KEYWORD_WITH_ALT(0, 0, 430, 310, yyextra->ARB_shader_storage_buffer_object_enable, BUFFER); 446*61046927SAndroid Build Coastguard Workervarying DEPRECATED_KEYWORD(VARYING, yyextra, 420, 300); 447*61046927SAndroid Build Coastguard Workercentroid KEYWORD_WITH_ALT(120, 300, 120, 300, yyextra->EXT_gpu_shader4_enable, CENTROID); 448*61046927SAndroid Build Coastguard Workerinvariant KEYWORD(120, 100, 120, 100, INVARIANT); 449*61046927SAndroid Build Coastguard Workerflat KEYWORD_WITH_ALT(130, 100, 130, 300, yyextra->EXT_gpu_shader4_enable, FLAT); 450*61046927SAndroid Build Coastguard Workersmooth KEYWORD(130, 300, 130, 300, SMOOTH); 451*61046927SAndroid Build Coastguard Workernoperspective KEYWORD_WITH_ALT(130, 300, 130, 0, yyextra->EXT_gpu_shader4_enable || yyextra->NV_shader_noperspective_interpolation_enable, NOPERSPECTIVE); 452*61046927SAndroid Build Coastguard Workerpatch KEYWORD_WITH_ALT(0, 300, 400, 320, yyextra->has_tessellation_shader(), PATCH); 453*61046927SAndroid Build Coastguard Worker 454*61046927SAndroid Build Coastguard Workersampler1D DEPRECATED_ES_TYPE(&glsl_type_builtin_sampler1D); 455*61046927SAndroid Build Coastguard Workersampler2D { yylval->type = &glsl_type_builtin_sampler2D; return BASIC_TYPE_TOK; } 456*61046927SAndroid Build Coastguard Workersampler3D { yylval->type = &glsl_type_builtin_sampler3D; return BASIC_TYPE_TOK; } 457*61046927SAndroid Build Coastguard WorkersamplerCube { yylval->type = &glsl_type_builtin_samplerCube; return BASIC_TYPE_TOK; } 458*61046927SAndroid Build Coastguard Workersampler1DArray TYPE_WITH_ALT(130, 300, 130, 0, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_array, &glsl_type_builtin_sampler1DArray); 459*61046927SAndroid Build Coastguard Workersampler2DArray TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_array, &glsl_type_builtin_sampler2DArray); 460*61046927SAndroid Build Coastguard Workersampler1DShadow DEPRECATED_ES_TYPE(&glsl_type_builtin_sampler1DShadow); 461*61046927SAndroid Build Coastguard Workersampler2DShadow { yylval->type = &glsl_type_builtin_sampler2DShadow; return BASIC_TYPE_TOK; } 462*61046927SAndroid Build Coastguard WorkersamplerCubeShadow TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable, &glsl_type_builtin_samplerCubeShadow); 463*61046927SAndroid Build Coastguard Workersampler1DArrayShadow TYPE_WITH_ALT(130, 300, 130, 0, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_array, &glsl_type_builtin_sampler1DArrayShadow); 464*61046927SAndroid Build Coastguard Workersampler2DArrayShadow TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_array, &glsl_type_builtin_sampler2DArrayShadow); 465*61046927SAndroid Build Coastguard Workerisampler1D TYPE_WITH_ALT(130, 300, 130, 0, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer, &glsl_type_builtin_isampler1D); 466*61046927SAndroid Build Coastguard Workerisampler2D TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer, &glsl_type_builtin_isampler2D); 467*61046927SAndroid Build Coastguard Workerisampler3D TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer, &glsl_type_builtin_isampler3D); 468*61046927SAndroid Build Coastguard WorkerisamplerCube TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer, &glsl_type_builtin_isamplerCube); 469*61046927SAndroid Build Coastguard Workerisampler1DArray TYPE_WITH_ALT(130, 300, 130, 0, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer && yyextra->exts->EXT_texture_array, &glsl_type_builtin_isampler1DArray); 470*61046927SAndroid Build Coastguard Workerisampler2DArray TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer && yyextra->exts->EXT_texture_array, &glsl_type_builtin_isampler2DArray); 471*61046927SAndroid Build Coastguard Workerusampler1D TYPE_WITH_ALT(130, 300, 130, 0, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer, &glsl_type_builtin_usampler1D); 472*61046927SAndroid Build Coastguard Workerusampler2D TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer, &glsl_type_builtin_usampler2D); 473*61046927SAndroid Build Coastguard Workerusampler3D TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer, &glsl_type_builtin_usampler3D); 474*61046927SAndroid Build Coastguard WorkerusamplerCube TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer, &glsl_type_builtin_usamplerCube); 475*61046927SAndroid Build Coastguard Workerusampler1DArray TYPE_WITH_ALT(130, 300, 130, 0, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer && yyextra->exts->EXT_texture_array, &glsl_type_builtin_usampler1DArray); 476*61046927SAndroid Build Coastguard Workerusampler2DArray TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer && yyextra->exts->EXT_texture_array, &glsl_type_builtin_usampler2DArray); 477*61046927SAndroid Build Coastguard Worker 478*61046927SAndroid Build Coastguard Worker /* additional keywords in ARB_texture_multisample, included in GLSL 1.50 */ 479*61046927SAndroid Build Coastguard Worker /* these are reserved but not defined in GLSL 3.00 */ 480*61046927SAndroid Build Coastguard Worker /* [iu]sampler2DMS are defined in GLSL ES 3.10 */ 481*61046927SAndroid Build Coastguard Workersampler2DMS TYPE_WITH_ALT(150, 300, 150, 310, yyextra->ARB_texture_multisample_enable, &glsl_type_builtin_sampler2DMS); 482*61046927SAndroid Build Coastguard Workerisampler2DMS TYPE_WITH_ALT(150, 300, 150, 310, yyextra->ARB_texture_multisample_enable, &glsl_type_builtin_isampler2DMS); 483*61046927SAndroid Build Coastguard Workerusampler2DMS TYPE_WITH_ALT(150, 300, 150, 310, yyextra->ARB_texture_multisample_enable, &glsl_type_builtin_usampler2DMS); 484*61046927SAndroid Build Coastguard Workersampler2DMSArray TYPE_WITH_ALT(150, 300, 150, 320, yyextra->ARB_texture_multisample_enable || yyextra->OES_texture_storage_multisample_2d_array_enable, &glsl_type_builtin_sampler2DMSArray); 485*61046927SAndroid Build Coastguard Workerisampler2DMSArray TYPE_WITH_ALT(150, 300, 150, 320, yyextra->ARB_texture_multisample_enable || yyextra->OES_texture_storage_multisample_2d_array_enable, &glsl_type_builtin_isampler2DMSArray); 486*61046927SAndroid Build Coastguard Workerusampler2DMSArray TYPE_WITH_ALT(150, 300, 150, 320, yyextra->ARB_texture_multisample_enable || yyextra->OES_texture_storage_multisample_2d_array_enable, &glsl_type_builtin_usampler2DMSArray); 487*61046927SAndroid Build Coastguard Worker 488*61046927SAndroid Build Coastguard Worker /* keywords available with ARB_texture_cube_map_array_enable extension on desktop GLSL */ 489*61046927SAndroid Build Coastguard WorkersamplerCubeArray TYPE_WITH_ALT(400, 310, 400, 320, yyextra->ARB_texture_cube_map_array_enable || yyextra->OES_texture_cube_map_array_enable || yyextra->EXT_texture_cube_map_array_enable, &glsl_type_builtin_samplerCubeArray); 490*61046927SAndroid Build Coastguard WorkerisamplerCubeArray TYPE_WITH_ALT(400, 310, 400, 320, yyextra->ARB_texture_cube_map_array_enable || yyextra->OES_texture_cube_map_array_enable || yyextra->EXT_texture_cube_map_array_enable, &glsl_type_builtin_isamplerCubeArray); 491*61046927SAndroid Build Coastguard WorkerusamplerCubeArray TYPE_WITH_ALT(400, 310, 400, 320, yyextra->ARB_texture_cube_map_array_enable || yyextra->OES_texture_cube_map_array_enable || yyextra->EXT_texture_cube_map_array_enable, &glsl_type_builtin_usamplerCubeArray); 492*61046927SAndroid Build Coastguard WorkersamplerCubeArrayShadow TYPE_WITH_ALT(400, 310, 400, 320, yyextra->ARB_texture_cube_map_array_enable || yyextra->OES_texture_cube_map_array_enable || yyextra->EXT_texture_cube_map_array_enable, &glsl_type_builtin_samplerCubeArrayShadow); 493*61046927SAndroid Build Coastguard Worker 494*61046927SAndroid Build Coastguard WorkersamplerExternalOES { 495*61046927SAndroid Build Coastguard Worker if (yyextra->OES_EGL_image_external_enable || yyextra->OES_EGL_image_external_essl3_enable) { 496*61046927SAndroid Build Coastguard Worker yylval->type = &glsl_type_builtin_samplerExternalOES; 497*61046927SAndroid Build Coastguard Worker return BASIC_TYPE_TOK; 498*61046927SAndroid Build Coastguard Worker } else 499*61046927SAndroid Build Coastguard Worker return IDENTIFIER; 500*61046927SAndroid Build Coastguard Worker } 501*61046927SAndroid Build Coastguard Worker 502*61046927SAndroid Build Coastguard Worker /* keywords available with ARB_gpu_shader5 */ 503*61046927SAndroid Build Coastguard Workerprecise KEYWORD_WITH_ALT(400, 310, 400, 320, yyextra->ARB_gpu_shader5_enable || yyextra->EXT_gpu_shader5_enable || yyextra->OES_gpu_shader5_enable, PRECISE); 504*61046927SAndroid Build Coastguard Worker 505*61046927SAndroid Build Coastguard Worker /* keywords available with ARB_shader_image_load_store */ 506*61046927SAndroid Build Coastguard Workerimage1D TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_image1D); 507*61046927SAndroid Build Coastguard Workerimage2D TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_image2D); 508*61046927SAndroid Build Coastguard Workerimage3D TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_image3D); 509*61046927SAndroid Build Coastguard Workerimage2DRect TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_image2DRect); 510*61046927SAndroid Build Coastguard WorkerimageCube TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_imageCube); 511*61046927SAndroid Build Coastguard WorkerimageBuffer TYPE_WITH_ALT(130, 300, 420, 320, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable || yyextra->EXT_texture_buffer_enable || yyextra->OES_texture_buffer_enable, &glsl_type_builtin_imageBuffer); 512*61046927SAndroid Build Coastguard Workerimage1DArray TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_image1DArray); 513*61046927SAndroid Build Coastguard Workerimage2DArray TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_image2DArray); 514*61046927SAndroid Build Coastguard WorkerimageCubeArray TYPE_WITH_ALT(130, 300, 420, 320, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable || yyextra->OES_texture_cube_map_array_enable || yyextra->EXT_texture_cube_map_array_enable, &glsl_type_builtin_imageCubeArray); 515*61046927SAndroid Build Coastguard Workerimage2DMS TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_image2DMS); 516*61046927SAndroid Build Coastguard Workerimage2DMSArray TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_image2DMSArray); 517*61046927SAndroid Build Coastguard Workeriimage1D TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_iimage1D); 518*61046927SAndroid Build Coastguard Workeriimage2D TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_iimage2D); 519*61046927SAndroid Build Coastguard Workeriimage3D TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_iimage3D); 520*61046927SAndroid Build Coastguard Workeriimage2DRect TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_iimage2DRect); 521*61046927SAndroid Build Coastguard WorkeriimageCube TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_iimageCube); 522*61046927SAndroid Build Coastguard WorkeriimageBuffer TYPE_WITH_ALT(130, 300, 420, 320, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable || yyextra->EXT_texture_buffer_enable || yyextra->OES_texture_buffer_enable, &glsl_type_builtin_iimageBuffer); 523*61046927SAndroid Build Coastguard Workeriimage1DArray TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_iimage1DArray); 524*61046927SAndroid Build Coastguard Workeriimage2DArray TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_iimage2DArray); 525*61046927SAndroid Build Coastguard WorkeriimageCubeArray TYPE_WITH_ALT(130, 300, 420, 320, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable || yyextra->OES_texture_cube_map_array_enable || yyextra->EXT_texture_cube_map_array_enable, &glsl_type_builtin_iimageCubeArray); 526*61046927SAndroid Build Coastguard Workeriimage2DMS TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_iimage2DMS); 527*61046927SAndroid Build Coastguard Workeriimage2DMSArray TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_iimage2DMSArray); 528*61046927SAndroid Build Coastguard Workeruimage1D TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_uimage1D); 529*61046927SAndroid Build Coastguard Workeruimage2D TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_uimage2D); 530*61046927SAndroid Build Coastguard Workeruimage3D TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_uimage3D); 531*61046927SAndroid Build Coastguard Workeruimage2DRect TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_uimage2DRect); 532*61046927SAndroid Build Coastguard WorkeruimageCube TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_uimageCube); 533*61046927SAndroid Build Coastguard WorkeruimageBuffer TYPE_WITH_ALT(130, 300, 420, 320, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable || yyextra->EXT_texture_buffer_enable || yyextra->OES_texture_buffer_enable, &glsl_type_builtin_uimageBuffer); 534*61046927SAndroid Build Coastguard Workeruimage1DArray TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_uimage1DArray); 535*61046927SAndroid Build Coastguard Workeruimage2DArray TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_uimage2DArray); 536*61046927SAndroid Build Coastguard WorkeruimageCubeArray TYPE_WITH_ALT(130, 300, 420, 320, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable || yyextra->OES_texture_cube_map_array_enable || yyextra->EXT_texture_cube_map_array_enable, &glsl_type_builtin_uimageCubeArray); 537*61046927SAndroid Build Coastguard Workeruimage2DMS TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_uimage2DMS); 538*61046927SAndroid Build Coastguard Workeruimage2DMSArray TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_uimage2DMSArray); 539*61046927SAndroid Build Coastguard Workerimage1DShadow KEYWORD(130, 0, 420, 0, IMAGE1DSHADOW); 540*61046927SAndroid Build Coastguard Workerimage2DShadow KEYWORD(130, 0, 420, 0, IMAGE2DSHADOW); 541*61046927SAndroid Build Coastguard Workerimage1DArrayShadow KEYWORD(130, 0, 420, 0, IMAGE1DARRAYSHADOW); 542*61046927SAndroid Build Coastguard Workerimage2DArrayShadow KEYWORD(130, 0, 420, 0, IMAGE2DARRAYSHADOW); 543*61046927SAndroid Build Coastguard Worker 544*61046927SAndroid Build Coastguard Workercoherent KEYWORD_WITH_ALT(420, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable || yyextra->ARB_shader_storage_buffer_object_enable, COHERENT); 545*61046927SAndroid Build Coastguard Workervolatile KEYWORD_WITH_ALT(110, 100, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable || yyextra->ARB_shader_storage_buffer_object_enable, VOLATILE); 546*61046927SAndroid Build Coastguard Workerrestrict KEYWORD_WITH_ALT(420, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable || yyextra->ARB_shader_storage_buffer_object_enable, RESTRICT); 547*61046927SAndroid Build Coastguard Workerreadonly KEYWORD_WITH_ALT(420, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->ARB_shader_storage_buffer_object_enable, READONLY); 548*61046927SAndroid Build Coastguard Workerwriteonly KEYWORD_WITH_ALT(420, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->ARB_shader_storage_buffer_object_enable, WRITEONLY); 549*61046927SAndroid Build Coastguard Worker 550*61046927SAndroid Build Coastguard Workeratomic_uint TYPE_WITH_ALT(420, 300, 420, 310, yyextra->ARB_shader_atomic_counters_enable, &glsl_type_builtin_atomic_uint); 551*61046927SAndroid Build Coastguard Worker 552*61046927SAndroid Build Coastguard Workershared KEYWORD_WITH_ALT(430, 310, 430, 310, yyextra->ARB_compute_shader_enable, SHARED); 553*61046927SAndroid Build Coastguard Worker 554*61046927SAndroid Build Coastguard Workerstruct return STRUCT; 555*61046927SAndroid Build Coastguard Workervoid return VOID_TOK; 556*61046927SAndroid Build Coastguard Worker 557*61046927SAndroid Build Coastguard Workerlayout { 558*61046927SAndroid Build Coastguard Worker if ((yyextra->is_version(140, 300)) 559*61046927SAndroid Build Coastguard Worker || yyextra->ARB_bindless_texture_enable 560*61046927SAndroid Build Coastguard Worker || yyextra->KHR_blend_equation_advanced_enable 561*61046927SAndroid Build Coastguard Worker || yyextra->AMD_conservative_depth_enable 562*61046927SAndroid Build Coastguard Worker || yyextra->ARB_conservative_depth_enable 563*61046927SAndroid Build Coastguard Worker || yyextra->ARB_explicit_attrib_location_enable 564*61046927SAndroid Build Coastguard Worker || yyextra->ARB_explicit_uniform_location_enable 565*61046927SAndroid Build Coastguard Worker || yyextra->ARB_post_depth_coverage_enable 566*61046927SAndroid Build Coastguard Worker || yyextra->has_separate_shader_objects() 567*61046927SAndroid Build Coastguard Worker || yyextra->ARB_uniform_buffer_object_enable 568*61046927SAndroid Build Coastguard Worker || yyextra->ARB_fragment_coord_conventions_enable 569*61046927SAndroid Build Coastguard Worker || yyextra->ARB_shading_language_420pack_enable 570*61046927SAndroid Build Coastguard Worker || yyextra->ARB_compute_shader_enable 571*61046927SAndroid Build Coastguard Worker || yyextra->ARB_tessellation_shader_enable 572*61046927SAndroid Build Coastguard Worker || yyextra->EXT_shader_framebuffer_fetch_non_coherent_enable) { 573*61046927SAndroid Build Coastguard Worker return LAYOUT_TOK; 574*61046927SAndroid Build Coastguard Worker } else { 575*61046927SAndroid Build Coastguard Worker return classify_identifier(yyextra, yytext, yyleng, yylval); 576*61046927SAndroid Build Coastguard Worker } 577*61046927SAndroid Build Coastguard Worker } 578*61046927SAndroid Build Coastguard Worker 579*61046927SAndroid Build Coastguard Worker\+\+ return INC_OP; 580*61046927SAndroid Build Coastguard Worker-- return DEC_OP; 581*61046927SAndroid Build Coastguard Worker\<= return LE_OP; 582*61046927SAndroid Build Coastguard Worker>= return GE_OP; 583*61046927SAndroid Build Coastguard Worker== return EQ_OP; 584*61046927SAndroid Build Coastguard Worker!= return NE_OP; 585*61046927SAndroid Build Coastguard Worker&& return AND_OP; 586*61046927SAndroid Build Coastguard Worker\|\| return OR_OP; 587*61046927SAndroid Build Coastguard Worker"^^" return XOR_OP; 588*61046927SAndroid Build Coastguard Worker"<<" return LEFT_OP; 589*61046927SAndroid Build Coastguard Worker">>" return RIGHT_OP; 590*61046927SAndroid Build Coastguard Worker 591*61046927SAndroid Build Coastguard Worker\*= return MUL_ASSIGN; 592*61046927SAndroid Build Coastguard Worker\/= return DIV_ASSIGN; 593*61046927SAndroid Build Coastguard Worker\+= return ADD_ASSIGN; 594*61046927SAndroid Build Coastguard Worker\%= return MOD_ASSIGN; 595*61046927SAndroid Build Coastguard Worker\<\<= return LEFT_ASSIGN; 596*61046927SAndroid Build Coastguard Worker>>= return RIGHT_ASSIGN; 597*61046927SAndroid Build Coastguard Worker&= return AND_ASSIGN; 598*61046927SAndroid Build Coastguard Worker"^=" return XOR_ASSIGN; 599*61046927SAndroid Build Coastguard Worker\|= return OR_ASSIGN; 600*61046927SAndroid Build Coastguard Worker-= return SUB_ASSIGN; 601*61046927SAndroid Build Coastguard Worker 602*61046927SAndroid Build Coastguard Worker[1-9][0-9]*([uU]|[lL]|ul|UL)? { 603*61046927SAndroid Build Coastguard Worker return LITERAL_INTEGER(10); 604*61046927SAndroid Build Coastguard Worker } 605*61046927SAndroid Build Coastguard Worker0[xX][0-9a-fA-F]+([uU]|[lL]|ul|UL)? { 606*61046927SAndroid Build Coastguard Worker return LITERAL_INTEGER(16); 607*61046927SAndroid Build Coastguard Worker } 608*61046927SAndroid Build Coastguard Worker0[0-7]*([uU]|[lL]|ul|UL)? { 609*61046927SAndroid Build Coastguard Worker return LITERAL_INTEGER(8); 610*61046927SAndroid Build Coastguard Worker } 611*61046927SAndroid Build Coastguard Worker 612*61046927SAndroid Build Coastguard Worker[0-9]+\.[0-9]+([eE][+-]?[0-9]+)?(hf|HF) | 613*61046927SAndroid Build Coastguard Worker\.[0-9]+([eE][+-]?[0-9]+)?(hf|HF) | 614*61046927SAndroid Build Coastguard Worker[0-9]+\.([eE][+-]?[0-9]+)?(hf|HF) | 615*61046927SAndroid Build Coastguard Worker[0-9]+[eE][+-]?[0-9]+(hf|HF) { 616*61046927SAndroid Build Coastguard Worker if (!yyextra->AMD_gpu_shader_half_float_enable) 617*61046927SAndroid Build Coastguard Worker return ERROR_TOK; 618*61046927SAndroid Build Coastguard Worker yylval->dreal = _mesa_strtod(yytext, NULL); 619*61046927SAndroid Build Coastguard Worker return FLOAT16CONSTANT; 620*61046927SAndroid Build Coastguard Worker } 621*61046927SAndroid Build Coastguard Worker 622*61046927SAndroid Build Coastguard Worker[0-9]+\.[0-9]+([eE][+-]?[0-9]+)?[fF]? | 623*61046927SAndroid Build Coastguard Worker\.[0-9]+([eE][+-]?[0-9]+)?[fF]? | 624*61046927SAndroid Build Coastguard Worker[0-9]+\.([eE][+-]?[0-9]+)?[fF]? | 625*61046927SAndroid Build Coastguard Worker[0-9]+[eE][+-]?[0-9]+[fF]? { 626*61046927SAndroid Build Coastguard Worker struct _mesa_glsl_parse_state *state = yyextra; 627*61046927SAndroid Build Coastguard Worker char suffix = yytext[strlen(yytext) - 1]; 628*61046927SAndroid Build Coastguard Worker if (!state->is_version(120, 300) && 629*61046927SAndroid Build Coastguard Worker (suffix == 'f' || suffix == 'F')) { 630*61046927SAndroid Build Coastguard Worker _mesa_glsl_warning(yylloc, state, 631*61046927SAndroid Build Coastguard Worker "Float suffixes are invalid in GLSL 1.10"); 632*61046927SAndroid Build Coastguard Worker } 633*61046927SAndroid Build Coastguard Worker yylval->real = _mesa_strtof(yytext, NULL); 634*61046927SAndroid Build Coastguard Worker return FLOATCONSTANT; 635*61046927SAndroid Build Coastguard Worker } 636*61046927SAndroid Build Coastguard Worker 637*61046927SAndroid Build Coastguard Worker[0-9]+\.[0-9]+([eE][+-]?[0-9]+)?(lf|LF) | 638*61046927SAndroid Build Coastguard Worker\.[0-9]+([eE][+-]?[0-9]+)?(lf|LF) | 639*61046927SAndroid Build Coastguard Worker[0-9]+\.([eE][+-]?[0-9]+)?(lf|LF) | 640*61046927SAndroid Build Coastguard Worker[0-9]+[eE][+-]?[0-9]+(lf|LF) { 641*61046927SAndroid Build Coastguard Worker if (!yyextra->is_version(400, 0) && 642*61046927SAndroid Build Coastguard Worker !yyextra->ARB_gpu_shader_fp64_enable) 643*61046927SAndroid Build Coastguard Worker return ERROR_TOK; 644*61046927SAndroid Build Coastguard Worker yylval->dreal = _mesa_strtod(yytext, NULL); 645*61046927SAndroid Build Coastguard Worker return DOUBLECONSTANT; 646*61046927SAndroid Build Coastguard Worker } 647*61046927SAndroid Build Coastguard Worker 648*61046927SAndroid Build Coastguard Workertrue { 649*61046927SAndroid Build Coastguard Worker yylval->n = 1; 650*61046927SAndroid Build Coastguard Worker return BOOLCONSTANT; 651*61046927SAndroid Build Coastguard Worker } 652*61046927SAndroid Build Coastguard Workerfalse { 653*61046927SAndroid Build Coastguard Worker yylval->n = 0; 654*61046927SAndroid Build Coastguard Worker return BOOLCONSTANT; 655*61046927SAndroid Build Coastguard Worker } 656*61046927SAndroid Build Coastguard Worker 657*61046927SAndroid Build Coastguard Worker 658*61046927SAndroid Build Coastguard Worker /* Reserved words in GLSL 1.10. */ 659*61046927SAndroid Build Coastguard Workerasm KEYWORD(110, 100, 0, 0, ASM); 660*61046927SAndroid Build Coastguard Workerclass KEYWORD(110, 100, 0, 0, CLASS); 661*61046927SAndroid Build Coastguard Workerunion KEYWORD(110, 100, 0, 0, UNION); 662*61046927SAndroid Build Coastguard Workerenum KEYWORD(110, 100, 0, 0, ENUM); 663*61046927SAndroid Build Coastguard Workertypedef KEYWORD(110, 100, 0, 0, TYPEDEF); 664*61046927SAndroid Build Coastguard Workertemplate KEYWORD(110, 100, 0, 0, TEMPLATE); 665*61046927SAndroid Build Coastguard Workerthis KEYWORD(110, 100, 0, 0, THIS); 666*61046927SAndroid Build Coastguard Workerpacked KEYWORD_WITH_ALT(110, 100, 140, 300, yyextra->ARB_uniform_buffer_object_enable, PACKED_TOK); 667*61046927SAndroid Build Coastguard Workergoto KEYWORD(110, 100, 0, 0, GOTO); 668*61046927SAndroid Build Coastguard Workerswitch KEYWORD(110, 100, 130, 300, SWITCH); 669*61046927SAndroid Build Coastguard Workerdefault KEYWORD(110, 100, 130, 300, DEFAULT); 670*61046927SAndroid Build Coastguard Workerinline KEYWORD(110, 100, 0, 0, INLINE_TOK); 671*61046927SAndroid Build Coastguard Workernoinline KEYWORD(110, 100, 0, 0, NOINLINE); 672*61046927SAndroid Build Coastguard Workerpublic KEYWORD(110, 100, 0, 0, PUBLIC_TOK); 673*61046927SAndroid Build Coastguard Workerstatic KEYWORD(110, 100, 0, 0, STATIC); 674*61046927SAndroid Build Coastguard Workerextern KEYWORD(110, 100, 0, 0, EXTERN); 675*61046927SAndroid Build Coastguard Workerexternal KEYWORD(110, 100, 0, 0, EXTERNAL); 676*61046927SAndroid Build Coastguard Workerinterface KEYWORD(110, 100, 0, 0, INTERFACE_TOK); 677*61046927SAndroid Build Coastguard Workerlong KEYWORD(110, 100, 0, 0, LONG_TOK); 678*61046927SAndroid Build Coastguard Workershort KEYWORD(110, 100, 0, 0, SHORT_TOK); 679*61046927SAndroid Build Coastguard Workerdouble TYPE_WITH_ALT(130, 100, 130, 300, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_double); 680*61046927SAndroid Build Coastguard Workerhalf KEYWORD(110, 100, 0, 0, HALF); 681*61046927SAndroid Build Coastguard Workerfixed KEYWORD(110, 100, 0, 0, FIXED_TOK); 682*61046927SAndroid Build Coastguard Workerunsigned KEYWORD_WITH_ALT(110, 100, 0, 0, yyextra->EXT_gpu_shader4_enable, UNSIGNED); 683*61046927SAndroid Build Coastguard Workerinput KEYWORD(110, 100, 0, 0, INPUT_TOK); 684*61046927SAndroid Build Coastguard Workeroutput KEYWORD(110, 100, 0, 0, OUTPUT); 685*61046927SAndroid Build Coastguard Workerhvec2 KEYWORD(110, 100, 0, 0, HVEC2); 686*61046927SAndroid Build Coastguard Workerhvec3 KEYWORD(110, 100, 0, 0, HVEC3); 687*61046927SAndroid Build Coastguard Workerhvec4 KEYWORD(110, 100, 0, 0, HVEC4); 688*61046927SAndroid Build Coastguard Workerdvec2 TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dvec2); 689*61046927SAndroid Build Coastguard Workerdvec3 TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dvec3); 690*61046927SAndroid Build Coastguard Workerdvec4 TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dvec4); 691*61046927SAndroid Build Coastguard Workerdmat2 TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat2); 692*61046927SAndroid Build Coastguard Workerdmat3 TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat3); 693*61046927SAndroid Build Coastguard Workerdmat4 TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat4); 694*61046927SAndroid Build Coastguard Workerdmat2x2 TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat2); 695*61046927SAndroid Build Coastguard Workerdmat2x3 TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat2x3); 696*61046927SAndroid Build Coastguard Workerdmat2x4 TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat2x4); 697*61046927SAndroid Build Coastguard Workerdmat3x2 TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat3x2); 698*61046927SAndroid Build Coastguard Workerdmat3x3 TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat3); 699*61046927SAndroid Build Coastguard Workerdmat3x4 TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat3x4); 700*61046927SAndroid Build Coastguard Workerdmat4x2 TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat4x2); 701*61046927SAndroid Build Coastguard Workerdmat4x3 TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat4x3); 702*61046927SAndroid Build Coastguard Workerdmat4x4 TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat4); 703*61046927SAndroid Build Coastguard Workerfvec2 KEYWORD(110, 100, 0, 0, FVEC2); 704*61046927SAndroid Build Coastguard Workerfvec3 KEYWORD(110, 100, 0, 0, FVEC3); 705*61046927SAndroid Build Coastguard Workerfvec4 KEYWORD(110, 100, 0, 0, FVEC4); 706*61046927SAndroid Build Coastguard Workersampler2DRect TYPE_WITH_ALT(110, 100, 0, 0, yyextra->ARB_texture_rectangle_enable, &glsl_type_builtin_sampler2DRect); 707*61046927SAndroid Build Coastguard Workersampler3DRect KEYWORD(110, 100, 0, 0, SAMPLER3DRECT); 708*61046927SAndroid Build Coastguard Workersampler2DRectShadow TYPE_WITH_ALT(110, 100, 0, 0, yyextra->ARB_texture_rectangle_enable, &glsl_type_builtin_sampler2DRectShadow); 709*61046927SAndroid Build Coastguard Workersizeof KEYWORD(110, 100, 0, 0, SIZEOF); 710*61046927SAndroid Build Coastguard Workercast KEYWORD(110, 100, 0, 0, CAST); 711*61046927SAndroid Build Coastguard Workernamespace KEYWORD(110, 100, 0, 0, NAMESPACE); 712*61046927SAndroid Build Coastguard Workerusing KEYWORD(110, 100, 0, 0, USING); 713*61046927SAndroid Build Coastguard Worker 714*61046927SAndroid Build Coastguard Worker /* Additional reserved words in GLSL 1.20. */ 715*61046927SAndroid Build Coastguard Workerlowp KEYWORD(120, 100, 130, 100, LOWP); 716*61046927SAndroid Build Coastguard Workermediump KEYWORD(120, 100, 130, 100, MEDIUMP); 717*61046927SAndroid Build Coastguard Workerhighp KEYWORD(120, 100, 130, 100, HIGHP); 718*61046927SAndroid Build Coastguard Workerprecision KEYWORD(120, 100, 130, 100, PRECISION); 719*61046927SAndroid Build Coastguard Worker 720*61046927SAndroid Build Coastguard Worker /* Additional reserved words in GLSL 1.30. */ 721*61046927SAndroid Build Coastguard Workercase KEYWORD(130, 300, 130, 300, CASE); 722*61046927SAndroid Build Coastguard Workercommon KEYWORD(130, 300, 0, 0, COMMON); 723*61046927SAndroid Build Coastguard Workerpartition KEYWORD(130, 300, 0, 0, PARTITION); 724*61046927SAndroid Build Coastguard Workeractive KEYWORD(130, 300, 0, 0, ACTIVE); 725*61046927SAndroid Build Coastguard Workersuperp KEYWORD(130, 100, 0, 0, SUPERP); 726*61046927SAndroid Build Coastguard WorkersamplerBuffer TYPE_WITH_ALT(130, 300, 140, 320, yyextra->EXT_texture_buffer_enable || yyextra->OES_texture_buffer_enable || (yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_buffer_object), &glsl_type_builtin_samplerBuffer); 727*61046927SAndroid Build Coastguard Workerfilter KEYWORD(130, 300, 0, 0, FILTER); 728*61046927SAndroid Build Coastguard Workerrow_major KEYWORD_WITH_ALT(130, 0, 140, 0, yyextra->ARB_uniform_buffer_object_enable && !yyextra->es_shader, ROW_MAJOR); 729*61046927SAndroid Build Coastguard Worker 730*61046927SAndroid Build Coastguard Worker /* Additional reserved words in GLSL 1.40 */ 731*61046927SAndroid Build Coastguard Workerisampler2DRect TYPE_WITH_ALT(140, 300, 140, 0, yyextra->EXT_gpu_shader4_enable && yyextra->exts->NV_texture_rectangle && yyextra->exts->EXT_texture_integer, &glsl_type_builtin_isampler2DRect); 732*61046927SAndroid Build Coastguard Workerusampler2DRect TYPE_WITH_ALT(140, 300, 140, 0, yyextra->EXT_gpu_shader4_enable && yyextra->exts->NV_texture_rectangle && yyextra->exts->EXT_texture_integer, &glsl_type_builtin_usampler2DRect); 733*61046927SAndroid Build Coastguard WorkerisamplerBuffer TYPE_WITH_ALT(140, 300, 140, 320, yyextra->EXT_texture_buffer_enable || yyextra->OES_texture_buffer_enable || (yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_buffer_object && yyextra->exts->EXT_texture_integer), &glsl_type_builtin_isamplerBuffer); 734*61046927SAndroid Build Coastguard WorkerusamplerBuffer TYPE_WITH_ALT(140, 300, 140, 320, yyextra->EXT_texture_buffer_enable || yyextra->OES_texture_buffer_enable || (yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_buffer_object && yyextra->exts->EXT_texture_integer), &glsl_type_builtin_usamplerBuffer); 735*61046927SAndroid Build Coastguard Worker 736*61046927SAndroid Build Coastguard Worker /* Additional reserved words in GLSL ES 3.00 */ 737*61046927SAndroid Build Coastguard Workerresource KEYWORD(420, 300, 0, 0, RESOURCE); 738*61046927SAndroid Build Coastguard Workersample KEYWORD_WITH_ALT(400, 300, 400, 320, yyextra->ARB_gpu_shader5_enable || yyextra->OES_shader_multisample_interpolation_enable, SAMPLE); 739*61046927SAndroid Build Coastguard Workersubroutine KEYWORD_WITH_ALT(400, 300, 400, 0, yyextra->ARB_shader_subroutine_enable, SUBROUTINE); 740*61046927SAndroid Build Coastguard Worker 741*61046927SAndroid Build Coastguard Worker /* Additional words for ARB_gpu_shader_int64 */ 742*61046927SAndroid Build Coastguard Workerint64_t TYPE_WITH_ALT(0, 0, 0, 0, yyextra->ARB_gpu_shader_int64_enable || yyextra->AMD_gpu_shader_int64_enable, &glsl_type_builtin_int64_t); 743*61046927SAndroid Build Coastguard Workeri64vec2 TYPE_WITH_ALT(0, 0, 0, 0, yyextra->ARB_gpu_shader_int64_enable || yyextra->AMD_gpu_shader_int64_enable, &glsl_type_builtin_i64vec2); 744*61046927SAndroid Build Coastguard Workeri64vec3 TYPE_WITH_ALT(0, 0, 0, 0, yyextra->ARB_gpu_shader_int64_enable || yyextra->AMD_gpu_shader_int64_enable, &glsl_type_builtin_i64vec3); 745*61046927SAndroid Build Coastguard Workeri64vec4 TYPE_WITH_ALT(0, 0, 0, 0, yyextra->ARB_gpu_shader_int64_enable || yyextra->AMD_gpu_shader_int64_enable, &glsl_type_builtin_i64vec4); 746*61046927SAndroid Build Coastguard Worker 747*61046927SAndroid Build Coastguard Workeruint64_t TYPE_WITH_ALT(0, 0, 0, 0, yyextra->ARB_gpu_shader_int64_enable || yyextra->AMD_gpu_shader_int64_enable, &glsl_type_builtin_uint64_t); 748*61046927SAndroid Build Coastguard Workeru64vec2 TYPE_WITH_ALT(0, 0, 0, 0, yyextra->ARB_gpu_shader_int64_enable || yyextra->AMD_gpu_shader_int64_enable, &glsl_type_builtin_u64vec2); 749*61046927SAndroid Build Coastguard Workeru64vec3 TYPE_WITH_ALT(0, 0, 0, 0, yyextra->ARB_gpu_shader_int64_enable || yyextra->AMD_gpu_shader_int64_enable, &glsl_type_builtin_u64vec3); 750*61046927SAndroid Build Coastguard Workeru64vec4 TYPE_WITH_ALT(0, 0, 0, 0, yyextra->ARB_gpu_shader_int64_enable || yyextra->AMD_gpu_shader_int64_enable, &glsl_type_builtin_u64vec4); 751*61046927SAndroid Build Coastguard Worker 752*61046927SAndroid Build Coastguard Worker /* Additional words for AMD_gpu_shader_half_float */ 753*61046927SAndroid Build Coastguard Workerfloat16_t TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_float16_t); 754*61046927SAndroid Build Coastguard Workerf16vec2 TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16vec2); 755*61046927SAndroid Build Coastguard Workerf16vec3 TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16vec3); 756*61046927SAndroid Build Coastguard Workerf16vec4 TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16vec4); 757*61046927SAndroid Build Coastguard Workerf16mat2 TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat2); 758*61046927SAndroid Build Coastguard Workerf16mat3 TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat3); 759*61046927SAndroid Build Coastguard Workerf16mat4 TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat4); 760*61046927SAndroid Build Coastguard Workerf16mat2x2 TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat2); 761*61046927SAndroid Build Coastguard Workerf16mat2x3 TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat2x3); 762*61046927SAndroid Build Coastguard Workerf16mat2x4 TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat2x4); 763*61046927SAndroid Build Coastguard Workerf16mat3x2 TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat3x2); 764*61046927SAndroid Build Coastguard Workerf16mat3x3 TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat3); 765*61046927SAndroid Build Coastguard Workerf16mat3x4 TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat3x4); 766*61046927SAndroid Build Coastguard Workerf16mat4x2 TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat4x2); 767*61046927SAndroid Build Coastguard Workerf16mat4x3 TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat4x3); 768*61046927SAndroid Build Coastguard Workerf16mat4x4 TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat4); 769*61046927SAndroid Build Coastguard Worker 770*61046927SAndroid Build Coastguard Worker[_a-zA-Z][_a-zA-Z0-9]* { 771*61046927SAndroid Build Coastguard Worker struct _mesa_glsl_parse_state *state = yyextra; 772*61046927SAndroid Build Coastguard Worker if (state->es_shader && yyleng > 1024) { 773*61046927SAndroid Build Coastguard Worker _mesa_glsl_error(yylloc, state, 774*61046927SAndroid Build Coastguard Worker "Identifier `%s' exceeds 1024 characters", 775*61046927SAndroid Build Coastguard Worker yytext); 776*61046927SAndroid Build Coastguard Worker } 777*61046927SAndroid Build Coastguard Worker return classify_identifier(state, yytext, yyleng, yylval); 778*61046927SAndroid Build Coastguard Worker } 779*61046927SAndroid Build Coastguard Worker 780*61046927SAndroid Build Coastguard Worker\. { struct _mesa_glsl_parse_state *state = yyextra; 781*61046927SAndroid Build Coastguard Worker state->is_field = true; 782*61046927SAndroid Build Coastguard Worker return DOT_TOK; } 783*61046927SAndroid Build Coastguard Worker 784*61046927SAndroid Build Coastguard Worker. { return yytext[0]; } 785*61046927SAndroid Build Coastguard Worker 786*61046927SAndroid Build Coastguard Worker%% 787*61046927SAndroid Build Coastguard Worker 788*61046927SAndroid Build Coastguard Workerint 789*61046927SAndroid Build Coastguard Workerclassify_identifier(struct _mesa_glsl_parse_state *state, const char *name, 790*61046927SAndroid Build Coastguard Worker unsigned name_len, YYSTYPE *output) 791*61046927SAndroid Build Coastguard Worker{ 792*61046927SAndroid Build Coastguard Worker /* We're not doing linear_strdup here, to avoid an implicit call on 793*61046927SAndroid Build Coastguard Worker * strlen() for the length of the string, as this is already found by flex 794*61046927SAndroid Build Coastguard Worker * and stored in yyleng 795*61046927SAndroid Build Coastguard Worker */ 796*61046927SAndroid Build Coastguard Worker char *id = (char *) linear_alloc_child(state->linalloc, name_len + 1); 797*61046927SAndroid Build Coastguard Worker memcpy(id, name, name_len + 1); 798*61046927SAndroid Build Coastguard Worker output->identifier = id; 799*61046927SAndroid Build Coastguard Worker 800*61046927SAndroid Build Coastguard Worker if (state->is_field) { 801*61046927SAndroid Build Coastguard Worker state->is_field = false; 802*61046927SAndroid Build Coastguard Worker return FIELD_SELECTION; 803*61046927SAndroid Build Coastguard Worker } 804*61046927SAndroid Build Coastguard Worker if (state->symbols->get_variable(name) || state->symbols->get_function(name)) 805*61046927SAndroid Build Coastguard Worker return IDENTIFIER; 806*61046927SAndroid Build Coastguard Worker else if (state->symbols->get_type(name)) 807*61046927SAndroid Build Coastguard Worker return TYPE_IDENTIFIER; 808*61046927SAndroid Build Coastguard Worker else 809*61046927SAndroid Build Coastguard Worker return NEW_IDENTIFIER; 810*61046927SAndroid Build Coastguard Worker} 811*61046927SAndroid Build Coastguard Worker 812*61046927SAndroid Build Coastguard Workervoid 813*61046927SAndroid Build Coastguard Worker_mesa_glsl_lexer_ctor(struct _mesa_glsl_parse_state *state, const char *string) 814*61046927SAndroid Build Coastguard Worker{ 815*61046927SAndroid Build Coastguard Worker yylex_init_extra(state, & state->scanner); 816*61046927SAndroid Build Coastguard Worker yy_scan_string(string, state->scanner); 817*61046927SAndroid Build Coastguard Worker} 818*61046927SAndroid Build Coastguard Worker 819*61046927SAndroid Build Coastguard Workervoid 820*61046927SAndroid Build Coastguard Worker_mesa_glsl_lexer_dtor(struct _mesa_glsl_parse_state *state) 821*61046927SAndroid Build Coastguard Worker{ 822*61046927SAndroid Build Coastguard Worker yylex_destroy(state->scanner); 823*61046927SAndroid Build Coastguard Worker} 824