Module: Mesa Branch: main Commit: 952e06672fdb6b3fd968ef7d93889356ed0c330b URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=952e06672fdb6b3fd968ef7d93889356ed0c330b
Author: Faith Ekstrand <faith.ekstr...@collabora.com> Date: Tue Dec 12 18:06:13 2023 -0600 nak/sm50: Add legalization and encoding for OpLdc Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26615> --- src/nouveau/compiler/nak/encode_sm50.rs | 20 ++++++++++++++++++++ src/nouveau/compiler/nak/legalize.rs | 1 + 2 files changed, 21 insertions(+) diff --git a/src/nouveau/compiler/nak/encode_sm50.rs b/src/nouveau/compiler/nak/encode_sm50.rs index d2e39b75f5d..e70e95cbf1e 100644 --- a/src/nouveau/compiler/nak/encode_sm50.rs +++ b/src/nouveau/compiler/nak/encode_sm50.rs @@ -480,6 +480,25 @@ impl SM50Instr { } } + fn encode_ldc(&mut self, op: &OpLdc) { + assert!(op.cb.src_mod.is_none()); + let SrcRef::CBuf(cb) = &op.cb.src_ref else { + panic!("Not a CBuf source"); + }; + let CBuf::Binding(cb_idx) = cb.buf else { + panic!("Must be a bound constant buffer"); + }; + + self.set_opcode(0xef90); + + self.set_dst(op.dst); + self.set_reg_src(8..16, op.offset); + self.set_field(20..36, cb.offset); + self.set_field(36..41, cb_idx); + self.set_field(44..46, 0_u8); // TODO: subop + self.set_mem_type(48..51, op.mem_type); + } + fn encode_stg(&mut self, op: &OpSt) { self.set_opcode(0xeed8); @@ -1747,6 +1766,7 @@ impl SM50Instr { Op::PopC(op) => si.encode_popc(&op), Op::Prmt(op) => si.encode_prmt(&op), Op::Ld(op) => si.encode_ld(&op), + Op::Ldc(op) => si.encode_ldc(&op), Op::St(op) => si.encode_st(&op), Op::Lop2(op) => si.encode_lop2(&op), Op::Shf(op) => si.encode_shf(&op), diff --git a/src/nouveau/compiler/nak/legalize.rs b/src/nouveau/compiler/nak/legalize.rs index cccc9368806..4b7098db60e 100644 --- a/src/nouveau/compiler/nak/legalize.rs +++ b/src/nouveau/compiler/nak/legalize.rs @@ -199,6 +199,7 @@ fn legalize_sm50_instr( copy_src_if_not_reg(b, &mut op.srcs[1], RegFile::GPR); copy_src_if_not_reg(b, &mut op.srcs[2], RegFile::GPR); } + Op::Ldc(_) => (), // Nothing to do Op::Copy(_) => (), // Nothing to do _ => { let src_types = instr.src_types();