nak: Add tests for OpLop2 and OpLop3

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30381>
This commit is contained in:
Faith Ekstrand 2024-07-25 16:03:27 -05:00 committed by Marge Bot
parent dc4ebfd562
commit 3353374287
2 changed files with 61 additions and 2 deletions

View file

@ -625,6 +625,37 @@ fn test_op_isetp() {
}
}
#[test]
fn test_op_lop2() {
if RunSingleton::get().sm.sm() < 70 {
let logic_ops =
[LogicOp2::And, LogicOp2::Or, LogicOp2::Xor, LogicOp2::PassB];
for logic_op in logic_ops {
let op = OpLop2 {
dst: Dst::None,
srcs: [0.into(), 0.into()],
op: logic_op,
};
test_foldable_op(op);
}
}
}
#[test]
fn test_op_lop3() {
if RunSingleton::get().sm.sm() >= 70 {
for lut in 0..255 {
let op = OpLop3 {
dst: Dst::None,
srcs: [0.into(), 0.into(), 0.into()],
op: LogicOp3 { lut },
};
test_foldable_op(op);
}
}
}
#[test]
fn test_op_shf() {
let sm = &RunSingleton::get().sm;

View file

@ -3650,7 +3650,7 @@ impl DisplayOp for OpISetP {
impl_display_for_op!(OpISetP);
#[repr(C)]
#[derive(SrcsAsSlice, DstsAsSlice)]
#[derive(Clone, SrcsAsSlice, DstsAsSlice)]
pub struct OpLop2 {
#[dst_type(GPR)]
pub dst: Dst,
@ -3667,8 +3667,24 @@ impl DisplayOp for OpLop2 {
}
}
impl Foldable for OpLop2 {
fn fold(&self, _sm: &dyn ShaderModel, f: &mut OpFoldData<'_>) {
let srcs = [
f.get_u32_src(self, &self.srcs[0]),
f.get_u32_src(self, &self.srcs[1]),
];
let dst = match self.op {
LogicOp2::And => srcs[0] & srcs[1],
LogicOp2::Or => srcs[0] | srcs[1],
LogicOp2::Xor => srcs[0] ^ srcs[1],
LogicOp2::PassB => srcs[1],
};
f.set_u32_dst(self, &self.dst, dst);
}
}
#[repr(C)]
#[derive(SrcsAsSlice, DstsAsSlice)]
#[derive(Clone, SrcsAsSlice, DstsAsSlice)]
pub struct OpLop3 {
#[dst_type(GPR)]
pub dst: Dst,
@ -3679,6 +3695,18 @@ pub struct OpLop3 {
pub op: LogicOp3,
}
impl Foldable for OpLop3 {
fn fold(&self, _sm: &dyn ShaderModel, f: &mut OpFoldData<'_>) {
let srcs = [
f.get_u32_src(self, &self.srcs[0]),
f.get_u32_src(self, &self.srcs[1]),
f.get_u32_src(self, &self.srcs[2]),
];
let dst = self.op.eval(srcs[0], srcs[1], srcs[2]);
f.set_u32_dst(self, &self.dst, dst);
}
}
impl DisplayOp for OpLop3 {
fn fmt_op(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(