lima/ppir: add common helper for creating movs
authorVasily Khoruzhick <anarsoul@gmail.com>
Wed, 28 Aug 2019 05:22:01 +0000 (22:22 -0700)
committerVasily Khoruzhick <anarsoul@gmail.com>
Wed, 4 Sep 2019 00:02:13 +0000 (00:02 +0000)
Introduce common helper for creating movs to avoid code duplication

Reviewed-by: Erico Nunes <nunes.erico@gmail.com>
Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
src/gallium/drivers/lima/ir/pp/lower.c
src/gallium/drivers/lima/ir/pp/node.c
src/gallium/drivers/lima/ir/pp/ppir.h

index 5aca32e683e1622fbe5e792e93e4a7865ef4bef3..e49b20e8c7e40cb7b751c6dcde059e671aa8573d 100644 (file)
@@ -54,35 +54,22 @@ static bool ppir_lower_const(ppir_block *block, ppir_node *node)
       break;
    }
 
-   ppir_node *move = ppir_node_create(block, ppir_op_mov, -1, 0);
+   ppir_node *move = ppir_node_insert_mov(node);
    if (unlikely(!move))
       return false;
 
    ppir_debug("lower const create move %d for %d\n",
               move->index, node->index);
 
-   ppir_alu_node *alu = ppir_node_to_alu(move);
-   alu->dest = *dest;
-   alu->num_src = 1;
-   ppir_node_target_assign(alu->src, node);
-   for (int s = 0; s < 4; s++)
-      alu->src->swizzle[s] = s;
-
-   ppir_node_foreach_succ_safe(node, dep) {
-      ppir_node_replace_pred(dep, move);
-      ppir_node_replace_child(succ, node, move);
-   }
-
    /* Need to be careful with changing src/dst type here:
     * it has to be done *after* successors have their children
     * replaced, otherwise ppir_node_replace_child() won't find
     * matching src/dst and as result won't work
     */
-   alu->src->type = dest->type = ppir_target_pipeline;
-   alu->src->pipeline = dest->pipeline = ppir_pipeline_reg_const0;
+   ppir_src *mov_src = ppir_node_get_src(move, 0);
+   mov_src->type = dest->type = ppir_target_pipeline;
+   mov_src->pipeline = dest->pipeline = ppir_pipeline_reg_const0;
 
-   ppir_node_add_dep(move, node);
-   list_addtail(&move->list, &node->list);
    return true;
 }
 
@@ -109,27 +96,13 @@ static bool ppir_lower_load(ppir_block *block, ppir_node *node)
       return true;
    }
 
-   ppir_node *move = ppir_node_create(block, ppir_op_mov, -1 , 0);
+   ppir_node *move = ppir_node_insert_mov(node);
    if (unlikely(!move))
       return false;
 
-   ppir_alu_node *alu = ppir_node_to_alu(move);
-
-   alu->dest = *dest;
-
-   ppir_node_replace_all_succ(move, node);
-
    dest->type = ppir_target_pipeline;
    dest->pipeline = ppir_pipeline_reg_uniform;
 
-   alu->num_src = 1;
-   ppir_node_target_assign(&alu->src[0], node);
-   for (int i = 0; i < 4; i++)
-      alu->src->swizzle[i] = i;
-
-   ppir_node_add_dep(move, node);
-   list_addtail(&move->list, &node->list);
-
    return true;
 }
 
@@ -154,6 +127,12 @@ static bool ppir_lower_ddxy(ppir_block *block, ppir_node *node)
 static bool ppir_lower_texture(ppir_block *block, ppir_node *node)
 {
    ppir_load_texture_node *load_tex = ppir_node_to_load_texture(node);
+   ppir_dest *dest = ppir_node_get_dest(node);
+
+   if (ppir_node_is_root(node) && dest->type == ppir_target_ssa) {
+      ppir_node_delete(node);
+      return true;
+   }
 
    /* Create load_coords node */
    ppir_load_node *load = ppir_node_create(block, ppir_op_load_coords, -1, 0);
@@ -178,27 +157,16 @@ static bool ppir_lower_texture(ppir_block *block, ppir_node *node)
    ppir_node_add_dep(node, &load->node);
 
    /* Create move node */
-   ppir_node *move = ppir_node_create(block, ppir_op_mov, -1 , 0);
+   ppir_node *move = ppir_node_insert_mov(node);
    if (unlikely(!move))
       return false;
 
-   ppir_alu_node *alu = ppir_node_to_alu(move);
-
-   ppir_dest *dest = ppir_node_get_dest(node);
-   alu->dest = *dest;
-
-   ppir_node_replace_all_succ(move, node);
-
-   dest->type = ppir_target_pipeline;
-   dest->pipeline = ppir_pipeline_reg_sampler;
-
-   alu->num_src = 1;
-   ppir_node_target_assign(&alu->src[0], node);
-   for (int i = 0; i < 4; i++)
-      alu->src->swizzle[i] = i;
+   ppir_debug("lower texture create move %d for %d\n",
+              move->index, node->index);
 
-   ppir_node_add_dep(move, node);
-   list_addtail(&move->list, &node->list);
+   ppir_src *mov_src=  ppir_node_get_src(move, 0);
+   mov_src->type = dest->type = ppir_target_pipeline;
+   mov_src->pipeline = dest->pipeline = ppir_pipeline_reg_sampler;
 
    return true;
 }
index db141cac5c17bc2508a278ea00c697937a251c1b..fd6e2efa0359416b511a6b6a0af768f6b10a9861 100644 (file)
@@ -698,3 +698,25 @@ ppir_node *ppir_node_clone(ppir_block *block, ppir_node *node)
       return NULL;
    }
 }
+
+ppir_node *ppir_node_insert_mov(ppir_node *node)
+{
+   ppir_node *move = ppir_node_create(node->block, ppir_op_mov, -1, 0);
+   if (unlikely(!move))
+      return NULL;
+
+   ppir_dest *dest = ppir_node_get_dest(node);
+   ppir_alu_node *alu = ppir_node_to_alu(move);
+   alu->dest = *dest;
+   alu->num_src = 1;
+   ppir_node_target_assign(alu->src, node);
+
+   for (int s = 0; s < 4; s++)
+      alu->src->swizzle[s] = s;
+
+   ppir_node_replace_all_succ(move, node);
+   ppir_node_add_dep(move, node);
+   list_addtail(&move->list, &node->list);
+
+   return move;
+}
index 462cd93538a2f5556f94eae468bc19d880c4cf2f..ec649e4afa9a12f363118588ef4a533844386af3 100644 (file)
@@ -384,6 +384,8 @@ void ppir_node_replace_all_succ(ppir_node *dst, ppir_node *src);
 void ppir_node_replace_pred(ppir_dep *dep, ppir_node *new_pred);
 ppir_dep *ppir_dep_for_pred(ppir_node *node, ppir_node *pred);
 ppir_node *ppir_node_clone(ppir_block *block, ppir_node *node);
+/* Assumes that node successors are in the same block */
+ppir_node *ppir_node_insert_mov(ppir_node *node);
 
 static inline bool ppir_node_is_root(ppir_node *node)
 {