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
