diff options
author | Connor Abbott <cwabbott0@gmail.com> | 2020-09-21 13:47:48 +0200 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2020-09-22 14:54:40 +0000 |
commit | 37054a3ef5d2d177eac90e24852742a04afd3dd4 (patch) | |
tree | 6d956765d6e090c4d478cfc35e2b36addb1ccdda | |
parent | 6ebc20fd884153db7cb9390692190664d993b640 (diff) |
ir3: Don't use the format to get the image type
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>
-rw-r--r-- | src/freedreno/ir3/ir3_image.c | 52 |
1 files changed, 48 insertions, 4 deletions
diff --git a/src/freedreno/ir3/ir3_image.c b/src/freedreno/ir3/ir3_image.c index b89f74d5de9..1647f437676 100644 --- a/src/freedreno/ir3/ir3_image.c +++ b/src/freedreno/ir3/ir3_image.c @@ -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 |