From 93ce419991444b6406e5eb752b46b6eaa7c4b6e9 Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Fri, 19 Apr 2024 21:47:02 +0200 Subject: [PATCH] r600/sfn: Use dependecies to order barriers and LDS/RAT instructions This gives more freedom to schedule the group barrier and removes the need to add blocks around a barrier to keep the scheduler in check. This should avoid emitting some CF instructions. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/11002 Fixes: fe881bf0976cf5799afba52911cdf6df45e8641f r600/sfn: move kill handling fully to scheduling v2: grammar fixes (lorn10) Signed-off-by: Gert Wollny Part-of: (cherry picked from commit bf44ce61bb4f19a8d921a119a949468a08e2c0b3) --- .pick_status.json | 2 +- src/gallium/drivers/r600/sfn/sfn_shader.cpp | 23 +++++++++++++++++---- src/gallium/drivers/r600/sfn/sfn_shader.h | 2 ++ 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index bfb6ce9bc3f..03da6829c7a 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -34,7 +34,7 @@ "description": "r600/sfn: Use dependecies to order barriers and LDS/RAT instructions", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "fe881bf0976cf5799afba52911cdf6df45e8641f", "notes": null diff --git a/src/gallium/drivers/r600/sfn/sfn_shader.cpp b/src/gallium/drivers/r600/sfn/sfn_shader.cpp index 7af0000f45b..495df1f73b6 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_shader.cpp @@ -1364,6 +1364,22 @@ void Shader::InstructionChain::visit(AluInstr *instr) } } } + + if (instr->has_lds_access()) { + last_lds_access = instr; + if (last_group_barrier) + instr->add_required_instr(last_group_barrier); + } + + if (!instr->has_alu_flag(alu_is_lds) && + instr->opcode() == op0_group_barrier) { + last_group_barrier = instr; + if (last_lds_access) + instr->add_required_instr(last_group_barrier); + if (last_ssbo_instr) + instr->add_required_instr(last_ssbo_instr); + } + } void @@ -1402,6 +1418,9 @@ Shader::InstructionChain::visit(RatInstr *instr) if (last_kill_instr) instr->add_required_instr(last_kill_instr); + + if (last_group_barrier) + instr->add_required_instr(last_group_barrier); } void @@ -1464,13 +1483,9 @@ Shader::emit_group_barrier(nir_intrinsic_instr *intr) { assert(m_control_flow_depth == 0); (void)intr; - /* Put barrier into it's own block, so that optimizers and the - * scheduler don't move code */ - start_new_block(0); auto op = new AluInstr(op0_group_barrier, 0); op->set_alu_flag(alu_last_instr); emit_instruction(op); - start_new_block(0); return true; } diff --git a/src/gallium/drivers/r600/sfn/sfn_shader.h b/src/gallium/drivers/r600/sfn/sfn_shader.h index 9b442bdab04..8b340ca2649 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader.h +++ b/src/gallium/drivers/r600/sfn/sfn_shader.h @@ -413,6 +413,8 @@ private: Instr *last_gds_instr{nullptr}; Instr *last_ssbo_instr{nullptr}; Instr *last_kill_instr{nullptr}; + Instr *last_lds_access{nullptr}; + Instr *last_group_barrier{nullptr}; std::unordered_map last_alu_with_indirect_reg; bool prepare_mem_barrier{false}; };