ir_constant_expression: Add support for array == and !=.
Piglit parser tests const-array-03.frag and const-array-04.frag now generate the correct code.
This commit is contained in:
@@ -430,9 +430,14 @@ ir_constant::has_value(const ir_constant *c) const
|
|||||||
if (this->type != c->type)
|
if (this->type != c->type)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* FINISHME: This will probably also handle constant arrays as soon as those
|
if (this->type->is_array()) {
|
||||||
* FINISHME: are supported.
|
for (unsigned i = 0; i < this->type->length; i++) {
|
||||||
*/
|
if (this->array_elements[i]->has_value(c->array_elements[i]))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (this->type->base_type == GLSL_TYPE_STRUCT) {
|
if (this->type->base_type == GLSL_TYPE_STRUCT) {
|
||||||
const exec_node *a_node = this->components.head;
|
const exec_node *a_node = this->components.head;
|
||||||
const exec_node *b_node = c->components.head;
|
const exec_node *b_node = c->components.head;
|
||||||
|
@@ -73,6 +73,22 @@ ir_expression::constant_expression_value()
|
|||||||
components = op[1]->type->components();
|
components = op[1]->type->components();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *ctx = talloc_parent(this);
|
||||||
|
|
||||||
|
/* Handle array operations here, rather than below. */
|
||||||
|
if (op[0]->type->is_array()) {
|
||||||
|
assert(op[1] != NULL && op[1]->type->is_array());
|
||||||
|
switch (this->operation) {
|
||||||
|
case ir_binop_equal:
|
||||||
|
return new(ctx) ir_constant(op[0]->has_value(op[1]));
|
||||||
|
case ir_binop_nequal:
|
||||||
|
return new(ctx) ir_constant(!op[0]->has_value(op[1]));
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
switch (this->operation) {
|
switch (this->operation) {
|
||||||
case ir_unop_logic_not:
|
case ir_unop_logic_not:
|
||||||
assert(op[0]->type->base_type == GLSL_TYPE_BOOL);
|
assert(op[0]->type->base_type == GLSL_TYPE_BOOL);
|
||||||
@@ -616,7 +632,6 @@ ir_expression::constant_expression_value()
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *ctx = talloc_parent(this);
|
|
||||||
return new(ctx) ir_constant(this->type, &data);
|
return new(ctx) ir_constant(this->type, &data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user