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

Author: Gert Wollny <[email protected]>
Date:   Fri Feb 24 17:27:30 2023 +0100

r600/sfn: Fix minimum required registers

Don't count the local registers, just the arrays, because local
registers might be renamed during register allocation.

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/8100

Fixes: 9fd9f3cd10cf58549f850aeca9103d8cca5a5f81
   r600/sfn: Set minimum required registers based on array allocation

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

---

 src/gallium/drivers/r600/sfn/sfn_shader.cpp       | 3 +--
 src/gallium/drivers/r600/sfn/sfn_valuefactory.cpp | 2 ++
 src/gallium/drivers/r600/sfn/sfn_valuefactory.h   | 3 +++
 3 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/r600/sfn/sfn_shader.cpp 
b/src/gallium/drivers/r600/sfn/sfn_shader.cpp
index 66f21194a36..567af70d7bc 100644
--- a/src/gallium/drivers/r600/sfn/sfn_shader.cpp
+++ b/src/gallium/drivers/r600/sfn/sfn_shader.cpp
@@ -522,8 +522,7 @@ Shader::allocate_local_registers(const exec_list *registers)
 {
    if (value_factory().allocate_registers(registers))
       m_indirect_files |= 1 << TGSI_FILE_TEMPORARY;
-   m_required_registers = value_factory().next_register_index() ?
-                             value_factory().next_register_index() - 1 : 0;
+   m_required_registers = value_factory().array_registers();
 }
 
 bool
diff --git a/src/gallium/drivers/r600/sfn/sfn_valuefactory.cpp 
b/src/gallium/drivers/r600/sfn/sfn_valuefactory.cpp
index e19479ea724..4c9a822e52c 100644
--- a/src/gallium/drivers/r600/sfn/sfn_valuefactory.cpp
+++ b/src/gallium/drivers/r600/sfn/sfn_valuefactory.cpp
@@ -118,6 +118,8 @@ ValueFactory::allocate_registers(const exec_list *registers)
       length = a.length;
    }
 
+   m_required_array_registers = m_next_register_index ? m_next_register_index 
: 0;
+
    foreach_list_typed(nir_register, reg, node, registers)
    {
       if (!reg->num_array_elems) {
diff --git a/src/gallium/drivers/r600/sfn/sfn_valuefactory.h 
b/src/gallium/drivers/r600/sfn/sfn_valuefactory.h
index eaf6e7ed56b..134d5be9253 100644
--- a/src/gallium/drivers/r600/sfn/sfn_valuefactory.h
+++ b/src/gallium/drivers/r600/sfn/sfn_valuefactory.h
@@ -285,6 +285,8 @@ public:
 
    int next_register_index() const { return m_next_register_index; }
 
+   uint32_t array_registers() const { return m_required_array_registers; }
+
 private:
    PVirtualValue ssa_src(const nir_ssa_def& dest, int chan);
 
@@ -326,6 +328,7 @@ private:
       126, pin_chan, {0, 1, 2, 3}
    };
    ChannelCounts m_channel_counts;
+   uint32_t m_required_array_registers{0};
 };
 
 } // namespace r600

Reply via email to