nir: Add an alignment to nir_intrinsic_load_constant
Inf1883cc73d
we tried to pass through alignments from load_constant intrinsics when rewriting them to load_ubo in iris. However, those intrinsics don't have ALIGN_MUL or ALIGN_OFFSET indices. It's easy enough to add them. We just call the size/align function on the vector type at the end of our deref chain and use the alignment returned from there. It's possible we could do better by walking the whole deref chain but this should be good enough. Fixes:f1883cc73d
"iris: Set alignments on cbuf0 and constant reads" Closes: #2739 Reviewed-by: Eric Anholt <eric@anholt.net> Tested-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4468>
This commit is contained in:

committed by
Marge Bot

parent
8cbeb13704
commit
33eb43349e
@@ -747,7 +747,8 @@ load("shared", 1, [BASE, ALIGN_MUL, ALIGN_OFFSET], [CAN_ELIMINATE])
|
|||||||
# src[] = { offset }.
|
# src[] = { offset }.
|
||||||
load("push_constant", 1, [BASE, RANGE], [CAN_ELIMINATE, CAN_REORDER])
|
load("push_constant", 1, [BASE, RANGE], [CAN_ELIMINATE, CAN_REORDER])
|
||||||
# src[] = { offset }.
|
# src[] = { offset }.
|
||||||
load("constant", 1, [BASE, RANGE], [CAN_ELIMINATE, CAN_REORDER])
|
load("constant", 1, [BASE, RANGE, ALIGN_MUL, ALIGN_OFFSET],
|
||||||
|
[CAN_ELIMINATE, CAN_REORDER])
|
||||||
# src[] = { address }.
|
# src[] = { address }.
|
||||||
load("global", 1, [ACCESS, ALIGN_MUL, ALIGN_OFFSET], [CAN_ELIMINATE])
|
load("global", 1, [ACCESS, ALIGN_MUL, ALIGN_OFFSET], [CAN_ELIMINATE])
|
||||||
# src[] = { address }.
|
# src[] = { address }.
|
||||||
|
@@ -75,11 +75,15 @@ build_constant_load(nir_builder *b, nir_deref_instr *deref,
|
|||||||
size_align(var->type, &var_size, &var_align);
|
size_align(var->type, &var_size, &var_align);
|
||||||
assert(var->data.location % var_align == 0);
|
assert(var->data.location % var_align == 0);
|
||||||
|
|
||||||
|
UNUSED unsigned deref_size, deref_align;
|
||||||
|
size_align(deref->type, &deref_size, &deref_align);
|
||||||
|
|
||||||
nir_intrinsic_instr *load =
|
nir_intrinsic_instr *load =
|
||||||
nir_intrinsic_instr_create(b->shader, nir_intrinsic_load_constant);
|
nir_intrinsic_instr_create(b->shader, nir_intrinsic_load_constant);
|
||||||
load->num_components = num_components;
|
load->num_components = num_components;
|
||||||
nir_intrinsic_set_base(load, var->data.location);
|
nir_intrinsic_set_base(load, var->data.location);
|
||||||
nir_intrinsic_set_range(load, var_size);
|
nir_intrinsic_set_range(load, var_size);
|
||||||
|
nir_intrinsic_set_align(load, deref_align, 0);
|
||||||
load->src[0] = nir_src_for_ssa(nir_build_deref_offset(b, deref, size_align));
|
load->src[0] = nir_src_for_ssa(nir_build_deref_offset(b, deref, size_align));
|
||||||
nir_ssa_dest_init(&load->instr, &load->dest,
|
nir_ssa_dest_init(&load->instr, &load->dest,
|
||||||
num_components, bit_size, NULL);
|
num_components, bit_size, NULL);
|
||||||
|
@@ -575,6 +575,7 @@ validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state)
|
|||||||
case nir_intrinsic_load_shared:
|
case nir_intrinsic_load_shared:
|
||||||
case nir_intrinsic_load_global:
|
case nir_intrinsic_load_global:
|
||||||
case nir_intrinsic_load_scratch:
|
case nir_intrinsic_load_scratch:
|
||||||
|
case nir_intrinsic_load_constant:
|
||||||
/* These memory load operations must have alignments */
|
/* These memory load operations must have alignments */
|
||||||
validate_assert(state,
|
validate_assert(state,
|
||||||
util_is_power_of_two_nonzero(nir_intrinsic_align_mul(instr)));
|
util_is_power_of_two_nonzero(nir_intrinsic_align_mul(instr)));
|
||||||
@@ -589,7 +590,6 @@ validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state)
|
|||||||
case nir_intrinsic_load_output:
|
case nir_intrinsic_load_output:
|
||||||
case nir_intrinsic_load_per_vertex_output:
|
case nir_intrinsic_load_per_vertex_output:
|
||||||
case nir_intrinsic_load_push_constant:
|
case nir_intrinsic_load_push_constant:
|
||||||
case nir_intrinsic_load_constant:
|
|
||||||
/* All memory load operations must load at least a byte */
|
/* All memory load operations must load at least a byte */
|
||||||
validate_assert(state, nir_dest_bit_size(instr->dest) >= 8);
|
validate_assert(state, nir_dest_bit_size(instr->dest) >= 8);
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user