ir3: disallow moving memory writes over discard

Writes to global memory should not be moved over discard,
otherwise we could have unintended side-effects or lack of
side-effects where they should be observed.

Fixes tests:
 dEQP-VK.rasterization.frag_side_effects.color_at_beginning.kill
 dEQP-VK.rasterization.frag_side_effects.color_at_end.kill

Signed-off-by: Danylo Piliaiev <dpiliaiev@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9365>
This commit is contained in:
Danylo Piliaiev
2021-03-02 14:30:01 +02:00
committed by Marge Bot
parent 7b3b8524ef
commit 7e25e5b56f

View File

@@ -1956,6 +1956,9 @@ emit_intrinsic(struct ir3_context *ctx, nir_intrinsic_instr *intr)
cond->regs[0]->flags &= ~IR3_REG_SSA;
kill = ir3_KILL(b, cond, 0);
/* Side-effects should not be moved on a different side of the kill */
kill->barrier_class = IR3_BARRIER_IMAGE_W | IR3_BARRIER_BUFFER_W;
kill->barrier_conflict = IR3_BARRIER_IMAGE_W | IR3_BARRIER_BUFFER_W;
kill->regs[1]->num = regid(REG_P0, 0);
array_insert(ctx->ir, ctx->ir->predicates, kill);