From 2519472845a7eccd9ff2bfc8a3061ec2ae00de06 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Fri, 14 Aug 2020 01:32:00 -0400 Subject: [PATCH] st/mesa: handle lowered IO in st_nir_assign_vs_in_locations There are piglit failures without this. Reviewed-by: Eric Anholt Part-of: --- src/mesa/state_tracker/st_glsl_to_nir.cpp | 29 ++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) 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. -- 2.30.2