if (isl_has_matching_typed_storage_image_format(devinfo, image_fmt))
return false;
+ assert(nir_src_as_uint(intrin->src[1]) == 0);
+
b->cursor = nir_instr_remove(&intrin->instr);
nir_ssa_def *size = load_image_param(b, deref, SIZE);
bool
brw_nir_lower_image_load_store(nir_shader *shader,
- const struct gen_device_info *devinfo)
+ const struct gen_device_info *devinfo,
+ bool *uses_atomic_load_store)
{
bool progress = false;
if (function->impl == NULL)
continue;
+ bool impl_progress = false;
nir_foreach_block_safe(block, function->impl) {
nir_builder b;
nir_builder_init(&b, function->impl);
switch (intrin->intrinsic) {
case nir_intrinsic_image_deref_load:
if (lower_image_load_instr(&b, devinfo, intrin))
- progress = true;
+ impl_progress = true;
break;
case nir_intrinsic_image_deref_store:
if (lower_image_store_instr(&b, devinfo, intrin))
- progress = true;
+ impl_progress = true;
break;
case nir_intrinsic_image_deref_atomic_add:
case nir_intrinsic_image_deref_atomic_xor:
case nir_intrinsic_image_deref_atomic_exchange:
case nir_intrinsic_image_deref_atomic_comp_swap:
+ if (uses_atomic_load_store)
+ *uses_atomic_load_store = true;
if (lower_image_atomic_instr(&b, devinfo, intrin))
- progress = true;
+ impl_progress = true;
break;
case nir_intrinsic_image_deref_size:
if (lower_image_size_instr(&b, devinfo, intrin))
- progress = true;
+ impl_progress = true;
break;
default:
}
}
- if (progress)
+ if (impl_progress) {
+ progress = true;
nir_metadata_preserve(function->impl, nir_metadata_none);
+ } else {
+ nir_metadata_preserve(function->impl, nir_metadata_all);
+ }
}
return progress;