spirv: Propagate alignments to deref chains via casts
This commit propagates the alignment information provided either through the Alignment decoration on pointers or via the alignment mem operands to OpLoad, OpStore, and OpCopyMemory to the NIR deref chain. It does so by wrapping the deref in a cast. NIR should be able to clean up most unnecessary casts only leaving us with the useful alignment information. Reviewed-by: Jesse Natalie <jenatali@microsoft.com> Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6472>
This commit is contained in:

committed by
Marge Bot

parent
207b462e93
commit
3135984ad0
@@ -1210,6 +1210,29 @@ nir_build_deref_cast(nir_builder *build, nir_ssa_def *parent,
|
||||
return deref;
|
||||
}
|
||||
|
||||
static inline nir_deref_instr *
|
||||
nir_alignment_deref_cast(nir_builder *build, nir_deref_instr *parent,
|
||||
uint32_t align_mul, uint32_t align_offset)
|
||||
{
|
||||
nir_deref_instr *deref =
|
||||
nir_deref_instr_create(build->shader, nir_deref_type_cast);
|
||||
|
||||
deref->mode = parent->mode;
|
||||
deref->type = parent->type;
|
||||
deref->parent = nir_src_for_ssa(&parent->dest.ssa);
|
||||
deref->cast.ptr_stride = nir_deref_instr_array_stride(deref);
|
||||
deref->cast.align_mul = align_mul;
|
||||
deref->cast.align_offset = align_offset;
|
||||
|
||||
nir_ssa_dest_init(&deref->instr, &deref->dest,
|
||||
parent->dest.ssa.num_components,
|
||||
parent->dest.ssa.bit_size, NULL);
|
||||
|
||||
nir_builder_instr_insert(build, &deref->instr);
|
||||
|
||||
return deref;
|
||||
}
|
||||
|
||||
/** Returns a deref that follows another but starting from the given parent
|
||||
*
|
||||
* The new deref will be the same type and take the same array or struct index
|
||||
|
Reference in New Issue
Block a user