nak: sm50: add support for OpOut

Geometry shaders are broken otherwise.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26723>
This commit is contained in:
Daniel Almeida
2023-12-14 13:13:30 -06:00
committed by Marge Bot
parent 8b40a8715d
commit 2ac28dd9a9
2 changed files with 35 additions and 0 deletions

View File

@@ -2037,6 +2037,36 @@ impl SM50Instr {
self.set_reg_src(8..16, op.idx);
}
fn encode_out(&mut self, op: &OpOut) {
match &op.stream.src_ref {
SrcRef::Imm32(imm32) => {
self.set_opcode(0xf6e0);
self.set_src_imm_i20(20..39, 56, *imm32);
}
SrcRef::CBuf(cbuf) => {
self.set_opcode(0xebe0);
self.set_src_cb(20..39, cbuf);
}
SrcRef::Zero | SrcRef::Reg(_) => {
self.set_opcode(0xfbe0);
self.set_reg_src(20..28, op.stream);
}
src => panic!("Unsupported src type for OUT: {src}"),
}
self.set_field(
39..41,
match op.out_type {
OutType::Emit => 1_u8,
OutType::Cut => 2_u8,
OutType::EmitThenCut => 3_u8,
},
);
self.set_reg_src(8..16, op.handle);
self.set_dst(op.dst);
}
pub fn encode(
instr: &Instr,
sm: u8,
@@ -2108,6 +2138,7 @@ impl SM50Instr {
Op::CS2R(op) => si.encode_cs2r(op),
Op::Nop(_) => si.encode_nop(),
Op::Isberd(op) => si.encode_isberd(&op),
Op::Out(op) => si.encode_out(&op),
_ => panic!("Unhandled instruction {}", instr.op),
}

View File

@@ -354,6 +354,10 @@ fn legalize_sm50_instr(
copy_alu_src_if_not_reg(b, &mut op.handle, SrcType::GPR);
copy_alu_src_if_not_reg(b, &mut op.data, SrcType::GPR);
}
Op::Out(op) => {
copy_alu_src_if_not_reg(b, &mut op.handle, SrcType::GPR);
copy_alu_src_if_i20_overflow(b, &mut op.stream, SrcType::ALU);
}
_ => {
let src_types = instr.src_types();
for (i, src) in instr.srcs_mut().iter_mut().enumerate() {