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 {
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;

View File

@@ -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");

View File

@@ -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
{

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_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: