diff options
| author | Eric Anholt <eric@anholt.net> | 2010-08-10 19:52:02 -0700 | 
|---|---|---|
| committer | Eric Anholt <eric@anholt.net> | 2010-08-13 17:47:00 -0700 | 
| commit | 013bbbbb0ac52a12d1e4413700dc40dee70186f8 (patch) | |
| tree | 37020720338ede6f75ab3b893a5e4ef40bc33a9b | |
| parent | 2f4fe151681a6f6afe1d452eece6cf4144f44e49 (diff) | |
glsl2: Add support for ir_unop_neg to ir_mat_op_to_vec
| -rw-r--r-- | src/glsl/ir_mat_op_to_vec.cpp | 24 | 
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 880454c007..80e0579986 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: | 
