anv/pipeline: Translate vulkan_resource_index to a constant when possible

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>
This commit is contained in:
Jason Ekstrand
2017-12-01 03:18:51 -08:00
parent 3b34ed79f1
commit 1bce04deb8

View 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));