ir_to_mesa: Emit more reduced writemasks for ops on small types.

This should help prevent Mesa from having to be smart to give
channel-wise drivers better information.
This commit is contained in:
Eric Anholt
2010-05-06 09:35:56 -07:00
parent b07cc372c6
commit 3d70d1f4d6
2 changed files with 14 additions and 4 deletions
+13 -3
View File
@@ -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) {
+1 -1
View File
@@ -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);