[Mesa-dev] [PATCH 6/7] glsl/parser: Track built-in types using the glsl_type directly
Ian Romanick
idr at freedesktop.org
Wed Oct 18 14:39:31 UTC 2017
On 10/17/2017 12:54 PM, Nicolai Hähnle wrote:
> On 17.10.2017 20:14, Ian Romanick wrote:
>> From: Ian Romanick <ian.d.romanick at intel.com>
>>
>> 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
>
> How does this change lead to such a big reduction, and shouldn't the
> lexer changes be in a separate patch?
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.
It took me a bit to remember why I did it like this, so, at the very
least, I will add that text to the commit message.
> Cheers,
> Nicolai
>
>>
>> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
>> ---
>> src/compiler/glsl/ast.h | 13 +++++++++++--
>> src/compiler/glsl/ast_to_hir.cpp | 4 +++-
>> src/compiler/glsl/glsl_lexer.ll | 21 +++++++++++++--------
>> 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 1be86ac..eee2248 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 d7c8b47..6090ee9 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 5dad6ee..d2278ba 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 0a53425..19147c7 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
>>
>
>
More information about the mesa-dev
mailing list