1*8975f5c5SAndroid Build Coastguard Worker /*
2*8975f5c5SAndroid Build Coastguard Worker //
3*8975f5c5SAndroid Build Coastguard Worker // Copyright 2002 The ANGLE Project Authors. All rights reserved.
4*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
5*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
6*8975f5c5SAndroid Build Coastguard Worker //
7*8975f5c5SAndroid Build Coastguard Worker
8*8975f5c5SAndroid Build Coastguard Worker This file contains the Lex specification for GLSL ES.
9*8975f5c5SAndroid Build Coastguard Worker Based on ANSI C grammar, Lex specification:
10*8975f5c5SAndroid Build Coastguard Worker http://www.lysator.liu.se/c/ANSI-C-grammar-l.html
11*8975f5c5SAndroid Build Coastguard Worker
12*8975f5c5SAndroid Build Coastguard Worker IF YOU MODIFY THIS FILE YOU ALSO NEED TO RUN scripts/run_code_generation.py
13*8975f5c5SAndroid Build Coastguard Worker WHICH GENERATES THE GLSL ES LEXER (glslang_lex_autogen.cpp).
14*8975f5c5SAndroid Build Coastguard Worker */
15*8975f5c5SAndroid Build Coastguard Worker
16*8975f5c5SAndroid Build Coastguard Worker %top{
17*8975f5c5SAndroid Build Coastguard Worker // GENERATED FILE - DO NOT EDIT.
18*8975f5c5SAndroid Build Coastguard Worker // Generated by generate_parser.py from glslang.l
19*8975f5c5SAndroid Build Coastguard Worker //
20*8975f5c5SAndroid Build Coastguard Worker // Copyright 2019 The ANGLE Project Authors. All rights reserved.
21*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
22*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
23*8975f5c5SAndroid Build Coastguard Worker //
24*8975f5c5SAndroid Build Coastguard Worker // glslang.l:
25*8975f5c5SAndroid Build Coastguard Worker // Lexer for the OpenGL shading language.
26*8975f5c5SAndroid Build Coastguard Worker
27*8975f5c5SAndroid Build Coastguard Worker // Ignore errors in auto-generated code.
28*8975f5c5SAndroid Build Coastguard Worker #if defined(__GNUC__)
29*8975f5c5SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wswitch-enum"
30*8975f5c5SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wunused-function"
31*8975f5c5SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wunused-variable"
32*8975f5c5SAndroid Build Coastguard Worker #elif defined(_MSC_VER)
33*8975f5c5SAndroid Build Coastguard Worker #pragma warning(disable: 4005)
34*8975f5c5SAndroid Build Coastguard Worker #pragma warning(disable: 4065)
35*8975f5c5SAndroid Build Coastguard Worker #pragma warning(disable: 4189)
36*8975f5c5SAndroid Build Coastguard Worker #pragma warning(disable: 4244)
37*8975f5c5SAndroid Build Coastguard Worker #pragma warning(disable: 4505)
38*8975f5c5SAndroid Build Coastguard Worker #pragma warning(disable: 4701)
39*8975f5c5SAndroid Build Coastguard Worker #pragma warning(disable: 4702)
40*8975f5c5SAndroid Build Coastguard Worker #endif
41*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__)
42*8975f5c5SAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wimplicit-fallthrough"
43*8975f5c5SAndroid Build Coastguard Worker #if defined(__APPLE__)
44*8975f5c5SAndroid Build Coastguard Worker // Older clang versions don't have -Wextra-semi-stmt, and detecting Apple clang versions is
45*8975f5c5SAndroid Build Coastguard Worker // difficult because they use different yet overlapping version numbers vs. regular clang.
46*8975f5c5SAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wunknown-warning-option"
47*8975f5c5SAndroid Build Coastguard Worker #endif
48*8975f5c5SAndroid Build Coastguard Worker // Flex isn't semi-colon clean.
49*8975f5c5SAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wextra-semi-stmt"
50*8975f5c5SAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wunreachable-code"
51*8975f5c5SAndroid Build Coastguard Worker #endif
52*8975f5c5SAndroid Build Coastguard Worker }
53*8975f5c5SAndroid Build Coastguard Worker
54*8975f5c5SAndroid Build Coastguard Worker %{
55*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/glslang.h"
56*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/ParseContext.h"
57*8975f5c5SAndroid Build Coastguard Worker #include "compiler/preprocessor/Token.h"
58*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/util.h"
59*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/length_limits.h"
60*8975f5c5SAndroid Build Coastguard Worker
61*8975f5c5SAndroid Build Coastguard Worker using namespace sh;
62*8975f5c5SAndroid Build Coastguard Worker
63*8975f5c5SAndroid Build Coastguard Worker #include "glslang_tab_autogen.h"
64*8975f5c5SAndroid Build Coastguard Worker
65*8975f5c5SAndroid Build Coastguard Worker /* windows only pragma */
66*8975f5c5SAndroid Build Coastguard Worker #ifdef _MSC_VER
67*8975f5c5SAndroid Build Coastguard Worker #pragma warning(disable : 4102)
68*8975f5c5SAndroid Build Coastguard Worker #endif
69*8975f5c5SAndroid Build Coastguard Worker
70*8975f5c5SAndroid Build Coastguard Worker // Workaround for flex using the register keyword, deprecated in C++11.
71*8975f5c5SAndroid Build Coastguard Worker #ifdef __cplusplus
72*8975f5c5SAndroid Build Coastguard Worker #if __cplusplus > 199711L
73*8975f5c5SAndroid Build Coastguard Worker #define register
74*8975f5c5SAndroid Build Coastguard Worker #endif
75*8975f5c5SAndroid Build Coastguard Worker #endif
76*8975f5c5SAndroid Build Coastguard Worker
77*8975f5c5SAndroid Build Coastguard Worker #define YY_NO_INPUT
78*8975f5c5SAndroid Build Coastguard Worker #define YY_USER_ACTION \
79*8975f5c5SAndroid Build Coastguard Worker yylloc->first_file = yylloc->last_file = yycolumn; \
80*8975f5c5SAndroid Build Coastguard Worker yylloc->first_line = yylloc->last_line = yylineno;
81*8975f5c5SAndroid Build Coastguard Worker
82*8975f5c5SAndroid Build Coastguard Worker #define YY_INPUT(buf, result, max_size) \
83*8975f5c5SAndroid Build Coastguard Worker result = string_input(buf, max_size, yyscanner);
84*8975f5c5SAndroid Build Coastguard Worker
85*8975f5c5SAndroid Build Coastguard Worker static yy_size_t string_input(char* buf, yy_size_t max_size, yyscan_t yyscanner);
86*8975f5c5SAndroid Build Coastguard Worker static int check_type(yyscan_t yyscanner);
87*8975f5c5SAndroid Build Coastguard Worker static int reserved_word(yyscan_t yyscanner);
88*8975f5c5SAndroid Build Coastguard Worker // Tests if an extension is enabled. If the extension is promoted to core, this function returns true.
89*8975f5c5SAndroid Build Coastguard Worker static bool is_extension_enabled_or_is_core(TParseContext *context,
90*8975f5c5SAndroid Build Coastguard Worker int extension_version, TExtension extension, int promotion_version);
91*8975f5c5SAndroid Build Coastguard Worker // Helpers to determine if a symbol is reserved, keyword in extension or core, or identifier.
92*8975f5c5SAndroid Build Coastguard Worker // Formatted as:
93*8975f5c5SAndroid Build Coastguard Worker //
94*8975f5c5SAndroid Build Coastguard Worker // [V1_reserved_][V2_extension_][V3_keyword]
95*8975f5c5SAndroid Build Coastguard Worker //
96*8975f5c5SAndroid Build Coastguard Worker // which means in version V1, the symbol is reserved, and remains reserved until V3. From versions
97*8975f5c5SAndroid Build Coastguard Worker // V2 until V3, it's a keyword if the extension is enabled. From version V3 on, it's a keyword in
98*8975f5c5SAndroid Build Coastguard Worker // the spec itself. Prior to V1, the symbol can be used as identifier.
99*8975f5c5SAndroid Build Coastguard Worker static int ES2_extensions_ES3_keyword(TParseContext *context, TExtension extension1, TExtension extension2, TExtension extension3, int token);
100*8975f5c5SAndroid Build Coastguard Worker static int ES2_reserved_ES3_keyword(TParseContext *context, int token);
101*8975f5c5SAndroid Build Coastguard Worker static int ES2_keyword_ES3_reserved(TParseContext *context, int token);
102*8975f5c5SAndroid Build Coastguard Worker static int ES3_keyword(TParseContext *context, int token);
103*8975f5c5SAndroid Build Coastguard Worker static int ES3_reserved_ES3_1_keyword(TParseContext *context, int token);
104*8975f5c5SAndroid Build Coastguard Worker static int ES2_reserved_ES3_1_keyword(TParseContext *context, int token);
105*8975f5c5SAndroid Build Coastguard Worker static int ES3_1_keyword(TParseContext *context, int token);
106*8975f5c5SAndroid Build Coastguard Worker static int ES2_reserved_ES2_extension_ES3_keyword(TParseContext *context, TExtension extension, int token);
107*8975f5c5SAndroid Build Coastguard Worker static int ES3_extension(TParseContext *context, TExtension extension, int token);
108*8975f5c5SAndroid Build Coastguard Worker static int ES3_reserved_ES3_1_extension_ES3_2_keyword(TParseContext *context, TExtension extension, int token);
109*8975f5c5SAndroid Build Coastguard Worker static int ES3_reserved_ES3_1_extension_ES3_2_keyword_2(TParseContext *context, TExtension extension1, TExtension extension2, int token);
110*8975f5c5SAndroid Build Coastguard Worker static int ES3_reserved_ES3_extension(TParseContext *context, TExtension extension, int token);
111*8975f5c5SAndroid Build Coastguard Worker static int ES3_reserved_ES3_extension_ES3_1_keyword(TParseContext *context, TExtension extension, int token);
112*8975f5c5SAndroid Build Coastguard Worker static int ES3_reserved_ES3_extension_ES3_2_keyword(TParseContext *context, TExtension extension, int token);
113*8975f5c5SAndroid Build Coastguard Worker static int ES3_1_reserved_ES3_1_extension_ES3_2_keyword_2(TParseContext *context, TExtension extension1, TExtension extension2, int token1, int token2);
114*8975f5c5SAndroid Build Coastguard Worker static int ES3_and_3_1_reserved_ES3_1_extension_ES3_2_keyword_2(TParseContext *context, TExtension extension1, TExtension extension2, int token1, int token2);
115*8975f5c5SAndroid Build Coastguard Worker static int WEBGL_video_texture_extension(TParseContext *context, int token);
116*8975f5c5SAndroid Build Coastguard Worker static int uint_constant(TParseContext *context);
117*8975f5c5SAndroid Build Coastguard Worker static int int_constant(TParseContext *context);
118*8975f5c5SAndroid Build Coastguard Worker static int float_constant(yyscan_t yyscanner);
119*8975f5c5SAndroid Build Coastguard Worker static int floatsuffix_check(TParseContext* context);
120*8975f5c5SAndroid Build Coastguard Worker static int yuvcscstandardext_constant(TParseContext *context);
121*8975f5c5SAndroid Build Coastguard Worker %}
122*8975f5c5SAndroid Build Coastguard Worker
123*8975f5c5SAndroid Build Coastguard Worker %option noyywrap nounput never-interactive
124*8975f5c5SAndroid Build Coastguard Worker %option yylineno reentrant bison-bridge bison-locations
125*8975f5c5SAndroid Build Coastguard Worker %option extra-type="TParseContext*"
126*8975f5c5SAndroid Build Coastguard Worker %x FIELDS
127*8975f5c5SAndroid Build Coastguard Worker
128*8975f5c5SAndroid Build Coastguard Worker D [0-9]
129*8975f5c5SAndroid Build Coastguard Worker L [a-zA-Z_]
130*8975f5c5SAndroid Build Coastguard Worker H [a-fA-F0-9]
131*8975f5c5SAndroid Build Coastguard Worker E [Ee][+-]?{D}+
132*8975f5c5SAndroid Build Coastguard Worker O [0-7]
133*8975f5c5SAndroid Build Coastguard Worker
134*8975f5c5SAndroid Build Coastguard Worker %%
135*8975f5c5SAndroid Build Coastguard Worker
136*8975f5c5SAndroid Build Coastguard Worker %{
137*8975f5c5SAndroid Build Coastguard Worker TParseContext* context = yyextra;
138*8975f5c5SAndroid Build Coastguard Worker %}
139*8975f5c5SAndroid Build Coastguard Worker
140*8975f5c5SAndroid Build Coastguard Worker "invariant" { return INVARIANT; }
141*8975f5c5SAndroid Build Coastguard Worker "highp" { return HIGH_PRECISION; }
142*8975f5c5SAndroid Build Coastguard Worker "mediump" { return MEDIUM_PRECISION; }
143*8975f5c5SAndroid Build Coastguard Worker "lowp" { return LOW_PRECISION; }
144*8975f5c5SAndroid Build Coastguard Worker "precision" { return PRECISION; }
145*8975f5c5SAndroid Build Coastguard Worker
146*8975f5c5SAndroid Build Coastguard Worker "attribute" { return ES2_keyword_ES3_reserved(context, ATTRIBUTE); }
147*8975f5c5SAndroid Build Coastguard Worker "const" { return CONST_QUAL; }
148*8975f5c5SAndroid Build Coastguard Worker "uniform" { return UNIFORM; }
149*8975f5c5SAndroid Build Coastguard Worker "buffer" { return ES3_1_keyword(context, BUFFER); }
150*8975f5c5SAndroid Build Coastguard Worker "varying" { return ES2_keyword_ES3_reserved(context, VARYING); }
151*8975f5c5SAndroid Build Coastguard Worker
152*8975f5c5SAndroid Build Coastguard Worker "break" { return BREAK; }
153*8975f5c5SAndroid Build Coastguard Worker "continue" { return CONTINUE; }
154*8975f5c5SAndroid Build Coastguard Worker "do" { return DO; }
155*8975f5c5SAndroid Build Coastguard Worker "for" { return FOR; }
156*8975f5c5SAndroid Build Coastguard Worker "while" { return WHILE; }
157*8975f5c5SAndroid Build Coastguard Worker
158*8975f5c5SAndroid Build Coastguard Worker "if" { return IF; }
159*8975f5c5SAndroid Build Coastguard Worker "else" { return ELSE; }
160*8975f5c5SAndroid Build Coastguard Worker "switch" { return ES2_reserved_ES3_keyword(context, SWITCH); }
161*8975f5c5SAndroid Build Coastguard Worker "case" { return ES3_keyword(context, CASE); }
162*8975f5c5SAndroid Build Coastguard Worker "default" { return ES2_reserved_ES3_keyword(context, DEFAULT); }
163*8975f5c5SAndroid Build Coastguard Worker
164*8975f5c5SAndroid Build Coastguard Worker "centroid" { return ES3_keyword(context, CENTROID); }
165*8975f5c5SAndroid Build Coastguard Worker "flat" { return ES2_reserved_ES3_keyword(context, FLAT); }
166*8975f5c5SAndroid Build Coastguard Worker "smooth" { return ES3_keyword(context, SMOOTH); }
167*8975f5c5SAndroid Build Coastguard Worker "noperspective" { return ES3_reserved_ES3_extension(context, TExtension::NV_shader_noperspective_interpolation, NOPERSPECTIVE); }
168*8975f5c5SAndroid Build Coastguard Worker
169*8975f5c5SAndroid Build Coastguard Worker "patch" { return ES3_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::EXT_tessellation_shader, TExtension::OES_tessellation_shader, PATCH); }
170*8975f5c5SAndroid Build Coastguard Worker
171*8975f5c5SAndroid Build Coastguard Worker "in" { return IN_QUAL; }
172*8975f5c5SAndroid Build Coastguard Worker "out" { return OUT_QUAL; }
173*8975f5c5SAndroid Build Coastguard Worker "inout" { return INOUT_QUAL; }
174*8975f5c5SAndroid Build Coastguard Worker "shared" { return ES3_1_keyword(context, SHARED); }
175*8975f5c5SAndroid Build Coastguard Worker
176*8975f5c5SAndroid Build Coastguard Worker "float" { return FLOAT_TYPE; }
177*8975f5c5SAndroid Build Coastguard Worker "int" { return INT_TYPE; }
178*8975f5c5SAndroid Build Coastguard Worker "uint" { return ES3_keyword(context, UINT_TYPE); }
179*8975f5c5SAndroid Build Coastguard Worker "void" { return VOID_TYPE; }
180*8975f5c5SAndroid Build Coastguard Worker "bool" { return BOOL_TYPE; }
181*8975f5c5SAndroid Build Coastguard Worker "true" { yylval->lex.b = true; return BOOLCONSTANT; }
182*8975f5c5SAndroid Build Coastguard Worker "false" { yylval->lex.b = false; return BOOLCONSTANT; }
183*8975f5c5SAndroid Build Coastguard Worker
184*8975f5c5SAndroid Build Coastguard Worker "discard" { return DISCARD; }
185*8975f5c5SAndroid Build Coastguard Worker "return" { return RETURN; }
186*8975f5c5SAndroid Build Coastguard Worker
187*8975f5c5SAndroid Build Coastguard Worker "mat2" { return MATRIX2; }
188*8975f5c5SAndroid Build Coastguard Worker "mat3" { return MATRIX3; }
189*8975f5c5SAndroid Build Coastguard Worker "mat4" { return MATRIX4; }
190*8975f5c5SAndroid Build Coastguard Worker
191*8975f5c5SAndroid Build Coastguard Worker "mat2x2" { return ES3_keyword(context, MATRIX2); }
192*8975f5c5SAndroid Build Coastguard Worker "mat3x3" { return ES3_keyword(context, MATRIX3); }
193*8975f5c5SAndroid Build Coastguard Worker "mat4x4" { return ES3_keyword(context, MATRIX4); }
194*8975f5c5SAndroid Build Coastguard Worker
195*8975f5c5SAndroid Build Coastguard Worker "mat2x3" { return ES3_keyword(context, MATRIX2x3); }
196*8975f5c5SAndroid Build Coastguard Worker "mat3x2" { return ES3_keyword(context, MATRIX3x2); }
197*8975f5c5SAndroid Build Coastguard Worker "mat2x4" { return ES3_keyword(context, MATRIX2x4); }
198*8975f5c5SAndroid Build Coastguard Worker "mat4x2" { return ES3_keyword(context, MATRIX4x2); }
199*8975f5c5SAndroid Build Coastguard Worker "mat3x4" { return ES3_keyword(context, MATRIX3x4); }
200*8975f5c5SAndroid Build Coastguard Worker "mat4x3" { return ES3_keyword(context, MATRIX4x3); }
201*8975f5c5SAndroid Build Coastguard Worker
202*8975f5c5SAndroid Build Coastguard Worker "vec2" { return VEC2; }
203*8975f5c5SAndroid Build Coastguard Worker "vec3" { return VEC3; }
204*8975f5c5SAndroid Build Coastguard Worker "vec4" { return VEC4; }
205*8975f5c5SAndroid Build Coastguard Worker "ivec2" { return IVEC2; }
206*8975f5c5SAndroid Build Coastguard Worker "ivec3" { return IVEC3; }
207*8975f5c5SAndroid Build Coastguard Worker "ivec4" { return IVEC4; }
208*8975f5c5SAndroid Build Coastguard Worker "bvec2" { return BVEC2; }
209*8975f5c5SAndroid Build Coastguard Worker "bvec3" { return BVEC3; }
210*8975f5c5SAndroid Build Coastguard Worker "bvec4" { return BVEC4; }
211*8975f5c5SAndroid Build Coastguard Worker "uvec2" { return ES3_keyword(context, UVEC2); }
212*8975f5c5SAndroid Build Coastguard Worker "uvec3" { return ES3_keyword(context, UVEC3); }
213*8975f5c5SAndroid Build Coastguard Worker "uvec4" { return ES3_keyword(context, UVEC4); }
214*8975f5c5SAndroid Build Coastguard Worker
215*8975f5c5SAndroid Build Coastguard Worker "sampler2D" { return SAMPLER2D; }
216*8975f5c5SAndroid Build Coastguard Worker "samplerCube" { return SAMPLERCUBE; }
217*8975f5c5SAndroid Build Coastguard Worker "samplerExternalOES" { return SAMPLER_EXTERNAL_OES; }
218*8975f5c5SAndroid Build Coastguard Worker "sampler3D" { return ES2_reserved_ES2_extension_ES3_keyword(context, TExtension::OES_texture_3D, SAMPLER3D); }
219*8975f5c5SAndroid Build Coastguard Worker "sampler3DRect" { return ES2_reserved_ES3_keyword(context, SAMPLER3DRECT); }
220*8975f5c5SAndroid Build Coastguard Worker "sampler2DRect" { return SAMPLER2DRECT; }
221*8975f5c5SAndroid Build Coastguard Worker "sampler2DArray" { return ES3_keyword(context, SAMPLER2DARRAY); }
222*8975f5c5SAndroid Build Coastguard Worker "sampler2DMS" { return ES3_reserved_ES3_extension_ES3_1_keyword(context, TExtension::ANGLE_texture_multisample, SAMPLER2DMS); }
223*8975f5c5SAndroid Build Coastguard Worker "isampler2D" { return ES3_keyword(context, ISAMPLER2D); }
224*8975f5c5SAndroid Build Coastguard Worker "isampler3D" { return ES3_keyword(context, ISAMPLER3D); }
225*8975f5c5SAndroid Build Coastguard Worker "isamplerCube" { return ES3_keyword(context, ISAMPLERCUBE); }
226*8975f5c5SAndroid Build Coastguard Worker "isampler2DArray" { return ES3_keyword(context, ISAMPLER2DARRAY); }
227*8975f5c5SAndroid Build Coastguard Worker "isampler2DMS" { return ES3_reserved_ES3_extension_ES3_1_keyword(context, TExtension::ANGLE_texture_multisample, ISAMPLER2DMS); }
228*8975f5c5SAndroid Build Coastguard Worker "usampler2D" { return ES3_keyword(context, USAMPLER2D); }
229*8975f5c5SAndroid Build Coastguard Worker "usampler3D" { return ES3_keyword(context, USAMPLER3D); }
230*8975f5c5SAndroid Build Coastguard Worker "usamplerCube" { return ES3_keyword(context, USAMPLERCUBE); }
231*8975f5c5SAndroid Build Coastguard Worker "usampler2DArray" { return ES3_keyword(context, USAMPLER2DARRAY); }
232*8975f5c5SAndroid Build Coastguard Worker "usampler2DMS" { return ES3_reserved_ES3_extension_ES3_1_keyword(context, TExtension::ANGLE_texture_multisample, USAMPLER2DMS); }
233*8975f5c5SAndroid Build Coastguard Worker "sampler2DShadow" { return ES2_reserved_ES2_extension_ES3_keyword(context, TExtension::EXT_shadow_samplers, SAMPLER2DSHADOW); }
234*8975f5c5SAndroid Build Coastguard Worker "samplerCubeShadow" { return ES3_keyword(context, SAMPLERCUBESHADOW); }
235*8975f5c5SAndroid Build Coastguard Worker "sampler2DArrayShadow" { return ES3_keyword(context, SAMPLER2DARRAYSHADOW); }
236*8975f5c5SAndroid Build Coastguard Worker "__samplerExternal2DY2YEXT" { return ES3_extension(context, TExtension::EXT_YUV_target, SAMPLEREXTERNAL2DY2YEXT); }
237*8975f5c5SAndroid Build Coastguard Worker "sampler2DMSArray" { return ES3_reserved_ES3_1_extension_ES3_2_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, SAMPLER2DMSARRAY); }
238*8975f5c5SAndroid Build Coastguard Worker "isampler2DMSArray" { return ES3_reserved_ES3_1_extension_ES3_2_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, ISAMPLER2DMSARRAY); }
239*8975f5c5SAndroid Build Coastguard Worker "usampler2DMSArray" { return ES3_reserved_ES3_1_extension_ES3_2_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, USAMPLER2DMSARRAY); }
240*8975f5c5SAndroid Build Coastguard Worker "samplerCubeArray" { return ES3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array, SAMPLERCUBEARRAYOES, SAMPLERCUBEARRAYEXT); }
241*8975f5c5SAndroid Build Coastguard Worker "samplerBuffer" { return ES3_and_3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_buffer, TExtension::EXT_texture_buffer, SAMPLERBUFFER, SAMPLERBUFFER); }
242*8975f5c5SAndroid Build Coastguard Worker "samplerCubeArrayShadow" { return ES3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array, SAMPLERCUBEARRAYSHADOWOES, SAMPLERCUBEARRAYSHADOWEXT); }
243*8975f5c5SAndroid Build Coastguard Worker "isamplerCubeArray" { return ES3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array, ISAMPLERCUBEARRAYOES, ISAMPLERCUBEARRAYEXT); }
244*8975f5c5SAndroid Build Coastguard Worker "isamplerBuffer" { return ES3_and_3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_buffer, TExtension::EXT_texture_buffer, ISAMPLERBUFFER, ISAMPLERBUFFER); }
245*8975f5c5SAndroid Build Coastguard Worker "usamplerCubeArray" { return ES3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array, USAMPLERCUBEARRAYOES, USAMPLERCUBEARRAYEXT); }
246*8975f5c5SAndroid Build Coastguard Worker "usamplerBuffer" { return ES3_and_3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_buffer, TExtension::EXT_texture_buffer, USAMPLERBUFFER, USAMPLERBUFFER); }
247*8975f5c5SAndroid Build Coastguard Worker "samplerVideoWEBGL" { return WEBGL_video_texture_extension(context, SAMPLERVIDEOWEBGL); }
248*8975f5c5SAndroid Build Coastguard Worker "struct" { return STRUCT; }
249*8975f5c5SAndroid Build Coastguard Worker
250*8975f5c5SAndroid Build Coastguard Worker "layout" { return ES2_extensions_ES3_keyword(context, TExtension::EXT_shader_framebuffer_fetch, TExtension::EXT_shader_framebuffer_fetch_non_coherent, TExtension::KHR_blend_equation_advanced, LAYOUT); }
251*8975f5c5SAndroid Build Coastguard Worker
252*8975f5c5SAndroid Build Coastguard Worker "yuvCscStandardEXT" { return ES3_extension(context, TExtension::EXT_YUV_target, YUVCSCSTANDARDEXT); }
253*8975f5c5SAndroid Build Coastguard Worker "itu_601" { return yuvcscstandardext_constant(context); }
254*8975f5c5SAndroid Build Coastguard Worker "itu_601_full_range" { return yuvcscstandardext_constant(context); }
255*8975f5c5SAndroid Build Coastguard Worker "itu_709" { return yuvcscstandardext_constant(context); }
256*8975f5c5SAndroid Build Coastguard Worker
257*8975f5c5SAndroid Build Coastguard Worker "image2D" { return ES3_reserved_ES3_1_keyword(context, IMAGE2D); }
258*8975f5c5SAndroid Build Coastguard Worker "iimage2D" { return ES3_reserved_ES3_1_keyword(context, IIMAGE2D); }
259*8975f5c5SAndroid Build Coastguard Worker "uimage2D" { return ES3_reserved_ES3_1_keyword(context, UIMAGE2D); }
260*8975f5c5SAndroid Build Coastguard Worker "image2DArray" { return ES3_reserved_ES3_1_keyword(context, IMAGE2DARRAY); }
261*8975f5c5SAndroid Build Coastguard Worker "iimage2DArray" { return ES3_reserved_ES3_1_keyword(context, IIMAGE2DARRAY); }
262*8975f5c5SAndroid Build Coastguard Worker "uimage2DArray" { return ES3_reserved_ES3_1_keyword(context, UIMAGE2DARRAY); }
263*8975f5c5SAndroid Build Coastguard Worker "image3D" { return ES3_reserved_ES3_1_keyword(context, IMAGE3D); }
264*8975f5c5SAndroid Build Coastguard Worker "uimage3D" { return ES3_reserved_ES3_1_keyword(context, UIMAGE3D); }
265*8975f5c5SAndroid Build Coastguard Worker "iimage3D" { return ES3_reserved_ES3_1_keyword(context, IIMAGE3D); }
266*8975f5c5SAndroid Build Coastguard Worker "iimageCube" { return ES3_reserved_ES3_1_keyword(context, IIMAGECUBE); }
267*8975f5c5SAndroid Build Coastguard Worker "uimageCube" { return ES3_reserved_ES3_1_keyword(context, UIMAGECUBE); }
268*8975f5c5SAndroid Build Coastguard Worker "imageCube" { return ES3_reserved_ES3_1_keyword(context, IMAGECUBE); }
269*8975f5c5SAndroid Build Coastguard Worker "imageCubeArray" { return ES3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array, IMAGECUBEARRAYOES, IMAGECUBEARRAYEXT); }
270*8975f5c5SAndroid Build Coastguard Worker "iimageCubeArray" { return ES3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array, IIMAGECUBEARRAYOES, IIMAGECUBEARRAYEXT); }
271*8975f5c5SAndroid Build Coastguard Worker "uimageCubeArray" { return ES3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array, UIMAGECUBEARRAYOES, UIMAGECUBEARRAYEXT); }
272*8975f5c5SAndroid Build Coastguard Worker "imageBuffer" { return ES3_and_3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_buffer, TExtension::EXT_texture_buffer, IMAGEBUFFER, IMAGEBUFFER); }
273*8975f5c5SAndroid Build Coastguard Worker "iimageBuffer" { return ES3_and_3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_buffer, TExtension::EXT_texture_buffer, IIMAGEBUFFER, IIMAGEBUFFER); }
274*8975f5c5SAndroid Build Coastguard Worker "uimageBuffer" { return ES3_and_3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_buffer, TExtension::EXT_texture_buffer, UIMAGEBUFFER, UIMAGEBUFFER); }
275*8975f5c5SAndroid Build Coastguard Worker "readonly" { return ES3_reserved_ES3_1_keyword(context, READONLY); }
276*8975f5c5SAndroid Build Coastguard Worker "writeonly" { return ES3_reserved_ES3_1_keyword(context, WRITEONLY); }
277*8975f5c5SAndroid Build Coastguard Worker "coherent" { return ES3_reserved_ES3_1_keyword(context, COHERENT); }
278*8975f5c5SAndroid Build Coastguard Worker "restrict" { return ES3_reserved_ES3_1_keyword(context, RESTRICT); }
279*8975f5c5SAndroid Build Coastguard Worker "volatile" { return ES2_reserved_ES3_1_keyword(context, VOLATILE); }
280*8975f5c5SAndroid Build Coastguard Worker "atomic_uint" { return ES3_reserved_ES3_1_keyword(context, ATOMICUINT); }
281*8975f5c5SAndroid Build Coastguard Worker "sample" { return ES3_reserved_ES3_extension_ES3_2_keyword(context, TExtension::OES_shader_multisample_interpolation, SAMPLE); }
282*8975f5c5SAndroid Build Coastguard Worker "precise" { return ES3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::EXT_gpu_shader5, TExtension::OES_gpu_shader5, PRECISE, PRECISE); }
283*8975f5c5SAndroid Build Coastguard Worker
284*8975f5c5SAndroid Build Coastguard Worker /* ANGLE_shader_pixel_local_storage */
285*8975f5c5SAndroid Build Coastguard Worker "pixelLocalANGLE" { return ES3_extension(context, TExtension::ANGLE_shader_pixel_local_storage, PIXELLOCALANGLE); }
286*8975f5c5SAndroid Build Coastguard Worker "ipixelLocalANGLE" { return ES3_extension(context, TExtension::ANGLE_shader_pixel_local_storage, IPIXELLOCALANGLE); }
287*8975f5c5SAndroid Build Coastguard Worker "upixelLocalANGLE" { return ES3_extension(context, TExtension::ANGLE_shader_pixel_local_storage, UPIXELLOCALANGLE); }
288*8975f5c5SAndroid Build Coastguard Worker
289*8975f5c5SAndroid Build Coastguard Worker /* Reserved keywords for GLSL ES 3.00 that are not reserved for GLSL ES 1.00 */
290*8975f5c5SAndroid Build Coastguard Worker "resource" |
291*8975f5c5SAndroid Build Coastguard Worker "subroutine" |
292*8975f5c5SAndroid Build Coastguard Worker "common" |
293*8975f5c5SAndroid Build Coastguard Worker "partition" |
294*8975f5c5SAndroid Build Coastguard Worker "active" |
295*8975f5c5SAndroid Build Coastguard Worker
296*8975f5c5SAndroid Build Coastguard Worker "filter" |
297*8975f5c5SAndroid Build Coastguard Worker "image1D" |
298*8975f5c5SAndroid Build Coastguard Worker "iimage1D" |
299*8975f5c5SAndroid Build Coastguard Worker "uimage1D" |
300*8975f5c5SAndroid Build Coastguard Worker "image1DArray" |
301*8975f5c5SAndroid Build Coastguard Worker "iimage1DArray" |
302*8975f5c5SAndroid Build Coastguard Worker "uimage1DArray" |
303*8975f5c5SAndroid Build Coastguard Worker
304*8975f5c5SAndroid Build Coastguard Worker "sampler1DArray" |
305*8975f5c5SAndroid Build Coastguard Worker "sampler1DArrayShadow" |
306*8975f5c5SAndroid Build Coastguard Worker "isampler1D" |
307*8975f5c5SAndroid Build Coastguard Worker "isampler1DArray" |
308*8975f5c5SAndroid Build Coastguard Worker "usampler1D" |
309*8975f5c5SAndroid Build Coastguard Worker "usampler1DArray" |
310*8975f5c5SAndroid Build Coastguard Worker "isampler2DRect" |
311*8975f5c5SAndroid Build Coastguard Worker "usampler2DRect" {
312*8975f5c5SAndroid Build Coastguard Worker if (context->getShaderVersion() < 300) {
313*8975f5c5SAndroid Build Coastguard Worker yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
314*8975f5c5SAndroid Build Coastguard Worker return check_type(yyscanner);
315*8975f5c5SAndroid Build Coastguard Worker }
316*8975f5c5SAndroid Build Coastguard Worker return reserved_word(yyscanner);
317*8975f5c5SAndroid Build Coastguard Worker }
318*8975f5c5SAndroid Build Coastguard Worker
319*8975f5c5SAndroid Build Coastguard Worker /* Reserved keywords in GLSL ES 1.00 that are not reserved in GLSL ES 3.00 */
320*8975f5c5SAndroid Build Coastguard Worker "packed" {
321*8975f5c5SAndroid Build Coastguard Worker if (context->getShaderVersion() >= 300)
322*8975f5c5SAndroid Build Coastguard Worker {
323*8975f5c5SAndroid Build Coastguard Worker yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
324*8975f5c5SAndroid Build Coastguard Worker return check_type(yyscanner);
325*8975f5c5SAndroid Build Coastguard Worker }
326*8975f5c5SAndroid Build Coastguard Worker
327*8975f5c5SAndroid Build Coastguard Worker return reserved_word(yyscanner);
328*8975f5c5SAndroid Build Coastguard Worker }
329*8975f5c5SAndroid Build Coastguard Worker
330*8975f5c5SAndroid Build Coastguard Worker /* Reserved keywords in WebGL that not reserved in GL */
331*8975f5c5SAndroid Build Coastguard Worker "image1DShadow" |
332*8975f5c5SAndroid Build Coastguard Worker "image2DShadow" |
333*8975f5c5SAndroid Build Coastguard Worker "image1DArrayShadow" |
334*8975f5c5SAndroid Build Coastguard Worker "image2DArrayShadow" {
335*8975f5c5SAndroid Build Coastguard Worker if(!IsWebGLBasedSpec(context->getShaderSpec()))
336*8975f5c5SAndroid Build Coastguard Worker {
337*8975f5c5SAndroid Build Coastguard Worker yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
338*8975f5c5SAndroid Build Coastguard Worker return check_type(yyscanner);
339*8975f5c5SAndroid Build Coastguard Worker }
340*8975f5c5SAndroid Build Coastguard Worker
341*8975f5c5SAndroid Build Coastguard Worker return reserved_word(yyscanner);
342*8975f5c5SAndroid Build Coastguard Worker }
343*8975f5c5SAndroid Build Coastguard Worker
344*8975f5c5SAndroid Build Coastguard Worker /* Reserved keywords */
345*8975f5c5SAndroid Build Coastguard Worker "asm" |
346*8975f5c5SAndroid Build Coastguard Worker
347*8975f5c5SAndroid Build Coastguard Worker "class" |
348*8975f5c5SAndroid Build Coastguard Worker "union" |
349*8975f5c5SAndroid Build Coastguard Worker "enum" |
350*8975f5c5SAndroid Build Coastguard Worker "typedef" |
351*8975f5c5SAndroid Build Coastguard Worker "template" |
352*8975f5c5SAndroid Build Coastguard Worker "this" |
353*8975f5c5SAndroid Build Coastguard Worker
354*8975f5c5SAndroid Build Coastguard Worker "goto" |
355*8975f5c5SAndroid Build Coastguard Worker
356*8975f5c5SAndroid Build Coastguard Worker "inline" |
357*8975f5c5SAndroid Build Coastguard Worker "noinline" |
358*8975f5c5SAndroid Build Coastguard Worker "public" |
359*8975f5c5SAndroid Build Coastguard Worker "static" |
360*8975f5c5SAndroid Build Coastguard Worker "extern" |
361*8975f5c5SAndroid Build Coastguard Worker "external" |
362*8975f5c5SAndroid Build Coastguard Worker "interface" |
363*8975f5c5SAndroid Build Coastguard Worker
364*8975f5c5SAndroid Build Coastguard Worker "long" |
365*8975f5c5SAndroid Build Coastguard Worker "short" |
366*8975f5c5SAndroid Build Coastguard Worker "double" |
367*8975f5c5SAndroid Build Coastguard Worker "half" |
368*8975f5c5SAndroid Build Coastguard Worker "fixed" |
369*8975f5c5SAndroid Build Coastguard Worker "unsigned" |
370*8975f5c5SAndroid Build Coastguard Worker "superp" |
371*8975f5c5SAndroid Build Coastguard Worker
372*8975f5c5SAndroid Build Coastguard Worker "input" |
373*8975f5c5SAndroid Build Coastguard Worker "output" |
374*8975f5c5SAndroid Build Coastguard Worker
375*8975f5c5SAndroid Build Coastguard Worker "hvec2" |
376*8975f5c5SAndroid Build Coastguard Worker "hvec3" |
377*8975f5c5SAndroid Build Coastguard Worker "hvec4" |
378*8975f5c5SAndroid Build Coastguard Worker "dvec2" |
379*8975f5c5SAndroid Build Coastguard Worker "dvec3" |
380*8975f5c5SAndroid Build Coastguard Worker "dvec4" |
381*8975f5c5SAndroid Build Coastguard Worker "fvec2" |
382*8975f5c5SAndroid Build Coastguard Worker "fvec3" |
383*8975f5c5SAndroid Build Coastguard Worker "fvec4" |
384*8975f5c5SAndroid Build Coastguard Worker
385*8975f5c5SAndroid Build Coastguard Worker "sampler2DRectShadow" |
386*8975f5c5SAndroid Build Coastguard Worker "sampler1D" |
387*8975f5c5SAndroid Build Coastguard Worker "sampler1DShadow" |
388*8975f5c5SAndroid Build Coastguard Worker
389*8975f5c5SAndroid Build Coastguard Worker "sizeof" |
390*8975f5c5SAndroid Build Coastguard Worker "cast" |
391*8975f5c5SAndroid Build Coastguard Worker
392*8975f5c5SAndroid Build Coastguard Worker "namespace" |
393*8975f5c5SAndroid Build Coastguard Worker "using" { return reserved_word(yyscanner); }
394*8975f5c5SAndroid Build Coastguard Worker
395*8975f5c5SAndroid Build Coastguard Worker {L}({L}|{D})* {
396*8975f5c5SAndroid Build Coastguard Worker yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
397*8975f5c5SAndroid Build Coastguard Worker return check_type(yyscanner);
398*8975f5c5SAndroid Build Coastguard Worker }
399*8975f5c5SAndroid Build Coastguard Worker
400*8975f5c5SAndroid Build Coastguard Worker 0[xX]{H}+ { return int_constant(context); }
401*8975f5c5SAndroid Build Coastguard Worker 0{O}+ { return int_constant(context); }
402*8975f5c5SAndroid Build Coastguard Worker {D}+ { return int_constant(context); }
403*8975f5c5SAndroid Build Coastguard Worker
404*8975f5c5SAndroid Build Coastguard Worker 0[xX]{H}+[uU] { return uint_constant(context); }
405*8975f5c5SAndroid Build Coastguard Worker 0{O}+[uU] { return uint_constant(context); }
406*8975f5c5SAndroid Build Coastguard Worker {D}+[uU] { return uint_constant(context); }
407*8975f5c5SAndroid Build Coastguard Worker
408*8975f5c5SAndroid Build Coastguard Worker {D}+{E} { return float_constant(yyscanner); }
409*8975f5c5SAndroid Build Coastguard Worker {D}+"."{D}*({E})? { return float_constant(yyscanner); }
410*8975f5c5SAndroid Build Coastguard Worker "."{D}+({E})? { return float_constant(yyscanner); }
411*8975f5c5SAndroid Build Coastguard Worker
412*8975f5c5SAndroid Build Coastguard Worker {D}+{E}[fF] { return floatsuffix_check(context); }
413*8975f5c5SAndroid Build Coastguard Worker {D}+"."{D}*({E})?[fF] { return floatsuffix_check(context); }
414*8975f5c5SAndroid Build Coastguard Worker "."{D}+({E})?[fF] { return floatsuffix_check(context); }
415*8975f5c5SAndroid Build Coastguard Worker
416*8975f5c5SAndroid Build Coastguard Worker "+=" { return ADD_ASSIGN; }
417*8975f5c5SAndroid Build Coastguard Worker "-=" { return SUB_ASSIGN; }
418*8975f5c5SAndroid Build Coastguard Worker "*=" { return MUL_ASSIGN; }
419*8975f5c5SAndroid Build Coastguard Worker "/=" { return DIV_ASSIGN; }
420*8975f5c5SAndroid Build Coastguard Worker "%=" { return MOD_ASSIGN; }
421*8975f5c5SAndroid Build Coastguard Worker "<<=" { return LEFT_ASSIGN; }
422*8975f5c5SAndroid Build Coastguard Worker ">>=" { return RIGHT_ASSIGN; }
423*8975f5c5SAndroid Build Coastguard Worker "&=" { return AND_ASSIGN; }
424*8975f5c5SAndroid Build Coastguard Worker "^=" { return XOR_ASSIGN; }
425*8975f5c5SAndroid Build Coastguard Worker "|=" { return OR_ASSIGN; }
426*8975f5c5SAndroid Build Coastguard Worker
427*8975f5c5SAndroid Build Coastguard Worker "++" { return INC_OP; }
428*8975f5c5SAndroid Build Coastguard Worker "--" { return DEC_OP; }
429*8975f5c5SAndroid Build Coastguard Worker "&&" { return AND_OP; }
430*8975f5c5SAndroid Build Coastguard Worker "||" { return OR_OP; }
431*8975f5c5SAndroid Build Coastguard Worker "^^" { return XOR_OP; }
432*8975f5c5SAndroid Build Coastguard Worker "<=" { return LE_OP; }
433*8975f5c5SAndroid Build Coastguard Worker ">=" { return GE_OP; }
434*8975f5c5SAndroid Build Coastguard Worker "==" { return EQ_OP; }
435*8975f5c5SAndroid Build Coastguard Worker "!=" { return NE_OP; }
436*8975f5c5SAndroid Build Coastguard Worker "<<" { return LEFT_OP; }
437*8975f5c5SAndroid Build Coastguard Worker ">>" { return RIGHT_OP; }
438*8975f5c5SAndroid Build Coastguard Worker ";" { return SEMICOLON; }
439*8975f5c5SAndroid Build Coastguard Worker ("{"|"<%") { return LEFT_BRACE; }
440*8975f5c5SAndroid Build Coastguard Worker ("}"|"%>") { return RIGHT_BRACE; }
441*8975f5c5SAndroid Build Coastguard Worker "," { return COMMA; }
442*8975f5c5SAndroid Build Coastguard Worker ":" { return COLON; }
443*8975f5c5SAndroid Build Coastguard Worker "=" { return EQUAL; }
444*8975f5c5SAndroid Build Coastguard Worker "(" { return LEFT_PAREN; }
445*8975f5c5SAndroid Build Coastguard Worker ")" { return RIGHT_PAREN; }
446*8975f5c5SAndroid Build Coastguard Worker ("["|"<:") { return LEFT_BRACKET; }
447*8975f5c5SAndroid Build Coastguard Worker ("]"|":>") { return RIGHT_BRACKET; }
448*8975f5c5SAndroid Build Coastguard Worker "." { BEGIN(FIELDS); return DOT; }
449*8975f5c5SAndroid Build Coastguard Worker "!" { return BANG; }
450*8975f5c5SAndroid Build Coastguard Worker "-" { return DASH; }
451*8975f5c5SAndroid Build Coastguard Worker "~" { return TILDE; }
452*8975f5c5SAndroid Build Coastguard Worker "+" { return PLUS; }
453*8975f5c5SAndroid Build Coastguard Worker "*" { return STAR; }
454*8975f5c5SAndroid Build Coastguard Worker "/" { return SLASH; }
455*8975f5c5SAndroid Build Coastguard Worker "%" { return PERCENT; }
456*8975f5c5SAndroid Build Coastguard Worker "<" { return LEFT_ANGLE; }
457*8975f5c5SAndroid Build Coastguard Worker ">" { return RIGHT_ANGLE; }
458*8975f5c5SAndroid Build Coastguard Worker "|" { return VERTICAL_BAR; }
459*8975f5c5SAndroid Build Coastguard Worker "^" { return CARET; }
460*8975f5c5SAndroid Build Coastguard Worker "&" { return AMPERSAND; }
461*8975f5c5SAndroid Build Coastguard Worker "?" { return QUESTION; }
462*8975f5c5SAndroid Build Coastguard Worker
463*8975f5c5SAndroid Build Coastguard Worker <FIELDS>{L}({L}|{D})* {
464*8975f5c5SAndroid Build Coastguard Worker BEGIN(INITIAL);
465*8975f5c5SAndroid Build Coastguard Worker yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
466*8975f5c5SAndroid Build Coastguard Worker return FIELD_SELECTION;
467*8975f5c5SAndroid Build Coastguard Worker }
468*8975f5c5SAndroid Build Coastguard Worker <FIELDS>[ \t\v\f\r] {}
469*8975f5c5SAndroid Build Coastguard Worker <FIELDS>. {
470*8975f5c5SAndroid Build Coastguard Worker yyextra->error(*yylloc, "Illegal character at fieldname start", yytext);
471*8975f5c5SAndroid Build Coastguard Worker return 0;
472*8975f5c5SAndroid Build Coastguard Worker }
473*8975f5c5SAndroid Build Coastguard Worker
474*8975f5c5SAndroid Build Coastguard Worker [ \t\v\n\f\r] { }
475*8975f5c5SAndroid Build Coastguard Worker <*><<EOF>> { yyterminate(); }
476*8975f5c5SAndroid Build Coastguard Worker <*>. { assert(false); return 0; }
477*8975f5c5SAndroid Build Coastguard Worker
478*8975f5c5SAndroid Build Coastguard Worker %%
479*8975f5c5SAndroid Build Coastguard Worker
480*8975f5c5SAndroid Build Coastguard Worker yy_size_t string_input(char* buf, yy_size_t max_size, yyscan_t yyscanner) {
481*8975f5c5SAndroid Build Coastguard Worker angle::pp::Token token;
482*8975f5c5SAndroid Build Coastguard Worker yyget_extra(yyscanner)->getPreprocessor().lex(&token);
483*8975f5c5SAndroid Build Coastguard Worker yy_size_t len = token.type == angle::pp::Token::LAST ? 0 : token.text.size();
484*8975f5c5SAndroid Build Coastguard Worker if (len < max_size)
485*8975f5c5SAndroid Build Coastguard Worker memcpy(buf, token.text.c_str(), len);
486*8975f5c5SAndroid Build Coastguard Worker yyset_column(token.location.file, yyscanner);
487*8975f5c5SAndroid Build Coastguard Worker yyset_lineno(token.location.line, yyscanner);
488*8975f5c5SAndroid Build Coastguard Worker
489*8975f5c5SAndroid Build Coastguard Worker if (len >= max_size)
490*8975f5c5SAndroid Build Coastguard Worker YY_FATAL_ERROR("Input buffer overflow");
491*8975f5c5SAndroid Build Coastguard Worker else if (len > 0)
492*8975f5c5SAndroid Build Coastguard Worker buf[len++] = ' ';
493*8975f5c5SAndroid Build Coastguard Worker return len;
494*8975f5c5SAndroid Build Coastguard Worker }
495*8975f5c5SAndroid Build Coastguard Worker
check_type(yyscan_t yyscanner)496*8975f5c5SAndroid Build Coastguard Worker int check_type(yyscan_t yyscanner) {
497*8975f5c5SAndroid Build Coastguard Worker struct yyguts_t* yyg = (struct yyguts_t*) yyscanner;
498*8975f5c5SAndroid Build Coastguard Worker
499*8975f5c5SAndroid Build Coastguard Worker int token = IDENTIFIER;
500*8975f5c5SAndroid Build Coastguard Worker // Note that the ImmutableString used here isn't static or pool allocated - but it's fine since yytext is valid for the duration of its use.
501*8975f5c5SAndroid Build Coastguard Worker const TSymbol* symbol = yyextra->symbolTable.find(ImmutableString(yytext, yyleng), yyextra->getShaderVersion());
502*8975f5c5SAndroid Build Coastguard Worker if (symbol && symbol->isStruct())
503*8975f5c5SAndroid Build Coastguard Worker {
504*8975f5c5SAndroid Build Coastguard Worker token = TYPE_NAME;
505*8975f5c5SAndroid Build Coastguard Worker }
506*8975f5c5SAndroid Build Coastguard Worker yylval->lex.symbol = symbol;
507*8975f5c5SAndroid Build Coastguard Worker return token;
508*8975f5c5SAndroid Build Coastguard Worker }
509*8975f5c5SAndroid Build Coastguard Worker
reserved_word(yyscan_t yyscanner)510*8975f5c5SAndroid Build Coastguard Worker int reserved_word(yyscan_t yyscanner) {
511*8975f5c5SAndroid Build Coastguard Worker struct yyguts_t* yyg = (struct yyguts_t*) yyscanner;
512*8975f5c5SAndroid Build Coastguard Worker
513*8975f5c5SAndroid Build Coastguard Worker yyextra->error(*yylloc, "Illegal use of reserved word", yytext);
514*8975f5c5SAndroid Build Coastguard Worker return 0;
515*8975f5c5SAndroid Build Coastguard Worker }
516*8975f5c5SAndroid Build Coastguard Worker
is_extension_enabled_or_is_core(TParseContext * context,int extension_version,TExtension extension,int promotion_version)517*8975f5c5SAndroid Build Coastguard Worker static bool is_extension_enabled_or_is_core(TParseContext *context,
518*8975f5c5SAndroid Build Coastguard Worker int extension_version, TExtension extension, int promotion_version)
519*8975f5c5SAndroid Build Coastguard Worker {
520*8975f5c5SAndroid Build Coastguard Worker int version = context->getShaderVersion();
521*8975f5c5SAndroid Build Coastguard Worker
522*8975f5c5SAndroid Build Coastguard Worker // If version is at least promotion_version, symbol is definitely keyword. Otherwise it's a
523*8975f5c5SAndroid Build Coastguard Worker // keyword if version is at least extension_version (where the extension was introduced) and
524*8975f5c5SAndroid Build Coastguard Worker // the extension is enabled.
525*8975f5c5SAndroid Build Coastguard Worker return version >= promotion_version ||
526*8975f5c5SAndroid Build Coastguard Worker (version >= extension_version && context->isExtensionEnabled(extension));
527*8975f5c5SAndroid Build Coastguard Worker }
528*8975f5c5SAndroid Build Coastguard Worker
ES2_reserved_ES3_keyword(TParseContext * context,int token)529*8975f5c5SAndroid Build Coastguard Worker int ES2_reserved_ES3_keyword(TParseContext *context, int token)
530*8975f5c5SAndroid Build Coastguard Worker {
531*8975f5c5SAndroid Build Coastguard Worker yyscan_t yyscanner = (yyscan_t) context->getScanner();
532*8975f5c5SAndroid Build Coastguard Worker
533*8975f5c5SAndroid Build Coastguard Worker if (context->getShaderVersion() < 300)
534*8975f5c5SAndroid Build Coastguard Worker {
535*8975f5c5SAndroid Build Coastguard Worker return reserved_word(yyscanner);
536*8975f5c5SAndroid Build Coastguard Worker }
537*8975f5c5SAndroid Build Coastguard Worker
538*8975f5c5SAndroid Build Coastguard Worker return token;
539*8975f5c5SAndroid Build Coastguard Worker }
540*8975f5c5SAndroid Build Coastguard Worker
ES2_keyword_ES3_reserved(TParseContext * context,int token)541*8975f5c5SAndroid Build Coastguard Worker int ES2_keyword_ES3_reserved(TParseContext *context, int token)
542*8975f5c5SAndroid Build Coastguard Worker {
543*8975f5c5SAndroid Build Coastguard Worker yyscan_t yyscanner = (yyscan_t) context->getScanner();
544*8975f5c5SAndroid Build Coastguard Worker
545*8975f5c5SAndroid Build Coastguard Worker if (context->getShaderVersion() >= 300)
546*8975f5c5SAndroid Build Coastguard Worker {
547*8975f5c5SAndroid Build Coastguard Worker return reserved_word(yyscanner);
548*8975f5c5SAndroid Build Coastguard Worker }
549*8975f5c5SAndroid Build Coastguard Worker
550*8975f5c5SAndroid Build Coastguard Worker return token;
551*8975f5c5SAndroid Build Coastguard Worker }
552*8975f5c5SAndroid Build Coastguard Worker
ES3_reserved_ES3_1_keyword(TParseContext * context,int token)553*8975f5c5SAndroid Build Coastguard Worker int ES3_reserved_ES3_1_keyword(TParseContext *context, int token)
554*8975f5c5SAndroid Build Coastguard Worker {
555*8975f5c5SAndroid Build Coastguard Worker struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
556*8975f5c5SAndroid Build Coastguard Worker yyscan_t yyscanner = (yyscan_t) context->getScanner();
557*8975f5c5SAndroid Build Coastguard Worker
558*8975f5c5SAndroid Build Coastguard Worker if (context->getShaderVersion() < 300)
559*8975f5c5SAndroid Build Coastguard Worker {
560*8975f5c5SAndroid Build Coastguard Worker yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
561*8975f5c5SAndroid Build Coastguard Worker return check_type(yyscanner);
562*8975f5c5SAndroid Build Coastguard Worker }
563*8975f5c5SAndroid Build Coastguard Worker else if (context->getShaderVersion() == 300)
564*8975f5c5SAndroid Build Coastguard Worker {
565*8975f5c5SAndroid Build Coastguard Worker return reserved_word(yyscanner);
566*8975f5c5SAndroid Build Coastguard Worker }
567*8975f5c5SAndroid Build Coastguard Worker
568*8975f5c5SAndroid Build Coastguard Worker return token;
569*8975f5c5SAndroid Build Coastguard Worker }
570*8975f5c5SAndroid Build Coastguard Worker
ES3_keyword(TParseContext * context,int token)571*8975f5c5SAndroid Build Coastguard Worker int ES3_keyword(TParseContext *context, int token)
572*8975f5c5SAndroid Build Coastguard Worker {
573*8975f5c5SAndroid Build Coastguard Worker struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
574*8975f5c5SAndroid Build Coastguard Worker yyscan_t yyscanner = (yyscan_t) context->getScanner();
575*8975f5c5SAndroid Build Coastguard Worker
576*8975f5c5SAndroid Build Coastguard Worker // not a reserved word in GLSL ES 1.00, so could be used as an identifier/type name
577*8975f5c5SAndroid Build Coastguard Worker if (context->getShaderVersion() < 300)
578*8975f5c5SAndroid Build Coastguard Worker {
579*8975f5c5SAndroid Build Coastguard Worker yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
580*8975f5c5SAndroid Build Coastguard Worker return check_type(yyscanner);
581*8975f5c5SAndroid Build Coastguard Worker }
582*8975f5c5SAndroid Build Coastguard Worker
583*8975f5c5SAndroid Build Coastguard Worker return token;
584*8975f5c5SAndroid Build Coastguard Worker }
585*8975f5c5SAndroid Build Coastguard Worker
ES2_reserved_ES3_1_keyword(TParseContext * context,int token)586*8975f5c5SAndroid Build Coastguard Worker int ES2_reserved_ES3_1_keyword(TParseContext *context, int token)
587*8975f5c5SAndroid Build Coastguard Worker {
588*8975f5c5SAndroid Build Coastguard Worker yyscan_t yyscanner = (yyscan_t) context->getScanner();
589*8975f5c5SAndroid Build Coastguard Worker
590*8975f5c5SAndroid Build Coastguard Worker if (context->getShaderVersion() < 310)
591*8975f5c5SAndroid Build Coastguard Worker {
592*8975f5c5SAndroid Build Coastguard Worker return reserved_word(yyscanner);
593*8975f5c5SAndroid Build Coastguard Worker }
594*8975f5c5SAndroid Build Coastguard Worker
595*8975f5c5SAndroid Build Coastguard Worker return token;
596*8975f5c5SAndroid Build Coastguard Worker }
597*8975f5c5SAndroid Build Coastguard Worker
ES3_1_keyword(TParseContext * context,int token)598*8975f5c5SAndroid Build Coastguard Worker int ES3_1_keyword(TParseContext *context, int token)
599*8975f5c5SAndroid Build Coastguard Worker {
600*8975f5c5SAndroid Build Coastguard Worker struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
601*8975f5c5SAndroid Build Coastguard Worker yyscan_t yyscanner = (yyscan_t) context->getScanner();
602*8975f5c5SAndroid Build Coastguard Worker
603*8975f5c5SAndroid Build Coastguard Worker // A keyword in GLSL ES 3.10.
604*8975f5c5SAndroid Build Coastguard Worker if (context->getShaderVersion() >= 310)
605*8975f5c5SAndroid Build Coastguard Worker {
606*8975f5c5SAndroid Build Coastguard Worker return token;
607*8975f5c5SAndroid Build Coastguard Worker }
608*8975f5c5SAndroid Build Coastguard Worker
609*8975f5c5SAndroid Build Coastguard Worker // Otherwise can be used as an identifier/type name
610*8975f5c5SAndroid Build Coastguard Worker yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
611*8975f5c5SAndroid Build Coastguard Worker return check_type(yyscanner);
612*8975f5c5SAndroid Build Coastguard Worker }
613*8975f5c5SAndroid Build Coastguard Worker
WEBGL_video_texture_extension(TParseContext * context,int token)614*8975f5c5SAndroid Build Coastguard Worker int WEBGL_video_texture_extension(TParseContext *context, int token)
615*8975f5c5SAndroid Build Coastguard Worker {
616*8975f5c5SAndroid Build Coastguard Worker // Available with WEBGL_video_texture_extension
617*8975f5c5SAndroid Build Coastguard Worker if (context->isExtensionEnabled(TExtension::WEBGL_video_texture))
618*8975f5c5SAndroid Build Coastguard Worker {
619*8975f5c5SAndroid Build Coastguard Worker return token;
620*8975f5c5SAndroid Build Coastguard Worker }
621*8975f5c5SAndroid Build Coastguard Worker
622*8975f5c5SAndroid Build Coastguard Worker // Otherwise can be used as an identifier/type name
623*8975f5c5SAndroid Build Coastguard Worker struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
624*8975f5c5SAndroid Build Coastguard Worker yyscan_t yyscanner = (yyscan_t) context->getScanner();
625*8975f5c5SAndroid Build Coastguard Worker
626*8975f5c5SAndroid Build Coastguard Worker yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
627*8975f5c5SAndroid Build Coastguard Worker return check_type(yyscanner);
628*8975f5c5SAndroid Build Coastguard Worker }
629*8975f5c5SAndroid Build Coastguard Worker
ES2_extensions_ES3_keyword(TParseContext * context,TExtension extension1,TExtension extension2,TExtension extension3,int token)630*8975f5c5SAndroid Build Coastguard Worker int ES2_extensions_ES3_keyword(TParseContext *context, TExtension extension1, TExtension extension2, TExtension extension3, int token)
631*8975f5c5SAndroid Build Coastguard Worker {
632*8975f5c5SAndroid Build Coastguard Worker struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
633*8975f5c5SAndroid Build Coastguard Worker yyscan_t yyscanner = (yyscan_t) context->getScanner();
634*8975f5c5SAndroid Build Coastguard Worker
635*8975f5c5SAndroid Build Coastguard Worker // A keyword in GLSL ES 3.00 or GLSL ES 1.00 with enabled extension.
636*8975f5c5SAndroid Build Coastguard Worker if (is_extension_enabled_or_is_core(context, 100, extension1, 300))
637*8975f5c5SAndroid Build Coastguard Worker {
638*8975f5c5SAndroid Build Coastguard Worker return token;
639*8975f5c5SAndroid Build Coastguard Worker }
640*8975f5c5SAndroid Build Coastguard Worker else if (is_extension_enabled_or_is_core(context, 100, extension2, 300))
641*8975f5c5SAndroid Build Coastguard Worker {
642*8975f5c5SAndroid Build Coastguard Worker return token;
643*8975f5c5SAndroid Build Coastguard Worker }
644*8975f5c5SAndroid Build Coastguard Worker else if (is_extension_enabled_or_is_core(context, 100, extension3, 300))
645*8975f5c5SAndroid Build Coastguard Worker {
646*8975f5c5SAndroid Build Coastguard Worker return token;
647*8975f5c5SAndroid Build Coastguard Worker }
648*8975f5c5SAndroid Build Coastguard Worker
649*8975f5c5SAndroid Build Coastguard Worker // not a reserved word in GLSL ES 1.00, so could be used as an identifier/type name
650*8975f5c5SAndroid Build Coastguard Worker yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
651*8975f5c5SAndroid Build Coastguard Worker return check_type(yyscanner);
652*8975f5c5SAndroid Build Coastguard Worker }
653*8975f5c5SAndroid Build Coastguard Worker
ES2_reserved_ES2_extension_ES3_keyword(TParseContext * context,TExtension extension,int token)654*8975f5c5SAndroid Build Coastguard Worker int ES2_reserved_ES2_extension_ES3_keyword(TParseContext *context, TExtension extension, int token)
655*8975f5c5SAndroid Build Coastguard Worker {
656*8975f5c5SAndroid Build Coastguard Worker yyscan_t yyscanner = (yyscan_t) context->getScanner();
657*8975f5c5SAndroid Build Coastguard Worker
658*8975f5c5SAndroid Build Coastguard Worker // A keyword in GLSL ES 3.00 or GLSL ES 1.00 with enabled extension.
659*8975f5c5SAndroid Build Coastguard Worker if (is_extension_enabled_or_is_core(context, 100, extension, 300))
660*8975f5c5SAndroid Build Coastguard Worker {
661*8975f5c5SAndroid Build Coastguard Worker return token;
662*8975f5c5SAndroid Build Coastguard Worker }
663*8975f5c5SAndroid Build Coastguard Worker
664*8975f5c5SAndroid Build Coastguard Worker // Reserved otherwise.
665*8975f5c5SAndroid Build Coastguard Worker return reserved_word(yyscanner);
666*8975f5c5SAndroid Build Coastguard Worker }
667*8975f5c5SAndroid Build Coastguard Worker
ES3_extension(TParseContext * context,TExtension extension,int token)668*8975f5c5SAndroid Build Coastguard Worker int ES3_extension(TParseContext *context, TExtension extension, int token)
669*8975f5c5SAndroid Build Coastguard Worker {
670*8975f5c5SAndroid Build Coastguard Worker struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
671*8975f5c5SAndroid Build Coastguard Worker yyscan_t yyscanner = (yyscan_t) context->getScanner();
672*8975f5c5SAndroid Build Coastguard Worker
673*8975f5c5SAndroid Build Coastguard Worker // a keyword word in GLSL ES 3.00 with enabled extension.
674*8975f5c5SAndroid Build Coastguard Worker if (context->getShaderVersion() >= 300 && context->isExtensionEnabled(extension))
675*8975f5c5SAndroid Build Coastguard Worker {
676*8975f5c5SAndroid Build Coastguard Worker return token;
677*8975f5c5SAndroid Build Coastguard Worker }
678*8975f5c5SAndroid Build Coastguard Worker
679*8975f5c5SAndroid Build Coastguard Worker // Otherwise can be used as an identifier/type name
680*8975f5c5SAndroid Build Coastguard Worker yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
681*8975f5c5SAndroid Build Coastguard Worker return check_type(yyscanner);
682*8975f5c5SAndroid Build Coastguard Worker }
683*8975f5c5SAndroid Build Coastguard Worker
ES3_reserved_ES3_1_extension_ES3_2_keyword(TParseContext * context,TExtension extension,int token)684*8975f5c5SAndroid Build Coastguard Worker int ES3_reserved_ES3_1_extension_ES3_2_keyword(TParseContext *context, TExtension extension, int token)
685*8975f5c5SAndroid Build Coastguard Worker {
686*8975f5c5SAndroid Build Coastguard Worker struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
687*8975f5c5SAndroid Build Coastguard Worker yyscan_t yyscanner = (yyscan_t) context->getScanner();
688*8975f5c5SAndroid Build Coastguard Worker
689*8975f5c5SAndroid Build Coastguard Worker // a keyword in GLSL ES 3.10 with enabled extension
690*8975f5c5SAndroid Build Coastguard Worker if (is_extension_enabled_or_is_core(context, 310, extension, 320))
691*8975f5c5SAndroid Build Coastguard Worker {
692*8975f5c5SAndroid Build Coastguard Worker return token;
693*8975f5c5SAndroid Build Coastguard Worker }
694*8975f5c5SAndroid Build Coastguard Worker // a reserved word in GLSL ES 3.00+
695*8975f5c5SAndroid Build Coastguard Worker if (context->getShaderVersion() >= 300)
696*8975f5c5SAndroid Build Coastguard Worker {
697*8975f5c5SAndroid Build Coastguard Worker return reserved_word(yyscanner);
698*8975f5c5SAndroid Build Coastguard Worker }
699*8975f5c5SAndroid Build Coastguard Worker
700*8975f5c5SAndroid Build Coastguard Worker // Otherwise can be used as an identifier/type name
701*8975f5c5SAndroid Build Coastguard Worker yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
702*8975f5c5SAndroid Build Coastguard Worker return check_type(yyscanner);
703*8975f5c5SAndroid Build Coastguard Worker }
704*8975f5c5SAndroid Build Coastguard Worker
ES3_reserved_ES3_1_extension_ES3_2_keyword_2(TParseContext * context,TExtension extension1,TExtension extension2,int token)705*8975f5c5SAndroid Build Coastguard Worker int ES3_reserved_ES3_1_extension_ES3_2_keyword_2(TParseContext *context, TExtension extension1, TExtension extension2, int token)
706*8975f5c5SAndroid Build Coastguard Worker {
707*8975f5c5SAndroid Build Coastguard Worker struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
708*8975f5c5SAndroid Build Coastguard Worker yyscan_t yyscanner = (yyscan_t) context->getScanner();
709*8975f5c5SAndroid Build Coastguard Worker
710*8975f5c5SAndroid Build Coastguard Worker // a keyword in GLSL ES 3.10 with enabled extension
711*8975f5c5SAndroid Build Coastguard Worker if (is_extension_enabled_or_is_core(context, 310, extension1, 320))
712*8975f5c5SAndroid Build Coastguard Worker {
713*8975f5c5SAndroid Build Coastguard Worker return token;
714*8975f5c5SAndroid Build Coastguard Worker }
715*8975f5c5SAndroid Build Coastguard Worker else if (is_extension_enabled_or_is_core(context, 310, extension2, 320))
716*8975f5c5SAndroid Build Coastguard Worker {
717*8975f5c5SAndroid Build Coastguard Worker return token;
718*8975f5c5SAndroid Build Coastguard Worker }
719*8975f5c5SAndroid Build Coastguard Worker // a reserved word in GLSL ES 3.00+
720*8975f5c5SAndroid Build Coastguard Worker if (context->getShaderVersion() >= 300)
721*8975f5c5SAndroid Build Coastguard Worker {
722*8975f5c5SAndroid Build Coastguard Worker return reserved_word(yyscanner);
723*8975f5c5SAndroid Build Coastguard Worker }
724*8975f5c5SAndroid Build Coastguard Worker
725*8975f5c5SAndroid Build Coastguard Worker // Otherwise can be used as an identifier/type name
726*8975f5c5SAndroid Build Coastguard Worker yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
727*8975f5c5SAndroid Build Coastguard Worker return check_type(yyscanner);
728*8975f5c5SAndroid Build Coastguard Worker }
729*8975f5c5SAndroid Build Coastguard Worker
ES3_reserved_ES3_extension(TParseContext * context,TExtension extension,int token)730*8975f5c5SAndroid Build Coastguard Worker int ES3_reserved_ES3_extension(TParseContext *context, TExtension extension, int token)
731*8975f5c5SAndroid Build Coastguard Worker {
732*8975f5c5SAndroid Build Coastguard Worker struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
733*8975f5c5SAndroid Build Coastguard Worker yyscan_t yyscanner = (yyscan_t) context->getScanner();
734*8975f5c5SAndroid Build Coastguard Worker
735*8975f5c5SAndroid Build Coastguard Worker if(context->getShaderVersion() >= 300)
736*8975f5c5SAndroid Build Coastguard Worker {
737*8975f5c5SAndroid Build Coastguard Worker if (context->isExtensionEnabled(extension)) {
738*8975f5c5SAndroid Build Coastguard Worker return token;
739*8975f5c5SAndroid Build Coastguard Worker } else {
740*8975f5c5SAndroid Build Coastguard Worker return reserved_word(yyscanner);
741*8975f5c5SAndroid Build Coastguard Worker }
742*8975f5c5SAndroid Build Coastguard Worker }
743*8975f5c5SAndroid Build Coastguard Worker
744*8975f5c5SAndroid Build Coastguard Worker yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
745*8975f5c5SAndroid Build Coastguard Worker return check_type(yyscanner);
746*8975f5c5SAndroid Build Coastguard Worker }
747*8975f5c5SAndroid Build Coastguard Worker
ES3_reserved_ES3_extension_ES3_1_keyword(TParseContext * context,TExtension extension,int token)748*8975f5c5SAndroid Build Coastguard Worker int ES3_reserved_ES3_extension_ES3_1_keyword(TParseContext *context, TExtension extension, int token)
749*8975f5c5SAndroid Build Coastguard Worker {
750*8975f5c5SAndroid Build Coastguard Worker struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
751*8975f5c5SAndroid Build Coastguard Worker yyscan_t yyscanner = (yyscan_t) context->getScanner();
752*8975f5c5SAndroid Build Coastguard Worker
753*8975f5c5SAndroid Build Coastguard Worker // A keyword in GLSL ES 3.00 with enabled extension or in GLSL ES 3.10
754*8975f5c5SAndroid Build Coastguard Worker if (is_extension_enabled_or_is_core(context, 300, extension, 310))
755*8975f5c5SAndroid Build Coastguard Worker {
756*8975f5c5SAndroid Build Coastguard Worker return token;
757*8975f5c5SAndroid Build Coastguard Worker }
758*8975f5c5SAndroid Build Coastguard Worker
759*8975f5c5SAndroid Build Coastguard Worker if(context->getShaderVersion() == 300)
760*8975f5c5SAndroid Build Coastguard Worker {
761*8975f5c5SAndroid Build Coastguard Worker return reserved_word(yyscanner);
762*8975f5c5SAndroid Build Coastguard Worker }
763*8975f5c5SAndroid Build Coastguard Worker
764*8975f5c5SAndroid Build Coastguard Worker yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
765*8975f5c5SAndroid Build Coastguard Worker return check_type(yyscanner);
766*8975f5c5SAndroid Build Coastguard Worker }
767*8975f5c5SAndroid Build Coastguard Worker
ES3_reserved_ES3_extension_ES3_2_keyword(TParseContext * context,TExtension extension,int token)768*8975f5c5SAndroid Build Coastguard Worker int ES3_reserved_ES3_extension_ES3_2_keyword(TParseContext *context, TExtension extension, int token)
769*8975f5c5SAndroid Build Coastguard Worker {
770*8975f5c5SAndroid Build Coastguard Worker struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
771*8975f5c5SAndroid Build Coastguard Worker yyscan_t yyscanner = (yyscan_t) context->getScanner();
772*8975f5c5SAndroid Build Coastguard Worker
773*8975f5c5SAndroid Build Coastguard Worker // A keyword in GLSL ES 3.00 with enabled extension or in GLSL ES 3.20
774*8975f5c5SAndroid Build Coastguard Worker if (is_extension_enabled_or_is_core(context, 300, extension, 320))
775*8975f5c5SAndroid Build Coastguard Worker {
776*8975f5c5SAndroid Build Coastguard Worker return token;
777*8975f5c5SAndroid Build Coastguard Worker }
778*8975f5c5SAndroid Build Coastguard Worker
779*8975f5c5SAndroid Build Coastguard Worker if(context->getShaderVersion() == 300 ||context->getShaderVersion() == 310)
780*8975f5c5SAndroid Build Coastguard Worker {
781*8975f5c5SAndroid Build Coastguard Worker return reserved_word(yyscanner);
782*8975f5c5SAndroid Build Coastguard Worker }
783*8975f5c5SAndroid Build Coastguard Worker
784*8975f5c5SAndroid Build Coastguard Worker yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
785*8975f5c5SAndroid Build Coastguard Worker return check_type(yyscanner);
786*8975f5c5SAndroid Build Coastguard Worker }
787*8975f5c5SAndroid Build Coastguard Worker
ES3_1_reserved_ES3_1_extension_ES3_2_keyword_2(TParseContext * context,TExtension extension1,TExtension extension2,int token1,int token2)788*8975f5c5SAndroid Build Coastguard Worker static int ES3_1_reserved_ES3_1_extension_ES3_2_keyword_2(TParseContext *context, TExtension extension1, TExtension extension2, int token1, int token2)
789*8975f5c5SAndroid Build Coastguard Worker {
790*8975f5c5SAndroid Build Coastguard Worker struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
791*8975f5c5SAndroid Build Coastguard Worker yyscan_t yyscanner = (yyscan_t) context->getScanner();
792*8975f5c5SAndroid Build Coastguard Worker
793*8975f5c5SAndroid Build Coastguard Worker // A keyword in GLSL ES 3.20 or GLSL ES 3.10 with enabled extension.
794*8975f5c5SAndroid Build Coastguard Worker if (is_extension_enabled_or_is_core(context, 310, extension1, 320))
795*8975f5c5SAndroid Build Coastguard Worker {
796*8975f5c5SAndroid Build Coastguard Worker return token1;
797*8975f5c5SAndroid Build Coastguard Worker }
798*8975f5c5SAndroid Build Coastguard Worker else if (is_extension_enabled_or_is_core(context, 310, extension2, 320))
799*8975f5c5SAndroid Build Coastguard Worker {
800*8975f5c5SAndroid Build Coastguard Worker return token2;
801*8975f5c5SAndroid Build Coastguard Worker }
802*8975f5c5SAndroid Build Coastguard Worker
803*8975f5c5SAndroid Build Coastguard Worker // A reserved word in GLSL ES 3.10
804*8975f5c5SAndroid Build Coastguard Worker if (context->getShaderVersion() == 310)
805*8975f5c5SAndroid Build Coastguard Worker {
806*8975f5c5SAndroid Build Coastguard Worker return reserved_word(yyscanner);
807*8975f5c5SAndroid Build Coastguard Worker }
808*8975f5c5SAndroid Build Coastguard Worker
809*8975f5c5SAndroid Build Coastguard Worker yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
810*8975f5c5SAndroid Build Coastguard Worker return check_type(yyscanner);
811*8975f5c5SAndroid Build Coastguard Worker }
812*8975f5c5SAndroid Build Coastguard Worker
ES3_and_3_1_reserved_ES3_1_extension_ES3_2_keyword_2(TParseContext * context,TExtension extension1,TExtension extension2,int token1,int token2)813*8975f5c5SAndroid Build Coastguard Worker static int ES3_and_3_1_reserved_ES3_1_extension_ES3_2_keyword_2(TParseContext *context, TExtension extension1, TExtension extension2, int token1, int token2)
814*8975f5c5SAndroid Build Coastguard Worker {
815*8975f5c5SAndroid Build Coastguard Worker struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
816*8975f5c5SAndroid Build Coastguard Worker yyscan_t yyscanner = (yyscan_t) context->getScanner();
817*8975f5c5SAndroid Build Coastguard Worker
818*8975f5c5SAndroid Build Coastguard Worker // A keyword in GLSL ES 3.20 or GLSL ES 3.10 with enabled extension.
819*8975f5c5SAndroid Build Coastguard Worker if (is_extension_enabled_or_is_core(context, 310, extension1, 320))
820*8975f5c5SAndroid Build Coastguard Worker {
821*8975f5c5SAndroid Build Coastguard Worker return token1;
822*8975f5c5SAndroid Build Coastguard Worker }
823*8975f5c5SAndroid Build Coastguard Worker else if (is_extension_enabled_or_is_core(context, 310, extension2, 320))
824*8975f5c5SAndroid Build Coastguard Worker {
825*8975f5c5SAndroid Build Coastguard Worker return token2;
826*8975f5c5SAndroid Build Coastguard Worker }
827*8975f5c5SAndroid Build Coastguard Worker
828*8975f5c5SAndroid Build Coastguard Worker // A reserved word in GLSL ES 3.00 and 3.10
829*8975f5c5SAndroid Build Coastguard Worker if (context->getShaderVersion() >= 300)
830*8975f5c5SAndroid Build Coastguard Worker {
831*8975f5c5SAndroid Build Coastguard Worker return reserved_word(yyscanner);
832*8975f5c5SAndroid Build Coastguard Worker }
833*8975f5c5SAndroid Build Coastguard Worker
834*8975f5c5SAndroid Build Coastguard Worker yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
835*8975f5c5SAndroid Build Coastguard Worker return check_type(yyscanner);
836*8975f5c5SAndroid Build Coastguard Worker }
837*8975f5c5SAndroid Build Coastguard Worker
uint_constant(TParseContext * context)838*8975f5c5SAndroid Build Coastguard Worker int uint_constant(TParseContext *context)
839*8975f5c5SAndroid Build Coastguard Worker {
840*8975f5c5SAndroid Build Coastguard Worker struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
841*8975f5c5SAndroid Build Coastguard Worker
842*8975f5c5SAndroid Build Coastguard Worker if (context->getShaderVersion() < 300)
843*8975f5c5SAndroid Build Coastguard Worker {
844*8975f5c5SAndroid Build Coastguard Worker context->error(*yylloc, "Unsigned integers are unsupported prior to GLSL ES 3.00", yytext);
845*8975f5c5SAndroid Build Coastguard Worker return 0;
846*8975f5c5SAndroid Build Coastguard Worker }
847*8975f5c5SAndroid Build Coastguard Worker
848*8975f5c5SAndroid Build Coastguard Worker if (!atoi_clamp(yytext, &(yylval->lex.u)))
849*8975f5c5SAndroid Build Coastguard Worker yyextra->error(*yylloc, "Integer overflow", yytext);
850*8975f5c5SAndroid Build Coastguard Worker
851*8975f5c5SAndroid Build Coastguard Worker return UINTCONSTANT;
852*8975f5c5SAndroid Build Coastguard Worker }
853*8975f5c5SAndroid Build Coastguard Worker
floatsuffix_check(TParseContext * context)854*8975f5c5SAndroid Build Coastguard Worker int floatsuffix_check(TParseContext* context)
855*8975f5c5SAndroid Build Coastguard Worker {
856*8975f5c5SAndroid Build Coastguard Worker struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
857*8975f5c5SAndroid Build Coastguard Worker
858*8975f5c5SAndroid Build Coastguard Worker if (context->getShaderVersion() < 300)
859*8975f5c5SAndroid Build Coastguard Worker {
860*8975f5c5SAndroid Build Coastguard Worker context->error(*yylloc, "Floating-point suffix unsupported prior to GLSL ES 3.00", yytext);
861*8975f5c5SAndroid Build Coastguard Worker return 0;
862*8975f5c5SAndroid Build Coastguard Worker }
863*8975f5c5SAndroid Build Coastguard Worker
864*8975f5c5SAndroid Build Coastguard Worker std::string text = yytext;
865*8975f5c5SAndroid Build Coastguard Worker text.resize(text.size() - 1);
866*8975f5c5SAndroid Build Coastguard Worker if (!strtof_clamp(text, &(yylval->lex.f)))
867*8975f5c5SAndroid Build Coastguard Worker yyextra->warning(*yylloc, "Float overflow", yytext);
868*8975f5c5SAndroid Build Coastguard Worker
869*8975f5c5SAndroid Build Coastguard Worker return(FLOATCONSTANT);
870*8975f5c5SAndroid Build Coastguard Worker }
871*8975f5c5SAndroid Build Coastguard Worker
yyerror(YYLTYPE * lloc,TParseContext * context,void * scanner,const char * reason)872*8975f5c5SAndroid Build Coastguard Worker void yyerror(YYLTYPE* lloc, TParseContext* context, void *scanner, const char* reason) {
873*8975f5c5SAndroid Build Coastguard Worker context->error(*lloc, reason, yyget_text(scanner));
874*8975f5c5SAndroid Build Coastguard Worker }
875*8975f5c5SAndroid Build Coastguard Worker
int_constant(TParseContext * context)876*8975f5c5SAndroid Build Coastguard Worker int int_constant(TParseContext *context) {
877*8975f5c5SAndroid Build Coastguard Worker struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
878*8975f5c5SAndroid Build Coastguard Worker
879*8975f5c5SAndroid Build Coastguard Worker unsigned int u;
880*8975f5c5SAndroid Build Coastguard Worker if (!atoi_clamp(yytext, &u))
881*8975f5c5SAndroid Build Coastguard Worker {
882*8975f5c5SAndroid Build Coastguard Worker if (context->getShaderVersion() >= 300)
883*8975f5c5SAndroid Build Coastguard Worker yyextra->error(*yylloc, "Integer overflow", yytext);
884*8975f5c5SAndroid Build Coastguard Worker else
885*8975f5c5SAndroid Build Coastguard Worker yyextra->warning(*yylloc, "Integer overflow", yytext);
886*8975f5c5SAndroid Build Coastguard Worker }
887*8975f5c5SAndroid Build Coastguard Worker yylval->lex.i = static_cast<int>(u);
888*8975f5c5SAndroid Build Coastguard Worker return INTCONSTANT;
889*8975f5c5SAndroid Build Coastguard Worker }
890*8975f5c5SAndroid Build Coastguard Worker
float_constant(yyscan_t yyscanner)891*8975f5c5SAndroid Build Coastguard Worker int float_constant(yyscan_t yyscanner) {
892*8975f5c5SAndroid Build Coastguard Worker struct yyguts_t* yyg = (struct yyguts_t*) yyscanner;
893*8975f5c5SAndroid Build Coastguard Worker
894*8975f5c5SAndroid Build Coastguard Worker if (!strtof_clamp(yytext, &(yylval->lex.f)))
895*8975f5c5SAndroid Build Coastguard Worker yyextra->warning(*yylloc, "Float overflow", yytext);
896*8975f5c5SAndroid Build Coastguard Worker return FLOATCONSTANT;
897*8975f5c5SAndroid Build Coastguard Worker }
898*8975f5c5SAndroid Build Coastguard Worker
yuvcscstandardext_constant(TParseContext * context)899*8975f5c5SAndroid Build Coastguard Worker int yuvcscstandardext_constant(TParseContext *context)
900*8975f5c5SAndroid Build Coastguard Worker {
901*8975f5c5SAndroid Build Coastguard Worker struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
902*8975f5c5SAndroid Build Coastguard Worker yyscan_t yyscanner = (yyscan_t) context->getScanner();
903*8975f5c5SAndroid Build Coastguard Worker
904*8975f5c5SAndroid Build Coastguard Worker // a reserved word in GLSL ES 3.00 with enabled extension, otherwise could be used as an identifier/type name
905*8975f5c5SAndroid Build Coastguard Worker if (context->getShaderVersion() >= 300 && context->isExtensionEnabled(TExtension::EXT_YUV_target))
906*8975f5c5SAndroid Build Coastguard Worker {
907*8975f5c5SAndroid Build Coastguard Worker yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
908*8975f5c5SAndroid Build Coastguard Worker return YUVCSCSTANDARDEXTCONSTANT;
909*8975f5c5SAndroid Build Coastguard Worker }
910*8975f5c5SAndroid Build Coastguard Worker
911*8975f5c5SAndroid Build Coastguard Worker yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
912*8975f5c5SAndroid Build Coastguard Worker return check_type(yyscanner);
913*8975f5c5SAndroid Build Coastguard Worker }
914*8975f5c5SAndroid Build Coastguard Worker
glslang_initialize(TParseContext * context)915*8975f5c5SAndroid Build Coastguard Worker int glslang_initialize(TParseContext* context) {
916*8975f5c5SAndroid Build Coastguard Worker yyscan_t scanner = NULL;
917*8975f5c5SAndroid Build Coastguard Worker if (yylex_init_extra(context, &scanner))
918*8975f5c5SAndroid Build Coastguard Worker return 1;
919*8975f5c5SAndroid Build Coastguard Worker
920*8975f5c5SAndroid Build Coastguard Worker context->setScanner(scanner);
921*8975f5c5SAndroid Build Coastguard Worker return 0;
922*8975f5c5SAndroid Build Coastguard Worker }
923*8975f5c5SAndroid Build Coastguard Worker
glslang_finalize(TParseContext * context)924*8975f5c5SAndroid Build Coastguard Worker int glslang_finalize(TParseContext* context) {
925*8975f5c5SAndroid Build Coastguard Worker yyscan_t scanner = context->getScanner();
926*8975f5c5SAndroid Build Coastguard Worker if (scanner == NULL) return 0;
927*8975f5c5SAndroid Build Coastguard Worker
928*8975f5c5SAndroid Build Coastguard Worker context->setScanner(NULL);
929*8975f5c5SAndroid Build Coastguard Worker yylex_destroy(scanner);
930*8975f5c5SAndroid Build Coastguard Worker
931*8975f5c5SAndroid Build Coastguard Worker return 0;
932*8975f5c5SAndroid Build Coastguard Worker }
933*8975f5c5SAndroid Build Coastguard Worker
glslang_scan(size_t count,const char * const string[],const int length[],TParseContext * context)934*8975f5c5SAndroid Build Coastguard Worker int glslang_scan(size_t count, const char* const string[], const int length[],
935*8975f5c5SAndroid Build Coastguard Worker TParseContext* context) {
936*8975f5c5SAndroid Build Coastguard Worker yyrestart(NULL, context->getScanner());
937*8975f5c5SAndroid Build Coastguard Worker yyset_column(0, context->getScanner());
938*8975f5c5SAndroid Build Coastguard Worker yyset_lineno(1, context->getScanner());
939*8975f5c5SAndroid Build Coastguard Worker
940*8975f5c5SAndroid Build Coastguard Worker // Initialize preprocessor.
941*8975f5c5SAndroid Build Coastguard Worker angle::pp::Preprocessor *preprocessor = &context->getPreprocessor();
942*8975f5c5SAndroid Build Coastguard Worker
943*8975f5c5SAndroid Build Coastguard Worker if (!preprocessor->init(count, string, length))
944*8975f5c5SAndroid Build Coastguard Worker return 1;
945*8975f5c5SAndroid Build Coastguard Worker
946*8975f5c5SAndroid Build Coastguard Worker if (context->getFragmentPrecisionHigh())
947*8975f5c5SAndroid Build Coastguard Worker preprocessor->predefineMacro("GL_FRAGMENT_PRECISION_HIGH", 1);
948*8975f5c5SAndroid Build Coastguard Worker
949*8975f5c5SAndroid Build Coastguard Worker preprocessor->setMaxTokenSize(sh::GetGlobalMaxTokenSize(context->getShaderSpec()));
950*8975f5c5SAndroid Build Coastguard Worker
951*8975f5c5SAndroid Build Coastguard Worker return 0;
952*8975f5c5SAndroid Build Coastguard Worker }
953