intel/nir: handle image_sparse_load in storage format lowering

The last component of sparse load is the residency data. We don't want
to touch/convert that value with the format lowering.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23882>
This commit is contained in:
Lionel Landwerlin
2023-05-24 18:38:48 +03:00
parent d33aff783d
commit 300cc829de

View File

@@ -362,7 +362,8 @@ expand_vec:
static bool
lower_image_load_instr(nir_builder *b,
const struct intel_device_info *devinfo,
nir_intrinsic_instr *intrin)
nir_intrinsic_instr *intrin,
bool sparse)
{
nir_deref_instr *deref = nir_src_as_deref(intrin->src[0]);
nir_variable *var = nir_deref_instr_get_variable(deref);
@@ -376,7 +377,8 @@ lower_image_load_instr(nir_builder *b,
if (isl_has_matching_typed_storage_image_format(devinfo, image_fmt)) {
const enum isl_format lower_fmt =
isl_lower_storage_image_format(devinfo, image_fmt);
const unsigned dest_components = intrin->num_components;
const unsigned dest_components =
sparse ? (intrin->num_components - 1) : intrin->num_components;
/* Use an undef to hold the uses of the load while we do the color
* conversion.
@@ -394,9 +396,30 @@ lower_image_load_instr(nir_builder *b,
image_fmt, lower_fmt,
dest_components);
if (sparse) {
/* Put the sparse component back on the original instruction */
intrin->num_components++;
intrin->dest.ssa.num_components = intrin->num_components;
/* Carry over the sparse component without modifying it with the
* converted color.
*/
nir_ssa_def *sparse_color[NIR_MAX_VEC_COMPONENTS];
for (unsigned i = 0; i < dest_components; i++)
sparse_color[i] = nir_channel(b, color, i);
sparse_color[dest_components] =
nir_channel(b, &intrin->dest.ssa, intrin->num_components - 1);
color = nir_vec(b, sparse_color, dest_components + 1);
}
nir_ssa_def_rewrite_uses(placeholder, color);
nir_instr_remove(placeholder->parent_instr);
} else {
/* This code part is only useful prior to Gfx9, we do not have plans to
* enable sparse there.
*/
assert(!sparse);
const struct isl_format_layout *image_fmtl =
isl_format_get_layout(image_fmt);
/* We have a matching typed format for everything 32b and below */
@@ -691,7 +714,12 @@ brw_nir_lower_storage_image_instr(nir_builder *b,
switch (intrin->intrinsic) {
case nir_intrinsic_image_deref_load:
if (opts->lower_loads)
return lower_image_load_instr(b, opts->devinfo, intrin);
return lower_image_load_instr(b, opts->devinfo, intrin, false);
return false;
case nir_intrinsic_image_deref_sparse_load:
if (opts->lower_loads)
return lower_image_load_instr(b, opts->devinfo, intrin, true);
return false;
case nir_intrinsic_image_deref_store: