From a2159dfe8aa6cc869cb4e942f84d25d332dd5259 Mon Sep 17 00:00:00 2001 From: Konstantin Seurer Date: Sun, 28 May 2023 11:36:13 +0200 Subject: [PATCH] gallivm: Handle invalid image format/op combinations Reviewed-by: Dave Airlie Part-of: --- src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c | 38 +++++++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c index 66734b0..6262c02 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c @@ -4650,9 +4650,41 @@ lp_build_do_atomic_soa(struct gallivm_state *gallivm, { const enum pipe_format format = format_desc->format; - if (format != PIPE_FORMAT_R32_UINT && - format != PIPE_FORMAT_R32_SINT && - format != PIPE_FORMAT_R32_FLOAT) { + bool valid = format == PIPE_FORMAT_R32_UINT || + format == PIPE_FORMAT_R32_SINT || + format == PIPE_FORMAT_R32_FLOAT; + + bool integer = format != PIPE_FORMAT_R32_FLOAT; + if (img_op == LP_IMG_ATOMIC) { + switch (op) { + case LLVMAtomicRMWBinOpAdd: + case LLVMAtomicRMWBinOpSub: + case LLVMAtomicRMWBinOpAnd: + case LLVMAtomicRMWBinOpNand: + case LLVMAtomicRMWBinOpOr: + case LLVMAtomicRMWBinOpXor: + case LLVMAtomicRMWBinOpMax: + case LLVMAtomicRMWBinOpMin: + case LLVMAtomicRMWBinOpUMax: + case LLVMAtomicRMWBinOpUMin: + valid &= integer; + break; + case LLVMAtomicRMWBinOpFAdd: + case LLVMAtomicRMWBinOpFSub: +#if LLVM_VERSION_MAJOR >= 15 + case LLVMAtomicRMWBinOpFMax: + case LLVMAtomicRMWBinOpFMin: +#endif + valid &= !integer; + break; + default: + break; + } + } else { + valid &= integer; + } + + if (!valid) { atomic_result[0] = lp_build_zero(gallivm, type); return; } -- 2.7.4