Handle constant expressions using derefs of const values.

Fixes CorrectParse1.frag and makes for a ton of folding in
CorrectParse2.frag.
This commit is contained in:
Eric Anholt 2010-04-06 10:30:54 -07:00
parent 3fff009af1
commit 326c676236
4 changed files with 19 additions and 3 deletions

View File

@ -1603,12 +1603,15 @@ ast_declarator_list::hir(exec_list *instructions,
* declaration.
*/
if (this->type->qualifier.constant) {
rhs = rhs->constant_expression_value();
if (!rhs) {
ir_constant *constant_value = rhs->constant_expression_value();
if (!constant_value) {
_mesa_glsl_error(& initializer_loc, state,
"initializer of const variable `%s' must be a "
"constant expression",
decl->identifier);
} else {
rhs = constant_value;
var->constant_value = constant_value;
}
}

1
ir.cpp
View File

@ -338,6 +338,7 @@ ir_variable::ir_variable(const struct glsl_type *type, const char *name)
{
this->type = type;
this->name = name;
this->constant_value = NULL;
if (type && type->base_type == GLSL_TYPE_SAMPLER)
this->read_only = true;

5
ir.h
View File

@ -154,6 +154,11 @@ public:
* equality). This flag enables this behavior.
*/
unsigned array_lvalue:1;
/**
* Value assigned in the initializer of a variable declared "const"
*/
ir_constant *constant_value;
};

View File

@ -395,8 +395,15 @@ ir_constant_visitor::visit(ir_swizzle *ir)
void
ir_constant_visitor::visit(ir_dereference *ir)
{
(void) ir;
value = NULL;
if (ir->mode == ir_dereference::ir_reference_variable) {
ir_variable *var = ir->var->as_variable();
if (var && var->constant_value) {
value = new ir_constant(ir->type, &var->constant_value->value);
}
}
/* FINISHME: Other dereference modes. */
}