nir: Allow 64-bit image atomics
authorJason Ekstrand <jason@jlekstrand.net>
Tue, 17 Mar 2020 22:45:28 +0000 (17:45 -0500)
committerMarge Bot <eric+marge@anholt.net>
Mon, 9 Nov 2020 17:17:39 +0000 (17:17 +0000)
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7509>

src/compiler/nir/nir_validate.c

index 2b0df24..b974bc9 100644 (file)
@@ -722,10 +722,14 @@ validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state)
    case nir_intrinsic_bindless_image_atomic_xor:
    case nir_intrinsic_bindless_image_atomic_comp_swap: {
       enum pipe_format format = image_intrin_format(instr);
-      validate_assert(state, format == PIPE_FORMAT_COUNT ||
-                             format == PIPE_FORMAT_R32_UINT ||
-                             format == PIPE_FORMAT_R32_SINT);
-      validate_assert(state, nir_dest_bit_size(instr->dest) == 32);
+      if (format != PIPE_FORMAT_COUNT) {
+         validate_assert(state, format == PIPE_FORMAT_R32_UINT ||
+                                format == PIPE_FORMAT_R32_SINT ||
+                                format == PIPE_FORMAT_R64_UINT ||
+                                format == PIPE_FORMAT_R64_SINT);
+         validate_assert(state, nir_dest_bit_size(instr->dest) ==
+                                util_format_get_blocksizebits(format));
+      }
       break;
    }
 
@@ -733,11 +737,15 @@ validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state)
    case nir_intrinsic_image_atomic_exchange:
    case nir_intrinsic_bindless_image_atomic_exchange: {
       enum pipe_format format = image_intrin_format(instr);
-      validate_assert(state, format == PIPE_FORMAT_COUNT ||
-                             format == PIPE_FORMAT_R32_UINT ||
-                             format == PIPE_FORMAT_R32_SINT ||
-                             format == PIPE_FORMAT_R32_FLOAT);
-      validate_assert(state, nir_dest_bit_size(instr->dest) == 32);
+      if (format != PIPE_FORMAT_COUNT) {
+         validate_assert(state, format == PIPE_FORMAT_R32_UINT ||
+                                format == PIPE_FORMAT_R32_SINT ||
+                                format == PIPE_FORMAT_R32_FLOAT ||
+                                format == PIPE_FORMAT_R64_UINT ||
+                                format == PIPE_FORMAT_R64_SINT);
+         validate_assert(state, nir_dest_bit_size(instr->dest) ==
+                                util_format_get_blocksizebits(format));
+      }
       break;
    }