diff --git a/src/gallium/drivers/r600/sfn/sfn_instr.h b/src/gallium/drivers/r600/sfn/sfn_instr.h index 6314030bfa7..5f99cf837ee 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr.h +++ b/src/gallium/drivers/r600/sfn/sfn_instr.h @@ -136,7 +136,7 @@ public: const InstrList& dependend_instr() { return m_dependend_instr; } virtual AluInstr *as_alu() { return nullptr; } - virtual uint8_t allowed_dest_chan_mask() const { return 0; } + virtual uint8_t allowed_src_chan_mask() const { return 0; } protected: const InstrList& required_instr() const { return m_required_instr; } diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp index 635ead4453e..0a56d4b9fba 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp @@ -465,15 +465,16 @@ AluInstr::set_sources(SrcValues src) } } +uint8_t AluInstr::allowed_src_chan_mask() const +{ + return 0xf; +} + uint8_t AluInstr::allowed_dest_chan_mask() const { - if (alu_slots() != 1) { - if (has_alu_flag(alu_is_cayman_trans)) { + if (alu_slots() != 1 && has_alu_flag(alu_is_cayman_trans)) { return (1 << alu_slots()) - 1; - } else { - return 0; - } } return 0xf; } diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_alu.h b/src/gallium/drivers/r600/sfn/sfn_instr_alu.h index f2c1928f758..dc6a2236429 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_alu.h +++ b/src/gallium/drivers/r600/sfn/sfn_instr_alu.h @@ -179,7 +179,8 @@ public: AluInstr *as_alu() override { return this; } - uint8_t allowed_dest_chan_mask() const override; + uint8_t allowed_src_chan_mask() const override; + uint8_t allowed_dest_chan_mask() const; private: friend class AluGroup; diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp index 69fb7193c17..b810b850a98 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp @@ -202,8 +202,14 @@ AluGroup::add_vec_instructions(AluInstr *instr) if (dest && (dest->pin() == pin_free || dest->pin() == pin_group)) { int free_mask = 0xf; + for (auto p : dest->parents()) { + auto alu = p->as_alu(); + if (alu) + free_mask &= alu->allowed_dest_chan_mask(); + } + for (auto u : dest->uses()) { - free_mask &= u->allowed_dest_chan_mask(); + free_mask &= u->allowed_src_chan_mask(); if (!free_mask) return false; } diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_export.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_export.cpp index ae07ac9f7dc..4718356c628 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_export.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_export.cpp @@ -161,7 +161,7 @@ ExportInstr::from_string_impl(std::istream& is, ValueFactory& vf) } uint8_t -ExportInstr::allowed_dest_chan_mask() const +ExportInstr::allowed_src_chan_mask() const { return value().free_chan_mask(); } diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_export.h b/src/gallium/drivers/r600/sfn/sfn_instr_export.h index 12edaece4fb..2b8ac4084dd 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_export.h +++ b/src/gallium/drivers/r600/sfn/sfn_instr_export.h @@ -77,7 +77,7 @@ public: static Instr::Pointer from_string(std::istream& is, ValueFactory& vf); static Instr::Pointer last_from_string(std::istream& is, ValueFactory& vf); - uint8_t allowed_dest_chan_mask() const override; + uint8_t allowed_src_chan_mask() const override; private: static ExportInstr::Pointer from_string_impl(std::istream& is, ValueFactory& vf); diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_tex.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_tex.cpp index 711125919ad..84caf6e5ceb 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_tex.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_tex.cpp @@ -423,7 +423,7 @@ TexInstr::replace_source(PRegister old_src, PVirtualValue new_src) } uint8_t -TexInstr::allowed_dest_chan_mask() const +TexInstr::allowed_src_chan_mask() const { return m_src.free_chan_mask(); } diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_tex.h b/src/gallium/drivers/r600/sfn/sfn_instr_tex.h index 051dfee7c32..06e027591d8 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_tex.h +++ b/src/gallium/drivers/r600/sfn/sfn_instr_tex.h @@ -153,7 +153,7 @@ public: bool replace_source(PRegister old_src, PVirtualValue new_src) override; - uint8_t allowed_dest_chan_mask() const override; + uint8_t allowed_src_chan_mask() const override; private: bool do_ready() const override;