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.jus...@intel.com> --- src/intel/vulkan/anv_nir_apply_pipeline_layout.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/intel/vulkan/anv_nir_apply_pipeline_layout.c b/src/intel/vulkan/anv_nir_apply_pipeline_layout.c index 612b3f7..978a8a5 100644 --- a/src/intel/vulkan/anv_nir_apply_pipeline_layout.c +++ b/src/intel/vulkan/anv_nir_apply_pipeline_layout.c @@ -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)); -- 2.5.0.400.gff86faf _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev