summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2010-08-10 19:52:02 -0700
committerEric Anholt <eric@anholt.net>2010-08-13 17:47:00 -0700
commit013bbbbb0ac52a12d1e4413700dc40dee70186f8 (patch)
tree37020720338ede6f75ab3b893a5e4ef40bc33a9b
parent2f4fe151681a6f6afe1d452eece6cf4144f44e49 (diff)
glsl2: Add support for ir_unop_neg to ir_mat_op_to_vec
-rw-r--r--src/glsl/ir_mat_op_to_vec.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/glsl/ir_mat_op_to_vec.cpp b/src/glsl/ir_mat_op_to_vec.cpp
index 880454c0076..80e05799861 100644
--- a/src/glsl/ir_mat_op_to_vec.cpp
+++ b/src/glsl/ir_mat_op_to_vec.cpp
@@ -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: