diff options
| -rw-r--r-- | ir_to_mesa.cpp | 16 | ||||
| -rw-r--r-- | ir_to_mesa.h | 2 | 
2 files changed, 14 insertions, 4 deletions
| diff --git a/ir_to_mesa.cpp b/ir_to_mesa.cpp index 3976f437f9..a01c50cbc2 100644 --- a/ir_to_mesa.cpp +++ b/ir_to_mesa.cpp @@ -177,9 +177,19 @@ ir_to_mesa_visitor::create_tree(int op,   * pass over the Mesa IR later.   */  void -ir_to_mesa_visitor::get_temp(struct mbtree *tree) +ir_to_mesa_visitor::get_temp(struct mbtree *tree, int size)  { +   int swizzle = 0; +   int i; +     ir_to_mesa_set_tree_reg(tree, PROGRAM_TEMPORARY, this->next_temp++); + +   for (i = 0; i < size; i++) +      swizzle |= 1 << i; +   for (; i < 4; i++) +      swizzle |= 1 << (size - 1); +   tree->src_reg.swizzle = swizzle; +   tree->dst_reg.writemask = (1 << size) - 1;  }  void @@ -349,7 +359,7 @@ ir_to_mesa_visitor::visit(ir_expression *ir)     }     /* Allocate a temporary for the result. */ -   this->get_temp(this->result); +   this->get_temp(this->result, ir->type->vector_elements);  } @@ -369,7 +379,7 @@ ir_to_mesa_visitor::visit(ir_swizzle *ir)     assert(this->result);     tree = this->create_tree(MB_TERM_swizzle_vec4, ir, this->result, NULL); -   this->get_temp(tree); +   this->get_temp(tree, 4);     for (i = 0; i < 4; i++) {        if (i < ir->type->vector_elements) { diff --git a/ir_to_mesa.h b/ir_to_mesa.h index 00328e5fab..fbf10d86bb 100644 --- a/ir_to_mesa.h +++ b/ir_to_mesa.h @@ -100,7 +100,7 @@ public:     int next_temp;     int next_constant; -   void get_temp(struct mbtree *tree); +   void get_temp(struct mbtree *tree, int size);     void get_temp_for_var(ir_variable *var, struct mbtree *tree); | 
