Module: Mesa Branch: master Commit: da9a1cb8a684cf4a30e6c292a80e7cab4c89482d URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=da9a1cb8a684cf4a30e6c292a80e7cab4c89482d
Author: Rob Clark <[email protected]> Date: Mon May 15 16:42:15 2017 -0400 freedreno/ir3: fix crash with atomics Atomics can have a result value. And sometimes it is even used. Signed-off-by: Rob Clark <[email protected]> --- src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c b/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c index dfebb62b16..a6908033ab 100644 --- a/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c +++ b/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c @@ -1248,7 +1248,7 @@ emit_intrinsic_store_ssbo(struct ir3_compile *ctx, nir_intrinsic_instr *intr) array_insert(b, b->keeps, stgb); } -static void +static struct ir3_instruction * emit_intrinsic_atomic(struct ir3_compile *ctx, nir_intrinsic_instr *intr) { struct ir3_block *b = ctx->block; @@ -1324,6 +1324,8 @@ emit_intrinsic_atomic(struct ir3_compile *ctx, nir_intrinsic_instr *intr) /* even if nothing consume the result, we can't DCE the instruction: */ array_insert(b, b->keeps, atomic); + + return atomic; } static void add_sysval_input_compmask(struct ir3_compile *ctx, @@ -1438,7 +1440,12 @@ emit_intrinsic(struct ir3_compile *ctx, nir_intrinsic_instr *intr) case nir_intrinsic_ssbo_atomic_xor: case nir_intrinsic_ssbo_atomic_exchange: case nir_intrinsic_ssbo_atomic_comp_swap: - emit_intrinsic_atomic(ctx, intr); + if (info->has_dest) { + compile_assert(ctx, intr->num_components == 1); + dst[0] = emit_intrinsic_atomic(ctx, intr); + } else { + emit_intrinsic_atomic(ctx, intr); + } break; case nir_intrinsic_store_output: idx = nir_intrinsic_base(intr); _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
