diff --git a/src/panfrost/compiler/IR_pseudo.xml b/src/panfrost/compiler/IR_pseudo.xml index 19e2483a07c..cf7029d3ba6 100644 --- a/src/panfrost/compiler/IR_pseudo.xml +++ b/src/panfrost/compiler/IR_pseudo.xml @@ -191,5 +191,6 @@ + diff --git a/src/panfrost/compiler/bi_pressure_schedule.c b/src/panfrost/compiler/bi_pressure_schedule.c index 1fa3134fecf..96cd9e2b19a 100644 --- a/src/panfrost/compiler/bi_pressure_schedule.c +++ b/src/panfrost/compiler/bi_pressure_schedule.c @@ -85,6 +85,8 @@ create_dag(bi_context *ctx, bi_block *block, void *memctx) bi_foreach_dest(I, d) last_write[I->dest[d].value] = node; + add_dep(node, preload); + switch (bi_opcode_props[I->op].message) { case BIFROST_MESSAGE_LOAD: /* Regular memory loads needs to be serialized against @@ -146,21 +148,22 @@ create_dag(bi_context *ctx, bi_block *block, void *memctx) break; } - add_dep(node, preload); - if (I->op == BI_OPCODE_DISCARD_F32) { /* Serialize against ATEST */ add_dep(node, coverage); coverage = node; - - /* Also serialize against memory and barriers */ + } + if (I->op == BI_OPCODE_DISCARD_F32 || + I->op == BI_OPCODE_MEMORY_BARRIER) { + /* Serialize against memory operations and barriers */ add_dep(node, memory_load); add_dep(node, memory_store); memory_load = node; memory_store = node; - } else if ((I->op == BI_OPCODE_PHI) || - (I->op == BI_OPCODE_MOV_I32 && - I->src[0].type == BI_INDEX_REGISTER)) { + } + if ((I->op == BI_OPCODE_PHI) || + (I->op == BI_OPCODE_MOV_I32 && + I->src[0].type == BI_INDEX_REGISTER)) { preload = node; } }