anv: Handle nir_intrinsic_vulkan_resource_reindex
authorJason Ekstrand <jason.ekstrand@intel.com>
Fri, 1 Dec 2017 01:13:56 +0000 (17:13 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Wed, 6 Dec 2017 06:01:54 +0000 (22:01 -0800)
Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
src/intel/vulkan/anv_nir_apply_pipeline_layout.c

index f8d81648a9ac2d037c86fb0d9a437697ab56999d..612b3f7effe79d00ec29d013b58773427675fe57 100644 (file)
@@ -128,6 +128,25 @@ lower_res_index_intrinsic(nir_intrinsic_instr *intrin,
    nir_instr_remove(&intrin->instr);
 }
 
+static void
+lower_res_reindex_intrinsic(nir_intrinsic_instr *intrin,
+                            struct apply_pipeline_layout_state *state)
+{
+   nir_builder *b = &state->builder;
+
+   /* For us, the resource indices are just indices into the binding table and
+    * array elements are sequential.  A resource_reindex just turns into an
+    * add of the two indices.
+    */
+   assert(intrin->src[0].is_ssa && intrin->src[0].is_ssa);
+   nir_ssa_def *new_index = nir_iadd(b, intrin->src[0].ssa,
+                                        intrin->src[1].ssa);
+
+   assert(intrin->dest.is_ssa);
+   nir_ssa_def_rewrite_uses(&intrin->dest.ssa, nir_src_for_ssa(new_index));
+   nir_instr_remove(&intrin->instr);
+}
+
 static void
 lower_tex_deref(nir_tex_instr *tex, nir_deref_var *deref,
                 unsigned *const_index, unsigned array_size,
@@ -265,8 +284,15 @@ apply_pipeline_layout_block(nir_block *block,
       switch (instr->type) {
       case nir_instr_type_intrinsic: {
          nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
-         if (intrin->intrinsic == nir_intrinsic_vulkan_resource_index) {
+         switch (intrin->intrinsic) {
+         case nir_intrinsic_vulkan_resource_index:
             lower_res_index_intrinsic(intrin, state);
+            break;
+         case nir_intrinsic_vulkan_resource_reindex:
+            lower_res_reindex_intrinsic(intrin, state);
+            break;
+         default:
+            break;
          }
          break;
       }