radv: Use nested ifs for pushing child nodes in traversal loop.

Avoids a bunch of overhead costs if the previous child was empty
already.

Reviewed-by: Konstantin Seurer <konstantin.seurer@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18538>
This commit is contained in:
Bas Nieuwenhuizen
2022-09-11 17:59:15 +02:00
parent 91a4cd26b3
commit ca04f968d9
+14 -10
View File
@@ -1552,19 +1552,23 @@ build_traversal_shader(struct radv_device *device,
nir_load_var(&b, trav_vars.dir), nir_load_var(&b, trav_vars.inv_dir));
}
nir_ssa_def *new_nodes[4];
for (unsigned i = 0; i < 4; ++i)
new_nodes[i] = nir_channel(&b, result, i);
for (unsigned i = 1; i < 4; ++i)
nir_push_if(&b, nir_ine_imm(&b, new_nodes[i], 0xffffffff));
for (unsigned i = 4; i-- > 1;) {
nir_ssa_def *new_node = nir_channel(&b, result, i);
nir_push_if(&b, nir_ine_imm(&b, new_node, 0xffffffff));
{
nir_store_shared(&b, new_node, nir_load_var(&b, trav_vars.stack), .base = 0,
.align_mul = stack_entry_size);
nir_store_var(
&b, trav_vars.stack,
nir_iadd(&b, nir_load_var(&b, trav_vars.stack), stack_entry_stride_def), 1);
}
nir_store_shared(&b, new_nodes[i], nir_load_var(&b, trav_vars.stack), .base = 0,
.align_mul = stack_entry_size);
nir_store_var(
&b, trav_vars.stack,
nir_iadd(&b, nir_load_var(&b, trav_vars.stack), stack_entry_stride_def), 1);
nir_pop_if(&b, NULL);
}
nir_store_var(&b, trav_vars.current_node, nir_channel(&b, result, 0), 0x1);
nir_store_var(&b, trav_vars.current_node, new_nodes[0], 0x1);
}
nir_pop_if(&b, NULL);
}