diff options
author | Ian Romanick <[email protected]> | 2017-09-20 16:19:15 -0500 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2017-10-30 09:27:09 -0700 |
commit | 34f7e761bc61d3086c1e4e42285c31678b256107 (patch) | |
tree | 6b89692f3cb93611ffb5a484ac903d74bb5bba15 /src | |
parent | 747c057530a1da32860f3881ca73a0d648e8f317 (diff) |
glsl/parser: Track built-in types using the glsl_type directly
Without the lexer changes, tests/glslparsertest/glsl2/tex_rect-02.frag
fails. Before this change, the parser would determine that
sampler2DRect is not a valid type because the call to
state->symbols->get_type() in ast_type_specifier::glsl_type() would
return NULL. Since ast_type_specifier::glsl_type() is now going to
return the glsl_type pointer that it received from the lexer, it doesn't
have an opportunity to generate an error.
text data bss dec hex filename
8255243 268856 294072 8818171 868dfb 32-bit i965_dri.so before
8255291 268856 294072 8818219 868e2b 32-bit i965_dri.so after
7815195 345592 420592 8581379 82f103 64-bit i965_dri.so before
7815339 345592 420592 8581523 82f193 64-bit i965_dri.so after
Signed-off-by: Ian Romanick <[email protected]>
Reviewed-by: Nicolai Hähnle <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/glsl/ast.h | 13 | ||||
-rw-r--r-- | src/compiler/glsl/ast_to_hir.cpp | 4 | ||||
-rw-r--r-- | src/compiler/glsl/glsl_lexer.ll | 21 | ||||
-rw-r--r-- | src/compiler/glsl/glsl_parser.yy | 2 |
4 files changed, 28 insertions, 12 deletions
diff --git a/src/compiler/glsl/ast.h b/src/compiler/glsl/ast.h index 1be86ac17d9..eee22482812 100644 --- a/src/compiler/glsl/ast.h +++ b/src/compiler/glsl/ast.h @@ -27,6 +27,7 @@ #include "list.h" #include "glsl_parser_extras.h" +#include "compiler/glsl_types.h" struct _mesa_glsl_parse_state; @@ -853,7 +854,7 @@ class ast_type_specifier : public ast_node { public: /** Construct a type specifier from a type name */ ast_type_specifier(const char *name) - : type_name(name), structure(NULL), array_specifier(NULL), + : type(NULL), type_name(name), structure(NULL), array_specifier(NULL), default_precision(ast_precision_none) { /* empty */ @@ -861,12 +862,19 @@ public: /** Construct a type specifier from a structure definition */ ast_type_specifier(ast_struct_specifier *s) - : type_name(s->name), structure(s), array_specifier(NULL), + : type(NULL), type_name(s->name), structure(s), array_specifier(NULL), default_precision(ast_precision_none) { /* empty */ } + ast_type_specifier(const glsl_type *t) + : type(t), type_name(t->name), structure(NULL), array_specifier(NULL), + default_precision(ast_precision_none) + { + /* empty */ + } + const struct glsl_type *glsl_type(const char **name, struct _mesa_glsl_parse_state *state) const; @@ -875,6 +883,7 @@ public: ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *); + const struct glsl_type *type; const char *type_name; ast_struct_specifier *structure; diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp index d7c8b47f9d4..6090ee92573 100644 --- a/src/compiler/glsl/ast_to_hir.cpp +++ b/src/compiler/glsl/ast_to_hir.cpp @@ -2361,7 +2361,9 @@ ast_type_specifier::glsl_type(const char **name, { const struct glsl_type *type; - if (structure) + if (this->type != NULL) + type = this->type; + else if (structure) type = structure->type; else type = state->symbols->get_type(this->type_name); diff --git a/src/compiler/glsl/glsl_lexer.ll b/src/compiler/glsl/glsl_lexer.ll index 5dad6eeb042..d2278ba01d6 100644 --- a/src/compiler/glsl/glsl_lexer.ll +++ b/src/compiler/glsl/glsl_lexer.ll @@ -132,18 +132,23 @@ static int classify_identifier(struct _mesa_glsl_parse_state *, const char *, /** * Like DEPRECATED_ES_KEYWORD, but for types */ -#define DEPRECATED_ES_TYPE(gtype) \ +#define DEPRECATED_ES_TYPE_WITH_ALT(alt_expr, gtype) \ do { \ if (yyextra->is_version(0, 300)) { \ - _mesa_glsl_error(yylloc, yyextra, \ - "illegal use of reserved word `%s'", yytext); \ - return ERROR_TOK; \ - } else { \ - yylval->type = gtype; \ + _mesa_glsl_error(yylloc, yyextra, \ + "illegal use of reserved word `%s'", yytext); \ + return ERROR_TOK; \ + } else if (alt_expr) { \ + yylval->type = gtype; \ return BASIC_TYPE_TOK; \ + } else { \ + return classify_identifier(yyextra, yytext, yyleng, yylval); \ } \ } while (0) +#define DEPRECATED_ES_TYPE(gtype) \ + DEPRECATED_ES_TYPE_WITH_ALT(true, gtype) + static int literal_integer(char *text, int len, struct _mesa_glsl_parse_state *state, YYSTYPE *lval, YYLTYPE *lloc, int base) @@ -619,9 +624,9 @@ dmat4x4 TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, gl fvec2 KEYWORD(110, 100, 0, 0, FVEC2); fvec3 KEYWORD(110, 100, 0, 0, FVEC3); fvec4 KEYWORD(110, 100, 0, 0, FVEC4); -sampler2DRect DEPRECATED_ES_TYPE(glsl_type::sampler2DRect_type); +sampler2DRect DEPRECATED_ES_TYPE_WITH_ALT(yyextra->ARB_texture_rectangle_enable, glsl_type::sampler2DRect_type); sampler3DRect KEYWORD(110, 100, 0, 0, SAMPLER3DRECT); -sampler2DRectShadow DEPRECATED_ES_TYPE(glsl_type::sampler2DRectShadow_type); +sampler2DRectShadow DEPRECATED_ES_TYPE_WITH_ALT(yyextra->ARB_texture_rectangle_enable, glsl_type::sampler2DRectShadow_type); sizeof KEYWORD(110, 100, 0, 0, SIZEOF); cast KEYWORD(110, 100, 0, 0, CAST); namespace KEYWORD(110, 100, 0, 0, NAMESPACE); diff --git a/src/compiler/glsl/glsl_parser.yy b/src/compiler/glsl/glsl_parser.yy index 0a5342571c6..19147c7a3ec 100644 --- a/src/compiler/glsl/glsl_parser.yy +++ b/src/compiler/glsl/glsl_parser.yy @@ -2189,7 +2189,7 @@ type_specifier_nonarray: basic_type_specifier_nonarray { void *ctx = state->linalloc; - $$ = new(ctx) ast_type_specifier($1->name); + $$ = new(ctx) ast_type_specifier($1); $$->set_location(@1); } | struct_specifier |