Mesa (master): ir3: Don't use the format to get the image type

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Sep 22 15:08:05 UTC 2020


Module: Mesa
Branch: master
Commit: 37054a3ef5d2d177eac90e24852742a04afd3dd4
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=37054a3ef5d2d177eac90e24852742a04afd3dd4

Author: Connor Abbott <cwabbott0 at gmail.com>
Date:   Mon Sep 21 13:47:48 2020 +0200

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>

---

 src/freedreno/ir3/ir3_image.c | 52 +++++++++++++++++++++++++++++++++++++++----
 1 file 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



More information about the mesa-commit mailing list