[Mesa-dev] [PATCH] glsl: Drop the round-trip through ast_type_specifier for many builtin types.

Matt Turner mattst88 at gmail.com
Thu Mar 29 14:59:30 PDT 2012


On Thu, Mar 29, 2012 at 5:37 PM, Eric Anholt <eric at anholt.net> wrote:
> We have lexer recognition of a bunch of our types based on the
> handling.  This code was mapping those recognized tokens to an enum
> and then to a string of their name.  Just drop the enums and provide
> the string directly in the parser.
> ---
>  src/glsl/ast.h          |   66 +----------------------------
>  src/glsl/ast_to_hir.cpp |    4 +-
>  src/glsl/ast_type.cpp   |   68 +-----------------------------
>  src/glsl/glsl_parser.yy |  106 +++++++++++++++++++++++------------------------
>  4 files changed, 58 insertions(+), 186 deletions(-)
>
> diff --git a/src/glsl/ast.h b/src/glsl/ast.h
> index 1f78af8..e6707ac 100644
> --- a/src/glsl/ast.h
> +++ b/src/glsl/ast.h
> @@ -418,72 +418,12 @@ public:
>  };
>
>
> -enum ast_types {
> -   ast_void,
> -   ast_float,
> -   ast_int,
> -   ast_uint,
> -   ast_bool,
> -   ast_vec2,
> -   ast_vec3,
> -   ast_vec4,
> -   ast_bvec2,
> -   ast_bvec3,
> -   ast_bvec4,
> -   ast_ivec2,
> -   ast_ivec3,
> -   ast_ivec4,
> -   ast_uvec2,
> -   ast_uvec3,
> -   ast_uvec4,
> -   ast_mat2,
> -   ast_mat2x3,
> -   ast_mat2x4,
> -   ast_mat3x2,
> -   ast_mat3,
> -   ast_mat3x4,
> -   ast_mat4x2,
> -   ast_mat4x3,
> -   ast_mat4,
> -   ast_sampler1d,
> -   ast_sampler2d,
> -   ast_sampler2drect,
> -   ast_sampler3d,
> -   ast_samplercube,
> -   ast_samplerexternaloes,
> -   ast_sampler1dshadow,
> -   ast_sampler2dshadow,
> -   ast_sampler2drectshadow,
> -   ast_samplercubeshadow,
> -   ast_sampler1darray,
> -   ast_sampler2darray,
> -   ast_sampler1darrayshadow,
> -   ast_sampler2darrayshadow,
> -   ast_isampler1d,
> -   ast_isampler2d,
> -   ast_isampler3d,
> -   ast_isamplercube,
> -   ast_isampler1darray,
> -   ast_isampler2darray,
> -   ast_usampler1d,
> -   ast_usampler2d,
> -   ast_usampler3d,
> -   ast_usamplercube,
> -   ast_usampler1darray,
> -   ast_usampler2darray,
> -
> -   ast_struct,
> -   ast_type_name
> -};
> -
>
>  class ast_type_specifier : public ast_node {
>  public:
> -   ast_type_specifier(int specifier);
> -
>    /** Construct a type specifier from a type name */
>    ast_type_specifier(const char *name)
> -      : type_specifier(ast_type_name), type_name(name), structure(NULL),
> +      : type_name(name), structure(NULL),
>        is_array(false), array_size(NULL), precision(ast_precision_none),
>        is_precision_statement(false)
>    {
> @@ -492,7 +432,7 @@ public:
>
>    /** Construct a type specifier from a structure definition */
>    ast_type_specifier(ast_struct_specifier *s)
> -      : type_specifier(ast_struct), type_name(s->name), structure(s),
> +      : type_name(s->name), structure(s),
>        is_array(false), array_size(NULL), precision(ast_precision_none),
>        is_precision_statement(false)
>    {
> @@ -507,8 +447,6 @@ public:
>
>    ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *);
>
> -   enum ast_types type_specifier;
> -
>    const char *type_name;
>    ast_struct_specifier *structure;
>
> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
> index ff56e33..dd02301 100644
> --- a/src/glsl/ast_to_hir.cpp
> +++ b/src/glsl/ast_to_hir.cpp
> @@ -3904,8 +3904,8 @@ ast_type_specifier::hir(exec_list *instructions,
>                           "arrays");
>          return NULL;
>       }
> -      if (this->type_specifier != ast_float
> -          && this->type_specifier != ast_int) {
> +      if (strcmp(this->type_name, "float") != 0 &&
> +         strcmp(this->type_name, "int") != 0) {
>          _mesa_glsl_error(&loc, state,
>                           "default precision statements apply only to types "
>                           "float and int");
> diff --git a/src/glsl/ast_type.cpp b/src/glsl/ast_type.cpp
> index 79c43ee..6c44f8c 100644
> --- a/src/glsl/ast_type.cpp
> +++ b/src/glsl/ast_type.cpp
> @@ -29,7 +29,7 @@ extern "C" {
>  void
>  ast_type_specifier::print(void) const
>  {
> -   if (type_specifier == ast_struct) {
> +   if (structure) {
>       structure->print();
>    } else {
>       printf("%s ", type_name);
> @@ -46,72 +46,6 @@ ast_type_specifier::print(void) const
>    }
>  }
>
> -ast_type_specifier::ast_type_specifier(int specifier)
> -      : type_specifier(ast_types(specifier)), type_name(NULL), structure(NULL),
> -       is_array(false), array_size(NULL), precision(ast_precision_none),
> -       is_precision_statement(false)
> -{
> -   static const char *const names[] = {
> -      "void",
> -      "float",
> -      "int",
> -      "uint",
> -      "bool",
> -      "vec2",
> -      "vec3",
> -      "vec4",
> -      "bvec2",
> -      "bvec3",
> -      "bvec4",
> -      "ivec2",
> -      "ivec3",
> -      "ivec4",
> -      "uvec2",
> -      "uvec3",
> -      "uvec4",
> -      "mat2",
> -      "mat2x3",
> -      "mat2x4",
> -      "mat3x2",
> -      "mat3",
> -      "mat3x4",
> -      "mat4x2",
> -      "mat4x3",
> -      "mat4",
> -      "sampler1D",
> -      "sampler2D",
> -      "sampler2DRect",
> -      "sampler3D",
> -      "samplerCube",
> -      "samplerExternalOES",
> -      "sampler1DShadow",
> -      "sampler2DShadow",
> -      "sampler2DRectShadow",
> -      "samplerCubeShadow",
> -      "sampler1DArray",
> -      "sampler2DArray",
> -      "sampler1DArrayShadow",
> -      "sampler2DArrayShadow",
> -      "isampler1D",
> -      "isampler2D",
> -      "isampler3D",
> -      "isamplerCube",
> -      "isampler1DArray",
> -      "isampler2DArray",
> -      "usampler1D",
> -      "usampler2D",
> -      "usampler3D",
> -      "usamplerCube",
> -      "usampler1DArray",
> -      "usampler2DArray",
> -
> -      NULL, /* ast_struct */
> -      NULL  /* ast_type_name */
> -   };
> -
> -   type_name = names[specifier];
> -}
> -
>  bool
>  ast_fully_specified_type::has_qualifiers() const
>  {
> diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy
> index 64506b6..5ce69b6 100644
> --- a/src/glsl/glsl_parser.yy
> +++ b/src/glsl/glsl_parser.yy
> @@ -156,7 +156,7 @@ static void yyerror(YYLTYPE *loc, _mesa_glsl_parse_state *st, const char *msg)
>  %type <type_specifier> type_specifier
>  %type <type_specifier> type_specifier_no_prec
>  %type <type_specifier> type_specifier_nonarray
> -%type <n> basic_type_specifier_nonarray
> +%type <identifier> basic_type_specifier_nonarray
>  %type <fully_specified_type> fully_specified_type
>  %type <function> function_prototype
>  %type <function> function_header
> @@ -1365,58 +1365,58 @@ type_specifier_nonarray:
>        ;
>
>  basic_type_specifier_nonarray:
> -       VOID_TOK                { $$ = ast_void; }
> -       | FLOAT_TOK             { $$ = ast_float; }
> -       | INT_TOK               { $$ = ast_int; }
> -       | UINT_TOK              { $$ = ast_uint; }
> -       | BOOL_TOK              { $$ = ast_bool; }
> -       | VEC2                  { $$ = ast_vec2; }
> -       | VEC3                  { $$ = ast_vec3; }
> -       | VEC4                  { $$ = ast_vec4; }
> -       | BVEC2                 { $$ = ast_bvec2; }
> -       | BVEC3                 { $$ = ast_bvec3; }
> -       | BVEC4                 { $$ = ast_bvec4; }
> -       | IVEC2                 { $$ = ast_ivec2; }
> -       | IVEC3                 { $$ = ast_ivec3; }
> -       | IVEC4                 { $$ = ast_ivec4; }
> -       | UVEC2                 { $$ = ast_uvec2; }
> -       | UVEC3                 { $$ = ast_uvec3; }
> -       | UVEC4                 { $$ = ast_uvec4; }
> -       | MAT2X2                { $$ = ast_mat2; }
> -       | MAT2X3                { $$ = ast_mat2x3; }
> -       | MAT2X4                { $$ = ast_mat2x4; }
> -       | MAT3X2                { $$ = ast_mat3x2; }
> -       | MAT3X3                { $$ = ast_mat3; }
> -       | MAT3X4                { $$ = ast_mat3x4; }
> -       | MAT4X2                { $$ = ast_mat4x2; }
> -       | MAT4X3                { $$ = ast_mat4x3; }
> -       | MAT4X4                { $$ = ast_mat4; }
> -       | SAMPLER1D             { $$ = ast_sampler1d; }
> -       | SAMPLER2D             { $$ = ast_sampler2d; }
> -       | SAMPLER2DRECT         { $$ = ast_sampler2drect; }
> -       | SAMPLER3D             { $$ = ast_sampler3d; }
> -       | SAMPLERCUBE           { $$ = ast_samplercube; }
> -       | SAMPLEREXTERNALOES    { $$ = ast_samplerexternaloes; }
> -       | SAMPLER1DSHADOW       { $$ = ast_sampler1dshadow; }
> -       | SAMPLER2DSHADOW       { $$ = ast_sampler2dshadow; }
> -       | SAMPLER2DRECTSHADOW   { $$ = ast_sampler2drectshadow; }
> -       | SAMPLERCUBESHADOW     { $$ = ast_samplercubeshadow; }
> -       | SAMPLER1DARRAY        { $$ = ast_sampler1darray; }
> -       | SAMPLER2DARRAY        { $$ = ast_sampler2darray; }
> -       | SAMPLER1DARRAYSHADOW  { $$ = ast_sampler1darrayshadow; }
> -       | SAMPLER2DARRAYSHADOW  { $$ = ast_sampler2darrayshadow; }
> -       | ISAMPLER1D            { $$ = ast_isampler1d; }
> -       | ISAMPLER2D            { $$ = ast_isampler2d; }
> -       | ISAMPLER3D            { $$ = ast_isampler3d; }
> -       | ISAMPLERCUBE          { $$ = ast_isamplercube; }
> -       | ISAMPLER1DARRAY       { $$ = ast_isampler1darray; }
> -       | ISAMPLER2DARRAY       { $$ = ast_isampler2darray; }
> -       | USAMPLER1D            { $$ = ast_usampler1d; }
> -       | USAMPLER2D            { $$ = ast_usampler2d; }
> -       | USAMPLER3D            { $$ = ast_usampler3d; }
> -       | USAMPLERCUBE          { $$ = ast_usamplercube; }
> -       | USAMPLER1DARRAY       { $$ = ast_usampler1darray; }
> -       | USAMPLER2DARRAY       { $$ = ast_usampler2darray; }
> +       VOID_TOK                { $$ = (char *)"void"; }
> +       | FLOAT_TOK             { $$ = (char *)"float"; }
> +       | INT_TOK               { $$ = (char *)"int"; }
> +       | UINT_TOK              { $$ = (char *)"uint"; }
> +       | BOOL_TOK              { $$ = (char *)"bool"; }
> +       | VEC2                  { $$ = (char *)"vec2"; }
> +       | VEC3                  { $$ = (char *)"vec3"; }
> +       | VEC4                  { $$ = (char *)"vec4"; }
> +       | BVEC2                 { $$ = (char *)"bvec2"; }
> +       | BVEC3                 { $$ = (char *)"bvec3"; }
> +       | BVEC4                 { $$ = (char *)"bvec4"; }
> +       | IVEC2                 { $$ = (char *)"ivec2"; }
> +       | IVEC3                 { $$ = (char *)"ivec3"; }
> +       | IVEC4                 { $$ = (char *)"ivec4"; }
> +       | UVEC2                 { $$ = (char *)"uvec2"; }
> +       | UVEC3                 { $$ = (char *)"uvec3"; }
> +       | UVEC4                 { $$ = (char *)"uvec4"; }
> +       | MAT2X2                { $$ = (char *)"mat2"; }
> +       | MAT2X3                { $$ = (char *)"mat2x3"; }
> +       | MAT2X4                { $$ = (char *)"mat2x4"; }
> +       | MAT3X2                { $$ = (char *)"mat3x2"; }
> +       | MAT3X3                { $$ = (char *)"mat3"; }
> +       | MAT3X4                { $$ = (char *)"mat3x4"; }
> +       | MAT4X2                { $$ = (char *)"mat4x2"; }
> +       | MAT4X3                { $$ = (char *)"mat4x3"; }
> +       | MAT4X4                { $$ = (char *)"mat4"; }
> +       | SAMPLER1D             { $$ = (char *)"sampler1D"; }
> +       | SAMPLER2D             { $$ = (char *)"sampler2D"; }
> +       | SAMPLER2DRECT         { $$ = (char *)"sampler2DRect"; }
> +       | SAMPLER3D             { $$ = (char *)"sampler3D"; }
> +       | SAMPLERCUBE           { $$ = (char *)"samplerCube"; }
> +       | SAMPLEREXTERNALOES    { $$ = (char *)"samplerExternalOES"; }
> +       | SAMPLER1DSHADOW       { $$ = (char *)"sampler1DShadow"; }
> +       | SAMPLER2DSHADOW       { $$ = (char *)"sampler2DShadow"; }
> +       | SAMPLER2DRECTSHADOW   { $$ = (char *)"sampler2DRectShadow"; }
> +       | SAMPLERCUBESHADOW     { $$ = (char *)"samplerCubeShadow"; }
> +       | SAMPLER1DARRAY        { $$ = (char *)"sampler1DArray"; }
> +       | SAMPLER2DARRAY        { $$ = (char *)"sampler2DArray"; }
> +       | SAMPLER1DARRAYSHADOW  { $$ = (char *)"sampler1DArrayShadow"; }
> +       | SAMPLER2DARRAYSHADOW  { $$ = (char *)"sampler2DArrayShadow"; }
> +       | ISAMPLER1D            { $$ = (char *)"isampler1D"; }
> +       | ISAMPLER2D            { $$ = (char *)"isampler2D"; }
> +       | ISAMPLER3D            { $$ = (char *)"isampler3D"; }
> +       | ISAMPLERCUBE          { $$ = (char *)"isamplerCube"; }
> +       | ISAMPLER1DARRAY       { $$ = (char *)"isampler1DArray"; }
> +       | ISAMPLER2DARRAY       { $$ = (char *)"isampler2DArray"; }
> +       | USAMPLER1D            { $$ = (char *)"usampler1D"; }
> +       | USAMPLER2D            { $$ = (char *)"usampler2D"; }
> +       | USAMPLER3D            { $$ = (char *)"usampler3D"; }
> +       | USAMPLERCUBE          { $$ = (char *)"usamplerCube"; }
> +       | USAMPLER1DARRAY       { $$ = (char *)"usampler1DArray"; }
> +       | USAMPLER2DARRAY       { $$ = (char *)"usampler2DArray"; }
>        ;
>
>  precision_qualifier:
> --
> 1.7.9.5

I just came across this code in the parser a couple of days ago and
couldn't figure out why we were doing backflips to get the string. I
like this patch, but can't we go one step farther and return the
string directly from the lexer? Looking at the KEYWORD macro, we
already return the string when it's not identified as a keyword or
reserved word. Could we just set yylval->identifier in all cases and
use it directly in the parser?


More information about the mesa-dev mailing list