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 <alyssa@rosenzweig.io> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23173>
This commit is contained in:
@@ -2123,7 +2123,8 @@ agx_fp32_varying_mask(nir_shader *nir)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static nir_mem_access_size_align
|
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,
|
uint32_t align_offset, bool offset_is_const,
|
||||||
const void *cb_data)
|
const void *cb_data)
|
||||||
{
|
{
|
||||||
|
@@ -5106,6 +5106,7 @@ typedef struct {
|
|||||||
typedef nir_mem_access_size_align
|
typedef nir_mem_access_size_align
|
||||||
(*nir_lower_mem_access_bit_sizes_cb)(nir_intrinsic_op intrin,
|
(*nir_lower_mem_access_bit_sizes_cb)(nir_intrinsic_op intrin,
|
||||||
uint8_t bytes,
|
uint8_t bytes,
|
||||||
|
uint8_t bit_size,
|
||||||
uint32_t align_mul,
|
uint32_t align_mul,
|
||||||
uint32_t align_offset,
|
uint32_t align_offset,
|
||||||
bool offset_is_const,
|
bool offset_is_const,
|
||||||
|
@@ -89,7 +89,7 @@ lower_mem_load(nir_builder *b, nir_intrinsic_instr *intrin,
|
|||||||
|
|
||||||
nir_mem_access_size_align requested =
|
nir_mem_access_size_align requested =
|
||||||
mem_access_size_align_cb(intrin->intrinsic, bytes_read,
|
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);
|
offset_is_const, cb_data);
|
||||||
|
|
||||||
assert(util_is_power_of_two_nonzero(align_mul));
|
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 =
|
const uint32_t chunk_align =
|
||||||
nir_combined_align(align_mul, chunk_align_offset);
|
nir_combined_align(align_mul, chunk_align_offset);
|
||||||
requested = mem_access_size_align_cb(intrin->intrinsic, bytes_left,
|
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);
|
offset_is_const, cb_data);
|
||||||
|
|
||||||
unsigned chunk_bytes;
|
unsigned chunk_bytes;
|
||||||
@@ -253,7 +253,7 @@ lower_mem_store(nir_builder *b, nir_intrinsic_instr *intrin,
|
|||||||
|
|
||||||
nir_mem_access_size_align requested =
|
nir_mem_access_size_align requested =
|
||||||
mem_access_size_align_cb(intrin->intrinsic, bytes_written,
|
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);
|
offset_is_const, cb_data);
|
||||||
|
|
||||||
assert(util_is_power_of_two_nonzero(align_mul));
|
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;
|
(whole_align_offset + chunk_start) % align_mul;
|
||||||
|
|
||||||
requested = mem_access_size_align_cb(intrin->intrinsic, max_chunk_bytes,
|
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);
|
offset_is_const, cb_data);
|
||||||
|
|
||||||
const uint32_t chunk_bytes =
|
const uint32_t chunk_bytes =
|
||||||
|
@@ -1368,7 +1368,7 @@ bool combine_all_memory_barriers(nir_intrinsic_instr *a,
|
|||||||
|
|
||||||
static nir_mem_access_size_align
|
static nir_mem_access_size_align
|
||||||
get_mem_access_size_align(nir_intrinsic_op intrin, uint8_t bytes,
|
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)
|
bool offset_is_const, const void *cb_data)
|
||||||
{
|
{
|
||||||
const uint32_t align = nir_combined_align(align_mul, align_offset);
|
const uint32_t align = nir_combined_align(align_mul, align_offset);
|
||||||
|
@@ -4330,7 +4330,8 @@ bifrost_nir_lower_blend_components(struct nir_builder *b, nir_instr *instr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static nir_mem_access_size_align
|
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,
|
uint32_t align_offset, bool offset_is_const,
|
||||||
const void *cb_data)
|
const void *cb_data)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user