From: Kenneth Graunke Date: Mon, 15 Jul 2013 22:39:35 +0000 (-0700) Subject: glsl: Change is_precision_statement to default_precision != none. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=308d4c71466af7ad5cbb99f8b4fddd743f2a2b25;p=mesa.git glsl: Change is_precision_statement to default_precision != none. Currently, we store precision in ast_type_specifier, rather than ast_type_qualifier. This works because precision is the last qualifier, and immediately adjacent to the type. Default precision statements (such as "precision highp float") are represented as ast_type_specifier objects, with a boolean to indicate that it's a default precision statement rather than an ordinary type. ast_type_specifier::precision will be moving to ast_type_qualifier soon, in order to support arbitrary qualifier ordering. However, we still need to store a "this is a precision statement" flag /and/ the default precision in ast_type_specifier. This patch changes the boolean into a new field, default_precision. If default_precision != ast_precision_none, it's a precision statement with the specified precision. Otherwise, it's an ordinary type. Signed-off-by: Kenneth Graunke Reviewed-by: Matt Turner --- diff --git a/src/glsl/ast.h b/src/glsl/ast.h index 816d5fccbbc..1208704ff6d 100644 --- a/src/glsl/ast.h +++ b/src/glsl/ast.h @@ -534,7 +534,7 @@ public: ast_expression *array_size) : ast_node(), type_name(that->type_name), structure(that->structure), is_array(is_array), array_size(array_size), precision(that->precision), - is_precision_statement(that->is_precision_statement) + default_precision(that->default_precision) { /* empty */ } @@ -543,7 +543,7 @@ public: ast_type_specifier(const char *name) : type_name(name), structure(NULL), is_array(false), array_size(NULL), precision(ast_precision_none), - is_precision_statement(false) + default_precision(ast_precision_none) { /* empty */ } @@ -552,7 +552,7 @@ public: ast_type_specifier(ast_struct_specifier *s) : type_name(s->name), structure(s), is_array(false), array_size(NULL), precision(ast_precision_none), - is_precision_statement(false) + default_precision(ast_precision_none) { /* empty */ } @@ -573,7 +573,8 @@ public: unsigned precision:2; - bool is_precision_statement; + /** For precision statements, this is the given precision; otherwise none. */ + unsigned default_precision:2; }; diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index 28ccf728870..c1a2af30aea 100644 --- a/src/glsl/ast_to_hir.cpp +++ b/src/glsl/ast_to_hir.cpp @@ -3958,7 +3958,7 @@ ir_rvalue * ast_type_specifier::hir(exec_list *instructions, struct _mesa_glsl_parse_state *state) { - if (!this->is_precision_statement && this->structure == NULL) + if (this->default_precision == ast_precision_none && this->structure == NULL) return NULL; YYLTYPE loc = this->get_location(); @@ -3984,7 +3984,7 @@ ast_type_specifier::hir(exec_list *instructions, * field can be either int or float [...]. Any other types or * qualifiers will result in an error. */ - if (this->is_precision_statement) { + if (this->default_precision != ast_precision_none) { assert(this->precision != ast_precision_none); assert(this->structure == NULL); /* The check for structures was * performed above. */ diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy index ff57c29741f..1a13f485503 100644 --- a/src/glsl/glsl_parser.yy +++ b/src/glsl/glsl_parser.yy @@ -793,7 +793,7 @@ declaration: | PRECISION precision_qualifier type_specifier_no_prec ';' { $3->precision = $2; - $3->is_precision_statement = true; + $3->default_precision = $2; $$ = $3; } | interface_block