From 8a39a1502f2801c2e518bd233d3f67053aef20d7 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Wed, 7 May 2025 16:32:23 -0400 Subject: [PATCH] nak: Use TexOffsetMode for all texture ops We had a bool for most of them and an enum for OpTld4. Now we have an enum for all of them and we just reserve PerPx for OpTld4. While we're here, rework printing to put the "." in the enum display method. Part-of: --- src/nouveau/compiler/nak/from_nir.rs | 20 +++++----- src/nouveau/compiler/nak/ir.rs | 43 +++++++++------------- src/nouveau/compiler/nak/nvdisasm_tests.rs | 16 ++++---- src/nouveau/compiler/nak/sm20.rs | 12 +++--- src/nouveau/compiler/nak/sm32.rs | 12 +++--- src/nouveau/compiler/nak/sm50.rs | 14 +++---- src/nouveau/compiler/nak/sm70_encode.rs | 13 ++++--- 7 files changed, 62 insertions(+), 68 deletions(-) diff --git a/src/nouveau/compiler/nak/from_nir.rs b/src/nouveau/compiler/nak/from_nir.rs index 89889b50618..f96295bf905 100644 --- a/src/nouveau/compiler/nak/from_nir.rs +++ b/src/nouveau/compiler/nak/from_nir.rs @@ -1881,9 +1881,9 @@ impl<'a> ShaderFromNir<'a> { }; let offset_mode = match flags.offset_mode() { - NAK_NIR_OFFSET_MODE_NONE => Tld4OffsetMode::None, - NAK_NIR_OFFSET_MODE_AOFFI => Tld4OffsetMode::AddOffI, - NAK_NIR_OFFSET_MODE_PER_PX => Tld4OffsetMode::PerPx, + NAK_NIR_OFFSET_MODE_NONE => TexOffsetMode::None, + NAK_NIR_OFFSET_MODE_AOFFI => TexOffsetMode::AddOffI, + NAK_NIR_OFFSET_MODE_PER_PX => TexOffsetMode::PerPx, _ => panic!("Invalid offset mode"), }; @@ -1897,7 +1897,7 @@ impl<'a> ShaderFromNir<'a> { if tex.op == nir_texop_txd { assert!(lod_mode == TexLodMode::Auto); - assert!(offset_mode != Tld4OffsetMode::PerPx); + assert!(offset_mode != TexOffsetMode::PerPx); assert!(!flags.has_z_cmpr()); b.push_op(OpTxd { dsts: dsts, @@ -1905,13 +1905,13 @@ impl<'a> ShaderFromNir<'a> { tex: tex_ref, srcs: srcs, dim: dim, - offset: offset_mode == Tld4OffsetMode::AddOffI, + offset_mode, mem_eviction_priority: MemEvictionPriority::Normal, nodep: flags.nodep(), channel_mask, }); } else if tex.op == nir_texop_lod { - assert!(offset_mode == Tld4OffsetMode::None); + assert!(offset_mode == TexOffsetMode::None); b.push_op(OpTmml { dsts: dsts, tex: tex_ref, @@ -1921,7 +1921,7 @@ impl<'a> ShaderFromNir<'a> { channel_mask, }); } else if tex.op == nir_texop_txf || tex.op == nir_texop_txf_ms { - assert!(offset_mode != Tld4OffsetMode::PerPx); + assert!(offset_mode != TexOffsetMode::PerPx); b.push_op(OpTld { dsts: dsts, fault: fault.into(), @@ -1930,7 +1930,7 @@ impl<'a> ShaderFromNir<'a> { dim: dim, lod_mode: lod_mode, is_ms: tex.op == nir_texop_txf_ms, - offset: offset_mode == Tld4OffsetMode::AddOffI, + offset_mode, mem_eviction_priority: MemEvictionPriority::Normal, nodep: flags.nodep(), channel_mask, @@ -1950,7 +1950,7 @@ impl<'a> ShaderFromNir<'a> { channel_mask, }); } else { - assert!(offset_mode != Tld4OffsetMode::PerPx); + assert!(offset_mode != TexOffsetMode::PerPx); b.push_op(OpTex { dsts: dsts, fault: fault.into(), @@ -1959,7 +1959,7 @@ impl<'a> ShaderFromNir<'a> { dim: dim, lod_mode: lod_mode, z_cmpr: flags.has_z_cmpr(), - offset: offset_mode == Tld4OffsetMode::AddOffI, + offset_mode, mem_eviction_priority: MemEvictionPriority::Normal, nodep: flags.nodep(), channel_mask, diff --git a/src/nouveau/compiler/nak/ir.rs b/src/nouveau/compiler/nak/ir.rs index ace8c6afe8a..c1c59fac37f 100644 --- a/src/nouveau/compiler/nak/ir.rs +++ b/src/nouveau/compiler/nak/ir.rs @@ -1968,18 +1968,18 @@ impl fmt::Display for ChannelMask { } #[derive(Clone, Copy, Eq, PartialEq)] -pub enum Tld4OffsetMode { +pub enum TexOffsetMode { None, AddOffI, - PerPx, + PerPx, // tld4 only } -impl fmt::Display for Tld4OffsetMode { +impl fmt::Display for TexOffsetMode { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - Tld4OffsetMode::None => write!(f, "no_off"), - Tld4OffsetMode::AddOffI => write!(f, "aoffi"), - Tld4OffsetMode::PerPx => write!(f, "ptp"), + TexOffsetMode::None => write!(f, ""), + TexOffsetMode::AddOffI => write!(f, ".aoffi"), + TexOffsetMode::PerPx => write!(f, ".ptp"), } } } @@ -4771,7 +4771,7 @@ pub struct OpTex { pub dim: TexDim, pub lod_mode: TexLodMode, pub z_cmpr: bool, - pub offset: bool, + pub offset_mode: TexOffsetMode, pub mem_eviction_priority: MemEvictionPriority, pub nodep: bool, pub channel_mask: ChannelMask, @@ -4783,9 +4783,7 @@ impl DisplayOp for OpTex { if self.lod_mode != TexLodMode::Auto { write!(f, ".{}", self.lod_mode)?; } - if self.offset { - write!(f, ".aoffi")?; - } + write!(f, "{}", self.offset_mode)?; if self.z_cmpr { write!(f, ".dc")?; } @@ -4813,7 +4811,7 @@ pub struct OpTld { pub dim: TexDim, pub is_ms: bool, pub lod_mode: TexLodMode, - pub offset: bool, + pub offset_mode: TexOffsetMode, pub mem_eviction_priority: MemEvictionPriority, pub nodep: bool, pub channel_mask: ChannelMask, @@ -4825,9 +4823,7 @@ impl DisplayOp for OpTld { if self.lod_mode != TexLodMode::Auto { write!(f, ".{}", self.lod_mode)?; } - if self.offset { - write!(f, ".aoffi")?; - } + write!(f, "{}", self.offset_mode)?; if self.is_ms { write!(f, ".ms")?; } @@ -4854,7 +4850,7 @@ pub struct OpTld4 { pub dim: TexDim, pub comp: u8, - pub offset_mode: Tld4OffsetMode, + pub offset_mode: TexOffsetMode, pub z_cmpr: bool, pub mem_eviction_priority: MemEvictionPriority, pub nodep: bool, @@ -4863,10 +4859,7 @@ pub struct OpTld4 { impl DisplayOp for OpTld4 { fn fmt_op(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "tld4.g{}", self.dim)?; - if self.offset_mode != Tld4OffsetMode::None { - write!(f, ".{}", self.offset_mode)?; - } + write!(f, "tld4.g{}{}", self.dim, self.offset_mode)?; if self.z_cmpr { write!(f, ".dc")?; } @@ -4919,7 +4912,7 @@ pub struct OpTxd { pub srcs: [Src; 2], pub dim: TexDim, - pub offset: bool, + pub offset_mode: TexOffsetMode, pub mem_eviction_priority: MemEvictionPriority, pub nodep: bool, pub channel_mask: ChannelMask, @@ -4927,11 +4920,11 @@ pub struct OpTxd { impl DisplayOp for OpTxd { fn fmt_op(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "txd{}", self.dim)?; - if self.offset { - write!(f, ".aoffi")?; - } - write!(f, "{}", self.mem_eviction_priority)?; + write!( + f, + "txd{}{}{}", + self.dim, self.offset_mode, self.mem_eviction_priority + )?; if self.nodep { write!(f, ".nodep")?; } diff --git a/src/nouveau/compiler/nak/nvdisasm_tests.rs b/src/nouveau/compiler/nak/nvdisasm_tests.rs index 7e926a49e59..3c967f0f6f1 100644 --- a/src/nouveau/compiler/nak/nvdisasm_tests.rs +++ b/src/nouveau/compiler/nak/nvdisasm_tests.rs @@ -419,9 +419,9 @@ pub fn test_texture() { ]; let tld4_offset_modes = [ - Tld4OffsetMode::None, - Tld4OffsetMode::AddOffI, - Tld4OffsetMode::PerPx, + TexOffsetMode::None, + TexOffsetMode::AddOffI, + TexOffsetMode::PerPx, ]; let tex_queries = [ @@ -453,7 +453,7 @@ pub fn test_texture() { dim: TexDim::_2D, lod_mode, z_cmpr: false, - offset: false, + offset_mode: TexOffsetMode::None, mem_eviction_priority: MemEvictionPriority::First, nodep: true, channel_mask: ChannelMask::for_comps(3), @@ -477,7 +477,7 @@ pub fn test_texture() { dim: TexDim::_2D, is_ms: false, lod_mode, - offset: false, + offset_mode: TexOffsetMode::None, mem_eviction_priority: MemEvictionPriority::First, nodep: true, channel_mask: ChannelMask::for_comps(3), @@ -490,10 +490,10 @@ pub fn test_texture() { } for offset_mode in tld4_offset_modes { - let offset_mode_str = if offset_mode == Tld4OffsetMode::None { + let offset_mode_str = if offset_mode == TexOffsetMode::None { String::new() } else { - format!(".{offset_mode}") + format!("{offset_mode}") }; let instr = OpTld4 { @@ -540,7 +540,7 @@ pub fn test_texture() { srcs: [SrcRef::Reg(r1).into(), SrcRef::Reg(r3).into()], dim: TexDim::_2D, - offset: false, + offset_mode: TexOffsetMode::None, mem_eviction_priority: MemEvictionPriority::First, nodep: true, channel_mask: ChannelMask::for_comps(3), diff --git a/src/nouveau/compiler/nak/sm20.rs b/src/nouveau/compiler/nak/sm20.rs index 59879e0f27e..b9b1a349b91 100644 --- a/src/nouveau/compiler/nak/sm20.rs +++ b/src/nouveau/compiler/nak/sm20.rs @@ -1766,7 +1766,7 @@ impl SM20Op for OpTex { e.set_reg_src(26..32, &self.srcs[1]); e.set_tex_channel_mask(46..50, self.channel_mask); e.set_tex_dim(51..54, self.dim); - e.set_bit(54, self.offset); + e.set_bit(54, self.offset_mode == TexOffsetMode::AddOffI); e.set_bit(56, self.z_cmpr); e.set_tex_lod_mode(57..59, self.lod_mode); } @@ -1804,7 +1804,7 @@ impl SM20Op for OpTld { e.set_reg_src(26..32, &self.srcs[1]); e.set_tex_channel_mask(46..50, self.channel_mask); e.set_tex_dim(51..54, self.dim); - e.set_bit(54, self.offset); + e.set_bit(54, self.offset_mode == TexOffsetMode::AddOffI); e.set_bit(55, self.is_ms); e.set_bit(56, false); // z_cmpr e.set_field( @@ -1855,9 +1855,9 @@ impl SM20Op for OpTld4 { e.set_field( 54..56, match self.offset_mode { - Tld4OffsetMode::None => 0_u8, - Tld4OffsetMode::AddOffI => 1_u8, - Tld4OffsetMode::PerPx => 2_u8, + TexOffsetMode::None => 0_u8, + TexOffsetMode::AddOffI => 1_u8, + TexOffsetMode::PerPx => 2_u8, }, ); e.set_bit(56, self.z_cmpr); @@ -1929,7 +1929,7 @@ impl SM20Op for OpTxd { e.set_reg_src(26..32, &self.srcs[1]); e.set_tex_channel_mask(46..50, self.channel_mask); e.set_tex_dim(51..54, self.dim); - e.set_bit(54, self.offset); + e.set_bit(54, self.offset_mode == TexOffsetMode::AddOffI); } } diff --git a/src/nouveau/compiler/nak/sm32.rs b/src/nouveau/compiler/nak/sm32.rs index 26aa2bfb7b7..07cdf2b739e 100644 --- a/src/nouveau/compiler/nak/sm32.rs +++ b/src/nouveau/compiler/nak/sm32.rs @@ -2002,7 +2002,7 @@ impl SM32Op for OpTex { e.set_tex_dim(38..41, self.dim); e.set_bit(41, false); // ToDo: NDV e.set_bit(42, self.z_cmpr); - e.set_bit(43, self.offset); + e.set_bit(43, self.offset_mode == TexOffsetMode::AddOffI); e.set_tex_lod_mode(44..47, self.lod_mode); } } @@ -2040,7 +2040,7 @@ impl SM32Op for OpTld { e.set_field(34..38, self.channel_mask.to_bits()); e.set_tex_dim(38..41, self.dim); - e.set_bit(41, self.offset); + e.set_bit(41, self.offset_mode == TexOffsetMode::AddOffI); e.set_bit(42, false); // z_cmpr e.set_bit(43, self.is_ms); @@ -2086,9 +2086,9 @@ impl SM32Op for OpTld4 { e.set_field( 43..45, match self.offset_mode { - Tld4OffsetMode::None => 0_u8, - Tld4OffsetMode::AddOffI => 1_u8, - Tld4OffsetMode::PerPx => 2_u8, + TexOffsetMode::None => 0_u8, + TexOffsetMode::AddOffI => 1_u8, + TexOffsetMode::PerPx => 2_u8, }, ); e.set_field(45..47, self.comp); @@ -2164,7 +2164,7 @@ impl SM32Op for OpTxd { e.set_field(34..38, self.channel_mask.to_bits()); e.set_tex_dim(38..41, self.dim); e.set_bit(41, false); // ToDo: NDV - e.set_bit(54, self.offset); + e.set_bit(54, self.offset_mode == TexOffsetMode::AddOffI); } } diff --git a/src/nouveau/compiler/nak/sm50.rs b/src/nouveau/compiler/nak/sm50.rs index fbc167c5b7e..baa394610c4 100644 --- a/src/nouveau/compiler/nak/sm50.rs +++ b/src/nouveau/compiler/nak/sm50.rs @@ -2162,7 +2162,7 @@ impl SM50Op for OpTex { TexRef::Bound(idx) => { e.set_opcode(0x0380); e.set_field(36..49, idx); - e.set_bit(54, self.offset); + e.set_bit(54, self.offset_mode == TexOffsetMode::AddOffI); e.set_tex_lod_mode(55..57, self.lod_mode); } TexRef::CBuf { .. } => { @@ -2170,7 +2170,7 @@ impl SM50Op for OpTex { } TexRef::Bindless => { e.set_opcode(0xdeb8); - e.set_bit(36, self.offset); + e.set_bit(36, self.offset_mode == TexOffsetMode::AddOffI); e.set_tex_lod_mode(37..39, self.lod_mode); } } @@ -2216,7 +2216,7 @@ impl SM50Op for OpTld { e.set_tex_dim(28..31, self.dim); e.set_tex_channel_mask(31..35, self.channel_mask); - e.set_bit(35, self.offset); + e.set_bit(35, self.offset_mode == TexOffsetMode::AddOffI); e.set_bit(49, self.nodep); e.set_bit(50, self.is_ms); @@ -2235,9 +2235,9 @@ impl SM50Op for OpTld4 { fn encode(&self, e: &mut SM50Encoder<'_>) { let offset_mode = match self.offset_mode { - Tld4OffsetMode::None => 0_u8, - Tld4OffsetMode::AddOffI => 1_u8, - Tld4OffsetMode::PerPx => 2_u8, + TexOffsetMode::None => 0_u8, + TexOffsetMode::AddOffI => 1_u8, + TexOffsetMode::PerPx => 2_u8, }; match self.tex { TexRef::Bound(idx) => { @@ -2328,7 +2328,7 @@ impl SM50Op for OpTxd { e.set_tex_dim(28..31, self.dim); e.set_tex_channel_mask(31..35, self.channel_mask); - e.set_bit(35, self.offset); + e.set_bit(35, self.offset_mode == TexOffsetMode::AddOffI); e.set_bit(49, self.nodep); } } diff --git a/src/nouveau/compiler/nak/sm70_encode.rs b/src/nouveau/compiler/nak/sm70_encode.rs index 91bc1abc2bc..e72d4f516c2 100644 --- a/src/nouveau/compiler/nak/sm70_encode.rs +++ b/src/nouveau/compiler/nak/sm70_encode.rs @@ -2415,7 +2415,7 @@ impl SM70Op for OpTex { e.set_tex_dim(61..64, self.dim); e.set_tex_channel_mask(72..76, self.channel_mask); - e.set_bit(76, self.offset); + e.set_bit(76, self.offset_mode == TexOffsetMode::AddOffI); e.set_bit(77, false); // ToDo: NDV e.set_bit(78, self.z_cmpr); e.set_eviction_priority(&self.mem_eviction_priority); @@ -2467,7 +2467,8 @@ impl SM70Op for OpTld { e.set_tex_dim(61..64, self.dim); e.set_tex_channel_mask(72..76, self.channel_mask); - e.set_bit(76, self.offset); + e.set_bit(76, self.offset_mode == TexOffsetMode::AddOffI); + // bit 77: .CL e.set_bit(78, self.is_ms); // bits 79..81: .F16 @@ -2524,9 +2525,9 @@ impl SM70Op for OpTld4 { e.set_field( 76..78, match self.offset_mode { - Tld4OffsetMode::None => 0_u8, - Tld4OffsetMode::AddOffI => 1_u8, - Tld4OffsetMode::PerPx => 2_u8, + TexOffsetMode::None => 0_u8, + TexOffsetMode::AddOffI => 1_u8, + TexOffsetMode::PerPx => 2_u8, }, ); // bit 77: .CL @@ -2618,7 +2619,7 @@ impl SM70Op for OpTxd { e.set_tex_dim(61..64, self.dim); e.set_tex_channel_mask(72..76, self.channel_mask); - e.set_bit(76, self.offset); + e.set_bit(76, self.offset_mode == TexOffsetMode::AddOffI); e.set_bit(77, false); // ToDo: NDV e.set_eviction_priority(&self.mem_eviction_priority); e.set_bit(90, self.nodep);