gallivm: Handle invalid image format/op combinations

Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23515>
This commit is contained in:
Konstantin Seurer 2023-05-28 11:36:13 +02:00 committed by Marge Bot
parent 1841dd7549
commit a2159dfe8a

View file

@ -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;
}