From b401e718d29fffff5ea2f68496edee3eb023aa26 Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Wed, 17 May 2023 08:07:51 +0200 Subject: [PATCH] r600/sfn: add dependencies for kill instructions GDS and image instructions have side effects, so they can't be reordered with kill instructions. Signed-off-by: Gert Wollny Part-of: --- src/gallium/drivers/r600/sfn/sfn_shader.cpp | 21 +++++++++++++++++++++ src/gallium/drivers/r600/sfn/sfn_shader.h | 3 ++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/r600/sfn/sfn_shader.cpp b/src/gallium/drivers/r600/sfn/sfn_shader.cpp index 73fe34e14d9..fe21c03ccc1 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_shader.cpp @@ -1159,6 +1159,21 @@ Shader::emit_wait_ack() return true; } +void Shader::InstructionChain::visit(AluInstr *instr) +{ + if (instr->is_kill()) { + last_kill_instr = instr; + + // these instructions have side effects, they should + // not be re-order with kill + if (last_gds_instr) + instr->add_required_instr(last_gds_instr); + + if (last_ssbo_instr) + instr->add_required_instr(last_ssbo_instr); + } +} + void Shader::InstructionChain::visit(ScratchIOInstr *instr) { @@ -1173,6 +1188,9 @@ Shader::InstructionChain::visit(GDSInstr *instr) for (auto& loop : this_shader->m_loops) { loop->set_instr_flag(flag); } + if (last_kill_instr) + instr->add_required_instr(last_kill_instr); + } void @@ -1189,6 +1207,9 @@ Shader::InstructionChain::visit(RatInstr *instr) if (this_shader->m_current_block->inc_rat_emitted() > 15) this_shader->start_new_block(0); + + if (last_kill_instr) + instr->add_required_instr(last_kill_instr); } void diff --git a/src/gallium/drivers/r600/sfn/sfn_shader.h b/src/gallium/drivers/r600/sfn/sfn_shader.h index d4736a51c88..8969a2b05f2 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader.h +++ b/src/gallium/drivers/r600/sfn/sfn_shader.h @@ -365,7 +365,6 @@ private: class InstructionChain : public InstrVisitor { public: - void visit(AluInstr *instr) override { (void)instr; } void visit(AluGroup *instr) override { (void)instr; } void visit(TexInstr *instr) override { (void)instr; } void visit(ExportInstr *instr) override { (void)instr; } @@ -380,6 +379,7 @@ private: void visit(LDSAtomicInstr *instr) override { (void)instr; } void visit(LDSReadInstr *instr) override { (void)instr; } + void visit(AluInstr *instr) override; void visit(ScratchIOInstr *instr) override; void visit(GDSInstr *instr) override; void visit(RatInstr *instr) override; @@ -390,6 +390,7 @@ private: Instr *last_scratch_instr{nullptr}; Instr *last_gds_instr{nullptr}; Instr *last_ssbo_instr{nullptr}; + Instr *last_kill_instr{nullptr}; bool prepare_mem_barrier{false}; };