lima/ppir: split ppir_op_undef into undef and dummy again
[mesa.git] / src / gallium / drivers / lima / ir / pp / node.c
index d5a173046305f402df0920b3682c85cf227c088c..e646a395ca7c8b28934d2c570649630240120c79 100644 (file)
@@ -260,6 +260,13 @@ const ppir_op_info ppir_op_infos[] = {
          PPIR_INSTR_SLOT_VARYING, PPIR_INSTR_SLOT_END
       },
    },
+   [ppir_op_load_coords_reg] = {
+      .name = "ld_coords_reg",
+      .type = ppir_node_type_load,
+      .slots = (int []) {
+         PPIR_INSTR_SLOT_VARYING, PPIR_INSTR_SLOT_END
+      },
+   },
    [ppir_op_load_fragcoord] = {
       .name = "ld_fragcoord",
       .type = ppir_node_type_load,
@@ -335,6 +342,12 @@ const ppir_op_info ppir_op_infos[] = {
          PPIR_INSTR_SLOT_BRANCH, PPIR_INSTR_SLOT_END
       },
    },
+   [ppir_op_undef] = {
+      .name = "undef",
+      .type = ppir_node_type_alu,
+      .slots = (int []) {
+      },
+   },
    [ppir_op_dummy] = {
       .name = "dummy",
       .type = ppir_node_type_alu,
@@ -387,7 +400,8 @@ void *ppir_node_create(ppir_block *block, ppir_op op, int index, unsigned mask)
    return node;
 }
 
-void ppir_node_add_dep(ppir_node *succ, ppir_node *pred)
+void ppir_node_add_dep(ppir_node *succ, ppir_node *pred,
+                       ppir_dep_type type)
 {
    /* don't add dep for two nodes from different block */
    if (succ->block != pred->block)
@@ -402,6 +416,7 @@ void ppir_node_add_dep(ppir_node *succ, ppir_node *pred)
    ppir_dep *dep = ralloc(succ, ppir_dep);
    dep->pred = pred;
    dep->succ = succ;
+   dep->type = type;
    list_addtail(&dep->pred_link, &succ->pred_list);
    list_addtail(&dep->succ_link, &pred->succ_list);
 }
@@ -447,7 +462,8 @@ void ppir_node_replace_child(ppir_node *parent, ppir_node *old_child, ppir_node
    case ppir_node_type_load_texture:
    {
       ppir_load_texture_node *load_texture = ppir_node_to_load_texture(parent);
-      _ppir_node_replace_child(&load_texture->src_coords, old_child, new_child);
+      for (int i = 0; i < load_texture->num_src; i++)
+         _ppir_node_replace_child(ppir_node_get_src(parent, i), old_child, new_child);
       break;
    }
    case ppir_node_type_store:
@@ -613,88 +629,69 @@ static ppir_node *ppir_node_clone_const(ppir_block *block, ppir_node *node)
    }
    new_cnode->dest.type = ppir_target_ssa;
    new_cnode->dest.ssa.num_components = cnode->dest.ssa.num_components;
-   new_cnode->dest.ssa.live_in = INT_MAX;
-   new_cnode->dest.ssa.live_out = 0;
    new_cnode->dest.write_mask = cnode->dest.write_mask;
 
    return &new_cnode->node;
 }
 
 static ppir_node *
-ppir_node_clone_tex(ppir_block *block, ppir_node *node)
+ppir_node_clone_load(ppir_block *block, ppir_node *node)
 {
-   ppir_load_texture_node *tex_node = ppir_node_to_load_texture(node);
-   ppir_node *tex_coords = tex_node->src_coords.node;
-
-   ppir_node *new_tex_coords = NULL;
+   ppir_load_node *load_node = ppir_node_to_load(node);
+   ppir_load_node *new_lnode = ppir_node_create(block, node->op, -1, 0);
 
-   ppir_load_texture_node *new_tnode = ppir_node_create(block, ppir_op_load_texture, -1, 0);
-   if (!new_tnode)
+   if (!new_lnode)
       return NULL;
 
-   list_addtail(&new_tnode->node.list, &block->node_list);
+   list_addtail(&new_lnode->node.list, &block->node_list);
 
-   if (tex_coords) {
-      new_tex_coords = ppir_node_clone(block, tex_coords);
-      if (!new_tex_coords)
-         return NULL;
-   }
+   new_lnode->num_components = load_node->num_components;
+   new_lnode->index = load_node->index;
 
    ppir_dest *dest = ppir_node_get_dest(node);
-   new_tnode->dest = *dest;
-
-   new_tnode->sampler_dim = tex_node->sampler_dim;
-
-   for (int i = 0; i < 4; i++)
-      new_tnode->src_coords.swizzle[i] = tex_node->src_coords.swizzle[i];
+   new_lnode->dest = *dest;
 
-   for (int i = 0; i < ppir_node_get_src_num(node); i++) {
-      ppir_src *src = ppir_node_get_src(node, i);
-      ppir_src *new_src = ppir_node_get_src(&new_tnode->node, i);
+   ppir_src *src = ppir_node_get_src(node, 0);
+   if (src) {
+      new_lnode->num_src = 1;
       switch (src->type) {
-      case ppir_target_ssa: {
-         ppir_node_target_assign(new_src, new_tex_coords);
-         ppir_node_add_dep(&new_tnode->node, new_tex_coords);
-         break;
-      }
-      case ppir_target_register: {
-         new_src->type = src->type;
-         new_src->reg = src->reg;
-         new_src->node = NULL;
+      case ppir_target_ssa:
+         ppir_node_target_assign(&new_lnode->src, src->node);
+         ppir_node_add_dep(&new_lnode->node, src->node, ppir_dep_src);
          break;
-      }
-      case ppir_target_pipeline: {
-         new_src->type = src->type;
-         new_src->pipeline = src->pipeline;
+      case ppir_target_register:
+         new_lnode->src.type = src->type;
+         new_lnode->src.reg = src->reg;
+         new_lnode->src.node = NULL;
          break;
-      }
       default:
-         /* pipeline is not expected here */
+         /* Load nodes can't consume pipeline registers */
          assert(0);
       }
    }
 
-   return &new_tnode->node;
+   return &new_lnode->node;
 }
 
-static ppir_node *
-ppir_node_clone_load(ppir_block *block, ppir_node *node)
+void
+ppir_delete_if_orphan(ppir_block *block, ppir_node *node)
 {
-   ppir_load_node *load_node = ppir_node_to_load(node);
-   ppir_load_node *new_lnode = ppir_node_create(block, node->op, -1, 0);
-
-   if (!new_lnode)
-      return NULL;
-
-   list_addtail(&new_lnode->node.list, &block->node_list);
-
-   new_lnode->num_components = load_node->num_components;
-   new_lnode->index = load_node->index;
-
    ppir_dest *dest = ppir_node_get_dest(node);
-   new_lnode->dest = *dest;
+   if (!dest)
+      return;
 
-   return &new_lnode->node;
+   ppir_node_foreach_succ_safe(node, dep) {
+      ppir_node *succ = dep->succ;
+      for (int i = 0; i < ppir_node_get_src_num(succ); i++) {
+         ppir_src *src = ppir_node_get_src(succ, i);
+         if (!src)
+            continue;
+         if (ppir_node_target_equal(src, dest))
+            return;
+      }
+   }
+
+   ppir_node_delete(node);
 }
 
 ppir_node *ppir_node_clone(ppir_block *block, ppir_node *node)
@@ -702,12 +699,11 @@ ppir_node *ppir_node_clone(ppir_block *block, ppir_node *node)
    switch (node->op) {
    case ppir_op_const:
       return ppir_node_clone_const(block, node);
-   case ppir_op_load_texture:
-      return ppir_node_clone_tex(block, node);
    case ppir_op_load_uniform:
    case ppir_op_load_varying:
    case ppir_op_load_temp:
    case ppir_op_load_coords:
+   case ppir_op_load_coords_reg:
       return ppir_node_clone_load(block, node);
    default:
       return NULL;
@@ -730,8 +726,25 @@ ppir_node *ppir_node_insert_mov(ppir_node *node)
       alu->src->swizzle[s] = s;
 
    ppir_node_replace_all_succ(move, node);
-   ppir_node_add_dep(move, node);
+   ppir_node_add_dep(move, node, ppir_dep_src);
    list_addtail(&move->list, &node->list);
 
    return move;
 }
+
+bool ppir_node_has_single_src_succ(ppir_node *node)
+{
+   if (list_is_singular(&node->succ_list) &&
+       list_first_entry(&node->succ_list,
+                        ppir_dep, succ_link)->type == ppir_dep_src)
+      return true;
+
+   int cnt = 0;
+   ppir_node_foreach_succ(node, dep) {
+      if (dep->type != ppir_dep_src)
+         continue;
+      cnt++;
+   }
+
+   return cnt == 1;
+}