From 5d10e3ec6066239d732d19f69cd95da447e73e32 Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Sat, 15 Feb 2020 11:14:31 +0100 Subject: [PATCH] r600/nir: Pin interpolation results to channel Part-of: --- src/gallium/drivers/r600/sfn/sfn_shader_fragment.cpp | 4 ++++ src/gallium/drivers/r600/sfn/sfn_value_gpr.cpp | 6 ++++++ src/gallium/drivers/r600/sfn/sfn_value_gpr.h | 1 + 3 files changed, 11 insertions(+) diff --git a/src/gallium/drivers/r600/sfn/sfn_shader_fragment.cpp b/src/gallium/drivers/r600/sfn/sfn_shader_fragment.cpp index 270cb96d9a4..c3521f19362 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader_fragment.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_shader_fragment.cpp @@ -623,6 +623,8 @@ bool FragmentShaderFromNir::load_interpolated_one_comp(GPRVector &dest, auto ir = new AluInstruction(op, dest[chan], i & 1 ? ip.j : ip.i, PValue(new InlineConstValue(ALU_SRC_PARAM_BASE + io.lds_pos(), 0)), i == 0 ? EmitInstruction::write : EmitInstruction::last); + dest.pin_to_channel(chan); + ir->set_bank_swizzle(alu_vec_210); emit_instruction(ir); } @@ -636,6 +638,7 @@ bool FragmentShaderFromNir::load_interpolated_two_comp(GPRVector &dest, ShaderIn for (unsigned i = 0; i < 4 ; ++i) { ir = new AluInstruction(op, dest[i], i & 1 ? ip.j : ip.i, PValue(new InlineConstValue(ALU_SRC_PARAM_BASE + io.lds_pos(), 0)), (writemask & (1 << i)) ? EmitInstruction::write : EmitInstruction::empty); + dest.pin_to_channel(i); ir->set_bank_swizzle(alu_vec_210); emit_instruction(ir); } @@ -653,6 +656,7 @@ bool FragmentShaderFromNir::load_interpolated_two_comp_for_one(GPRVector &dest, PValue(new InlineConstValue(ALU_SRC_PARAM_BASE + io.lds_pos(), 0)), i == comp ? EmitInstruction::write : EmitInstruction::empty); ir->set_bank_swizzle(alu_vec_210); + dest.pin_to_channel(i); emit_instruction(ir); } ir->set_flag(alu_last_instr); diff --git a/src/gallium/drivers/r600/sfn/sfn_value_gpr.cpp b/src/gallium/drivers/r600/sfn/sfn_value_gpr.cpp index 7dbf2871180..35d90a87b22 100644 --- a/src/gallium/drivers/r600/sfn/sfn_value_gpr.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_value_gpr.cpp @@ -146,6 +146,12 @@ void GPRVector::set_reg_i(int i, PValue reg) m_elms[i] = reg; } +void GPRVector::pin_to_channel(int i) +{ + auto& v = static_cast(*m_elms[i]); + v.pin_to_channel(); +} + void GPRVector::do_print(std::ostream& os) const { os << "R" << sel() << "."; diff --git a/src/gallium/drivers/r600/sfn/sfn_value_gpr.h b/src/gallium/drivers/r600/sfn/sfn_value_gpr.h index f2c51f3c436..92b126c989b 100644 --- a/src/gallium/drivers/r600/sfn/sfn_value_gpr.h +++ b/src/gallium/drivers/r600/sfn/sfn_value_gpr.h @@ -93,6 +93,7 @@ public: PValue operator [] (int i) const {return m_elms[i];} PValue& operator [] (int i) {return m_elms[i];} + void pin_to_channel(int i); PValue x() const {return m_elms[0];} PValue y() const {return m_elms[1];} -- 2.30.2