glsl: Drop the round-trip through ast_type_specifier for many builtin types.

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@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Eric Anholt
2012-03-29 23:17:32 -07:00
parent b2c0df2b60
commit eb7a71dea7
4 changed files with 58 additions and 186 deletions

View File

@@ -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 { class ast_type_specifier : public ast_node {
public: public:
ast_type_specifier(int specifier);
/** Construct a type specifier from a type name */ /** Construct a type specifier from a type name */
ast_type_specifier(const char *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_array(false), array_size(NULL), precision(ast_precision_none),
is_precision_statement(false) is_precision_statement(false)
{ {
@@ -492,7 +432,7 @@ public:
/** Construct a type specifier from a structure definition */ /** Construct a type specifier from a structure definition */
ast_type_specifier(ast_struct_specifier *s) 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_array(false), array_size(NULL), precision(ast_precision_none),
is_precision_statement(false) is_precision_statement(false)
{ {
@@ -507,8 +447,6 @@ public:
ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *); ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *);
enum ast_types type_specifier;
const char *type_name; const char *type_name;
ast_struct_specifier *structure; ast_struct_specifier *structure;

View File

@@ -3904,8 +3904,8 @@ ast_type_specifier::hir(exec_list *instructions,
"arrays"); "arrays");
return NULL; return NULL;
} }
if (this->type_specifier != ast_float if (strcmp(this->type_name, "float") != 0 &&
&& this->type_specifier != ast_int) { strcmp(this->type_name, "int") != 0) {
_mesa_glsl_error(&loc, state, _mesa_glsl_error(&loc, state,
"default precision statements apply only to types " "default precision statements apply only to types "
"float and int"); "float and int");

View File

@@ -29,7 +29,7 @@ extern "C" {
void void
ast_type_specifier::print(void) const ast_type_specifier::print(void) const
{ {
if (type_specifier == ast_struct) { if (structure) {
structure->print(); structure->print();
} else { } else {
printf("%s ", type_name); 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 bool
ast_fully_specified_type::has_qualifiers() const ast_fully_specified_type::has_qualifiers() const
{ {

View File

@@ -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
%type <type_specifier> type_specifier_no_prec %type <type_specifier> type_specifier_no_prec
%type <type_specifier> type_specifier_nonarray %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 <fully_specified_type> fully_specified_type
%type <function> function_prototype %type <function> function_prototype
%type <function> function_header %type <function> function_header
@@ -1365,58 +1365,58 @@ type_specifier_nonarray:
; ;
basic_type_specifier_nonarray: basic_type_specifier_nonarray:
VOID_TOK { $$ = ast_void; } VOID_TOK { $$ = "void"; }
| FLOAT_TOK { $$ = ast_float; } | FLOAT_TOK { $$ = "float"; }
| INT_TOK { $$ = ast_int; } | INT_TOK { $$ = "int"; }
| UINT_TOK { $$ = ast_uint; } | UINT_TOK { $$ = "uint"; }
| BOOL_TOK { $$ = ast_bool; } | BOOL_TOK { $$ = "bool"; }
| VEC2 { $$ = ast_vec2; } | VEC2 { $$ = "vec2"; }
| VEC3 { $$ = ast_vec3; } | VEC3 { $$ = "vec3"; }
| VEC4 { $$ = ast_vec4; } | VEC4 { $$ = "vec4"; }
| BVEC2 { $$ = ast_bvec2; } | BVEC2 { $$ = "bvec2"; }
| BVEC3 { $$ = ast_bvec3; } | BVEC3 { $$ = "bvec3"; }
| BVEC4 { $$ = ast_bvec4; } | BVEC4 { $$ = "bvec4"; }
| IVEC2 { $$ = ast_ivec2; } | IVEC2 { $$ = "ivec2"; }
| IVEC3 { $$ = ast_ivec3; } | IVEC3 { $$ = "ivec3"; }
| IVEC4 { $$ = ast_ivec4; } | IVEC4 { $$ = "ivec4"; }
| UVEC2 { $$ = ast_uvec2; } | UVEC2 { $$ = "uvec2"; }
| UVEC3 { $$ = ast_uvec3; } | UVEC3 { $$ = "uvec3"; }
| UVEC4 { $$ = ast_uvec4; } | UVEC4 { $$ = "uvec4"; }
| MAT2X2 { $$ = ast_mat2; } | MAT2X2 { $$ = "mat2"; }
| MAT2X3 { $$ = ast_mat2x3; } | MAT2X3 { $$ = "mat2x3"; }
| MAT2X4 { $$ = ast_mat2x4; } | MAT2X4 { $$ = "mat2x4"; }
| MAT3X2 { $$ = ast_mat3x2; } | MAT3X2 { $$ = "mat3x2"; }
| MAT3X3 { $$ = ast_mat3; } | MAT3X3 { $$ = "mat3"; }
| MAT3X4 { $$ = ast_mat3x4; } | MAT3X4 { $$ = "mat3x4"; }
| MAT4X2 { $$ = ast_mat4x2; } | MAT4X2 { $$ = "mat4x2"; }
| MAT4X3 { $$ = ast_mat4x3; } | MAT4X3 { $$ = "mat4x3"; }
| MAT4X4 { $$ = ast_mat4; } | MAT4X4 { $$ = "mat4"; }
| SAMPLER1D { $$ = ast_sampler1d; } | SAMPLER1D { $$ = "sampler1D"; }
| SAMPLER2D { $$ = ast_sampler2d; } | SAMPLER2D { $$ = "sampler2D"; }
| SAMPLER2DRECT { $$ = ast_sampler2drect; } | SAMPLER2DRECT { $$ = "sampler2DRect"; }
| SAMPLER3D { $$ = ast_sampler3d; } | SAMPLER3D { $$ = "sampler3D"; }
| SAMPLERCUBE { $$ = ast_samplercube; } | SAMPLERCUBE { $$ = "samplerCube"; }
| SAMPLEREXTERNALOES { $$ = ast_samplerexternaloes; } | SAMPLEREXTERNALOES { $$ = "samplerExternalOES"; }
| SAMPLER1DSHADOW { $$ = ast_sampler1dshadow; } | SAMPLER1DSHADOW { $$ = "sampler1DShadow"; }
| SAMPLER2DSHADOW { $$ = ast_sampler2dshadow; } | SAMPLER2DSHADOW { $$ = "sampler2DShadow"; }
| SAMPLER2DRECTSHADOW { $$ = ast_sampler2drectshadow; } | SAMPLER2DRECTSHADOW { $$ = "sampler2DRectShadow"; }
| SAMPLERCUBESHADOW { $$ = ast_samplercubeshadow; } | SAMPLERCUBESHADOW { $$ = "samplerCubeShadow"; }
| SAMPLER1DARRAY { $$ = ast_sampler1darray; } | SAMPLER1DARRAY { $$ = "sampler1DArray"; }
| SAMPLER2DARRAY { $$ = ast_sampler2darray; } | SAMPLER2DARRAY { $$ = "sampler2DArray"; }
| SAMPLER1DARRAYSHADOW { $$ = ast_sampler1darrayshadow; } | SAMPLER1DARRAYSHADOW { $$ = "sampler1DArrayShadow"; }
| SAMPLER2DARRAYSHADOW { $$ = ast_sampler2darrayshadow; } | SAMPLER2DARRAYSHADOW { $$ = "sampler2DArrayShadow"; }
| ISAMPLER1D { $$ = ast_isampler1d; } | ISAMPLER1D { $$ = "isampler1D"; }
| ISAMPLER2D { $$ = ast_isampler2d; } | ISAMPLER2D { $$ = "isampler2D"; }
| ISAMPLER3D { $$ = ast_isampler3d; } | ISAMPLER3D { $$ = "isampler3D"; }
| ISAMPLERCUBE { $$ = ast_isamplercube; } | ISAMPLERCUBE { $$ = "isamplerCube"; }
| ISAMPLER1DARRAY { $$ = ast_isampler1darray; } | ISAMPLER1DARRAY { $$ = "isampler1DArray"; }
| ISAMPLER2DARRAY { $$ = ast_isampler2darray; } | ISAMPLER2DARRAY { $$ = "isampler2DArray"; }
| USAMPLER1D { $$ = ast_usampler1d; } | USAMPLER1D { $$ = "usampler1D"; }
| USAMPLER2D { $$ = ast_usampler2d; } | USAMPLER2D { $$ = "usampler2D"; }
| USAMPLER3D { $$ = ast_usampler3d; } | USAMPLER3D { $$ = "usampler3D"; }
| USAMPLERCUBE { $$ = ast_usamplercube; } | USAMPLERCUBE { $$ = "usamplerCube"; }
| USAMPLER1DARRAY { $$ = ast_usampler1darray; } | USAMPLER1DARRAY { $$ = "usampler1DArray"; }
| USAMPLER2DARRAY { $$ = ast_usampler2darray; } | USAMPLER2DARRAY { $$ = "usampler2DArray"; }
; ;
precision_qualifier: precision_qualifier: