ir_to_mesa: Emit more reduced writemasks for ops on small types.
authorEric Anholt <eric@anholt.net>
Thu, 6 May 2010 16:35:56 +0000 (09:35 -0700)
committerEric Anholt <eric@anholt.net>
Thu, 24 Jun 2010 22:05:19 +0000 (15:05 -0700)
This should help prevent Mesa from having to be smart to give
channel-wise drivers better information.

ir_to_mesa.cpp
ir_to_mesa.h

index 3976f437f93df1732abbea292c7408f0417413c3..a01c50cbc2fb8938aa153a1222c41bb60e4aeade 100644 (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) {
index 00328e5fab2c288d7a3ee66221af04aa17d83ac0..fbf10d86bb6d815b8344437a1c755bf9a95f5b9d 100644 (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);