Module: Mesa
Branch: main
Commit: c0d0ce4c6b4530264afef0db89236c9e9e4cc7bb
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=c0d0ce4c6b4530264afef0db89236c9e9e4cc7bb

Author: Faith Ekstrand <faith.ekstr...@collabora.com>
Date:   Wed Nov 22 14:41:48 2023 -0600

nak: Rework OpPrmt a bit

This renames `selection` to `sel`, adds a source type for sel, adds the
PrmtMode for selecting permute mode, and adds proper legalization.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26348>

---

 src/nouveau/compiler/nak_builder.rs     |  3 ++-
 src/nouveau/compiler/nak_encode_sm70.rs | 15 +++++++++++++-
 src/nouveau/compiler/nak_ir.rs          | 35 ++++++++++++++++++++++++++++++---
 src/nouveau/compiler/nak_legalize.rs    |  7 +++++--
 4 files changed, 53 insertions(+), 7 deletions(-)

diff --git a/src/nouveau/compiler/nak_builder.rs 
b/src/nouveau/compiler/nak_builder.rs
index f8090243acd..585bde11d60 100644
--- a/src/nouveau/compiler/nak_builder.rs
+++ b/src/nouveau/compiler/nak_builder.rs
@@ -64,7 +64,8 @@ pub trait Builder {
             self.push_op(OpPrmt {
                 dst: dst,
                 srcs: [x, y],
-                selection: sel_u32.into(),
+                sel: sel_u32.into(),
+                mode: PrmtMode::Index,
             });
         }
     }
diff --git a/src/nouveau/compiler/nak_encode_sm70.rs 
b/src/nouveau/compiler/nak_encode_sm70.rs
index 4e1ce63fd9f..6c5f8fa27ea 100644
--- a/src/nouveau/compiler/nak_encode_sm70.rs
+++ b/src/nouveau/compiler/nak_encode_sm70.rs
@@ -864,9 +864,22 @@ impl SM70Instr {
             0x16,
             Some(op.dst),
             ALUSrc::from_src(&op.srcs[0]),
-            ALUSrc::from_src(&op.selection),
+            ALUSrc::from_src(&op.sel),
             ALUSrc::from_src(&op.srcs[1]),
         );
+
+        self.set_field(
+            72..75,
+            match op.mode {
+                PrmtMode::Index => 0_u8,
+                PrmtMode::Forward4Extract => 1_u8,
+                PrmtMode::Backward4Extract => 2_u8,
+                PrmtMode::Replicate8 => 3_u8,
+                PrmtMode::EdgeClampLeft => 4_u8,
+                PrmtMode::EdgeClampRight => 5_u8,
+                PrmtMode::Replicate16 => 6_u8,
+            },
+        )
     }
 
     fn encode_sel(&mut self, op: &OpSel) {
diff --git a/src/nouveau/compiler/nak_ir.rs b/src/nouveau/compiler/nak_ir.rs
index 966f42202bb..89bcaac929a 100644
--- a/src/nouveau/compiler/nak_ir.rs
+++ b/src/nouveau/compiler/nak_ir.rs
@@ -2726,6 +2726,32 @@ impl DisplayOp for OpMov {
 }
 impl_display_for_op!(OpMov);
 
+#[allow(dead_code)]
+#[derive(Clone, Copy, Eq, Hash, PartialEq)]
+pub enum PrmtMode {
+    Index,
+    Forward4Extract,
+    Backward4Extract,
+    Replicate8,
+    EdgeClampLeft,
+    EdgeClampRight,
+    Replicate16,
+}
+
+impl fmt::Display for PrmtMode {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            PrmtMode::Index => Ok(()),
+            PrmtMode::Forward4Extract => write!(f, ".f4e"),
+            PrmtMode::Backward4Extract => write!(f, ".b4e"),
+            PrmtMode::Replicate8 => write!(f, ".rc8"),
+            PrmtMode::EdgeClampLeft => write!(f, ".ecl"),
+            PrmtMode::EdgeClampRight => write!(f, ".ecl"),
+            PrmtMode::Replicate16 => write!(f, ".rc16"),
+        }
+    }
+}
+
 #[repr(C)]
 #[derive(SrcsAsSlice, DstsAsSlice)]
 /// Permutes `srcs` into `dst` using `selection`.
@@ -2735,15 +2761,18 @@ pub struct OpPrmt {
     #[src_type(ALU)]
     pub srcs: [Src; 2],
 
-    pub selection: Src,
+    #[src_type(ALU)]
+    pub sel: Src,
+
+    pub mode: PrmtMode,
 }
 
 impl DisplayOp for OpPrmt {
     fn fmt_op(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         write!(
             f,
-            "prmt {} [{}] {}",
-            self.srcs[0], self.selection, self.srcs[1],
+            "prmt{} {} [{}] {}",
+            self.mode, self.srcs[0], self.sel, self.srcs[1],
         )
     }
 }
diff --git a/src/nouveau/compiler/nak_legalize.rs 
b/src/nouveau/compiler/nak_legalize.rs
index 924959a2b13..5393167d991 100644
--- a/src/nouveau/compiler/nak_legalize.rs
+++ b/src/nouveau/compiler/nak_legalize.rs
@@ -198,8 +198,11 @@ fn legalize_instr(b: &mut impl SSABuilder, instr: &mut 
Instr) {
         | Op::F2I(_)
         | Op::I2F(_)
         | Op::Mov(_)
-        | Op::FRnd(_)
-        | Op::Prmt(_) => (),
+        | Op::FRnd(_) => (),
+        Op::Prmt(op) => {
+            copy_src_if_not_reg(b, &mut op.srcs[0], RegFile::GPR);
+            copy_src_if_not_reg(b, &mut op.srcs[1], RegFile::GPR);
+        }
         Op::Sel(op) => {
             let [ref mut src0, ref mut src1] = op.srcs;
             if !src_is_reg(src0) && src_is_reg(src1) {

Reply via email to