st/mesa: handle lowered IO in st_nir_assign_vs_in_locations
There are piglit failures without this. Reviewed-by: Eric Anholt <eric@anholt.net> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6442>
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user