anv: Set alignments on UBO/SSBO root derefs
[mesa.git] / src / intel / vulkan / anv_nir_apply_pipeline_layout.c
index 882d7cb6456900a20a6cac2fdf17b00a0753a117..4884ba325cdfb16d49b429447e9f9175dfe37f1b 100644 (file)
@@ -552,6 +552,31 @@ lower_load_vulkan_descriptor(nir_intrinsic_instr *intrin,
 
    const VkDescriptorType desc_type = nir_intrinsic_desc_type(intrin);
 
+   assert(intrin->dest.is_ssa);
+   nir_foreach_use(src, &intrin->dest.ssa) {
+      if (src->parent_instr->type != nir_instr_type_deref)
+         continue;
+
+      nir_deref_instr *cast = nir_instr_as_deref(src->parent_instr);
+      assert(cast->deref_type == nir_deref_type_cast);
+      switch (desc_type) {
+      case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
+      case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
+         cast->cast.align_mul = ANV_UBO_ALIGNMENT;
+         cast->cast.align_offset = 0;
+         break;
+
+      case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
+      case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
+         cast->cast.align_mul = ANV_SSBO_ALIGNMENT;
+         cast->cast.align_offset = 0;
+         break;
+
+      default:
+         break;
+      }
+   }
+
    assert(intrin->src[0].is_ssa);
    nir_ssa_def *index = intrin->src[0].ssa;