summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorConnor Abbott <cwabbott0@gmail.com>2020-09-21 13:47:48 +0200
committerMarge Bot <eric+marge@anholt.net>2020-09-22 14:54:40 +0000
commit37054a3ef5d2d177eac90e24852742a04afd3dd4 (patch)
tree6d956765d6e090c4d478cfc35e2b36addb1ccdda
parent6ebc20fd884153db7cb9390692190664d993b640 (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.c52
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