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 <kenneth@whitecape.org> Reviewed-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:
parent
7855482138
commit
308d4c7146
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue