turnip: implement intrinsic_vulkan_resource_reindex
authorDanylo Piliaiev <dpiliaiev@igalia.com>
Wed, 10 Mar 2021 12:29:31 +0000 (14:29 +0200)
committerMarge Bot <eric+marge@anholt.net>
Mon, 15 Mar 2021 23:56:26 +0000 (23:56 +0000)
Descriptor arrays are continuous, so it's just an addition of offset.

Fixes test:
 dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.dynamic_offset.select_descriptor_array

Signed-off-by: Danylo Piliaiev <dpiliaiev@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9495>

src/freedreno/vulkan/tu_shader.c

index bceba47..0feb07f 100644 (file)
@@ -241,6 +241,21 @@ lower_vulkan_resource_index(nir_builder *b, nir_intrinsic_instr *instr,
 }
 
 static void
+lower_vulkan_resource_reindex(nir_builder *b, nir_intrinsic_instr *instr)
+{
+   nir_ssa_def *old_index = instr->src[0].ssa;
+   nir_ssa_def *delta = instr->src[1].ssa;
+
+   nir_ssa_def *new_index =
+      nir_vec3(b, nir_channel(b, old_index, 0),
+               nir_iadd(b, nir_channel(b, old_index, 1), delta),
+               nir_channel(b, old_index, 2));
+
+   nir_ssa_def_rewrite_uses(&instr->dest.ssa, new_index);
+   nir_instr_remove(&instr->instr);
+}
+
+static void
 lower_load_vulkan_descriptor(nir_intrinsic_instr *intrin)
 {
    /* Loading the descriptor happens as part of the load/store instruction so
@@ -410,6 +425,9 @@ lower_intrinsic(nir_builder *b, nir_intrinsic_instr *instr,
    case nir_intrinsic_vulkan_resource_index:
       lower_vulkan_resource_index(b, instr, shader, layout);
       return true;
+   case nir_intrinsic_vulkan_resource_reindex:
+      lower_vulkan_resource_reindex(b, instr);
+      return true;
 
    case nir_intrinsic_load_ubo:
    case nir_intrinsic_load_ssbo: