anv/pipeline: Translate vulkan_resource_index to a constant when possible
authorJason Ekstrand <jason.ekstrand@intel.com>
Fri, 1 Dec 2017 11:18:51 +0000 (03:18 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 8 Dec 2017 23:43:25 +0000 (15:43 -0800)
We want to call brw_nir_analyze_ubo_ranges immedately after
anv_nir_apply_pipeline_layout and it badly wants constants.  We could
run an optimization step and let constant folding do it but that's way
more expensive than needed.  It's really easy to just handle constants
in apply_pipeline_layout.

Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
src/intel/vulkan/anv_nir_apply_pipeline_layout.c

index 612b3f7effe79d00ec29d013b58773427675fe57..978a8a57c701565a107b0abb02b2a44bb890fb3c 100644 (file)
@@ -116,12 +116,21 @@ lower_res_index_intrinsic(nir_intrinsic_instr *intrin,
    uint32_t array_size =
       state->layout->set[set].layout->binding[binding].array_size;
 
-   nir_ssa_def *block_index = nir_ssa_for_src(b, intrin->src[0], 1);
+   nir_const_value *const_array_index = nir_src_as_const_value(intrin->src[0]);
 
-   if (state->add_bounds_checks)
-      block_index = nir_umin(b, block_index, nir_imm_int(b, array_size - 1));
+   nir_ssa_def *block_index;
+   if (const_array_index) {
+      unsigned array_index = const_array_index->u32[0];
+      array_index = MIN2(array_index, array_size - 1);
+      block_index = nir_imm_int(b, surface_index + array_index);
+   } else {
+      block_index = nir_ssa_for_src(b, intrin->src[0], 1);
 
-   block_index = nir_iadd(b, nir_imm_int(b, surface_index), block_index);
+      if (state->add_bounds_checks)
+         block_index = nir_umin(b, block_index, nir_imm_int(b, array_size - 1));
+
+      block_index = nir_iadd(b, nir_imm_int(b, surface_index), block_index);
+   }
 
    assert(intrin->dest.is_ssa);
    nir_ssa_def_rewrite_uses(&intrin->dest.ssa, nir_src_for_ssa(block_index));