nak: Rework cbufs a bit

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24998>
This commit is contained in:
Faith Ekstrand
2023-05-05 21:57:26 -05:00
committed by Marge Bot
parent 86684fa9aa
commit 0ff7fbf093
3 changed files with 52 additions and 32 deletions
+13 -13
View File
@@ -1095,21 +1095,21 @@ impl<'a> ShaderFromNir<'a> {
}
nir_intrinsic_load_ubo => {
let idx = srcs[0];
let offset = srcs[1];
let dst = *self.get_dst(&intrin.def).as_ssa().unwrap();
if let Some(imm_idx) = idx.as_uint() {
let imm_idx = u8::try_from(imm_idx).unwrap();
if let Some(imm_offset) = offset.as_uint() {
let imm_offset = u16::try_from(imm_offset).unwrap();
let (off, off_imm) = self.get_io_addr_offset(&srcs[1], 16);
let dst = self.get_dst(&intrin.def);
if let Some(idx_imm) = idx.as_uint() {
let cb = CBufRef {
buf: CBuf::Binding(idx_imm.try_into().unwrap()),
offset: off_imm.try_into().unwrap(),
};
if off.is_zero() {
let mut pcopy = OpParCopy::new();
for (i, dst) in dst.iter().enumerate() {
let src = Src::new_cbuf(
imm_idx,
imm_offset + u16::try_from(i).unwrap() * 4,
);
pcopy.push(src, (*dst).into());
let vec_dst = *dst.as_ssa().unwrap();
for (i, dst) in vec_dst.iter().enumerate() {
let i = u16::try_from(i).unwrap();
pcopy.push(cb.offset(i * 4).into(), (*dst).into());
}
self.instrs.push(Instr::new(Op::ParCopy(pcopy)));
self.instrs.push(pcopy.into());
} else {
panic!("Indirect UBO offsets not yet supported");
}
+38 -15
View File
@@ -407,12 +407,37 @@ pub enum CBuf {
BindlessGPR(RegRef),
}
impl fmt::Display for CBuf {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
CBuf::Binding(idx) => write!(f, "c[{:#x}]", idx),
CBuf::BindlessSSA(v) => write!(f, "cx[{}]", v),
CBuf::BindlessGPR(r) => write!(f, "cx[{}]", r),
}
}
}
#[derive(Clone, Copy, Eq, Hash, PartialEq)]
pub struct CBufRef {
pub buf: CBuf,
pub offset: u16,
}
impl CBufRef {
pub fn offset(self, offset: u16) -> CBufRef {
CBufRef {
buf: self.buf,
offset: self.offset + offset,
}
}
}
impl fmt::Display for CBufRef {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}[{:#x}]", self.buf, self.offset)
}
}
#[derive(Clone, Copy, Eq, Hash, PartialEq)]
pub enum SrcRef {
Zero,
@@ -489,6 +514,12 @@ impl SrcRef {
}
}
impl From<CBufRef> for SrcRef {
fn from(cb: CBufRef) -> SrcRef {
SrcRef::CBuf(cb)
}
}
impl From<RegRef> for SrcRef {
fn from(reg: RegRef) -> SrcRef {
SrcRef::Reg(reg)
@@ -504,22 +535,14 @@ impl<T: Into<SSARef>> From<T> for SrcRef {
impl fmt::Display for SrcRef {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
SrcRef::Zero => write!(f, "ZERO")?,
SrcRef::True => write!(f, "TRUE")?,
SrcRef::False => write!(f, "FALSE")?,
SrcRef::Imm32(u) => write!(f, "{:#x}", u)?,
SrcRef::CBuf(r) => {
match r.buf {
CBuf::Binding(idx) => write!(f, "c[{:#x}]", idx)?,
CBuf::BindlessSSA(v) => write!(f, "cx[{}]", v)?,
CBuf::BindlessGPR(r) => write!(f, "cx[{}]", r)?,
}
write!(f, "[{:#x}]", r.offset)?;
}
SrcRef::SSA(v) => v.fmt(f)?,
SrcRef::Reg(r) => r.fmt(f)?,
SrcRef::Zero => write!(f, "ZERO"),
SrcRef::True => write!(f, "TRUE"),
SrcRef::False => write!(f, "FALSE"),
SrcRef::Imm32(u) => write!(f, "{:#x}", u),
SrcRef::CBuf(c) => c.fmt(f),
SrcRef::SSA(v) => v.fmt(f),
SrcRef::Reg(r) => r.fmt(f),
}
Ok(())
}
}
+1 -4
View File
@@ -44,10 +44,7 @@ impl CopyPropPass {
SrcRef::CBuf(cb) => {
let lo32 = Src::from(SrcRef::CBuf(cb));
let hi32 = Src {
src_ref: SrcRef::CBuf(CBufRef {
buf: cb.buf,
offset: cb.offset + 4,
}),
src_ref: SrcRef::CBuf(cb.offset(4)),
src_mod: src.src_mod,
};
self.add_copy(dst[0], SrcType::ALU, lo32);