diff --git a/src/gallium/drivers/r600/sfn/sfn_instr.cpp b/src/gallium/drivers/r600/sfn/sfn_instr.cpp index 17e76ba059d..058d44c02be 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr.cpp @@ -510,7 +510,7 @@ InstrWithVectorResult::InstrWithVectorResult(const InstrWithVectorResult& orig): { } -void InstrWithVectorResult::update_indirect_addr(PRegister addr) +void InstrWithVectorResult::update_indirect_addr(UNUSED PRegister old_reg, PRegister addr) { set_resource_offset(addr); } diff --git a/src/gallium/drivers/r600/sfn/sfn_instr.h b/src/gallium/drivers/r600/sfn/sfn_instr.h index 440533fe0be..7d8322e099f 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr.h +++ b/src/gallium/drivers/r600/sfn/sfn_instr.h @@ -134,7 +134,8 @@ public: virtual AluInstr *as_alu() { return nullptr; } virtual uint8_t allowed_src_chan_mask() const { return 0; } - virtual void update_indirect_addr(PRegister addr) { + virtual void update_indirect_addr(PRegister old_reg, PRegister addr) { + (void)old_reg; (void)addr; unreachable("Instruction type has no indirect addess"); }; @@ -352,7 +353,7 @@ public: const RegisterVec4::Swizzle& all_dest_swizzle() const { return m_dest_swizzle; } const RegisterVec4& dst() const { return m_dest; } - void update_indirect_addr(PRegister addr) override; + void update_indirect_addr(PRegister old_reg, PRegister addr) override; protected: InstrWithVectorResult(const InstrWithVectorResult& orig); diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp index 0b53852c330..ec3093ab9ac 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp @@ -380,9 +380,10 @@ void ReplaceIndirectArrayAddr::visit(UniformValue& value) } } -void AluInstr::update_indirect_addr(PRegister reg) +void AluInstr::update_indirect_addr(UNUSED PRegister old_reg, PRegister reg) { ReplaceIndirectArrayAddr visitor; + visitor.new_addr = reg; assert(reg->has_flag(Register::addr_or_idx)); diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_alu.h b/src/gallium/drivers/r600/sfn/sfn_instr_alu.h index d80c95f94db..223605854ea 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_alu.h +++ b/src/gallium/drivers/r600/sfn/sfn_instr_alu.h @@ -177,7 +177,7 @@ public: static const std::set last_write; std::tuple indirect_addr() const; - void update_indirect_addr(PRegister reg) override; + void update_indirect_addr(PRegister old_reg, PRegister reg) override; void add_extra_dependency(PVirtualValue reg); diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp index 1be52e19ed5..81071efddd3 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp @@ -373,8 +373,9 @@ GDSInstr::emit_atomic_pre_dec(nir_intrinsic_instr *instr, Shader& shader) return true; } -void GDSInstr::update_indirect_addr(PRegister addr) +void GDSInstr::update_indirect_addr(PRegister old_reg, PRegister addr) { + (void)old_reg; set_resource_offset(addr); } @@ -447,7 +448,7 @@ RatInstr::do_print(std::ostream& os) const os << " ACK"; } -void RatInstr::update_indirect_addr(PRegister addr) +void RatInstr::update_indirect_addr(UNUSED PRegister old_reg, PRegister addr) { set_resource_offset(addr); } diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_mem.h b/src/gallium/drivers/r600/sfn/sfn_instr_mem.h index a741a112da8..bc56ed9d5f6 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_mem.h +++ b/src/gallium/drivers/r600/sfn/sfn_instr_mem.h @@ -59,7 +59,7 @@ public: uint32_t slots() const override { return 1; }; uint8_t allowed_src_chan_mask() const override; - void update_indirect_addr(PRegister addr) override; + void update_indirect_addr(PRegister old_reg, PRegister addr) override; private: static bool emit_atomic_read(nir_intrinsic_instr *intr, Shader& shader); @@ -168,7 +168,7 @@ public: static bool emit(nir_intrinsic_instr *intr, Shader& shader); - void update_indirect_addr(PRegister addr) override; + void update_indirect_addr(PRegister old_reg, PRegister addr) override; private: static bool emit_global_store(nir_intrinsic_instr *intr, Shader& shader); diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_tex.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_tex.cpp index dfd8296748f..10b59ebe36b 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_tex.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_tex.cpp @@ -428,11 +428,12 @@ TexInstr::replace_source(PRegister old_src, PVirtualValue new_src) return success; } -void TexInstr::update_indirect_addr(PRegister addr) +void TexInstr::update_indirect_addr(PRegister old_reg, PRegister addr) { set_resource_offset(addr); + for (auto& p : m_prepare_instr) - p->update_indirect_addr(addr); + p->update_indirect_addr(old_reg, addr); } uint8_t diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_tex.h b/src/gallium/drivers/r600/sfn/sfn_instr_tex.h index 0966f4b6ad5..7f92bc2c846 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_tex.h +++ b/src/gallium/drivers/r600/sfn/sfn_instr_tex.h @@ -152,7 +152,7 @@ public: auto prepare_instr() const { return m_prepare_instr; } bool replace_source(PRegister old_src, PVirtualValue new_src) override; - void update_indirect_addr(PRegister addr) override; + void update_indirect_addr(PRegister old_reg, PRegister addr) override; uint8_t allowed_src_chan_mask() const override; diff --git a/src/gallium/drivers/r600/sfn/sfn_split_address_loads.cpp b/src/gallium/drivers/r600/sfn/sfn_split_address_loads.cpp index 95115e188fa..8d883273caf 100644 --- a/src/gallium/drivers/r600/sfn/sfn_split_address_loads.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_split_address_loads.cpp @@ -169,7 +169,7 @@ void AddressSplitVisitor::visit(AluInstr *instr) s->accept(collector); } - instr->update_indirect_addr(m_vf.addr()); + instr->update_indirect_addr(addr, m_vf.addr()); addr->del_use(instr); m_last_ar_load->inc_ar_uses(); m_last_ar_use.push_back(instr); @@ -188,7 +188,7 @@ auto AddressSplitVisitor::load_index_register(Instr *instr, PRegister index) -> m_last_idx_use[idx_id].push_back(instr); index->del_use(instr); - instr->update_indirect_addr(m_current_idx[idx_id]); + instr->update_indirect_addr(index, m_current_idx[idx_id]); m_last_idx_load_index[idx_id] = (instr->block_id() << 16) | instr->index(); return idx_id == 0 ? bim_zero : bim_one; }