From 025c1f5174005b04a4ce28da7e1a529dc4a13904 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timur=20Krist=C3=B3f?= Date: Tue, 25 Apr 2023 18:38:12 +0200 Subject: [PATCH] ac/nir: Emit legacy GS DONE signal in NIR. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Legacy GS needs to emit a DONE signal at the end. Do this in NIR instead of in the backends. Signed-off-by: Timur Kristóf Reviewed-by: Qiang Yu Reviewed-by: Rhys Perry Reviewed-by: Marek Olšák Part-of: --- src/amd/common/ac_nir.c | 12 +++++++ .../compiler/aco_instruction_selection.cpp | 8 ----- src/amd/vulkan/radv_nir_to_llvm.c | 34 ------------------- .../drivers/radeonsi/si_shader_llvm_gs.c | 5 --- 4 files changed, 12 insertions(+), 47 deletions(-) diff --git a/src/amd/common/ac_nir.c b/src/amd/common/ac_nir.c index 415c043d0f7..3b753a67e9b 100644 --- a/src/amd/common/ac_nir.c +++ b/src/amd/common/ac_nir.c @@ -1100,6 +1100,18 @@ ac_nir_lower_legacy_gs(nir_shader *nir, 64, s.vertex_count, s.primitive_count); + + /* Wait for all stores to finish. */ + nir_scoped_barrier(b, .execution_scope = NIR_SCOPE_INVOCATION, + .memory_scope = NIR_SCOPE_DEVICE, + .memory_semantics = NIR_MEMORY_RELEASE, + .memory_modes = nir_var_shader_out | nir_var_mem_ssbo | + nir_var_mem_global | nir_var_image); + + /* Signal that the GS is done. */ + nir_sendmsg_amd(b, nir_load_gs_wave_id_amd(b), + .base = AC_SENDMSG_GS_OP_NOP | AC_SENDMSG_GS_DONE); + if (progress) nir_metadata_preserve(impl, nir_metadata_none); } diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index aafd51a2b4d..db33b83e4ea 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -11421,14 +11421,6 @@ select_program(Program* program, unsigned shader_count, struct nir_shader* const visit_cf_list(&ctx, &func->body); - if (nir->info.stage == MESA_SHADER_GEOMETRY && !ngg_gs) { - Builder bld(ctx.program, ctx.block); - bld.barrier(aco_opcode::p_barrier, - memory_sync_info(storage_vmem_output, semantic_release, scope_device)); - bld.sopp(aco_opcode::s_sendmsg, bld.m0(ctx.gs_wave_id), -1, - sendmsg_gs_done(false, false, 0)); - } - if (ctx.stage == fragment_fs && ctx.program->info.ps.has_epilog) { create_fs_jump_to_epilog(&ctx); diff --git a/src/amd/vulkan/radv_nir_to_llvm.c b/src/amd/vulkan/radv_nir_to_llvm.c index 0bcbd29b53f..ffb41412bfd 100644 --- a/src/amd/vulkan/radv_nir_to_llvm.c +++ b/src/amd/vulkan/radv_nir_to_llvm.c @@ -280,37 +280,6 @@ radv_load_output(struct radv_shader_context *ctx, unsigned index, unsigned chan) return LLVMBuildLoad2(ctx->ac.builder, type, output, ""); } -static void -emit_gs_epilogue(struct radv_shader_context *ctx) -{ - if (ctx->ac.gfx_level >= GFX10) - ac_build_waitcnt(&ctx->ac, AC_WAIT_VSTORE); - - ac_build_sendmsg(&ctx->ac, AC_SENDMSG_GS_OP_NOP | AC_SENDMSG_GS_DONE, ctx->gs_wave_id); -} - -static void -handle_shader_outputs_post(struct ac_shader_abi *abi) -{ - struct radv_shader_context *ctx = radv_shader_context_from_abi(abi); - - switch (ctx->stage) { - case MESA_SHADER_VERTEX: - case MESA_SHADER_TESS_CTRL: - case MESA_SHADER_TESS_EVAL: - case MESA_SHADER_FRAGMENT: - break; /* Lowered in NIR */ - case MESA_SHADER_GEOMETRY: - if (ctx->shader_info->is_ngg) - break; /* Lowered in NIR */ - else - emit_gs_epilogue(ctx); - break; - default: - break; - } -} - static void ac_llvm_finalize_module(struct radv_shader_context *ctx, LLVMPassManagerRef passmgr) { @@ -523,9 +492,6 @@ ac_translate_nir_to_llvm(struct ac_llvm_compiler *ac_llvm, abort(); } - if (!gl_shader_stage_is_compute(shaders[shader_idx]->info.stage)) - handle_shader_outputs_post(&ctx.abi); - if (check_merged_wave_info) { LLVMBuildBr(ctx.ac.builder, merge_block); LLVMPositionBuilderAtEnd(ctx.ac.builder, merge_block); diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm_gs.c b/src/gallium/drivers/radeonsi/si_shader_llvm_gs.c index c0213111415..1b94a3e0472 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm_gs.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm_gs.c @@ -98,11 +98,6 @@ static LLVMValueRef si_get_gs_wave_id(struct si_shader_context *ctx) void si_llvm_gs_build_end(struct si_shader_context *ctx) { - if (ctx->screen->info.gfx_level >= GFX10) - ac_build_waitcnt(&ctx->ac, AC_WAIT_VSTORE); - - ac_build_sendmsg(&ctx->ac, AC_SENDMSG_GS_OP_NOP | AC_SENDMSG_GS_DONE, si_get_gs_wave_id(ctx)); - if (ctx->screen->info.gfx_level >= GFX9) ac_build_endif(&ctx->ac, ctx->merged_wrap_if_label); }