nak: Fix 8-bit selection for vectors

This fix at least permutation issues on vec16 of 8-bits values for
cooperative matrix.

Fixes: 9e84e9e44b ("nak: Add base support for 8 and 16-bit types")
Suggested-by: M Henning <drawoc@darkrefraction.com>
Signed-off-by: Mary Guillemard <mary.guillemard@collabora.com>
Reviewed-by: M Henning <drawoc@darkrefraction.com>
(cherry picked from commit 979dfaf0bb)

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32852>
This commit is contained in:
Mary Guillemard
2024-12-17 15:11:28 +01:00
committed by Dylan Baker
parent 6d33b742b0
commit c1ecf08e0d
2 changed files with 22 additions and 5 deletions

View File

@@ -543,24 +543,41 @@ impl<'a> ShaderFromNir<'a> {
}
8 => {
for dc in 0..bits.div_ceil(32) {
let mut psrc = [Src::new_zero(); 4];
let mut psrc = [None; 4];
let mut psel = [0_u8; 4];
for b in 0..4 {
let sc = dc * 4 + b;
if sc < srcs.len() {
let (ssa, byte) = srcs[sc];
// Deduplicate psrc entries
for i in 0..4_u8 {
let psrc_i = &mut psrc[usize::from(i)];
if *psrc_i == Src::new_zero() {
*psrc_i = ssa.into();
} else if *psrc_i != Src::from(ssa) {
if psrc_i.is_none() {
*psrc_i = Some(ssa.into());
} else if *psrc_i
!= Some(Src::from(ssa))
{
continue;
}
psel[b] = i * 4 + byte;
break;
}
}
}
let psrc = {
let mut res = [Src::new_zero(); 4];
for (idx, src) in psrc.iter().enumerate() {
if let Some(src) = src {
res[idx] = *src;
}
}
res
};
comps.push(b.prmt4(psrc, psel)[0]);
}
}