From edde762b56dbe0deceff64ad174138e0ea68fd3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timur=20Krist=C3=B3f?= Date: Fri, 20 Dec 2024 12:47:07 -0600 Subject: [PATCH] ac/nir/ngg: Move emitting GS vertex param exports to if. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On GFX10-10.3 (when no attribute ring is present), only emit the GS vertex parameter exports on the vertex export threads. Other threads don't have anything to export. Move this code around to make it a bit easier to follow. Also add some comments to better explain what's what. Signed-off-by: Timur Kristóf Acked-by: Marek Olšák Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/common/ac_nir_lower_ngg.c | 38 +++++++++++++++++-------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/amd/common/ac_nir_lower_ngg.c b/src/amd/common/ac_nir_lower_ngg.c index 5207d9566c9..5ec6cd0edc3 100644 --- a/src/amd/common/ac_nir_lower_ngg.c +++ b/src/amd/common/ac_nir_lower_ngg.c @@ -3252,26 +3252,30 @@ ngg_gs_export_vertices(nir_builder *b, nir_def *max_num_out_vtx, nir_def *tid_in s->options->force_vrs, !wait_attr_ring, export_outputs, &s->out, NULL); + if (s->options->has_param_exports && s->options->gfx_level < GFX11) { + /* Emit vertex parameter exports. + * Only the vertex export threads should do this. + */ + ac_nir_export_parameters(b, s->options->vs_output_param_offset, + b->shader->info.outputs_written, + b->shader->info.outputs_written_16bit, + &s->out); + } + nir_pop_if(b, if_vtx_export_thread); - if (s->options->has_param_exports) { - if (s->options->gfx_level >= GFX11) { - create_output_phis(b, b->shader->info.outputs_written, b->shader->info.outputs_written_16bit, &s->out); + if (s->options->has_param_exports && s->options->gfx_level >= GFX11) { + /* Store vertex parameters to attribute ring. + * For optimal attribute ring access, this should happen in top level CF. + */ + create_output_phis(b, b->shader->info.outputs_written, b->shader->info.outputs_written_16bit, &s->out); + ac_nir_store_parameters_to_attr_ring(b, s->options->vs_output_param_offset, + b->shader->info.outputs_written, + b->shader->info.outputs_written_16bit, + &s->out, tid_in_tg, max_num_out_vtx); - ac_nir_store_parameters_to_attr_ring(b, s->options->vs_output_param_offset, - b->shader->info.outputs_written, - b->shader->info.outputs_written_16bit, - &s->out, tid_in_tg, max_num_out_vtx); - - if (wait_attr_ring) - export_pos0_wait_attr_ring(b, if_vtx_export_thread, s->out.outputs, s->options); - } else { - b->cursor = nir_after_cf_list(&if_vtx_export_thread->then_list); - ac_nir_export_parameters(b, s->options->vs_output_param_offset, - b->shader->info.outputs_written, - b->shader->info.outputs_written_16bit, - &s->out); - } + if (wait_attr_ring) + export_pos0_wait_attr_ring(b, if_vtx_export_thread, s->out.outputs, s->options); } }