X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fnir%2Fnir_split_var_copies.c;h=10b71c16c1799e6ea6aaf805f2496140785beb29;hb=32d871b48fbf38cb309eaaa13c8b425695141b60;hp=98e05c95e451d3896795ce30d69acf7a705af96e;hpb=aeb4bbfd1ef869e30ab02231585c9c2e4e0f5972;p=mesa.git diff --git a/src/compiler/nir/nir_split_var_copies.c b/src/compiler/nir/nir_split_var_copies.c index 98e05c95e45..10b71c16c17 100644 --- a/src/compiler/nir/nir_split_var_copies.c +++ b/src/compiler/nir/nir_split_var_copies.c @@ -64,20 +64,25 @@ static void split_deref_copy_instr(nir_builder *b, - nir_deref_instr *dst, nir_deref_instr *src) + nir_deref_instr *dst, nir_deref_instr *src, + enum gl_access_qualifier dst_access, + enum gl_access_qualifier src_access) { - assert(dst->type == src->type); + assert(glsl_get_bare_type(dst->type) == + glsl_get_bare_type(src->type)); if (glsl_type_is_vector_or_scalar(src->type)) { - nir_copy_deref(b, dst, src); - } else if (glsl_type_is_struct(src->type)) { + nir_copy_deref_with_access(b, dst, src, dst_access, src_access); + } else if (glsl_type_is_struct_or_ifc(src->type)) { for (unsigned i = 0; i < glsl_get_length(src->type); i++) { split_deref_copy_instr(b, nir_build_deref_struct(b, dst, i), - nir_build_deref_struct(b, src, i)); + nir_build_deref_struct(b, src, i), + dst_access, src_access); } } else { assert(glsl_type_is_matrix(src->type) || glsl_type_is_array(src->type)); split_deref_copy_instr(b, nir_build_deref_array_wildcard(b, dst), - nir_build_deref_array_wildcard(b, src)); + nir_build_deref_array_wildcard(b, src), + dst_access, src_access); } } @@ -104,7 +109,9 @@ split_var_copies_impl(nir_function_impl *impl) nir_instr_as_deref(copy->src[0].ssa->parent_instr); nir_deref_instr *src = nir_instr_as_deref(copy->src[1].ssa->parent_instr); - split_deref_copy_instr(&b, dst, src); + split_deref_copy_instr(&b, dst, src, + nir_intrinsic_dst_access(copy), + nir_intrinsic_src_access(copy)); progress = true; } @@ -113,6 +120,10 @@ split_var_copies_impl(nir_function_impl *impl) if (progress) { nir_metadata_preserve(impl, nir_metadata_block_index | nir_metadata_dominance); + } else { +#ifndef NDEBUG + impl->valid_metadata &= ~nir_metadata_not_properly_reset; +#endif } return progress; @@ -123,8 +134,6 @@ nir_split_var_copies(nir_shader *shader) { bool progress = false; - nir_assert_unlowered_derefs(shader, nir_lower_load_store_derefs); - nir_foreach_function(function, shader) { if (function->impl) progress = split_var_copies_impl(function->impl) || progress;