ir_constant_expression: Add support for array == and !=.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 20 Jul 2010 10:08:32 +0000 (03:08 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 21 Jul 2010 23:38:33 +0000 (16:38 -0700)
Piglit parser tests const-array-03.frag and const-array-04.frag now
generate the correct code.

src/glsl/ir.cpp
src/glsl/ir_constant_expression.cpp

index d3f7302b54f47adf14dc2a66f2ce408f2f5b58e1..5054ec725ccaff39e02c935843528523b09b68f3 100644 (file)
@@ -430,9 +430,14 @@ ir_constant::has_value(const ir_constant *c) const
    if (this->type != c->type)
       return false;
 
-   /* FINISHME: This will probably also handle constant arrays as soon as those
-    * FINISHME: are supported.
-    */
+   if (this->type->is_array()) {
+      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) {
       const exec_node *a_node = this->components.head;
       const exec_node *b_node = c->components.head;
index d72a57c66abe9c2fe7337b8194ef75f8c6ec4926..5bef17c7554eedfec5dd8b1ba45a4f7295bc139b 100644 (file)
@@ -73,6 +73,22 @@ ir_expression::constant_expression_value()
       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) {
    case ir_unop_logic_not:
       assert(op[0]->type->base_type == GLSL_TYPE_BOOL);
@@ -616,7 +632,6 @@ ir_expression::constant_expression_value()
       return NULL;
    }
 
-   void *ctx = talloc_parent(this);
    return new(ctx) ir_constant(this->type, &data);
 }