From 4217353e2d1d97dc3beb57015e43b8f53f09069e Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Mon, 22 May 2023 09:49:23 -0700 Subject: [PATCH] nir_lower_mem_access_bit_sizes: Add a bit_size input to the callback We'd like to use this callback to adjust loads and stores from things that are unsupported to things that are supported, but if the input is already supported, we'd prefer not to change it. Rather than making up a bit size that'd work and doing a bunch of pack/unpack bit math, only return a different bit size if the input one doesn't work for us (i.e. can't load enough memory or just an unsupported size entirely). Reviewed-by: Alyssa Rosenzweig Part-of: --- src/asahi/compiler/agx_compile.c | 3 ++- src/compiler/nir/nir.h | 1 + src/compiler/nir/nir_lower_mem_access_bit_sizes.c | 8 ++++---- src/intel/compiler/brw_nir.c | 2 +- src/panfrost/compiler/bifrost_compile.c | 3 ++- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/asahi/compiler/agx_compile.c b/src/asahi/compiler/agx_compile.c index 5e151e7d858..dcc6b157155 100644 --- a/src/asahi/compiler/agx_compile.c +++ b/src/asahi/compiler/agx_compile.c @@ -2123,7 +2123,8 @@ agx_fp32_varying_mask(nir_shader *nir) } static nir_mem_access_size_align -mem_access_size_align_cb(nir_intrinsic_op intrin, uint8_t bytes, uint32_t align, +mem_access_size_align_cb(nir_intrinsic_op intrin, uint8_t bytes, + uint8_t input_bit_size, uint32_t align, uint32_t align_offset, bool offset_is_const, const void *cb_data) { diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index bdc3d45fa68..b8d0fcef558 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -5106,6 +5106,7 @@ typedef struct { typedef nir_mem_access_size_align (*nir_lower_mem_access_bit_sizes_cb)(nir_intrinsic_op intrin, uint8_t bytes, + uint8_t bit_size, uint32_t align_mul, uint32_t align_offset, bool offset_is_const, diff --git a/src/compiler/nir/nir_lower_mem_access_bit_sizes.c b/src/compiler/nir/nir_lower_mem_access_bit_sizes.c index 5ca3bcd4bb9..3939ad4db04 100644 --- a/src/compiler/nir/nir_lower_mem_access_bit_sizes.c +++ b/src/compiler/nir/nir_lower_mem_access_bit_sizes.c @@ -89,7 +89,7 @@ lower_mem_load(nir_builder *b, nir_intrinsic_instr *intrin, nir_mem_access_size_align requested = mem_access_size_align_cb(intrin->intrinsic, bytes_read, - align_mul, whole_align_offset, + bit_size, align_mul, whole_align_offset, offset_is_const, cb_data); assert(util_is_power_of_two_nonzero(align_mul)); @@ -112,7 +112,7 @@ lower_mem_load(nir_builder *b, nir_intrinsic_instr *intrin, const uint32_t chunk_align = nir_combined_align(align_mul, chunk_align_offset); requested = mem_access_size_align_cb(intrin->intrinsic, bytes_left, - align_mul, chunk_align_offset, + bit_size, align_mul, chunk_align_offset, offset_is_const, cb_data); unsigned chunk_bytes; @@ -253,7 +253,7 @@ lower_mem_store(nir_builder *b, nir_intrinsic_instr *intrin, nir_mem_access_size_align requested = mem_access_size_align_cb(intrin->intrinsic, bytes_written, - align_mul, whole_align_offset, + bit_size, align_mul, whole_align_offset, offset_is_const, cb_data); assert(util_is_power_of_two_nonzero(align_mul)); @@ -289,7 +289,7 @@ lower_mem_store(nir_builder *b, nir_intrinsic_instr *intrin, (whole_align_offset + chunk_start) % align_mul; requested = mem_access_size_align_cb(intrin->intrinsic, max_chunk_bytes, - align_mul, chunk_align_offset, + bit_size, align_mul, chunk_align_offset, offset_is_const, cb_data); const uint32_t chunk_bytes = diff --git a/src/intel/compiler/brw_nir.c b/src/intel/compiler/brw_nir.c index a19547d61a6..ef174ff1889 100644 --- a/src/intel/compiler/brw_nir.c +++ b/src/intel/compiler/brw_nir.c @@ -1368,7 +1368,7 @@ bool combine_all_memory_barriers(nir_intrinsic_instr *a, static nir_mem_access_size_align get_mem_access_size_align(nir_intrinsic_op intrin, uint8_t bytes, - uint32_t align_mul, uint32_t align_offset, + uint8_t bit_size, uint32_t align_mul, uint32_t align_offset, bool offset_is_const, const void *cb_data) { const uint32_t align = nir_combined_align(align_mul, align_offset); diff --git a/src/panfrost/compiler/bifrost_compile.c b/src/panfrost/compiler/bifrost_compile.c index 44389370e77..a13557b0a3c 100644 --- a/src/panfrost/compiler/bifrost_compile.c +++ b/src/panfrost/compiler/bifrost_compile.c @@ -4330,7 +4330,8 @@ bifrost_nir_lower_blend_components(struct nir_builder *b, nir_instr *instr, } static nir_mem_access_size_align -mem_access_size_align_cb(nir_intrinsic_op intrin, uint8_t bytes, uint32_t align, +mem_access_size_align_cb(nir_intrinsic_op intrin, uint8_t bytes, + uint8_t input_bit_size, uint32_t align, uint32_t align_offset, bool offset_is_const, const void *cb_data) {