ir3: Don't use the format to get the image type
authorConnor Abbott <cwabbott0@gmail.com>
Mon, 21 Sep 2020 11:47:48 +0000 (13:47 +0200)
committerMarge Bot <eric+marge@anholt.net>
Tue, 22 Sep 2020 14:54:40 +0000 (14:54 +0000)
Use the sampler type instead, which was recently plumbed through core
NIR, for load/store and the right type for atomics. This removes the
last hard dependency on the image format.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6800>

src/freedreno/ir3/ir3_image.c

index b89f74d..1647f43 100644 (file)
@@ -113,14 +113,58 @@ ir3_get_type_for_image_intrinsic(const nir_intrinsic_instr *instr)
 {
        const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic];
        int bit_size = info->has_dest ? nir_dest_bit_size(instr->dest) : 32;
-       enum pipe_format format = nir_intrinsic_format(instr);
 
-       if (util_format_is_pure_uint(format))
+       nir_alu_type type = nir_type_uint;
+       switch (instr->intrinsic) {
+       case nir_intrinsic_image_load:
+       case nir_intrinsic_bindless_image_load:
+       case nir_intrinsic_image_store:
+       case nir_intrinsic_bindless_image_store:
+               type = nir_alu_type_get_base_type(nir_intrinsic_type(instr));
+               break;
+
+       case nir_intrinsic_image_atomic_add:
+       case nir_intrinsic_bindless_image_atomic_add:
+       case nir_intrinsic_image_atomic_umin:
+       case nir_intrinsic_bindless_image_atomic_umin:
+       case nir_intrinsic_image_atomic_umax:
+       case nir_intrinsic_bindless_image_atomic_umax:
+       case nir_intrinsic_image_atomic_and:
+       case nir_intrinsic_bindless_image_atomic_and:
+       case nir_intrinsic_image_atomic_or:
+       case nir_intrinsic_bindless_image_atomic_or:
+       case nir_intrinsic_image_atomic_xor:
+       case nir_intrinsic_bindless_image_atomic_xor:
+       case nir_intrinsic_image_atomic_exchange:
+       case nir_intrinsic_bindless_image_atomic_exchange:
+       case nir_intrinsic_image_atomic_comp_swap:
+       case nir_intrinsic_bindless_image_atomic_comp_swap:
+       case nir_intrinsic_image_atomic_inc_wrap:
+       case nir_intrinsic_bindless_image_atomic_inc_wrap:
+               type = nir_type_uint;
+               break;
+
+       case nir_intrinsic_image_atomic_imin:
+       case nir_intrinsic_bindless_image_atomic_imin:
+       case nir_intrinsic_image_atomic_imax:
+       case nir_intrinsic_bindless_image_atomic_imax:
+               type = nir_type_int;
+               break;
+
+       default:
+               unreachable("Unhandled NIR image intrinsic");
+       }
+
+       switch (type) {
+       case nir_type_uint:
                return bit_size == 16 ? TYPE_U16 : TYPE_U32;
-       else if (util_format_is_pure_sint(format))
+       case nir_type_int:
                return bit_size == 16 ? TYPE_S16 : TYPE_S32;
-       else
+       case nir_type_float:
                return bit_size == 16 ? TYPE_F16 : TYPE_F32;
+       default:
+               unreachable("bad type");
+       }
 }
 
 /* Returns the number of components for the different image formats