gallivm: Handle invalid image format/op combinations
authorKonstantin Seurer <konstantin.seurer@gmail.com>
Sun, 28 May 2023 09:36:13 +0000 (11:36 +0200)
committerMarge Bot <emma+marge@anholt.net>
Thu, 8 Jun 2023 06:07:37 +0000 (06:07 +0000)
Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23515>

src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c

index 66734b0..6262c02 100644 (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;
    }