diff options
author | Eric Anholt <[email protected]> | 2010-08-10 19:52:02 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2010-08-13 17:47:00 -0700 |
commit | 013bbbbb0ac52a12d1e4413700dc40dee70186f8 (patch) | |
tree | 37020720338ede6f75ab3b893a5e4ef40bc33a9b /src | |
parent | 2f4fe151681a6f6afe1d452eece6cf4144f44e49 (diff) |
glsl2: Add support for ir_unop_neg to ir_mat_op_to_vec
Diffstat (limited to 'src')
-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 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: |