Commit a5045ac3 by Shahbaz Youssefi Committed by Commit Bot

glslang.l: refactor extension checks

Bug: angleproject:3569 Change-Id: I7cbbaa4d1cdd4dd4268f28e06c907958cff9b4e8 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1947450 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 5efb36b9
...@@ -2,11 +2,11 @@ ...@@ -2,11 +2,11 @@
"src/compiler/translator/generate_parser.py": "src/compiler/translator/generate_parser.py":
"566178ecdfae3a29803b3687fc518ebb", "566178ecdfae3a29803b3687fc518ebb",
"src/compiler/translator/glslang.l": "src/compiler/translator/glslang.l":
"84952cb3af3498f56f4cf9c0435285f2", "75adc098def35a464dfb5ca1a0e99799",
"src/compiler/translator/glslang.y": "src/compiler/translator/glslang.y":
"e32a1376309bd63368e45a968362d375", "e32a1376309bd63368e45a968362d375",
"src/compiler/translator/glslang_lex_autogen.cpp": "src/compiler/translator/glslang_lex_autogen.cpp":
"53be7b052dea27573461ae8faf9d837c", "5f55ca207583009489d136e47c71beb5",
"src/compiler/translator/glslang_tab_autogen.cpp": "src/compiler/translator/glslang_tab_autogen.cpp":
"ce4d6a80cebfee9b0c28ebfd51287fea", "ce4d6a80cebfee9b0c28ebfd51287fea",
"src/compiler/translator/glslang_tab_autogen.h": "src/compiler/translator/glslang_tab_autogen.h":
......
...@@ -87,16 +87,27 @@ using namespace sh; ...@@ -87,16 +87,27 @@ using namespace sh;
static yy_size_t string_input(char* buf, yy_size_t max_size, yyscan_t yyscanner); static yy_size_t string_input(char* buf, yy_size_t max_size, yyscan_t yyscanner);
static int check_type(yyscan_t yyscanner); static int check_type(yyscan_t yyscanner);
static int reserved_word(yyscan_t yyscanner); static int reserved_word(yyscan_t yyscanner);
// Tests if an extension is enabled. If the extension is promoted to core, this function returns true.
static bool is_extension_enabled_or_is_core(TParseContext *context,
int extension_version, TExtension extension, int promotion_version);
// Helpers to determine if a symbol is reserved, keyword in extension or core, or identifier.
// Formatted as:
//
// [V1_reserved_][V2_extension_][V3_keyword]
//
// which means in version V1, the symbol is reserved, and remains reserved until V3. From versions
// V2 until V3, it's a keyword if the extension is enabled. From version V3 on, it's a keyword in
// the spec itself. Prior to V1, the symbol can be used as identifier.
static int ES2_reserved_ES3_keyword(TParseContext *context, int token); static int ES2_reserved_ES3_keyword(TParseContext *context, int token);
static int ES2_keyword_ES3_reserved(TParseContext *context, int token); static int ES2_keyword_ES3_reserved(TParseContext *context, int token);
static int ES2_ident_ES3_keyword(TParseContext *context, int token); static int ES3_keyword(TParseContext *context, int token);
static int ES2_ident_ES3_reserved_ES3_1_keyword(TParseContext *context, int token); static int ES3_reserved_ES3_1_keyword(TParseContext *context, int token);
static int ES2_and_ES3_reserved_ES3_1_keyword(TParseContext *context, int token); static int ES2_reserved_ES3_1_keyword(TParseContext *context, int token);
static int ES2_and_ES3_ident_ES3_1_keyword(TParseContext *context, int token); static int ES3_1_keyword(TParseContext *context, int token);
static int ES2_extension_ES3_keyword_else_reserved(TParseContext *context, TExtension extension, int token); static int ES2_reserved_ES2_extension_ES3_keyword(TParseContext *context, TExtension extension, int token);
static int ES3_extension_keyword_else_ident(TParseContext *context, TExtension extension, int token); static int ES3_extension(TParseContext *context, TExtension extension, int token);
static int ES2_ident_ES3_reserved_ES3_1_extension_keyword(TParseContext *context, TExtension extension, int token); static int ES3_reserved_ES3_1_extension_ES3_2_keyword(TParseContext *context, TExtension extension, int token);
static int ES3_extension_and_ES3_1_keyword_ES3_reserved_else_ident(TParseContext *context, TExtension extension, int token); static int ES3_reserved_ES3_extension_ES3_1_keyword(TParseContext *context, TExtension extension, int token);
static int uint_constant(TParseContext *context); static int uint_constant(TParseContext *context);
static int int_constant(TParseContext *context); static int int_constant(TParseContext *context);
static int float_constant(yyscan_t yyscanner); static int float_constant(yyscan_t yyscanner);
...@@ -130,7 +141,7 @@ O [0-7] ...@@ -130,7 +141,7 @@ O [0-7]
"attribute" { return ES2_keyword_ES3_reserved(context, ATTRIBUTE); } "attribute" { return ES2_keyword_ES3_reserved(context, ATTRIBUTE); }
"const" { return CONST_QUAL; } "const" { return CONST_QUAL; }
"uniform" { return UNIFORM; } "uniform" { return UNIFORM; }
"buffer" { return ES2_and_ES3_ident_ES3_1_keyword(context, BUFFER); } "buffer" { return ES3_1_keyword(context, BUFFER); }
"varying" { return ES2_keyword_ES3_reserved(context, VARYING); } "varying" { return ES2_keyword_ES3_reserved(context, VARYING); }
"break" { return BREAK; } "break" { return BREAK; }
...@@ -142,21 +153,21 @@ O [0-7] ...@@ -142,21 +153,21 @@ O [0-7]
"if" { return IF; } "if" { return IF; }
"else" { return ELSE; } "else" { return ELSE; }
"switch" { return ES2_reserved_ES3_keyword(context, SWITCH); } "switch" { return ES2_reserved_ES3_keyword(context, SWITCH); }
"case" { return ES2_ident_ES3_keyword(context, CASE); } "case" { return ES3_keyword(context, CASE); }
"default" { return ES2_reserved_ES3_keyword(context, DEFAULT); } "default" { return ES2_reserved_ES3_keyword(context, DEFAULT); }
"centroid" { return ES2_ident_ES3_keyword(context, CENTROID); } "centroid" { return ES3_keyword(context, CENTROID); }
"flat" { return ES2_reserved_ES3_keyword(context, FLAT); } "flat" { return ES2_reserved_ES3_keyword(context, FLAT); }
"smooth" { return ES2_ident_ES3_keyword(context, SMOOTH); } "smooth" { return ES3_keyword(context, SMOOTH); }
"in" { return IN_QUAL; } "in" { return IN_QUAL; }
"out" { return OUT_QUAL; } "out" { return OUT_QUAL; }
"inout" { return INOUT_QUAL; } "inout" { return INOUT_QUAL; }
"shared" { return ES2_and_ES3_ident_ES3_1_keyword(context, SHARED); } "shared" { return ES3_1_keyword(context, SHARED); }
"float" { return FLOAT_TYPE; } "float" { return FLOAT_TYPE; }
"int" { return INT_TYPE; } "int" { return INT_TYPE; }
"uint" { return ES2_ident_ES3_keyword(context, UINT_TYPE); } "uint" { return ES3_keyword(context, UINT_TYPE); }
"void" { return VOID_TYPE; } "void" { return VOID_TYPE; }
"bool" { return BOOL_TYPE; } "bool" { return BOOL_TYPE; }
"true" { yylval->lex.b = true; return BOOLCONSTANT; } "true" { yylval->lex.b = true; return BOOLCONSTANT; }
...@@ -169,16 +180,16 @@ O [0-7] ...@@ -169,16 +180,16 @@ O [0-7]
"mat3" { return MATRIX3; } "mat3" { return MATRIX3; }
"mat4" { return MATRIX4; } "mat4" { return MATRIX4; }
"mat2x2" { return ES2_ident_ES3_keyword(context, MATRIX2); } "mat2x2" { return ES3_keyword(context, MATRIX2); }
"mat3x3" { return ES2_ident_ES3_keyword(context, MATRIX3); } "mat3x3" { return ES3_keyword(context, MATRIX3); }
"mat4x4" { return ES2_ident_ES3_keyword(context, MATRIX4); } "mat4x4" { return ES3_keyword(context, MATRIX4); }
"mat2x3" { return ES2_ident_ES3_keyword(context, MATRIX2x3); } "mat2x3" { return ES3_keyword(context, MATRIX2x3); }
"mat3x2" { return ES2_ident_ES3_keyword(context, MATRIX3x2); } "mat3x2" { return ES3_keyword(context, MATRIX3x2); }
"mat2x4" { return ES2_ident_ES3_keyword(context, MATRIX2x4); } "mat2x4" { return ES3_keyword(context, MATRIX2x4); }
"mat4x2" { return ES2_ident_ES3_keyword(context, MATRIX4x2); } "mat4x2" { return ES3_keyword(context, MATRIX4x2); }
"mat3x4" { return ES2_ident_ES3_keyword(context, MATRIX3x4); } "mat3x4" { return ES3_keyword(context, MATRIX3x4); }
"mat4x3" { return ES2_ident_ES3_keyword(context, MATRIX4x3); } "mat4x3" { return ES3_keyword(context, MATRIX4x3); }
"vec2" { return VEC2; } "vec2" { return VEC2; }
"vec3" { return VEC3; } "vec3" { return VEC3; }
...@@ -189,63 +200,63 @@ O [0-7] ...@@ -189,63 +200,63 @@ O [0-7]
"bvec2" { return BVEC2; } "bvec2" { return BVEC2; }
"bvec3" { return BVEC3; } "bvec3" { return BVEC3; }
"bvec4" { return BVEC4; } "bvec4" { return BVEC4; }
"uvec2" { return ES2_ident_ES3_keyword(context, UVEC2); } "uvec2" { return ES3_keyword(context, UVEC2); }
"uvec3" { return ES2_ident_ES3_keyword(context, UVEC3); } "uvec3" { return ES3_keyword(context, UVEC3); }
"uvec4" { return ES2_ident_ES3_keyword(context, UVEC4); } "uvec4" { return ES3_keyword(context, UVEC4); }
"sampler2D" { return SAMPLER2D; } "sampler2D" { return SAMPLER2D; }
"samplerCube" { return SAMPLERCUBE; } "samplerCube" { return SAMPLERCUBE; }
"samplerExternalOES" { return SAMPLER_EXTERNAL_OES; } "samplerExternalOES" { return SAMPLER_EXTERNAL_OES; }
"sampler3D" { return ES2_extension_ES3_keyword_else_reserved(context, TExtension::OES_texture_3D, SAMPLER3D); } "sampler3D" { return ES2_reserved_ES2_extension_ES3_keyword(context, TExtension::OES_texture_3D, SAMPLER3D); }
"sampler3DRect" { return ES2_reserved_ES3_keyword(context, SAMPLER3DRECT); } "sampler3DRect" { return ES2_reserved_ES3_keyword(context, SAMPLER3DRECT); }
"sampler2DRect" { return SAMPLER2DRECT; } "sampler2DRect" { return SAMPLER2DRECT; }
"sampler2DArray" { return ES2_ident_ES3_keyword(context, SAMPLER2DARRAY); } "sampler2DArray" { return ES3_keyword(context, SAMPLER2DARRAY); }
"sampler2DMS" { return ES3_extension_and_ES3_1_keyword_ES3_reserved_else_ident(context, TExtension::ANGLE_texture_multisample, SAMPLER2DMS); } "sampler2DMS" { return ES3_reserved_ES3_extension_ES3_1_keyword(context, TExtension::ANGLE_texture_multisample, SAMPLER2DMS); }
"isampler2D" { return ES2_ident_ES3_keyword(context, ISAMPLER2D); } "isampler2D" { return ES3_keyword(context, ISAMPLER2D); }
"isampler3D" { return ES2_ident_ES3_keyword(context, ISAMPLER3D); } "isampler3D" { return ES3_keyword(context, ISAMPLER3D); }
"isamplerCube" { return ES2_ident_ES3_keyword(context, ISAMPLERCUBE); } "isamplerCube" { return ES3_keyword(context, ISAMPLERCUBE); }
"isampler2DArray" { return ES2_ident_ES3_keyword(context, ISAMPLER2DARRAY); } "isampler2DArray" { return ES3_keyword(context, ISAMPLER2DARRAY); }
"isampler2DMS" { return ES3_extension_and_ES3_1_keyword_ES3_reserved_else_ident(context, TExtension::ANGLE_texture_multisample, ISAMPLER2DMS); } "isampler2DMS" { return ES3_reserved_ES3_extension_ES3_1_keyword(context, TExtension::ANGLE_texture_multisample, ISAMPLER2DMS); }
"usampler2D" { return ES2_ident_ES3_keyword(context, USAMPLER2D); } "usampler2D" { return ES3_keyword(context, USAMPLER2D); }
"usampler3D" { return ES2_ident_ES3_keyword(context, USAMPLER3D); } "usampler3D" { return ES3_keyword(context, USAMPLER3D); }
"usamplerCube" { return ES2_ident_ES3_keyword(context, USAMPLERCUBE); } "usamplerCube" { return ES3_keyword(context, USAMPLERCUBE); }
"usampler2DArray" { return ES2_ident_ES3_keyword(context, USAMPLER2DARRAY); } "usampler2DArray" { return ES3_keyword(context, USAMPLER2DARRAY); }
"usampler2DMS" { return ES3_extension_and_ES3_1_keyword_ES3_reserved_else_ident(context, TExtension::ANGLE_texture_multisample, USAMPLER2DMS); } "usampler2DMS" { return ES3_reserved_ES3_extension_ES3_1_keyword(context, TExtension::ANGLE_texture_multisample, USAMPLER2DMS); }
"sampler2DShadow" { return ES2_reserved_ES3_keyword(context, SAMPLER2DSHADOW); } "sampler2DShadow" { return ES2_reserved_ES3_keyword(context, SAMPLER2DSHADOW); }
"samplerCubeShadow" { return ES2_ident_ES3_keyword(context, SAMPLERCUBESHADOW); } "samplerCubeShadow" { return ES3_keyword(context, SAMPLERCUBESHADOW); }
"sampler2DArrayShadow" { return ES2_ident_ES3_keyword(context, SAMPLER2DARRAYSHADOW); } "sampler2DArrayShadow" { return ES3_keyword(context, SAMPLER2DARRAYSHADOW); }
"__samplerExternal2DY2YEXT" { return ES3_extension_keyword_else_ident(context, TExtension::EXT_YUV_target, SAMPLEREXTERNAL2DY2YEXT); } "__samplerExternal2DY2YEXT" { return ES3_extension(context, TExtension::EXT_YUV_target, SAMPLEREXTERNAL2DY2YEXT); }
"sampler2DMSArray" { return ES2_ident_ES3_reserved_ES3_1_extension_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, SAMPLER2DMSARRAY); } "sampler2DMSArray" { return ES3_reserved_ES3_1_extension_ES3_2_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, SAMPLER2DMSARRAY); }
"isampler2DMSArray" { return ES2_ident_ES3_reserved_ES3_1_extension_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, ISAMPLER2DMSARRAY); } "isampler2DMSArray" { return ES3_reserved_ES3_1_extension_ES3_2_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, ISAMPLER2DMSARRAY); }
"usampler2DMSArray" { return ES2_ident_ES3_reserved_ES3_1_extension_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, USAMPLER2DMSARRAY); } "usampler2DMSArray" { return ES3_reserved_ES3_1_extension_ES3_2_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, USAMPLER2DMSARRAY); }
"struct" { return STRUCT; } "struct" { return STRUCT; }
"layout" { return ES2_ident_ES3_keyword(context, LAYOUT); } "layout" { return ES3_keyword(context, LAYOUT); }
"yuvCscStandardEXT" { return ES3_extension_keyword_else_ident(context, TExtension::EXT_YUV_target, YUVCSCSTANDARDEXT); } "yuvCscStandardEXT" { return ES3_extension(context, TExtension::EXT_YUV_target, YUVCSCSTANDARDEXT); }
"itu_601" { return yuvcscstandardext_constant(context); } "itu_601" { return yuvcscstandardext_constant(context); }
"itu_601_full_range" { return yuvcscstandardext_constant(context); } "itu_601_full_range" { return yuvcscstandardext_constant(context); }
"itu_709" { return yuvcscstandardext_constant(context); } "itu_709" { return yuvcscstandardext_constant(context); }
"image2D" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE2D); } "image2D" { return ES3_reserved_ES3_1_keyword(context, IMAGE2D); }
"iimage2D" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE2D); } "iimage2D" { return ES3_reserved_ES3_1_keyword(context, IIMAGE2D); }
"uimage2D" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE2D); } "uimage2D" { return ES3_reserved_ES3_1_keyword(context, UIMAGE2D); }
"image2DArray" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE2DARRAY); } "image2DArray" { return ES3_reserved_ES3_1_keyword(context, IMAGE2DARRAY); }
"iimage2DArray" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE2DARRAY); } "iimage2DArray" { return ES3_reserved_ES3_1_keyword(context, IIMAGE2DARRAY); }
"uimage2DArray" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE2DARRAY); } "uimage2DArray" { return ES3_reserved_ES3_1_keyword(context, UIMAGE2DARRAY); }
"image3D" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE3D); } "image3D" { return ES3_reserved_ES3_1_keyword(context, IMAGE3D); }
"uimage3D" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE3D); } "uimage3D" { return ES3_reserved_ES3_1_keyword(context, UIMAGE3D); }
"iimage3D" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE3D); } "iimage3D" { return ES3_reserved_ES3_1_keyword(context, IIMAGE3D); }
"iimageCube" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGECUBE); } "iimageCube" { return ES3_reserved_ES3_1_keyword(context, IIMAGECUBE); }
"uimageCube" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGECUBE); } "uimageCube" { return ES3_reserved_ES3_1_keyword(context, UIMAGECUBE); }
"imageCube" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGECUBE); } "imageCube" { return ES3_reserved_ES3_1_keyword(context, IMAGECUBE); }
"readonly" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, READONLY); } "readonly" { return ES3_reserved_ES3_1_keyword(context, READONLY); }
"writeonly" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, WRITEONLY); } "writeonly" { return ES3_reserved_ES3_1_keyword(context, WRITEONLY); }
"coherent" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, COHERENT); } "coherent" { return ES3_reserved_ES3_1_keyword(context, COHERENT); }
"restrict" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, RESTRICT); } "restrict" { return ES3_reserved_ES3_1_keyword(context, RESTRICT); }
"volatile" { return ES2_and_ES3_reserved_ES3_1_keyword(context, VOLATILE); } "volatile" { return ES2_reserved_ES3_1_keyword(context, VOLATILE); }
"atomic_uint" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, ATOMICUINT); } "atomic_uint" { return ES3_reserved_ES3_1_keyword(context, ATOMICUINT); }
/* Reserved keywords for GLSL ES 3.00 that are not reserved for GLSL ES 1.00 */ /* Reserved keywords for GLSL ES 3.00 that are not reserved for GLSL ES 1.00 */
"resource" | "resource" |
...@@ -474,6 +485,18 @@ int reserved_word(yyscan_t yyscanner) { ...@@ -474,6 +485,18 @@ int reserved_word(yyscan_t yyscanner) {
return 0; return 0;
} }
static bool is_extension_enabled_or_is_core(TParseContext *context,
int extension_version, TExtension extension, int promotion_version)
{
int version = context->getShaderVersion();
// If version is at least promotion_version, symbol is definitely keyword. Otherwise it's a
// keyword if version is at least extension_version (where the extension was introduced) and
// the extension is enabled.
return version >= promotion_version ||
(version >= extension_version && context->isExtensionEnabled(extension));
}
int ES2_reserved_ES3_keyword(TParseContext *context, int token) int ES2_reserved_ES3_keyword(TParseContext *context, int token)
{ {
yyscan_t yyscanner = (yyscan_t) context->getScanner(); yyscan_t yyscanner = (yyscan_t) context->getScanner();
...@@ -498,7 +521,7 @@ int ES2_keyword_ES3_reserved(TParseContext *context, int token) ...@@ -498,7 +521,7 @@ int ES2_keyword_ES3_reserved(TParseContext *context, int token)
return token; return token;
} }
int ES2_ident_ES3_reserved_ES3_1_keyword(TParseContext *context, int token) int ES3_reserved_ES3_1_keyword(TParseContext *context, int token)
{ {
struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner(); struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
yyscan_t yyscanner = (yyscan_t) context->getScanner(); yyscan_t yyscanner = (yyscan_t) context->getScanner();
...@@ -516,7 +539,7 @@ int ES2_ident_ES3_reserved_ES3_1_keyword(TParseContext *context, int token) ...@@ -516,7 +539,7 @@ int ES2_ident_ES3_reserved_ES3_1_keyword(TParseContext *context, int token)
return token; return token;
} }
int ES2_ident_ES3_keyword(TParseContext *context, int token) int ES3_keyword(TParseContext *context, int token)
{ {
struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner(); struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
yyscan_t yyscanner = (yyscan_t) context->getScanner(); yyscan_t yyscanner = (yyscan_t) context->getScanner();
...@@ -531,7 +554,7 @@ int ES2_ident_ES3_keyword(TParseContext *context, int token) ...@@ -531,7 +554,7 @@ int ES2_ident_ES3_keyword(TParseContext *context, int token)
return token; return token;
} }
int ES2_and_ES3_reserved_ES3_1_keyword(TParseContext *context, int token) int ES2_reserved_ES3_1_keyword(TParseContext *context, int token)
{ {
yyscan_t yyscanner = (yyscan_t) context->getScanner(); yyscan_t yyscanner = (yyscan_t) context->getScanner();
...@@ -543,56 +566,59 @@ int ES2_and_ES3_reserved_ES3_1_keyword(TParseContext *context, int token) ...@@ -543,56 +566,59 @@ int ES2_and_ES3_reserved_ES3_1_keyword(TParseContext *context, int token)
return token; return token;
} }
int ES2_and_ES3_ident_ES3_1_keyword(TParseContext *context, int token) int ES3_1_keyword(TParseContext *context, int token)
{ {
struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner(); struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
yyscan_t yyscanner = (yyscan_t) context->getScanner(); yyscan_t yyscanner = (yyscan_t) context->getScanner();
// not a reserved word in GLSL ES 1.00 and GLSL ES 3.00, so could be used as an identifier/type name // A keyword in GLSL ES 3.10.
if (context->getShaderVersion() < 310) if (context->getShaderVersion() >= 310)
{ {
yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); return token;
return check_type(yyscanner);
} }
return token; // Otherwise can be used as an identifier/type name
yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
return check_type(yyscanner);
} }
int ES2_extension_ES3_keyword_else_reserved(TParseContext *context, TExtension extension, int token) int ES2_reserved_ES2_extension_ES3_keyword(TParseContext *context, TExtension extension, int token)
{ {
yyscan_t yyscanner = (yyscan_t) context->getScanner(); yyscan_t yyscanner = (yyscan_t) context->getScanner();
// Available with extension or ES 3.00 and above, reserved otherwise // A keyword in GLSL ES 3.00 or GLSL ES 1.00 with enabled extension.
if (context->isExtensionEnabled(extension) || context->getShaderVersion() >= 300) if (is_extension_enabled_or_is_core(context, 100, extension, 300))
{ {
return token; return token;
} }
// Reserved otherwise.
return reserved_word(yyscanner); return reserved_word(yyscanner);
} }
int ES3_extension_keyword_else_ident(TParseContext *context, TExtension extension, int token) int ES3_extension(TParseContext *context, TExtension extension, int token)
{ {
struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner(); struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
yyscan_t yyscanner = (yyscan_t) context->getScanner(); yyscan_t yyscanner = (yyscan_t) context->getScanner();
// a reserved word in GLSL ES 3.00 with enabled extension, otherwise could be used as an identifier/type name // a keyword word in GLSL ES 3.00 with enabled extension.
if (context->getShaderVersion() >= 300 && context->isExtensionEnabled(extension)) if (context->getShaderVersion() >= 300 && context->isExtensionEnabled(extension))
{ {
return token; return token;
} }
// Otherwise can be used as an identifier/type name
yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
return check_type(yyscanner); return check_type(yyscanner);
} }
int ES2_ident_ES3_reserved_ES3_1_extension_keyword(TParseContext *context, TExtension extension, int token) int ES3_reserved_ES3_1_extension_ES3_2_keyword(TParseContext *context, TExtension extension, int token)
{ {
struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner(); struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
yyscan_t yyscanner = (yyscan_t) context->getScanner(); yyscan_t yyscanner = (yyscan_t) context->getScanner();
// a keyword in GLSL ES 3.10 with enabled extension // a keyword in GLSL ES 3.10 with enabled extension
if (context->getShaderVersion() >= 310 && context->isExtensionEnabled(extension)) if (is_extension_enabled_or_is_core(context, 310, extension, 320))
{ {
return token; return token;
} }
...@@ -607,13 +633,13 @@ int ES2_ident_ES3_reserved_ES3_1_extension_keyword(TParseContext *context, TExte ...@@ -607,13 +633,13 @@ int ES2_ident_ES3_reserved_ES3_1_extension_keyword(TParseContext *context, TExte
return check_type(yyscanner); return check_type(yyscanner);
} }
int ES3_extension_and_ES3_1_keyword_ES3_reserved_else_ident(TParseContext *context, TExtension extension, int token) int ES3_reserved_ES3_extension_ES3_1_keyword(TParseContext *context, TExtension extension, int token)
{ {
struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner(); struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
yyscan_t yyscanner = (yyscan_t) context->getScanner(); yyscan_t yyscanner = (yyscan_t) context->getScanner();
// A keyword in GLSL ES 3.00 with enabled extension or in GLSL ES 3.10 // A keyword in GLSL ES 3.00 with enabled extension or in GLSL ES 3.10
if (context->getShaderVersion() >= 310 || (context->getShaderVersion() == 300 && context->isExtensionEnabled(extension))) if (is_extension_enabled_or_is_core(context, 300, extension, 310))
{ {
return token; return token;
} }
......
...@@ -1226,16 +1226,27 @@ using namespace sh; ...@@ -1226,16 +1226,27 @@ using namespace sh;
static yy_size_t string_input(char* buf, yy_size_t max_size, yyscan_t yyscanner); static yy_size_t string_input(char* buf, yy_size_t max_size, yyscan_t yyscanner);
static int check_type(yyscan_t yyscanner); static int check_type(yyscan_t yyscanner);
static int reserved_word(yyscan_t yyscanner); static int reserved_word(yyscan_t yyscanner);
// Tests if an extension is enabled. If the extension is promoted to core, this function returns true.
static bool is_extension_enabled_or_is_core(TParseContext *context,
int extension_version, TExtension extension, int promotion_version);
// Helpers to determine if a symbol is reserved, keyword in extension or core, or identifier.
// Formatted as:
//
// [V1_reserved_][V2_extension_][V3_keyword]
//
// which means in version V1, the symbol is reserved, and remains reserved until V3. From versions
// V2 until V3, it's a keyword if the extension is enabled. From version V3 on, it's a keyword in
// the spec itself. Prior to V1, the symbol can be used as identifier.
static int ES2_reserved_ES3_keyword(TParseContext *context, int token); static int ES2_reserved_ES3_keyword(TParseContext *context, int token);
static int ES2_keyword_ES3_reserved(TParseContext *context, int token); static int ES2_keyword_ES3_reserved(TParseContext *context, int token);
static int ES2_ident_ES3_keyword(TParseContext *context, int token); static int ES3_keyword(TParseContext *context, int token);
static int ES2_ident_ES3_reserved_ES3_1_keyword(TParseContext *context, int token); static int ES3_reserved_ES3_1_keyword(TParseContext *context, int token);
static int ES2_and_ES3_reserved_ES3_1_keyword(TParseContext *context, int token); static int ES2_reserved_ES3_1_keyword(TParseContext *context, int token);
static int ES2_and_ES3_ident_ES3_1_keyword(TParseContext *context, int token); static int ES3_1_keyword(TParseContext *context, int token);
static int ES2_extension_ES3_keyword_else_reserved(TParseContext *context, TExtension extension, int token); static int ES2_reserved_ES2_extension_ES3_keyword(TParseContext *context, TExtension extension, int token);
static int ES3_extension_keyword_else_ident(TParseContext *context, TExtension extension, int token); static int ES3_extension(TParseContext *context, TExtension extension, int token);
static int ES2_ident_ES3_reserved_ES3_1_extension_keyword(TParseContext *context, TExtension extension, int token); static int ES3_reserved_ES3_1_extension_ES3_2_keyword(TParseContext *context, TExtension extension, int token);
static int ES3_extension_and_ES3_1_keyword_ES3_reserved_else_ident(TParseContext *context, TExtension extension, int token); static int ES3_reserved_ES3_extension_ES3_1_keyword(TParseContext *context, TExtension extension, int token);
static int uint_constant(TParseContext *context); static int uint_constant(TParseContext *context);
static int int_constant(TParseContext *context); static int int_constant(TParseContext *context);
static int float_constant(yyscan_t yyscanner); static int float_constant(yyscan_t yyscanner);
...@@ -1743,7 +1754,7 @@ YY_RULE_SETUP ...@@ -1743,7 +1754,7 @@ YY_RULE_SETUP
YY_BREAK YY_BREAK
case 9: case 9:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_and_ES3_ident_ES3_1_keyword(context, BUFFER); } { return ES3_1_keyword(context, BUFFER); }
YY_BREAK YY_BREAK
case 10: case 10:
YY_RULE_SETUP YY_RULE_SETUP
...@@ -1783,7 +1794,7 @@ YY_RULE_SETUP ...@@ -1783,7 +1794,7 @@ YY_RULE_SETUP
YY_BREAK YY_BREAK
case 19: case 19:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, CASE); } { return ES3_keyword(context, CASE); }
YY_BREAK YY_BREAK
case 20: case 20:
YY_RULE_SETUP YY_RULE_SETUP
...@@ -1791,7 +1802,7 @@ YY_RULE_SETUP ...@@ -1791,7 +1802,7 @@ YY_RULE_SETUP
YY_BREAK YY_BREAK
case 21: case 21:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, CENTROID); } { return ES3_keyword(context, CENTROID); }
YY_BREAK YY_BREAK
case 22: case 22:
YY_RULE_SETUP YY_RULE_SETUP
...@@ -1799,7 +1810,7 @@ YY_RULE_SETUP ...@@ -1799,7 +1810,7 @@ YY_RULE_SETUP
YY_BREAK YY_BREAK
case 23: case 23:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, SMOOTH); } { return ES3_keyword(context, SMOOTH); }
YY_BREAK YY_BREAK
case 24: case 24:
YY_RULE_SETUP YY_RULE_SETUP
...@@ -1815,7 +1826,7 @@ YY_RULE_SETUP ...@@ -1815,7 +1826,7 @@ YY_RULE_SETUP
YY_BREAK YY_BREAK
case 27: case 27:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_and_ES3_ident_ES3_1_keyword(context, SHARED); } { return ES3_1_keyword(context, SHARED); }
YY_BREAK YY_BREAK
case 28: case 28:
YY_RULE_SETUP YY_RULE_SETUP
...@@ -1827,7 +1838,7 @@ YY_RULE_SETUP ...@@ -1827,7 +1838,7 @@ YY_RULE_SETUP
YY_BREAK YY_BREAK
case 30: case 30:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, UINT_TYPE); } { return ES3_keyword(context, UINT_TYPE); }
YY_BREAK YY_BREAK
case 31: case 31:
YY_RULE_SETUP YY_RULE_SETUP
...@@ -1867,39 +1878,39 @@ YY_RULE_SETUP ...@@ -1867,39 +1878,39 @@ YY_RULE_SETUP
YY_BREAK YY_BREAK
case 40: case 40:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, MATRIX2); } { return ES3_keyword(context, MATRIX2); }
YY_BREAK YY_BREAK
case 41: case 41:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, MATRIX3); } { return ES3_keyword(context, MATRIX3); }
YY_BREAK YY_BREAK
case 42: case 42:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, MATRIX4); } { return ES3_keyword(context, MATRIX4); }
YY_BREAK YY_BREAK
case 43: case 43:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, MATRIX2x3); } { return ES3_keyword(context, MATRIX2x3); }
YY_BREAK YY_BREAK
case 44: case 44:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, MATRIX3x2); } { return ES3_keyword(context, MATRIX3x2); }
YY_BREAK YY_BREAK
case 45: case 45:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, MATRIX2x4); } { return ES3_keyword(context, MATRIX2x4); }
YY_BREAK YY_BREAK
case 46: case 46:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, MATRIX4x2); } { return ES3_keyword(context, MATRIX4x2); }
YY_BREAK YY_BREAK
case 47: case 47:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, MATRIX3x4); } { return ES3_keyword(context, MATRIX3x4); }
YY_BREAK YY_BREAK
case 48: case 48:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, MATRIX4x3); } { return ES3_keyword(context, MATRIX4x3); }
YY_BREAK YY_BREAK
case 49: case 49:
YY_RULE_SETUP YY_RULE_SETUP
...@@ -1939,15 +1950,15 @@ YY_RULE_SETUP ...@@ -1939,15 +1950,15 @@ YY_RULE_SETUP
YY_BREAK YY_BREAK
case 58: case 58:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, UVEC2); } { return ES3_keyword(context, UVEC2); }
YY_BREAK YY_BREAK
case 59: case 59:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, UVEC3); } { return ES3_keyword(context, UVEC3); }
YY_BREAK YY_BREAK
case 60: case 60:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, UVEC4); } { return ES3_keyword(context, UVEC4); }
YY_BREAK YY_BREAK
case 61: case 61:
YY_RULE_SETUP YY_RULE_SETUP
...@@ -1963,7 +1974,7 @@ YY_RULE_SETUP ...@@ -1963,7 +1974,7 @@ YY_RULE_SETUP
YY_BREAK YY_BREAK
case 64: case 64:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_extension_ES3_keyword_else_reserved(context, TExtension::OES_texture_3D, SAMPLER3D); } { return ES2_reserved_ES2_extension_ES3_keyword(context, TExtension::OES_texture_3D, SAMPLER3D); }
YY_BREAK YY_BREAK
case 65: case 65:
YY_RULE_SETUP YY_RULE_SETUP
...@@ -1975,51 +1986,51 @@ YY_RULE_SETUP ...@@ -1975,51 +1986,51 @@ YY_RULE_SETUP
YY_BREAK YY_BREAK
case 67: case 67:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, SAMPLER2DARRAY); } { return ES3_keyword(context, SAMPLER2DARRAY); }
YY_BREAK YY_BREAK
case 68: case 68:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES3_extension_and_ES3_1_keyword_ES3_reserved_else_ident(context, TExtension::ANGLE_texture_multisample, SAMPLER2DMS); } { return ES3_reserved_ES3_extension_ES3_1_keyword(context, TExtension::ANGLE_texture_multisample, SAMPLER2DMS); }
YY_BREAK YY_BREAK
case 69: case 69:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, ISAMPLER2D); } { return ES3_keyword(context, ISAMPLER2D); }
YY_BREAK YY_BREAK
case 70: case 70:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, ISAMPLER3D); } { return ES3_keyword(context, ISAMPLER3D); }
YY_BREAK YY_BREAK
case 71: case 71:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, ISAMPLERCUBE); } { return ES3_keyword(context, ISAMPLERCUBE); }
YY_BREAK YY_BREAK
case 72: case 72:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, ISAMPLER2DARRAY); } { return ES3_keyword(context, ISAMPLER2DARRAY); }
YY_BREAK YY_BREAK
case 73: case 73:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES3_extension_and_ES3_1_keyword_ES3_reserved_else_ident(context, TExtension::ANGLE_texture_multisample, ISAMPLER2DMS); } { return ES3_reserved_ES3_extension_ES3_1_keyword(context, TExtension::ANGLE_texture_multisample, ISAMPLER2DMS); }
YY_BREAK YY_BREAK
case 74: case 74:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, USAMPLER2D); } { return ES3_keyword(context, USAMPLER2D); }
YY_BREAK YY_BREAK
case 75: case 75:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, USAMPLER3D); } { return ES3_keyword(context, USAMPLER3D); }
YY_BREAK YY_BREAK
case 76: case 76:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, USAMPLERCUBE); } { return ES3_keyword(context, USAMPLERCUBE); }
YY_BREAK YY_BREAK
case 77: case 77:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, USAMPLER2DARRAY); } { return ES3_keyword(context, USAMPLER2DARRAY); }
YY_BREAK YY_BREAK
case 78: case 78:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES3_extension_and_ES3_1_keyword_ES3_reserved_else_ident(context, TExtension::ANGLE_texture_multisample, USAMPLER2DMS); } { return ES3_reserved_ES3_extension_ES3_1_keyword(context, TExtension::ANGLE_texture_multisample, USAMPLER2DMS); }
YY_BREAK YY_BREAK
case 79: case 79:
YY_RULE_SETUP YY_RULE_SETUP
...@@ -2027,27 +2038,27 @@ YY_RULE_SETUP ...@@ -2027,27 +2038,27 @@ YY_RULE_SETUP
YY_BREAK YY_BREAK
case 80: case 80:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, SAMPLERCUBESHADOW); } { return ES3_keyword(context, SAMPLERCUBESHADOW); }
YY_BREAK YY_BREAK
case 81: case 81:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, SAMPLER2DARRAYSHADOW); } { return ES3_keyword(context, SAMPLER2DARRAYSHADOW); }
YY_BREAK YY_BREAK
case 82: case 82:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES3_extension_keyword_else_ident(context, TExtension::EXT_YUV_target, SAMPLEREXTERNAL2DY2YEXT); } { return ES3_extension(context, TExtension::EXT_YUV_target, SAMPLEREXTERNAL2DY2YEXT); }
YY_BREAK YY_BREAK
case 83: case 83:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_extension_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, SAMPLER2DMSARRAY); } { return ES3_reserved_ES3_1_extension_ES3_2_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, SAMPLER2DMSARRAY); }
YY_BREAK YY_BREAK
case 84: case 84:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_extension_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, ISAMPLER2DMSARRAY); } { return ES3_reserved_ES3_1_extension_ES3_2_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, ISAMPLER2DMSARRAY); }
YY_BREAK YY_BREAK
case 85: case 85:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_extension_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, USAMPLER2DMSARRAY); } { return ES3_reserved_ES3_1_extension_ES3_2_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, USAMPLER2DMSARRAY); }
YY_BREAK YY_BREAK
case 86: case 86:
YY_RULE_SETUP YY_RULE_SETUP
...@@ -2055,11 +2066,11 @@ YY_RULE_SETUP ...@@ -2055,11 +2066,11 @@ YY_RULE_SETUP
YY_BREAK YY_BREAK
case 87: case 87:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, LAYOUT); } { return ES3_keyword(context, LAYOUT); }
YY_BREAK YY_BREAK
case 88: case 88:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES3_extension_keyword_else_ident(context, TExtension::EXT_YUV_target, YUVCSCSTANDARDEXT); } { return ES3_extension(context, TExtension::EXT_YUV_target, YUVCSCSTANDARDEXT); }
YY_BREAK YY_BREAK
case 89: case 89:
YY_RULE_SETUP YY_RULE_SETUP
...@@ -2075,75 +2086,75 @@ YY_RULE_SETUP ...@@ -2075,75 +2086,75 @@ YY_RULE_SETUP
YY_BREAK YY_BREAK
case 92: case 92:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE2D); } { return ES3_reserved_ES3_1_keyword(context, IMAGE2D); }
YY_BREAK YY_BREAK
case 93: case 93:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE2D); } { return ES3_reserved_ES3_1_keyword(context, IIMAGE2D); }
YY_BREAK YY_BREAK
case 94: case 94:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE2D); } { return ES3_reserved_ES3_1_keyword(context, UIMAGE2D); }
YY_BREAK YY_BREAK
case 95: case 95:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE2DARRAY); } { return ES3_reserved_ES3_1_keyword(context, IMAGE2DARRAY); }
YY_BREAK YY_BREAK
case 96: case 96:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE2DARRAY); } { return ES3_reserved_ES3_1_keyword(context, IIMAGE2DARRAY); }
YY_BREAK YY_BREAK
case 97: case 97:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE2DARRAY); } { return ES3_reserved_ES3_1_keyword(context, UIMAGE2DARRAY); }
YY_BREAK YY_BREAK
case 98: case 98:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE3D); } { return ES3_reserved_ES3_1_keyword(context, IMAGE3D); }
YY_BREAK YY_BREAK
case 99: case 99:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE3D); } { return ES3_reserved_ES3_1_keyword(context, UIMAGE3D); }
YY_BREAK YY_BREAK
case 100: case 100:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE3D); } { return ES3_reserved_ES3_1_keyword(context, IIMAGE3D); }
YY_BREAK YY_BREAK
case 101: case 101:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGECUBE); } { return ES3_reserved_ES3_1_keyword(context, IIMAGECUBE); }
YY_BREAK YY_BREAK
case 102: case 102:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGECUBE); } { return ES3_reserved_ES3_1_keyword(context, UIMAGECUBE); }
YY_BREAK YY_BREAK
case 103: case 103:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGECUBE); } { return ES3_reserved_ES3_1_keyword(context, IMAGECUBE); }
YY_BREAK YY_BREAK
case 104: case 104:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, READONLY); } { return ES3_reserved_ES3_1_keyword(context, READONLY); }
YY_BREAK YY_BREAK
case 105: case 105:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, WRITEONLY); } { return ES3_reserved_ES3_1_keyword(context, WRITEONLY); }
YY_BREAK YY_BREAK
case 106: case 106:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, COHERENT); } { return ES3_reserved_ES3_1_keyword(context, COHERENT); }
YY_BREAK YY_BREAK
case 107: case 107:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, RESTRICT); } { return ES3_reserved_ES3_1_keyword(context, RESTRICT); }
YY_BREAK YY_BREAK
case 108: case 108:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_and_ES3_reserved_ES3_1_keyword(context, VOLATILE); } { return ES2_reserved_ES3_1_keyword(context, VOLATILE); }
YY_BREAK YY_BREAK
case 109: case 109:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, ATOMICUINT); } { return ES3_reserved_ES3_1_keyword(context, ATOMICUINT); }
YY_BREAK YY_BREAK
/* Reserved keywords for GLSL ES 3.00 that are not reserved for GLSL ES 1.00 */ /* Reserved keywords for GLSL ES 3.00 that are not reserved for GLSL ES 1.00 */
case 110: case 110:
...@@ -3839,6 +3850,18 @@ int reserved_word(yyscan_t yyscanner) { ...@@ -3839,6 +3850,18 @@ int reserved_word(yyscan_t yyscanner) {
return 0; return 0;
} }
static bool is_extension_enabled_or_is_core(TParseContext *context,
int extension_version, TExtension extension, int promotion_version)
{
int version = context->getShaderVersion();
// If version is at least promotion_version, symbol is definitely keyword. Otherwise it's a
// keyword if version is at least extension_version (where the extension was introduced) and
// the extension is enabled.
return version >= promotion_version ||
(version >= extension_version && context->isExtensionEnabled(extension));
}
int ES2_reserved_ES3_keyword(TParseContext *context, int token) int ES2_reserved_ES3_keyword(TParseContext *context, int token)
{ {
yyscan_t yyscanner = (yyscan_t) context->getScanner(); yyscan_t yyscanner = (yyscan_t) context->getScanner();
...@@ -3863,7 +3886,7 @@ int ES2_keyword_ES3_reserved(TParseContext *context, int token) ...@@ -3863,7 +3886,7 @@ int ES2_keyword_ES3_reserved(TParseContext *context, int token)
return token; return token;
} }
int ES2_ident_ES3_reserved_ES3_1_keyword(TParseContext *context, int token) int ES3_reserved_ES3_1_keyword(TParseContext *context, int token)
{ {
struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner(); struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
yyscan_t yyscanner = (yyscan_t) context->getScanner(); yyscan_t yyscanner = (yyscan_t) context->getScanner();
...@@ -3881,7 +3904,7 @@ int ES2_ident_ES3_reserved_ES3_1_keyword(TParseContext *context, int token) ...@@ -3881,7 +3904,7 @@ int ES2_ident_ES3_reserved_ES3_1_keyword(TParseContext *context, int token)
return token; return token;
} }
int ES2_ident_ES3_keyword(TParseContext *context, int token) int ES3_keyword(TParseContext *context, int token)
{ {
struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner(); struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
yyscan_t yyscanner = (yyscan_t) context->getScanner(); yyscan_t yyscanner = (yyscan_t) context->getScanner();
...@@ -3896,7 +3919,7 @@ int ES2_ident_ES3_keyword(TParseContext *context, int token) ...@@ -3896,7 +3919,7 @@ int ES2_ident_ES3_keyword(TParseContext *context, int token)
return token; return token;
} }
int ES2_and_ES3_reserved_ES3_1_keyword(TParseContext *context, int token) int ES2_reserved_ES3_1_keyword(TParseContext *context, int token)
{ {
yyscan_t yyscanner = (yyscan_t) context->getScanner(); yyscan_t yyscanner = (yyscan_t) context->getScanner();
...@@ -3908,56 +3931,59 @@ int ES2_and_ES3_reserved_ES3_1_keyword(TParseContext *context, int token) ...@@ -3908,56 +3931,59 @@ int ES2_and_ES3_reserved_ES3_1_keyword(TParseContext *context, int token)
return token; return token;
} }
int ES2_and_ES3_ident_ES3_1_keyword(TParseContext *context, int token) int ES3_1_keyword(TParseContext *context, int token)
{ {
struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner(); struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
yyscan_t yyscanner = (yyscan_t) context->getScanner(); yyscan_t yyscanner = (yyscan_t) context->getScanner();
// not a reserved word in GLSL ES 1.00 and GLSL ES 3.00, so could be used as an identifier/type name // A keyword in GLSL ES 3.10.
if (context->getShaderVersion() < 310) if (context->getShaderVersion() >= 310)
{ {
yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); return token;
return check_type(yyscanner);
} }
return token; // Otherwise can be used as an identifier/type name
yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
return check_type(yyscanner);
} }
int ES2_extension_ES3_keyword_else_reserved(TParseContext *context, TExtension extension, int token) int ES2_reserved_ES2_extension_ES3_keyword(TParseContext *context, TExtension extension, int token)
{ {
yyscan_t yyscanner = (yyscan_t) context->getScanner(); yyscan_t yyscanner = (yyscan_t) context->getScanner();
// Available with extension or ES 3.00 and above, reserved otherwise // A keyword in GLSL ES 3.00 or GLSL ES 1.00 with enabled extension.
if (context->isExtensionEnabled(extension) || context->getShaderVersion() >= 300) if (is_extension_enabled_or_is_core(context, 100, extension, 300))
{ {
return token; return token;
} }
// Reserved otherwise.
return reserved_word(yyscanner); return reserved_word(yyscanner);
} }
int ES3_extension_keyword_else_ident(TParseContext *context, TExtension extension, int token) int ES3_extension(TParseContext *context, TExtension extension, int token)
{ {
struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner(); struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
yyscan_t yyscanner = (yyscan_t) context->getScanner(); yyscan_t yyscanner = (yyscan_t) context->getScanner();
// a reserved word in GLSL ES 3.00 with enabled extension, otherwise could be used as an identifier/type name // a keyword word in GLSL ES 3.00 with enabled extension.
if (context->getShaderVersion() >= 300 && context->isExtensionEnabled(extension)) if (context->getShaderVersion() >= 300 && context->isExtensionEnabled(extension))
{ {
return token; return token;
} }
// Otherwise can be used as an identifier/type name
yylval->lex.string = AllocatePoolCharArray(yytext, yyleng); yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
return check_type(yyscanner); return check_type(yyscanner);
} }
int ES2_ident_ES3_reserved_ES3_1_extension_keyword(TParseContext *context, TExtension extension, int token) int ES3_reserved_ES3_1_extension_ES3_2_keyword(TParseContext *context, TExtension extension, int token)
{ {
struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner(); struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
yyscan_t yyscanner = (yyscan_t) context->getScanner(); yyscan_t yyscanner = (yyscan_t) context->getScanner();
// a keyword in GLSL ES 3.10 with enabled extension // a keyword in GLSL ES 3.10 with enabled extension
if (context->getShaderVersion() >= 310 && context->isExtensionEnabled(extension)) if (is_extension_enabled_or_is_core(context, 310, extension, 320))
{ {
return token; return token;
} }
...@@ -3972,13 +3998,13 @@ int ES2_ident_ES3_reserved_ES3_1_extension_keyword(TParseContext *context, TExte ...@@ -3972,13 +3998,13 @@ int ES2_ident_ES3_reserved_ES3_1_extension_keyword(TParseContext *context, TExte
return check_type(yyscanner); return check_type(yyscanner);
} }
int ES3_extension_and_ES3_1_keyword_ES3_reserved_else_ident(TParseContext *context, TExtension extension, int token) int ES3_reserved_ES3_extension_ES3_1_keyword(TParseContext *context, TExtension extension, int token)
{ {
struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner(); struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
yyscan_t yyscanner = (yyscan_t) context->getScanner(); yyscan_t yyscanner = (yyscan_t) context->getScanner();
// A keyword in GLSL ES 3.00 with enabled extension or in GLSL ES 3.10 // A keyword in GLSL ES 3.00 with enabled extension or in GLSL ES 3.10
if (context->getShaderVersion() >= 310 || (context->getShaderVersion() == 300 && context->isExtensionEnabled(extension))) if (is_extension_enabled_or_is_core(context, 300, extension, 310))
{ {
return token; return token;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment