[Mesa-dev] [PATCH 6/7] glsl/parser: Track built-in types using the glsl_type directly

Nicolai Hähnle nhaehnle at gmail.com
Mon Oct 23 16:22:16 UTC 2017


On 18.10.2017 16:39, Ian Romanick wrote:
> 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.

Seems reasonable, thanks for the explanation. With the explanation 
added, this patch has my R-b as well.

Cheers,
Nicolai


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


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list