From: Marek Olšák Date: Fri, 14 Aug 2020 05:32:00 +0000 (-0400) Subject: st/mesa: handle lowered IO in st_nir_assign_vs_in_locations X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2519472845a7eccd9ff2bfc8a3061ec2ae00de06;p=mesa.git st/mesa: handle lowered IO in st_nir_assign_vs_in_locations There are piglit failures without this. Reviewed-by: Eric Anholt Part-of: --- diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index b4d78c86d6c..442f1ffeeb8 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -105,9 +105,36 @@ st_nir_assign_vs_in_locations(struct nir_shader *nir) if (nir->info.stage != MESA_SHADER_VERTEX) return; + nir->num_inputs = util_bitcount64(nir->info.inputs_read); + + if (nir->info.io_lowered) { + /* Adjust the locations in load_input intrinsics. */ + nir_foreach_function(f, nir) { + if (f->impl) { + nir_foreach_block(block, f->impl) { + nir_foreach_instr_safe(instr, block) { + if (instr->type == nir_instr_type_intrinsic) { + nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr); + + if (intrin->intrinsic == nir_intrinsic_load_input) { + unsigned base = nir_intrinsic_base(intrin); + unsigned loc = nir_intrinsic_io_semantics(intrin).location; + + assert(nir->info.inputs_read & BITFIELD64_BIT(loc)); + base = util_bitcount64(nir->info.inputs_read & + BITFIELD64_MASK(loc)); + nir_intrinsic_set_base(intrin, base); + } + } + } + } + } + } + return; + } + bool removed_inputs = false; - nir->num_inputs = util_bitcount64(nir->info.inputs_read); nir_foreach_shader_in_variable_safe(var, nir) { /* NIR already assigns dual-slot inputs to two locations so all we have * to do is compact everything down.