[Mesa-dev] [PATCH 09/26] glsl: parse GLSL ES 3.00 keywords correctly.
Kenneth Graunke
kenneth at whitecape.org
Fri Nov 30 15:47:06 PST 2012
On 11/30/2012 10:07 AM, Ian Romanick wrote:
> From: Paul Berry <stereotype441 at gmail.com>
>
> GLSL ES 3.00 adds the following keywords over GLSL 1.00: uint,
> uvec[2-4], matNxM, centroid, flat, smooth, various samplers, layout,
> switch, default, and case.
>
> Additionally, it reserves a large number of keywords, some of which
> were already reserved in versions of desktop GL that Mesa supports,
> some of which are new to Mesa.
>
> A few of the reserved keywords in GLSL ES 3.00 are keywords that are
> supported in all other versions of GLSL: attribute, varying,
> sampler1D, sampler1DShador, sampler2DRect, and sampler2DRectShadow.
>
> This patch updates the lexer to handle all of the new keywords
> correctly when the language being parsed is GLSL 3.00 ES.
>
> Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
> src/glsl/glsl_lexer.ll | 189 ++++++++++++++++++++++++++++--------------------
> src/glsl/glsl_parser.yy | 3 +
> 2 files changed, 114 insertions(+), 78 deletions(-)
>
> diff --git a/src/glsl/glsl_lexer.ll b/src/glsl/glsl_lexer.ll
> index ef1402b..e667e71 100644
> --- a/src/glsl/glsl_lexer.ll
> +++ b/src/glsl/glsl_lexer.ll
> @@ -85,6 +85,21 @@ static int classify_identifier(struct _mesa_glsl_parse_state *, const char *);
> } \
> } while (0)
>
> +/**
> + * A macro for handling keywords that have been present in GLSL since
> + * its origin, but were changed into reserved words in GLSL 3.00 ES.
> + */
> +#define DEPRECATED_ES_KEYWORD(token) \
> + do { \
> + if (yyextra->is_version(0, 300)) { \
> + _mesa_glsl_error(yylloc, yyextra, \
> + "Illegal use of reserved word `%s'", yytext); \
> + return ERROR_TOK; \
> + } else { \
> + return token; \
> + } \
> + } while (0)
> +
> static int
> literal_integer(char *text, int len, struct _mesa_glsl_parse_state *state,
> YYSTYPE *lval, YYLTYPE *lloc, int base)
> @@ -223,12 +238,12 @@ HASH ^{SPC}#{SPC}
>
> \n { yylineno++; yycolumn = 0; }
>
> -attribute return ATTRIBUTE;
> +attribute DEPRECATED_ES_KEYWORD(ATTRIBUTE);
> const return CONST_TOK;
> bool return BOOL_TOK;
> float return FLOAT_TOK;
> int return INT_TOK;
> -uint KEYWORD(130, 0, 130, 0, UINT_TOK);
> +uint KEYWORD(130, 300, 130, 300, UINT_TOK);
>
> break return BREAK;
> continue return CONTINUE;
> @@ -246,59 +261,59 @@ bvec4 return BVEC4;
> ivec2 return IVEC2;
> ivec3 return IVEC3;
> ivec4 return IVEC4;
> -uvec2 KEYWORD(130, 0, 130, 0, UVEC2);
> -uvec3 KEYWORD(130, 0, 130, 0, UVEC3);
> -uvec4 KEYWORD(130, 0, 130, 0, UVEC4);
> +uvec2 KEYWORD(130, 300, 130, 300, UVEC2);
> +uvec3 KEYWORD(130, 300, 130, 300, UVEC3);
> +uvec4 KEYWORD(130, 300, 130, 300, UVEC4);
> vec2 return VEC2;
> vec3 return VEC3;
> vec4 return VEC4;
> mat2 return MAT2X2;
> mat3 return MAT3X3;
> mat4 return MAT4X4;
> -mat2x2 KEYWORD(120, 0, 120, 0, MAT2X2);
> -mat2x3 KEYWORD(120, 0, 120, 0, MAT2X3);
> -mat2x4 KEYWORD(120, 0, 120, 0, MAT2X4);
> -mat3x2 KEYWORD(120, 0, 120, 0, MAT3X2);
> -mat3x3 KEYWORD(120, 0, 120, 0, MAT3X3);
> -mat3x4 KEYWORD(120, 0, 120, 0, MAT3X4);
> -mat4x2 KEYWORD(120, 0, 120, 0, MAT4X2);
> -mat4x3 KEYWORD(120, 0, 120, 0, MAT4X3);
> -mat4x4 KEYWORD(120, 0, 120, 0, MAT4X4);
> +mat2x2 KEYWORD(120, 300, 120, 300, MAT2X2);
> +mat2x3 KEYWORD(120, 300, 120, 300, MAT2X3);
> +mat2x4 KEYWORD(120, 300, 120, 300, MAT2X4);
> +mat3x2 KEYWORD(120, 300, 120, 300, MAT3X2);
> +mat3x3 KEYWORD(120, 300, 120, 300, MAT3X3);
> +mat3x4 KEYWORD(120, 300, 120, 300, MAT3X4);
> +mat4x2 KEYWORD(120, 300, 120, 300, MAT4X2);
> +mat4x3 KEYWORD(120, 300, 120, 300, MAT4X3);
> +mat4x4 KEYWORD(120, 300, 120, 300, MAT4X4);
>
> in return IN_TOK;
> out return OUT_TOK;
> inout return INOUT_TOK;
> uniform return UNIFORM;
> -varying return VARYING;
> -centroid KEYWORD(120, 0, 120, 0, CENTROID);
> +varying DEPRECATED_ES_KEYWORD(VARYING);
> +centroid KEYWORD(120, 300, 120, 300, CENTROID);
> invariant KEYWORD(120, 100, 120, 100, INVARIANT);
> -flat KEYWORD(130, 100, 130, 0, FLAT);
> -smooth KEYWORD(130, 0, 130, 0, SMOOTH);
> -noperspective KEYWORD(130, 0, 130, 0, NOPERSPECTIVE);
> +flat KEYWORD(130, 100, 130, 300, FLAT);
> +smooth KEYWORD(130, 300, 130, 300, SMOOTH);
> +noperspective KEYWORD(130, 300, 130, 0, NOPERSPECTIVE);
>
> -sampler1D return SAMPLER1D;
> +sampler1D DEPRECATED_ES_KEYWORD(SAMPLER1D);
> sampler2D return SAMPLER2D;
> sampler3D return SAMPLER3D;
> samplerCube return SAMPLERCUBE;
> -sampler1DArray KEYWORD(130, 0, 130, 0, SAMPLER1DARRAY);
> -sampler2DArray KEYWORD(130, 0, 130, 0, SAMPLER2DARRAY);
> -sampler1DShadow return SAMPLER1DSHADOW;
> +sampler1DArray KEYWORD(130, 300, 130, 0, SAMPLER1DARRAY);
> +sampler2DArray KEYWORD(130, 300, 130, 300, SAMPLER2DARRAY);
> +sampler1DShadow DEPRECATED_ES_KEYWORD(SAMPLER1DSHADOW);
> sampler2DShadow return SAMPLER2DSHADOW;
> -samplerCubeShadow KEYWORD(130, 0, 130, 0, SAMPLERCUBESHADOW);
> -sampler1DArrayShadow KEYWORD(130, 0, 130, 0, SAMPLER1DARRAYSHADOW);
> -sampler2DArrayShadow KEYWORD(130, 0, 130, 0, SAMPLER2DARRAYSHADOW);
> -isampler1D KEYWORD(130, 0, 130, 0, ISAMPLER1D);
> -isampler2D KEYWORD(130, 0, 130, 0, ISAMPLER2D);
> -isampler3D KEYWORD(130, 0, 130, 0, ISAMPLER3D);
> -isamplerCube KEYWORD(130, 0, 130, 0, ISAMPLERCUBE);
> -isampler1DArray KEYWORD(130, 0, 130, 0, ISAMPLER1DARRAY);
> -isampler2DArray KEYWORD(130, 0, 130, 0, ISAMPLER2DARRAY);
> -usampler1D KEYWORD(130, 0, 130, 0, USAMPLER1D);
> -usampler2D KEYWORD(130, 0, 130, 0, USAMPLER2D);
> -usampler3D KEYWORD(130, 0, 130, 0, USAMPLER3D);
> -usamplerCube KEYWORD(130, 0, 130, 0, USAMPLERCUBE);
> -usampler1DArray KEYWORD(130, 0, 130, 0, USAMPLER1DARRAY);
> -usampler2DArray KEYWORD(130, 0, 130, 0, USAMPLER2DARRAY);
> +samplerCubeShadow KEYWORD(130, 300, 130, 300, SAMPLERCUBESHADOW);
> +sampler1DArrayShadow KEYWORD(130, 300, 130, 0, SAMPLER1DARRAYSHADOW);
> +sampler2DArrayShadow KEYWORD(130, 300, 130, 300, SAMPLER2DARRAYSHADOW);
> +isampler1D KEYWORD(130, 300, 130, 0, ISAMPLER1D);
> +isampler2D KEYWORD(130, 300, 130, 300, ISAMPLER2D);
> +isampler3D KEYWORD(130, 300, 130, 300, ISAMPLER3D);
> +isamplerCube KEYWORD(130, 300, 130, 300, ISAMPLERCUBE);
> +isampler1DArray KEYWORD(130, 300, 130, 0, ISAMPLER1DARRAY);
> +isampler2DArray KEYWORD(130, 300, 130, 300, ISAMPLER2DARRAY);
> +usampler1D KEYWORD(130, 300, 130, 0, USAMPLER1D);
> +usampler2D KEYWORD(130, 300, 130, 300, USAMPLER2D);
> +usampler3D KEYWORD(130, 300, 130, 300, USAMPLER3D);
> +usamplerCube KEYWORD(130, 300, 130, 300, USAMPLERCUBE);
> +usampler1DArray KEYWORD(130, 300, 130, 0, USAMPLER1DARRAY);
> +usampler2DArray KEYWORD(130, 300, 130, 300, USAMPLER2DARRAY);
>
> samplerCubeArray {
> if (yyextra->ARB_texture_cube_map_array_enable)
> @@ -337,7 +352,7 @@ struct return STRUCT;
> void return VOID_TOK;
>
> layout {
> - if ((yyextra->is_version(140, 0))
> + if ((yyextra->is_version(140, 300))
> || yyextra->AMD_conservative_depth_enable
> || yyextra->ARB_conservative_depth_enable
> || yyextra->ARB_explicit_attrib_location_enable
> @@ -424,8 +439,8 @@ template KEYWORD(110, 100, 0, 0, TEMPLATE);
> this KEYWORD(110, 100, 0, 0, THIS);
> packed KEYWORD_WITH_ALT(110, 100, 140, 0, yyextra->ARB_uniform_buffer_object_enable, PACKED_TOK);
> goto KEYWORD(110, 100, 0, 0, GOTO);
> -switch KEYWORD(110, 100, 130, 0, SWITCH);
> -default KEYWORD(110, 100, 130, 0, DEFAULT);
> +switch KEYWORD(110, 100, 130, 300, SWITCH);
> +default KEYWORD(110, 100, 130, 300, DEFAULT);
> inline KEYWORD(110, 100, 0, 0, INLINE_TOK);
> noinline KEYWORD(110, 100, 0, 0, NOINLINE);
> volatile KEYWORD(110, 100, 0, 0, VOLATILE);
> @@ -451,9 +466,9 @@ dvec4 KEYWORD(110, 100, 400, 0, DVEC4);
> fvec2 KEYWORD(110, 100, 0, 0, FVEC2);
> fvec3 KEYWORD(110, 100, 0, 0, FVEC3);
> fvec4 KEYWORD(110, 100, 0, 0, FVEC4);
> -sampler2DRect return SAMPLER2DRECT;
> +sampler2DRect DEPRECATED_ES_KEYWORD(SAMPLER2DRECT);
> sampler3DRect KEYWORD(110, 100, 0, 0, SAMPLER3DRECT);
> -sampler2DRectShadow return SAMPLER2DRECTSHADOW;
> +sampler2DRectShadow DEPRECATED_ES_KEYWORD(SAMPLER2DRECTSHADOW);
I don't think the handling of sampler2DRect/sampler2DRectShadow is
correct. It should be accepted if ARB_texture_rectangle is enabled or
1.40+. Otherwise, it's always been reserved.
Otherwise this looks okay.
More information about the mesa-dev
mailing list