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

Kenneth Graunke kenneth at whitecape.org
Thu Mar 29 23:17:32 PDT 2012


From: Eric Anholt <eric at anholt.net>

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.

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
---
 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(-)

This is just Eric's patch with the (char *) "..." casts removed.

diff --git a/src/glsl/ast.h b/src/glsl/ast.h
index 9c0cff8..9b1e0b1 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 5ab4b63..26cdc16 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		{ $$ = "void"; }
+	| FLOAT_TOK		{ $$ = "float"; }
+	| INT_TOK		{ $$ = "int"; }
+	| UINT_TOK		{ $$ = "uint"; }
+	| BOOL_TOK		{ $$ = "bool"; }
+	| VEC2			{ $$ = "vec2"; }
+	| VEC3			{ $$ = "vec3"; }
+	| VEC4			{ $$ = "vec4"; }
+	| BVEC2			{ $$ = "bvec2"; }
+	| BVEC3			{ $$ = "bvec3"; }
+	| BVEC4			{ $$ = "bvec4"; }
+	| IVEC2			{ $$ = "ivec2"; }
+	| IVEC3			{ $$ = "ivec3"; }
+	| IVEC4			{ $$ = "ivec4"; }
+	| UVEC2			{ $$ = "uvec2"; }
+	| UVEC3			{ $$ = "uvec3"; }
+	| UVEC4			{ $$ = "uvec4"; }
+	| MAT2X2		{ $$ = "mat2"; }
+	| MAT2X3		{ $$ = "mat2x3"; }
+	| MAT2X4		{ $$ = "mat2x4"; }
+	| MAT3X2		{ $$ = "mat3x2"; }
+	| MAT3X3		{ $$ = "mat3"; }
+	| MAT3X4		{ $$ = "mat3x4"; }
+	| MAT4X2		{ $$ = "mat4x2"; }
+	| MAT4X3		{ $$ = "mat4x3"; }
+	| MAT4X4		{ $$ = "mat4"; }
+	| SAMPLER1D		{ $$ = "sampler1D"; }
+	| SAMPLER2D		{ $$ = "sampler2D"; }
+	| SAMPLER2DRECT		{ $$ = "sampler2DRect"; }
+	| SAMPLER3D		{ $$ = "sampler3D"; }
+	| SAMPLERCUBE		{ $$ = "samplerCube"; }
+	| SAMPLEREXTERNALOES	{ $$ = "samplerExternalOES"; }
+	| SAMPLER1DSHADOW	{ $$ = "sampler1DShadow"; }
+	| SAMPLER2DSHADOW	{ $$ = "sampler2DShadow"; }
+	| SAMPLER2DRECTSHADOW	{ $$ = "sampler2DRectShadow"; }
+	| SAMPLERCUBESHADOW	{ $$ = "samplerCubeShadow"; }
+	| SAMPLER1DARRAY	{ $$ = "sampler1DArray"; }
+	| SAMPLER2DARRAY	{ $$ = "sampler2DArray"; }
+	| SAMPLER1DARRAYSHADOW	{ $$ = "sampler1DArrayShadow"; }
+	| SAMPLER2DARRAYSHADOW	{ $$ = "sampler2DArrayShadow"; }
+	| ISAMPLER1D		{ $$ = "isampler1D"; }
+	| ISAMPLER2D		{ $$ = "isampler2D"; }
+	| ISAMPLER3D		{ $$ = "isampler3D"; }
+	| ISAMPLERCUBE		{ $$ = "isamplerCube"; }
+	| ISAMPLER1DARRAY	{ $$ = "isampler1DArray"; }
+	| ISAMPLER2DARRAY	{ $$ = "isampler2DArray"; }
+	| USAMPLER1D		{ $$ = "usampler1D"; }
+	| USAMPLER2D		{ $$ = "usampler2D"; }
+	| USAMPLER3D		{ $$ = "usampler3D"; }
+	| USAMPLERCUBE		{ $$ = "usamplerCube"; }
+	| USAMPLER1DARRAY	{ $$ = "usampler1DArray"; }
+	| USAMPLER2DARRAY	{ $$ = "usampler2DArray"; }
 	;
 
 precision_qualifier:
-- 
1.7.7.6



More information about the mesa-dev mailing list