nir_deref_instr *dst_deref,
nir_deref_instr **dst_deref_arr,
nir_deref_instr *src_deref,
- nir_deref_instr **src_deref_arr)
+ nir_deref_instr **src_deref_arr,
+ enum gl_access_qualifier dst_access,
+ enum gl_access_qualifier src_access)
{
if (dst_deref_arr || src_deref_arr) {
assert(dst_deref_arr && src_deref_arr);
assert(length > 0);
for (unsigned i = 0; i < length; i++) {
- nir_ssa_def *index = nir_imm_int(b, i);
emit_deref_copy_load_store(b,
- nir_build_deref_array(b, dst_deref, index),
+ nir_build_deref_array_imm(b, dst_deref, i),
dst_deref_arr + 1,
- nir_build_deref_array(b, src_deref, index),
- src_deref_arr + 1);
+ nir_build_deref_array_imm(b, src_deref, i),
+ src_deref_arr + 1, dst_access, src_access);
}
} else {
- assert(dst_deref->type == src_deref->type);
+ assert(glsl_get_bare_type(dst_deref->type) ==
+ glsl_get_bare_type(src_deref->type));
assert(glsl_type_is_vector_or_scalar(dst_deref->type));
- nir_store_deref(b, dst_deref, nir_load_deref(b, src_deref), ~0);
+ nir_store_deref_with_access(b, dst_deref,
+ nir_load_deref_with_access(b, src_deref, src_access),
+ ~0, src_access);
}
}
b->cursor = nir_before_instr(©->instr);
emit_deref_copy_load_store(b, dst_path.path[0], &dst_path.path[1],
- src_path.path[0], &src_path.path[1]);
+ src_path.path[0], &src_path.path[1],
+ nir_intrinsic_dst_access(copy),
+ nir_intrinsic_src_access(copy));
nir_deref_path_finish(&dst_path);
nir_deref_path_finish(&src_path);
}
}
- if (progress)
+ if (progress) {
nir_metadata_preserve(impl, nir_metadata_block_index |
nir_metadata_dominance);
+ } else {
+ nir_metadata_preserve(impl, nir_metadata_all);
+ }
return progress;
}