From 59860d487368e18a1d85ea96988c5f4c904879b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timur=20Krist=C3=B3f?= Date: Sun, 31 Oct 2021 21:09:08 +0100 Subject: [PATCH] nir: Group per-primitive outputs at the end for driver location assign. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Timur Kristóf Reviewed-by: Timothy Arceri Acked-by: Caio Oliveira Part-of: --- src/compiler/nir/nir_linking_helpers.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/compiler/nir/nir_linking_helpers.c b/src/compiler/nir/nir_linking_helpers.c index 313a234a7f9..ffedcc3854f 100644 --- a/src/compiler/nir/nir_linking_helpers.c +++ b/src/compiler/nir/nir_linking_helpers.c @@ -1406,7 +1406,16 @@ static void insert_sorted(struct exec_list *var_list, nir_variable *new_var) { nir_foreach_variable_in_list(var, var_list) { - if (var->data.location > new_var->data.location) { + /* Use the `per_primitive` bool to sort per-primitive variables + * to the end of the list, so they get the last driver locations + * by nir_assign_io_var_locations. + * + * This is done because AMD HW requires that per-primitive outputs + * are the last params. + * In the future we can add an option for this, if needed by other HW. + */ + if (new_var->data.per_primitive < var->data.per_primitive || + var->data.location > new_var->data.location) { exec_node_insert_node_before(&var->node, &new_var->node); return; }