Mesa (master): freedreno: support 16b for the sampler opcode

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Nov 20 14:38:28 UTC 2019


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

Author: Hyunjun Ko <zzoon at igalia.com>
Date:   Wed Oct 23 09:08:57 2019 +0000

freedreno: support 16b for the sampler opcode

Reviewed-by: Rob Clark <robdclark at gmail.com>

---

 src/freedreno/ir3/ir3_compiler_nir.c | 50 +++++++++++++++++++++++-------------
 src/freedreno/ir3/ir3_image.c        |  6 +++++
 2 files changed, 38 insertions(+), 18 deletions(-)

diff --git a/src/freedreno/ir3/ir3_compiler_nir.c b/src/freedreno/ir3/ir3_compiler_nir.c
index 895ba9771dd..fd490a8dead 100644
--- a/src/freedreno/ir3/ir3_compiler_nir.c
+++ b/src/freedreno/ir3/ir3_compiler_nir.c
@@ -1091,9 +1091,11 @@ emit_intrinsic_image_size(struct ir3_context *ctx, nir_intrinsic_instr *intr,
 	struct ir3_instruction *samp_tex = get_image_samp_tex_src(ctx, intr);
 	struct ir3_instruction *sam, *lod;
 	unsigned flags, ncoords = ir3_get_image_coords(var, &flags);
+	type_t dst_type = nir_dest_bit_size(intr->dest) < 32 ?
+			TYPE_U16 : TYPE_U32;
 
 	lod = create_immed(b, 0);
-	sam = ir3_SAM(b, OPC_GETSIZE, TYPE_U32, 0b1111, flags,
+	sam = ir3_SAM(b, OPC_GETSIZE, dst_type, 0b1111, flags,
 			samp_tex, lod, NULL);
 
 	/* Array size actually ends up in .w rather than .z. This doesn't
@@ -1851,6 +1853,30 @@ emit_undef(struct ir3_context *ctx, nir_ssa_undef_instr *undef)
  * texture fetch/sample instructions:
  */
 
+static type_t
+get_tex_dest_type(nir_tex_instr *tex)
+{
+	type_t type;
+
+	switch (nir_alu_type_get_base_type(tex->dest_type)) {
+	case nir_type_invalid:
+	case nir_type_float:
+		type = nir_dest_bit_size(tex->dest) < 32 ? TYPE_F16 : TYPE_F32;
+		break;
+	case nir_type_int:
+		type = nir_dest_bit_size(tex->dest) < 32 ? TYPE_S16 : TYPE_S32;
+		break;
+	case nir_type_uint:
+	case nir_type_bool:
+		type = nir_dest_bit_size(tex->dest) < 32 ? TYPE_U16 : TYPE_U32;
+		break;
+	default:
+		unreachable("bad dest_type");
+	}
+
+	return type;
+}
+
 static void
 tex_info(nir_tex_instr *tex, unsigned *flagsp, unsigned *coordsp)
 {
@@ -2147,21 +2173,7 @@ emit_tex(struct ir3_context *ctx, nir_tex_instr *tex)
 			src1[nsrc1++] = lod;
 	}
 
-	switch (tex->dest_type) {
-	case nir_type_invalid:
-	case nir_type_float:
-		type = TYPE_F32;
-		break;
-	case nir_type_int:
-		type = TYPE_S32;
-		break;
-	case nir_type_uint:
-	case nir_type_bool:
-		type = TYPE_U32;
-		break;
-	default:
-		unreachable("bad dest_type");
-	}
+	type = get_tex_dest_type(tex);
 
 	if (opc == OPC_GETLOD)
 		type = TYPE_S32;
@@ -2244,10 +2256,11 @@ emit_tex_info(struct ir3_context *ctx, nir_tex_instr *tex, unsigned idx)
 {
 	struct ir3_block *b = ctx->block;
 	struct ir3_instruction **dst, *sam;
+	type_t dst_type = get_tex_dest_type(tex);
 
 	dst = ir3_get_dst(ctx, &tex->dest, 1);
 
-	sam = ir3_SAM(b, OPC_GETINFO, TYPE_U32, 1 << idx, 0,
+	sam = ir3_SAM(b, OPC_GETINFO, dst_type, 1 << idx, 0,
 			get_tex_samp_tex_src(ctx, tex), NULL, NULL);
 
 	/* even though there is only one component, since it ends
@@ -2272,6 +2285,7 @@ emit_tex_txs(struct ir3_context *ctx, nir_tex_instr *tex)
 	struct ir3_instruction **dst, *sam;
 	struct ir3_instruction *lod;
 	unsigned flags, coords;
+	type_t dst_type = get_tex_dest_type(tex);
 
 	tex_info(tex, &flags, &coords);
 
@@ -2288,7 +2302,7 @@ emit_tex_txs(struct ir3_context *ctx, nir_tex_instr *tex)
 
 	lod = ir3_get_src(ctx, &tex->src[0].src)[0];
 
-	sam = ir3_SAM(b, OPC_GETSIZE, TYPE_U32, 0b1111, flags,
+	sam = ir3_SAM(b, OPC_GETSIZE, dst_type, 0b1111, flags,
 			get_tex_samp_tex_src(ctx, tex), lod, NULL);
 
 	ir3_split_dest(b, dst, sam, 0, 4);
diff --git a/src/freedreno/ir3/ir3_image.c b/src/freedreno/ir3/ir3_image.c
index bb852dc25f5..60c71901c9c 100644
--- a/src/freedreno/ir3/ir3_image.c
+++ b/src/freedreno/ir3/ir3_image.c
@@ -145,6 +145,12 @@ ir3_get_image_type(const nir_variable *var)
 		return TYPE_S32;
 	case GLSL_TYPE_FLOAT:
 		return TYPE_F32;
+	case GLSL_TYPE_UINT16:
+		return TYPE_U16;
+	case GLSL_TYPE_INT16:
+		return TYPE_S16;
+	case GLSL_TYPE_FLOAT16:
+		return TYPE_F16;
 	default:
 		unreachable("bad sampler type.");
 		return 0;




More information about the mesa-commit mailing list