From a1b7b524f80555b4f9ae0db276004d171e8fee0b Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Wed, 20 Aug 2025 15:18:17 +0200 Subject: [PATCH] r600/sfn: factor out common code for readport validation Signed-off-by: Gert Wollny Part-of: --- .../r600/sfn/sfn_alu_readport_validation.cpp | 16 ++++++++++++ .../r600/sfn/sfn_alu_readport_validation.h | 3 +++ .../drivers/r600/sfn/sfn_instr_alu.cpp | 25 ++----------------- .../drivers/r600/sfn/sfn_instr_alugroup.cpp | 13 +--------- 4 files changed, 22 insertions(+), 35 deletions(-) diff --git a/src/gallium/drivers/r600/sfn/sfn_alu_readport_validation.cpp b/src/gallium/drivers/r600/sfn/sfn_alu_readport_validation.cpp index 0f0e2895f03..937e5c85f8a 100644 --- a/src/gallium/drivers/r600/sfn/sfn_alu_readport_validation.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_alu_readport_validation.cpp @@ -71,6 +71,22 @@ public: void visit(const UniformValue& value) override; }; +bool +AluReadportReservation::update_from_sources(const std::array& src, + const unsigned int nsrc) +{ + AluBankSwizzle bs = alu_vec_012; + while (bs != alu_vec_unknown) { + AluReadportReservation rpr = *this; + if (rpr.schedule_vec_src(src, nsrc, bs) == nsrc) { + *this = rpr; + return true; + } + ++bs; + } + return false; +} + unsigned AluReadportReservation::schedule_vec_src(const std::array& src, int nsrc, diff --git a/src/gallium/drivers/r600/sfn/sfn_alu_readport_validation.h b/src/gallium/drivers/r600/sfn/sfn_alu_readport_validation.h index 982b212efe6..4679cabbfff 100644 --- a/src/gallium/drivers/r600/sfn/sfn_alu_readport_validation.h +++ b/src/gallium/drivers/r600/sfn/sfn_alu_readport_validation.h @@ -17,6 +17,9 @@ public: AluReadportReservation(const AluReadportReservation& orig) = default; AluReadportReservation& operator=(const AluReadportReservation& orig) = default; + bool update_from_sources(const std::array& src, + const unsigned int nsrc); + unsigned schedule_vec_src(const std::array& src, int nsrc, AluBankSwizzle swz); diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp index 72ba5f70f79..3f7e6d7bfdb 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp @@ -717,18 +717,7 @@ AluInstr::check_readport_validation(PRegister old_src, PVirtualValue new_src) co for (unsigned i = 0; i < nsrc; ++i, ++ireg) src[i] = old_src->equal_to(**ireg) ? new_src : *ireg; - AluBankSwizzle bs = alu_vec_012; - while (bs != alu_vec_unknown) { - AluReadportReservation rpr = rpr_sum; - if (rpr.schedule_vec_src(src, nsrc, bs) == nsrc) { - rpr_sum = rpr; - break; - } - ++bs; - } - - if (bs == alu_vec_unknown) - success = false; + success &= rpr_sum.update_from_sources(src, nsrc); } return success; } @@ -883,17 +872,7 @@ AluInstr::split(ValueFactory& vf, AluGroup& group) for (unsigned i = 0; i < nsrc; ++i, ++ireg) src[i] = *ireg; - AluBankSwizzle bs = alu_vec_012; - while (bs != alu_vec_unknown) { - AluReadportReservation rpr = rr; - if (rpr.schedule_vec_src(src, nsrc, bs) == nsrc) { - rr = rpr; - break; - } - ++bs; - } - - if (bs == alu_vec_unknown) { + if (!rr.update_from_sources(src, nsrc)) { if (group.empty()) UNREACHABLE("multi-slot ALU op violated readpport configuration"); else diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp index 6c456b5dfe0..9bdbaa5b013 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp @@ -335,18 +335,7 @@ bool AluGroup::replace_source(PRegister old_src, PVirtualValue new_src) return old_src->equal_to(*s) ? new_src : s; }); - AluBankSwizzle bs = alu_vec_012; - while (bs != alu_vec_unknown) { - AluReadportReservation rpr = rpr_sum; - unsigned nsrc = srcs.size(); - if (rpr.schedule_vec_src(test_src, nsrc, bs) == nsrc) { - rpr_sum = rpr; - break; - } - ++bs; - } - - if (bs == alu_vec_unknown) + if (!rpr_sum.update_from_sources(test_src, srcs.size())) return false; }