summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/r600/sfn/sfn_emitssboinstruction.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/r600/sfn/sfn_emitssboinstruction.cpp')
-rw-r--r--src/gallium/drivers/r600/sfn/sfn_emitssboinstruction.cpp16
1 files changed, 9 insertions, 7 deletions
diff --git a/src/gallium/drivers/r600/sfn/sfn_emitssboinstruction.cpp b/src/gallium/drivers/r600/sfn/sfn_emitssboinstruction.cpp
index f7eb09936a4..458554eec8e 100644
--- a/src/gallium/drivers/r600/sfn/sfn_emitssboinstruction.cpp
+++ b/src/gallium/drivers/r600/sfn/sfn_emitssboinstruction.cpp
@@ -103,7 +103,7 @@ bool EmitSSBOInstruction::emit_atomic(const nir_intrinsic_instr* instr)
GPRVector dest = make_dest(instr);
- int base = nir_intrinsic_base(instr);
+ int base = remap_atomic_base(nir_intrinsic_base(instr));
PValue uav_id = from_nir(instr->src[0], 0);
@@ -111,7 +111,7 @@ bool EmitSSBOInstruction::emit_atomic(const nir_intrinsic_instr* instr)
GDSInstr *ir = nullptr;
if (instr->intrinsic == nir_intrinsic_atomic_counter_comp_swap) {
- PValue value2 = from_nir_with_fetch_constant(instr->src[1], 1);
+ PValue value2 = from_nir_with_fetch_constant(instr->src[2], 0);
ir = new GDSInstr(op, dest, value, value2, uav_id, base);
} else {
ir = new GDSInstr(op, dest, value, uav_id, base);
@@ -132,7 +132,7 @@ bool EmitSSBOInstruction::emit_unary_atomic(const nir_intrinsic_instr* instr)
PValue uav_id = from_nir(instr->src[0], 0);
- auto ir = new GDSInstr(op, dest, uav_id, nir_intrinsic_base(instr));
+ auto ir = new GDSInstr(op, dest, uav_id, remap_atomic_base(nir_intrinsic_base(instr)));
emit_instruction(ir);
return true;
@@ -221,7 +221,7 @@ bool EmitSSBOInstruction::emit_atomic_add(const nir_intrinsic_instr* instr)
PValue uav_id = from_nir(instr->src[0], 0);
auto ir = new GDSInstr(DS_OP_ADD_RET, dest, value, uav_id,
- nir_intrinsic_base(instr));
+ remap_atomic_base(nir_intrinsic_base(instr)));
emit_instruction(ir);
return true;
@@ -240,7 +240,7 @@ bool EmitSSBOInstruction::emit_atomic_inc(const nir_intrinsic_instr* instr)
PValue uav_id = from_nir(instr->src[0], 0);
GPRVector dest = make_dest(instr);
auto ir = new GDSInstr(DS_OP_ADD_RET, dest, m_atomic_update, uav_id,
- nir_intrinsic_base(instr));
+ remap_atomic_base(nir_intrinsic_base(instr)));
emit_instruction(ir);
return true;
}
@@ -252,9 +252,11 @@ bool EmitSSBOInstruction::emit_atomic_pre_dec(const nir_intrinsic_instr *instr)
PValue uav_id = from_nir(instr->src[0], 0);
auto ir = new GDSInstr(DS_OP_SUB_RET, dest, m_atomic_update, uav_id,
- nir_intrinsic_base(instr));
+ remap_atomic_base(nir_intrinsic_base(instr)));
emit_instruction(ir);
+ emit_instruction(new AluInstruction(op2_sub_int, dest.x(), dest.x(), literal(1), last_write));
+
return true;
}
@@ -263,7 +265,7 @@ bool EmitSSBOInstruction::emit_load_ssbo(const nir_intrinsic_instr* instr)
GPRVector dest = make_dest(instr);
/** src0 not used, should be some offset */
- auto addr = from_nir_with_fetch_constant(instr->src[1], 0);
+ auto addr = from_nir(instr->src[1], 0);
PValue addr_temp = create_register_from_nir_src(instr->src[1], 1);
/** Should be lowered in nir */