bool emit_rat(const RatInstruction& instr);
bool emit_ldswrite(const LDSWriteInstruction& instr);
bool emit_ldsread(const LDSReadInstruction& instr);
+ bool emit_ldsatomic(const LDSAtomicInstruction& instr);
bool emit_tf_write(const GDSStoreTessFactor& instr);
bool emit_load_addr(PValue addr);
return emit_ldswrite(static_cast<const LDSWriteInstruction&>(*i));
case Instruction::lds_read:
return emit_ldsread(static_cast<const LDSReadInstruction&>(*i));
+ case Instruction::lds_atomic:
+ return emit_ldsatomic(static_cast<const LDSAtomicInstruction&>(*i));
case Instruction::tf_write:
return emit_tf_write(static_cast<const GDSStoreTessFactor&>(*i));
default:
|| m_bc->index_reg_chan[1] != addr->chan()) {
struct r600_bytecode_alu alu;
- memset(&alu, 0, sizeof(alu));
- alu.op = opcode_map.at(op2_lshr_int);
- alu.dst.sel = addr->sel();
- alu.dst.chan = addr->chan();
- alu.src[0].sel = addr->sel();
- alu.src[0].chan = addr->chan();
- alu.src[1].sel = ALU_SRC_LITERAL;
- alu.src[1].value = 2;
- alu.last = 1;
- alu.dst.write = 1;
- int r = r600_bytecode_add_alu(m_bc, &alu);
- if (r)
- return false;
-
memset(&alu, 0, sizeof(alu));
alu.op = opcode_map.at(op1_mova_int);
alu.dst.chan = 0;
alu.src[0].sel = addr->sel();
alu.src[0].chan = addr->chan();
alu.last = 1;
- r = r600_bytecode_add_alu(m_bc, &alu);
+ int r = r600_bytecode_add_alu(m_bc, &alu);
if (r)
return false;
}
} else {
const LiteralValue& addr_reg = static_cast<const LiteralValue&>(*addr);
- uav_idx = addr_reg.value() >> 2;
+ uav_idx = addr_reg.value();
}
memset(&gds, 0, sizeof(struct r600_bytecode_gds));
return true;
}
+bool AssemblyFromShaderLegacyImpl::emit_ldsatomic(const LDSAtomicInstruction& instr)
+{
+ if (m_bc->cf_last->ndw > 240 - 4)
+ m_bc->force_add_cf = 1;
+
+ r600_bytecode_alu alu_fetch;
+ r600_bytecode_alu alu_read;
+
+ memset(&alu_fetch, 0, sizeof(r600_bytecode_alu));
+ alu_fetch.is_lds_idx_op = true;
+ alu_fetch.op = instr.op();
+
+ copy_src(alu_fetch.src[0], instr.address());
+ auto& src0 = instr.src0();
+ alu_fetch.src[1].sel = src0.sel();
+ alu_fetch.src[1].chan = src0.chan();
+ if (instr.src1()) {
+ auto& src1 = *instr.src1();
+ alu_fetch.src[2].sel = src1.sel();
+ alu_fetch.src[2].chan = src1.chan();
+ }
+ alu_fetch.last = 1;
+ int r = r600_bytecode_add_alu(m_bc, &alu_fetch);
+ if (r)
+ return false;
+
+ memset(&alu_read, 0, sizeof(r600_bytecode_alu));
+ copy_dst(alu_read.dst, instr.dest());
+ alu_read.op = ALU_OP1_MOV;
+ alu_read.src[0].sel = EG_V_SQ_ALU_SRC_LDS_OQ_A_POP;
+ alu_read.last = 1;
+ alu_read.dst.write = 1;
+ r = r600_bytecode_add_alu(m_bc, &alu_read);
+ if (r)
+ return false;
+ return true;
+}
+
bool AssemblyFromShaderLegacyImpl::emit_rat(const RatInstruction& instr)
{
struct r600_bytecode_gds gds;