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

@@ -2144,7 +2144,7 @@
"description": "nak: Fix 8-bit selection for vectors", "description": "nak: Fix 8-bit selection for vectors",
"nominated": true, "nominated": true,
"nomination_type": 2, "nomination_type": 2,
"resolution": 0, "resolution": 1,
"main_sha": null, "main_sha": null,
"because_sha": "9e84e9e44b111a6afe8a346fb0bb74f9c597af61", "because_sha": "9e84e9e44b111a6afe8a346fb0bb74f9c597af61",
"notes": null "notes": null

View File

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