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);