On 12/01/2012 11:40 AM, Ian Romanick wrote:
On 11/30/2012 03:47 PM, Kenneth Graunke wrote:
On 11/30/2012 10:07 AM, Ian Romanick wrote:
From: Paul Berry <stereotype...@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.roman...@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.

It's a special case.  The GL_ARB_texture_rectangle extension predates
the invention of the #extension mechanism.  A number of shipping drivers
and, supposedly, shipping applications use it without any #extension.
It's only reserved (generates an error) if the implementation doesn't
support the extension.  In Mesa, this gets handled elsewhere, but I
think every driver that supports GLSL also supports this extension.

Otherwise this looks okay.

Oh, right.  But it's actually reserved on ES.

Reviewed-by: Kenneth Graunke <kenn...@whitecape.org>

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to