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: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34910>
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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")?;
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user