glsl2: Add support for ir_unop_neg to ir_mat_op_to_vec
authorEric Anholt <eric@anholt.net>
Wed, 11 Aug 2010 02:52:02 +0000 (19:52 -0700)
committerEric Anholt <eric@anholt.net>
Sat, 14 Aug 2010 00:47:00 +0000 (17:47 -0700)
src/glsl/ir_mat_op_to_vec.cpp

index 880454c0076041f22f8a16e3a38c3d5b5490f6b8..80e057998612c1d43745f425723cfd2dd3a5304a 100644 (file)
@@ -311,6 +311,30 @@ ir_mat_op_to_vec_visitor::visit_leave(ir_assignment *assign)
 
    /* OK, time to break down this matrix operation. */
    switch (expr->operation) {
+   case ir_unop_neg: {
+      const unsigned mask = (1U << result_var->type->vector_elements) - 1;
+
+      /* Apply the operation to each column.*/
+      for (i = 0; i < matrix_columns; i++) {
+        ir_rvalue *op0 = get_column(op_var[0], i);
+        ir_dereference *result = get_column(result_var, i);
+        ir_expression *column_expr;
+        ir_assignment *column_assign;
+
+        column_expr = new(base_ir) ir_expression(expr->operation,
+                                                 result->type,
+                                                 op0,
+                                                 NULL);
+
+        column_assign = new(base_ir) ir_assignment(result,
+                                                   column_expr,
+                                                   NULL,
+                                                   mask);
+        assert(column_assign->write_mask != 0);
+        base_ir->insert_before(column_assign);
+      }
+      break;
+   }
    case ir_binop_add:
    case ir_binop_sub:
    case ir_binop_div: