nir: add pass to propagate image format to intrinsics

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Alyssa Anne Rosenzweig <alyssa.rosenzweig@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36773>
This commit is contained in:
Lionel Landwerlin 2025-08-14 13:35:54 +03:00 committed by Marge Bot
parent b8bdc68933
commit 94f8d0072d
2 changed files with 49 additions and 0 deletions

View file

@ -5856,6 +5856,9 @@ nir_lower_tex_shadow(nir_shader *s,
nir_lower_tex_shadow_swizzle *tex_swizzles,
bool is_fixed_point_format);
bool
nir_update_image_intrinsic_from_var(nir_shader *nir);
typedef struct nir_lower_image_options {
/**
* If true, lower cube size operations.

View file

@ -1566,3 +1566,49 @@ nir_lower_constant_to_temp(nir_shader *nir)
nir_fixup_deref_modes(nir);
nir_lower_global_vars_to_local(nir);
}
static bool
update_image_format_intrin(nir_builder *b,
nir_intrinsic_instr *intrin,
void *state)
{
switch (intrin->intrinsic) {
#define CASE(op) case nir_intrinsic_image_deref_##op
CASE(load):
CASE(sparse_load):
CASE(store):
CASE(atomic):
CASE(atomic_swap):
CASE(format):
CASE(levels):
CASE(order):
CASE(size):
CASE(samples):
CASE(samples_identical):
CASE(texel_address):
CASE(load_raw_intel):
CASE(store_raw_intel):
CASE(descriptor_amd):
CASE(fragment_mask_load_amd):
CASE(store_block_agx): {
nir_deref_instr *deref = nir_src_as_deref(intrin->src[0]);
nir_variable *var = nir_deref_instr_get_variable(deref);
if (var == NULL)
return false;
nir_intrinsic_set_format(intrin, var->data.image.format);
return true;
}
#undef CASE
default:
return false;
}
}
bool
nir_update_image_intrinsic_from_var(nir_shader *nir)
{
return nir_shader_intrinsics_pass(nir, update_image_format_intrin,
nir_metadata_all, NULL);
}