nir: copy intrinsic type when lowering load input/uniform and store output
[mesa.git] / src / compiler / nir / nir_lower_var_copies.c
index 17ec113a05b8a0aa7afe81ca378ae235179151b8..0ba398698f0dd9d0fa24f962bd4156a632fb6e96 100644 (file)
@@ -75,15 +75,15 @@ emit_deref_copy_load_store(nir_builder *b,
       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),
+                                    nir_build_deref_array_imm(b, src_deref, i),
                                     src_deref_arr + 1);
       }
    } 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);
@@ -140,9 +140,14 @@ lower_var_copies_impl(nir_function_impl *impl)
       }
    }
 
-   if (progress)
+   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;
 }
@@ -155,8 +160,6 @@ nir_lower_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 |= lower_var_copies_impl(function->impl);