Mesa (master): lima/ppir: rework emit nir to ppir

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat May 9 13:52:02 UTC 2020


Module: Mesa
Branch: master
Commit: 570f1420dbf361cf889c21c119816e063ecc3cea
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=570f1420dbf361cf889c21c119816e063ecc3cea

Author: Erico Nunes <nunes.erico at gmail.com>
Date:   Thu Feb 13 20:21:00 2020 +0100

lima/ppir: rework emit nir to ppir

The previous code assumed that a ppir node would be created for each nir
instr and used that to add it to the list of nodes and verify success.
This didn't make much sense anymore since some emit paths create
multiple nodes anyway, and this didn't allow for an emit call to not
create any new ppir node while still returning success.

Signed-off-by: Erico Nunes <nunes.erico at gmail.com>
Reviewed-by: Vasily Khoruzhick <anarsoul at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4632>

---

 src/gallium/drivers/lima/ir/pp/nir.c | 83 ++++++++++++++++++++----------------
 1 file changed, 47 insertions(+), 36 deletions(-)

diff --git a/src/gallium/drivers/lima/ir/pp/nir.c b/src/gallium/drivers/lima/ir/pp/nir.c
index 5175888d247..3c02c0a811c 100644
--- a/src/gallium/drivers/lima/ir/pp/nir.c
+++ b/src/gallium/drivers/lima/ir/pp/nir.c
@@ -171,20 +171,20 @@ static int nir_to_ppir_opcodes[nir_num_opcodes] = {
    [nir_op_fddy] = ppir_op_ddy,
 };
 
-static ppir_node *ppir_emit_alu(ppir_block *block, nir_instr *ni)
+static bool ppir_emit_alu(ppir_block *block, nir_instr *ni)
 {
    nir_alu_instr *instr = nir_instr_as_alu(ni);
    int op = nir_to_ppir_opcodes[instr->op];
 
    if (op < 0) {
       ppir_error("unsupported nir_op: %s\n", nir_op_infos[instr->op].name);
-      return NULL;
+      return false;
    }
 
    ppir_alu_node *node = ppir_node_create_dest(block, op, &instr->dest.dest,
                                                instr->dest.write_mask);
    if (!node)
-      return NULL;
+      return false;
 
    ppir_dest *pd = &node->dest;
    nir_alu_dest *nd = &instr->dest;
@@ -217,7 +217,8 @@ static ppir_node *ppir_emit_alu(ppir_block *block, nir_instr *ni)
       ps->negate = ns->negate;
    }
 
-   return &node->node;
+   list_addtail(&node->node.list, &block->node_list);
+   return true;
 }
 
 static ppir_block *ppir_block_create(ppir_compiler *comp);
@@ -272,8 +273,9 @@ static ppir_node *ppir_emit_discard(ppir_block *block, nir_instr *ni)
    return node;
 }
 
-static ppir_node *ppir_emit_intrinsic(ppir_block *block, nir_instr *ni)
+static bool ppir_emit_intrinsic(ppir_block *block, nir_instr *ni)
 {
+   ppir_node *node;
    nir_intrinsic_instr *instr = nir_instr_as_intrinsic(ni);
    unsigned mask = 0;
    ppir_load_node *lnode;
@@ -286,7 +288,7 @@ static ppir_node *ppir_emit_intrinsic(ppir_block *block, nir_instr *ni)
 
       lnode = ppir_node_create_dest(block, ppir_op_load_varying, &instr->dest, mask);
       if (!lnode)
-         return NULL;
+         return false;
 
       lnode->num_components = instr->num_components;
       lnode->index = nir_intrinsic_base(instr) * 4 + nir_intrinsic_component(instr);
@@ -296,7 +298,8 @@ static ppir_node *ppir_emit_intrinsic(ppir_block *block, nir_instr *ni)
          lnode->num_src = 1;
          ppir_node_add_src(block->comp, &lnode->node, &lnode->src, instr->src, 1);
       }
-      return &lnode->node;
+      list_addtail(&lnode->node.list, &block->node_list);
+      return true;
 
    case nir_intrinsic_load_frag_coord:
    case nir_intrinsic_load_point_coord:
@@ -322,10 +325,11 @@ static ppir_node *ppir_emit_intrinsic(ppir_block *block, nir_instr *ni)
 
       lnode = ppir_node_create_dest(block, op, &instr->dest, mask);
       if (!lnode)
-         return NULL;
+         return false;
 
       lnode->num_components = instr->num_components;
-      return &lnode->node;
+      list_addtail(&lnode->node.list, &block->node_list);
+      return true;
 
    case nir_intrinsic_load_uniform:
       if (!instr->dest.is_ssa)
@@ -333,7 +337,7 @@ static ppir_node *ppir_emit_intrinsic(ppir_block *block, nir_instr *ni)
 
       lnode = ppir_node_create_dest(block, ppir_op_load_uniform, &instr->dest, mask);
       if (!lnode)
-         return NULL;
+         return false;
 
       lnode->num_components = instr->num_components;
       lnode->index = nir_intrinsic_base(instr);
@@ -344,12 +348,13 @@ static ppir_node *ppir_emit_intrinsic(ppir_block *block, nir_instr *ni)
          ppir_node_add_src(block->comp, &lnode->node, &lnode->src, instr->src, 1);
       }
 
-      return &lnode->node;
+      list_addtail(&lnode->node.list, &block->node_list);
+      return true;
 
    case nir_intrinsic_store_output: {
       alu_node = ppir_node_create_dest(block, ppir_op_store_color, NULL, 0);
       if (!alu_node)
-         return NULL;
+         return false;
 
       ppir_dest *dest = ppir_node_get_dest(&alu_node->node);
       dest->type = ppir_target_ssa;
@@ -365,28 +370,33 @@ static ppir_node *ppir_emit_intrinsic(ppir_block *block, nir_instr *ni)
       ppir_node_add_src(block->comp, &alu_node->node, alu_node->src, instr->src,
                         u_bit_consecutive(0, instr->num_components));
 
-      return &alu_node->node;
+      list_addtail(&alu_node->node.list, &block->node_list);
+      return true;
    }
 
    case nir_intrinsic_discard:
-      return ppir_emit_discard(block, ni);
+      node = ppir_emit_discard(block, ni);
+      list_addtail(&node->list, &block->node_list);
+      return true;
 
    case nir_intrinsic_discard_if:
-      return ppir_emit_discard_if(block, ni);
+      node = ppir_emit_discard_if(block, ni);
+      list_addtail(&node->list, &block->node_list);
+      return true;
 
    default:
       ppir_error("unsupported nir_intrinsic_instr %s\n",
                  nir_intrinsic_infos[instr->intrinsic].name);
-      return NULL;
+      return false;
    }
 }
 
-static ppir_node *ppir_emit_load_const(ppir_block *block, nir_instr *ni)
+static bool ppir_emit_load_const(ppir_block *block, nir_instr *ni)
 {
    nir_load_const_instr *instr = nir_instr_as_load_const(ni);
    ppir_const_node *node = ppir_node_create_ssa(block, ppir_op_const, &instr->def);
    if (!node)
-      return NULL;
+      return false;
 
    assert(instr->def.bit_size == 32);
 
@@ -394,24 +404,26 @@ static ppir_node *ppir_emit_load_const(ppir_block *block, nir_instr *ni)
       node->constant.value[i].i = instr->value[i].i32;
    node->constant.num = instr->def.num_components;
 
-   return &node->node;
+   list_addtail(&node->node.list, &block->node_list);
+   return true;
 }
 
-static ppir_node *ppir_emit_ssa_undef(ppir_block *block, nir_instr *ni)
+static bool ppir_emit_ssa_undef(ppir_block *block, nir_instr *ni)
 {
    nir_ssa_undef_instr *undef = nir_instr_as_ssa_undef(ni);
    ppir_node *node = ppir_node_create_ssa(block, ppir_op_undef, &undef->def);
    if (!node)
-      return NULL;
+      return false;
    ppir_alu_node *alu = ppir_node_to_alu(node);
 
    ppir_dest *dest = &alu->dest;
    dest->ssa.undef = true;
 
-   return node;
+   list_addtail(&node->list, &block->node_list);
+   return true;
 }
 
-static ppir_node *ppir_emit_tex(ppir_block *block, nir_instr *ni)
+static bool ppir_emit_tex(ppir_block *block, nir_instr *ni)
 {
    nir_tex_instr *instr = nir_instr_as_tex(ni);
    ppir_load_texture_node *node;
@@ -423,7 +435,7 @@ static ppir_node *ppir_emit_tex(ppir_block *block, nir_instr *ni)
       break;
    default:
       ppir_error("unsupported texop %d\n", instr->op);
-      return NULL;
+      return false;
    }
 
    unsigned mask = 0;
@@ -432,7 +444,7 @@ static ppir_node *ppir_emit_tex(ppir_block *block, nir_instr *ni)
 
    node = ppir_node_create_dest(block, ppir_op_load_texture, &instr->dest, mask);
    if (!node)
-      return NULL;
+      return false;
 
    node->sampler = instr->texture_index;
 
@@ -468,11 +480,12 @@ static ppir_node *ppir_emit_tex(ppir_block *block, nir_instr *ni)
          break;
       default:
          ppir_error("unsupported texture source type\n");
-         return NULL;
+         return false;
       }
    }
 
-   return &node->node;
+   list_addtail(&node->node.list, &block->node_list);
+   return true;
 }
 
 static ppir_block *ppir_get_block(ppir_compiler *comp, nir_block *nblock)
@@ -482,7 +495,7 @@ static ppir_block *ppir_get_block(ppir_compiler *comp, nir_block *nblock)
    return block;
 }
 
-static ppir_node *ppir_emit_jump(ppir_block *block, nir_instr *ni)
+static bool ppir_emit_jump(ppir_block *block, nir_instr *ni)
 {
    ppir_node *node;
    ppir_compiler *comp = block->comp;
@@ -502,24 +515,25 @@ static ppir_node *ppir_emit_jump(ppir_block *block, nir_instr *ni)
    break;
    default:
       ppir_error("nir_jump_instr not support\n");
-      return NULL;
+      return false;
    }
 
    assert(jump_block != NULL);
 
    node = ppir_node_create(block, ppir_op_branch, -1, 0);
    if (!node)
-      return NULL;
+      return false;
    branch = ppir_node_to_branch(node);
 
    /* Unconditional */
    branch->num_src = 0;
    branch->target = jump_block;
 
-   return node;
+   list_addtail(&node->list, &block->node_list);
+   return true;
 }
 
-static ppir_node *(*ppir_emit_instr[nir_instr_type_phi])(ppir_block *, nir_instr *) = {
+static bool (*ppir_emit_instr[nir_instr_type_phi])(ppir_block *, nir_instr *) = {
    [nir_instr_type_alu]        = ppir_emit_alu,
    [nir_instr_type_intrinsic]  = ppir_emit_intrinsic,
    [nir_instr_type_load_const] = ppir_emit_load_const,
@@ -552,11 +566,8 @@ static bool ppir_emit_block(ppir_compiler *comp, nir_block *nblock)
 
    nir_foreach_instr(instr, nblock) {
       assert(instr->type < nir_instr_type_phi);
-      ppir_node *node = ppir_emit_instr[instr->type](block, instr);
-      if (!node)
+      if (!ppir_emit_instr[instr->type](block, instr))
          return false;
-
-      list_addtail(&node->list, &block->node_list);
    }
 
    return true;



More information about the mesa-commit mailing list