Module: Mesa
Branch: main
Commit: 9bf68273ad4958361420b5f0ea58e7db2b5d9e66
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=9bf68273ad4958361420b5f0ea58e7db2b5d9e66

Author: Gert Wollny <[email protected]>
Date:   Fri Jul 21 17:05:35 2023 +0200

r600/sfn: rework checks for ALU CF emission

Signed-off-by: Gert Wollny <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24297>

---

 src/gallium/drivers/r600/sfn/sfn_assembler.cpp | 49 ++++++++++++++++++--------
 1 file changed, 34 insertions(+), 15 deletions(-)

diff --git a/src/gallium/drivers/r600/sfn/sfn_assembler.cpp 
b/src/gallium/drivers/r600/sfn/sfn_assembler.cpp
index 3ce51572caa..dc9343e2cf1 100644
--- a/src/gallium/drivers/r600/sfn/sfn_assembler.cpp
+++ b/src/gallium/drivers/r600/sfn/sfn_assembler.cpp
@@ -445,24 +445,38 @@ AssamblerVisitor::visit(const AluGroup& group)
    if (group.slots() == 0)
       return;
 
-   if (group.has_lds_group_start()) {
-      if (m_bc->cf_last->ndw + 2 * (*group.begin())->required_slots() > 220) {
-         assert(m_bc->cf_last->nlds_read == 0);
-         m_bc->force_add_cf = 1;
-         m_last_addr = nullptr;
-      }
-   } else if (m_bc->cf_last) {
-      if (m_bc->cf_last->ndw + 2 * group.slots() > 248) {
-         assert(m_bc->cf_last->nlds_read == 0);
-         m_bc->force_add_cf = 1;
-         m_last_addr = nullptr;
+
+   static const unsigned slot_limit = 
r600::sfn_log.has_debug_flag(r600::SfnLog::noaddrsplit) ?
+                                         248 : 256;
+
+   if (m_bc->cf_last && !m_bc->force_add_cf) {
+      if (group.has_lds_group_start()) {
+         if (m_bc->cf_last->ndw + 2 * (*group.begin())->required_slots() > 
slot_limit) {
+            assert(m_bc->cf_last->nlds_read == 0);
+            assert(0 && "Not allowed to start new alu group here");
+            m_bc->force_add_cf = 1;
+            m_last_addr = nullptr;
+         }
       } else {
-         auto instr = *group.begin();
-         if (instr && !instr->has_alu_flag(alu_is_lds) &&
-             instr->opcode() == op0_group_barrier && m_bc->cf_last->ndw + 14 > 
240) {
+         if (m_bc->cf_last->ndw + 2 * group.slots() > slot_limit) {
+            std::cerr << "m_bc->cf_last->ndw = " << m_bc->cf_last->ndw
+                      << " group.slots() = " << group.slots()
+                      << " -> " << m_bc->cf_last->ndw + 2 * group.slots()
+                      << "> slot_limit = " << slot_limit << "\n";
             assert(m_bc->cf_last->nlds_read == 0);
+            assert(0 && "Not allowed to start new alu group here");
             m_bc->force_add_cf = 1;
             m_last_addr = nullptr;
+         } else {
+            auto instr = *group.begin();
+            if (instr && !instr->has_alu_flag(alu_is_lds) &&
+                instr->opcode() == op0_group_barrier && m_bc->cf_last->ndw + 
14 > slot_limit) {
+               assert(0 && "Not allowed to start new alu group here");
+               assert(m_bc->cf_last->nlds_read == 0);
+               assert(r600::sfn_log.has_debug_flag(r600::SfnLog::noaddrsplit));
+               m_bc->force_add_cf = 1;
+               m_last_addr = nullptr;
+            }
          }
       }
    }
@@ -876,7 +890,11 @@ AssamblerVisitor::visit(const Block& block)
    if (block.empty())
       return;
 
-   m_bc->force_add_cf = block.has_instr_flag(Instr::force_cf);
+   if (block.has_instr_flag(Instr::force_cf)) {
+      m_bc->force_add_cf = 1;
+      m_bc->ar_loaded = 0;
+      m_last_addr = nullptr;
+   }
    sfn_log << SfnLog::assembly << "Translate block  size: " << block.size()
            << " new_cf:" << m_bc->force_add_cf << "\n";
 
@@ -927,6 +945,7 @@ AssamblerVisitor::visit(const IfInstr& instr)
    if (needs_workaround) {
       r600_bytecode_add_cfinst(m_bc, CF_OP_PUSH);
       m_bc->cf_last->cf_addr = m_bc->cf_last->id + 2;
+      r600_bytecode_add_cfinst(m_bc, CF_OP_ALU);
       pred->set_cf_type(cf_alu);
    }
 

Reply via email to