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 <ian.d.romanick@intel.com> Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
@@ -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;
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user