summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/r600/sfn/sfn_shader_fragment.cpp4
-rw-r--r--src/gallium/drivers/r600/sfn/sfn_value_gpr.cpp6
-rw-r--r--src/gallium/drivers/r600/sfn/sfn_value_gpr.h1
3 files changed, 11 insertions, 0 deletions
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<GPRValue&>(*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];}