r600/nir: Pin interpolation results to channel
authorGert Wollny <gert.wollny@collabora.com>
Sat, 15 Feb 2020 10:14:31 +0000 (11:14 +0100)
committerMarge Bot <eric+marge@anholt.net>
Tue, 21 Apr 2020 15:10:43 +0000 (15:10 +0000)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4609>

src/gallium/drivers/r600/sfn/sfn_shader_fragment.cpp
src/gallium/drivers/r600/sfn/sfn_value_gpr.cpp
src/gallium/drivers/r600/sfn/sfn_value_gpr.h

index 270cb96d9a4416175a3a08561dd1dded6ad442cf..c3521f193629dd908b1d1d9d46124355b974895e 100644 (file)
@@ -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);
index 7dbf28711805877adbc3d1dc3879254c0a9be58d..35d90a87b225b387ee722b7e7b2c2e6273819f6f 100644 (file)
@@ -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<GPRValue&>(*m_elms[i]);
+   v.pin_to_channel();
+}
+
 void GPRVector::do_print(std::ostream& os) const
 {
    os << "R" << sel() << ".";
index f2c51f3c436123bb3cc43dedc507f5b7e3015fa8..92b126c989b37ada3910199b591414d6dfb53d07 100644 (file)
@@ -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];}