From 8dd3a81c1d7fd43218a4d206259dbc1cd6fc0a17 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Fri, 31 Jul 2020 18:48:27 -0400 Subject: [PATCH] pan/bi: Add format field to IR To make register_format packing explicit, and possibly in the future support the auto mode. Signed-off-by: Alyssa Rosenzweig Reviewed-by: Daniel Stone Part-of: --- src/panfrost/bifrost/bi_print.c | 3 +++ src/panfrost/bifrost/bifrost_compile.c | 3 +++ src/panfrost/bifrost/compiler.h | 3 +++ src/panfrost/bifrost/test/bi_test_pack.c | 1 + 4 files changed, 10 insertions(+) diff --git a/src/panfrost/bifrost/bi_print.c b/src/panfrost/bifrost/bi_print.c index 88d2c1e5db7..502ceb0dab9 100644 --- a/src/panfrost/bifrost/bi_print.c +++ b/src/panfrost/bifrost/bi_print.c @@ -293,6 +293,9 @@ bi_print_instruction(bi_instruction *ins, FILE *fp) if (ins->dest) pan_print_alu_type(ins->dest_type, fp); + if (ins->format && ins->dest != ins->format) + pan_print_alu_type(ins->format, fp); + if (bi_has_outmod(ins)) fprintf(fp, "%s", bi_output_mod_name(ins->outmod)); diff --git a/src/panfrost/bifrost/bifrost_compile.c b/src/panfrost/bifrost/bifrost_compile.c index 2c017ce6e3b..841e5b6a820 100644 --- a/src/panfrost/bifrost/bifrost_compile.c +++ b/src/panfrost/bifrost/bifrost_compile.c @@ -111,6 +111,7 @@ bi_emit_ld_vary(bi_context *ctx, nir_intrinsic_instr *instr) ins.load_vary.reuse = false; /* TODO */ ins.load_vary.flat = instr->intrinsic != nir_intrinsic_load_interpolated_input; ins.dest_type = nir_type_float | nir_dest_bit_size(instr->dest); + ins.format = ins.dest_type; if (nir_src_is_const(*nir_get_io_offset_src(instr))) { /* Zero it out for direct */ @@ -187,6 +188,7 @@ bi_load_with_r61(enum bi_class T, nir_intrinsic_instr *instr) ld.src_types[1] = nir_type_uint32; ld.src_types[2] = nir_type_uint32; ld.src_types[3] = nir_intrinsic_type(instr); + ld.format = nir_intrinsic_type(instr); return ld; } @@ -333,6 +335,7 @@ bi_emit_ld_frag_coord(bi_context *ctx, nir_intrinsic_instr *instr) }, .vector_channels = 1, .dest_type = nir_type_float32, + .format = nir_type_float32, .dest = bi_make_temp(ctx), .src = { BIR_INDEX_CONSTANT, BIR_INDEX_ZERO }, .src_types = { nir_type_uint32, nir_type_uint32 }, diff --git a/src/panfrost/bifrost/compiler.h b/src/panfrost/bifrost/compiler.h index b839156688e..24d26b2ec85 100644 --- a/src/panfrost/bifrost/compiler.h +++ b/src/panfrost/bifrost/compiler.h @@ -286,6 +286,9 @@ typedef struct { /* Source types if required by the class */ nir_alu_type src_types[BIR_SRC_COUNT]; + /* register_format if applicable */ + nir_alu_type format; + /* If the source type is 8-bit or 16-bit such that SIMD is possible, * and the class has BI_SWIZZLABLE, this is a swizzle in the usual * sense. On non-SIMD instructions, it can be used for component diff --git a/src/panfrost/bifrost/test/bi_test_pack.c b/src/panfrost/bifrost/test/bi_test_pack.c index 179da3ca054..f41f148dfe4 100644 --- a/src/panfrost/bifrost/test/bi_test_pack.c +++ b/src/panfrost/bifrost/test/bi_test_pack.c @@ -65,6 +65,7 @@ bit_test_single(struct panfrost_device *dev, .vector_channels = 3, .dest = BIR_INDEX_REGISTER | 32, .dest_type = nir_type_uint32, + .format = nir_type_uint32, .src = { BIR_INDEX_CONSTANT, BIR_INDEX_REGISTER | 61,