Add bool/int conversion as IR operations.
authorEric Anholt <eric@anholt.net>
Fri, 2 Apr 2010 12:17:08 +0000 (02:17 -1000)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 2 Apr 2010 18:22:41 +0000 (11:22 -0700)
Fixes constructor-09.glsl and CorrectParse2.frag.

ast_function.cpp
ir.cpp
ir.h
ir_print_visitor.cpp

index 2ca8976..09b7879 100644 (file)
@@ -130,7 +130,7 @@ convert_component(ir_rvalue *src, const glsl_type *desired_type)
         return new ir_expression(ir_unop_f2i, desired_type, src, NULL);
       else {
         assert(b == GLSL_TYPE_BOOL);
-        assert(!"FINISHME: Convert bool to int / uint.");
+        return new ir_expression(ir_unop_f2b, desired_type, src, NULL);
       }
    case GLSL_TYPE_FLOAT:
       switch (b) {
diff --git a/ir.cpp b/ir.cpp
index 674ba10..dd426df 100644 (file)
--- a/ir.cpp
+++ b/ir.cpp
@@ -66,6 +66,8 @@ ir_expression::get_num_operands(void)
       1, /* ir_unop_i2f */
       1, /* ir_unop_f2b */
       1, /* ir_unop_b2f */
+      1, /* ir_unop_i2b */
+      1, /* ir_unop_b2i */
       1, /* ir_unop_u2f */
 
       1, /* ir_unop_trunc */
diff --git a/ir.h b/ir.h
index 58aa631..3caff36 100644 (file)
--- a/ir.h
+++ b/ir.h
@@ -318,6 +318,8 @@ enum ir_expression_operation {
    ir_unop_i2f,      /**< Integer-to-float conversion. */
    ir_unop_f2b,      /**< Float-to-boolean conversion */
    ir_unop_b2f,      /**< Boolean-to-float conversion */
+   ir_unop_i2b,      /**< int-to-boolean conversion */
+   ir_unop_b2i,      /**< Boolean-to-int conversion */
    ir_unop_u2f,      /**< Unsigned-to-float conversion. */
 
    /**
index e3aeb69..e1fedd7 100644 (file)
@@ -102,6 +102,8 @@ void ir_print_visitor::visit(ir_expression *ir)
       "i2f",
       "f2b",
       "b2f",
+      "i2b",
+      "b2i",
       "u2f",
       "trunc",
       "ceil",