nir/lower_cl_images: support keeping derefs

This is needed by radeonsi and zink

Signed-off-by: Karol Herbst <kherbst@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19381>
This commit is contained in:
Karol Herbst 2022-09-26 00:03:35 +02:00 committed by Marge Bot
parent eae281e788
commit d459a58473
4 changed files with 23 additions and 4 deletions

View file

@ -5496,7 +5496,7 @@ bool nir_lower_ssa_defs_to_regs_block(nir_block *block);
bool nir_rematerialize_derefs_in_use_blocks_impl(nir_function_impl *impl);
bool nir_lower_samplers(nir_shader *shader);
bool nir_lower_cl_images(nir_shader *shader);
bool nir_lower_cl_images(nir_shader *shader, bool lower_image_derefs, bool lower_sampler_derefs);
bool nir_dedup_inline_samplers(nir_shader *shader);
bool nir_lower_ssbo(nir_shader *shader);

View file

@ -108,7 +108,7 @@ nir_dedup_inline_samplers(nir_shader *nir)
}
bool
nir_lower_cl_images(nir_shader *shader)
nir_lower_cl_images(nir_shader *shader, bool lower_image_derefs, bool lower_sampler_derefs)
{
nir_function_impl *impl = nir_shader_get_entrypoint(shader);
@ -159,6 +159,12 @@ nir_lower_cl_images(nir_shader *shader)
nir_builder b;
nir_builder_init(&b, impl);
/* don't need any lowering if we can keep the derefs */
if (!lower_image_derefs && !lower_sampler_derefs) {
nir_metadata_preserve(impl, nir_metadata_all);
return false;
}
bool progress = false;
nir_foreach_block_reverse(block, impl) {
nir_foreach_instr_reverse_safe(instr, block) {
@ -173,6 +179,13 @@ nir_lower_cl_images(nir_shader *shader)
!glsl_type_is_sampler(deref->type))
break;
if (!lower_image_derefs && glsl_type_is_image(deref->type))
break;
if (!lower_sampler_derefs &&
(glsl_type_is_sampler(deref->type) || glsl_type_is_texture(deref->type)))
break;
b.cursor = nir_instr_remove(&deref->instr);
nir_ssa_def *loc =
nir_imm_intN_t(&b, deref->var->data.driver_location,
@ -183,6 +196,9 @@ nir_lower_cl_images(nir_shader *shader)
}
case nir_instr_type_tex: {
if (!lower_sampler_derefs)
break;
nir_tex_instr *tex = nir_instr_as_tex(instr);
unsigned count = 0;
for (unsigned i = 0; i < tex->num_srcs; i++) {
@ -247,6 +263,9 @@ nir_lower_cl_images(nir_shader *shader)
case nir_intrinsic_image_deref_atomic_dec_wrap:
case nir_intrinsic_image_deref_size:
case nir_intrinsic_image_deref_samples: {
if (!lower_image_derefs)
break;
assert(intrin->src[0].is_ssa);
b.cursor = nir_before_instr(&intrin->instr);
/* Back-ends expect a 32-bit thing, not 64-bit */

View file

@ -376,7 +376,7 @@ binary clover::nir::spirv_to_nir(const binary &mod, const device &dev,
NIR_PASS_V(nir, nir_opt_deref);
NIR_PASS_V(nir, nir_lower_readonly_images_to_tex, false);
NIR_PASS_V(nir, nir_lower_cl_images);
NIR_PASS_V(nir, nir_lower_cl_images, true, true);
NIR_PASS_V(nir, nir_lower_memcpy);
/* use offsets for kernel inputs (uniform) */

View file

@ -534,7 +534,7 @@ fn lower_and_optimize_nir_late(
}
nir.pass1(nir_lower_readonly_images_to_tex, true);
nir.pass0(nir_lower_cl_images);
nir.pass2(nir_lower_cl_images, true, true);
nir.reset_scratch_size();
nir.pass2(