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

Author: Vasily Khoruzhick <[email protected]>
Date:   Sun Aug 18 22:57:54 2019 -0700

lima/ppir: add write after read deps for registers

For cases like:

(1) r1 = r2
(2) r2 = ssa1

We need to add (1) as dependency of (2), otherwise scheduler may
reorder them.

Tested-by: Andreas Baierl <[email protected]>
Reviewed-by: Qiang Yu <[email protected]>
Reviewed-by: Erico Nunes <[email protected]>
Signed-off-by: Vasily Khoruzhick <[email protected]>

---

 src/gallium/drivers/lima/ir/pp/nir.c | 27 +++++++++++++++++++++++++--
 1 file changed, 25 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/lima/ir/pp/nir.c 
b/src/gallium/drivers/lima/ir/pp/nir.c
index f7eaccd7c63..669e5fb4101 100644
--- a/src/gallium/drivers/lima/ir/pp/nir.c
+++ b/src/gallium/drivers/lima/ir/pp/nir.c
@@ -611,6 +611,28 @@ static void ppir_print_shader_db(struct nir_shader *nir, 
ppir_compiler *comp,
    free(shaderdb);
 }
 
+static void ppir_add_write_after_read_deps(ppir_compiler *comp)
+{
+   list_for_each_entry(ppir_block, block, &comp->block_list, list) {
+      list_for_each_entry(ppir_reg, reg, &comp->reg_list, list) {
+         ppir_node *write = NULL;
+         list_for_each_entry_rev(ppir_node, node, &block->node_list, list) {
+            for (int i = 0; i < ppir_node_get_src_num(node); i++) {
+               ppir_src *src = ppir_node_get_src(node, i);
+               if (src && src->type == ppir_target_register &&
+                   src->reg == reg &&
+                   write)
+                  ppir_node_add_dep(write, node);
+            }
+            ppir_dest *dest = ppir_node_get_dest(node);
+            if (dest && dest->type == ppir_target_register &&
+                dest->reg == reg)
+               write = node;
+         }
+      }
+   }
+}
+
 bool ppir_compile_nir(struct lima_fs_shader_state *prog, struct nir_shader 
*nir,
                       struct ra_regs *ra,
                       struct pipe_debug_callback *debug)
@@ -642,13 +664,14 @@ bool ppir_compile_nir(struct lima_fs_shader_state *prog, 
struct nir_shader *nir,
    if (comp->discard_block)
       list_addtail(&comp->discard_block->list, &comp->block_list);
 
-   ppir_add_ordering_deps(comp);
-
    ppir_node_print_prog(comp);
 
    if (!ppir_lower_prog(comp))
       goto err_out0;
 
+   ppir_add_ordering_deps(comp);
+   ppir_add_write_after_read_deps(comp);
+
    ppir_node_print_prog(comp);
 
    if (!ppir_node_to_instr(comp))

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to