From fe881bf0976cf5799afba52911cdf6df45e8641f Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Sun, 14 May 2023 14:48:51 +0200 Subject: [PATCH] r600/sfn: move kill handling fully to scheduling Signed-off-by: Gert Wollny Part-of: --- .../drivers/r600/sfn/sfn_instr_alugroup.cpp | 27 ++++++++++++------- .../drivers/r600/sfn/sfn_scheduler.cpp | 5 ++++ .../drivers/r600/sfn/sfn_shader_fs.cpp | 2 +- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp index 533f714359b..a7a8a8beed0 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp @@ -49,16 +49,14 @@ AluGroup::add_instruction(AluInstr *instr) ASSERTED auto opinfo = alu_ops.find(instr->opcode()); assert(opinfo->second.can_channel(AluOp::t, s_chip_class)); if (add_trans_instructions(instr)) { - if (instr->is_kill()) - m_has_kill_op = true; + m_has_kill_op |= instr->is_kill(); return true; } } if (add_vec_instructions(instr) && !instr->has_alu_flag(alu_is_trans)) { instr->set_parent_group(this); - if (instr->is_kill()) - m_has_kill_op = true; + m_has_kill_op |= instr->is_kill(); return true; } @@ -68,8 +66,7 @@ AluGroup::add_instruction(AluInstr *instr) if (s_max_slots > 4 && opinfo->second.can_channel(AluOp::t, s_chip_class) && add_trans_instructions(instr)) { instr->set_parent_group(this); - if (instr->is_kill()) - m_has_kill_op = true; + m_has_kill_op |= instr->is_kill(); return true; } @@ -143,6 +140,8 @@ AluGroup::add_trans_instructions(AluInstr *instr) /* We added a vector op in the trans channel, so we have to * make sure the corresponding vector channel is used */ assert(instr->has_alu_flag(alu_is_trans) || m_slots[instr->dest_chan()]); + + m_has_kill_op |= instr->is_kill(); return true; } } @@ -183,12 +182,16 @@ AluGroup::add_vec_instructions(AluInstr *instr) int preferred_chan = instr->dest_chan(); if (!m_slots[preferred_chan]) { if (instr->bank_swizzle() != alu_vec_unknown) { - if (try_readport(instr, instr->bank_swizzle())) + if (try_readport(instr, instr->bank_swizzle())) { + m_has_kill_op |= instr->is_kill(); return true; + } } else { for (AluBankSwizzle i = alu_vec_012; i != alu_vec_unknown; ++i) { - if (try_readport(instr, i)) + if (try_readport(instr, i)) { + m_has_kill_op |= instr->is_kill(); return true; + } } } } else { @@ -218,12 +221,16 @@ AluGroup::add_vec_instructions(AluInstr *instr) dest->set_chan(free_chan); if (instr->bank_swizzle() != alu_vec_unknown) { - if (try_readport(instr, instr->bank_swizzle())) + if (try_readport(instr, instr->bank_swizzle())) { + m_has_kill_op |= instr->is_kill(); return true; + } } else { for (AluBankSwizzle i = alu_vec_012; i != alu_vec_unknown; ++i) { - if (try_readport(instr, i)) + if (try_readport(instr, i)) { + m_has_kill_op |= instr->is_kill(); return true; + } } } } diff --git a/src/gallium/drivers/r600/sfn/sfn_scheduler.cpp b/src/gallium/drivers/r600/sfn/sfn_scheduler.cpp index 54fd469e110..c7817ac2444 100644 --- a/src/gallium/drivers/r600/sfn/sfn_scheduler.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_scheduler.cpp @@ -325,6 +325,7 @@ BlockScheduler::schedule_block(Block& in_block, bool have_instr = collect_ready(cir); m_current_block = new Block(in_block.nesting_depth(), in_block.id()); + m_current_block->set_instr_flag(Instr::force_cf); assert(m_current_block->id() >= 0); while (have_instr) { @@ -775,6 +776,10 @@ BlockScheduler::schedule_alu_to_group_vec(AluGroup *group) continue; } + // precausion: don't kill while we hae LDS queue reads in the pipeline + if ((*i)->is_kill() && m_current_block->lds_group_active()) + continue; + if (!m_current_block->try_reserve_kcache(**i)) { sfn_log << SfnLog::schedule << " failed (kcache)\n"; ++i; diff --git a/src/gallium/drivers/r600/sfn/sfn_shader_fs.cpp b/src/gallium/drivers/r600/sfn/sfn_shader_fs.cpp index 96ff986db02..010b546765b 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader_fs.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_shader_fs.cpp @@ -172,7 +172,7 @@ FragmentShader::process_stage_intrinsic(nir_intrinsic_instr *intr) value_factory().src(intr->src[0], 0), value_factory().zero(), {AluInstr::last})); - start_new_block(0); + return true; case nir_intrinsic_discard: m_uses_discard = true;