From 2166ee5c2ebf61391dcbbd2a4e13c3c67b53a67b Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Thu, 22 Feb 2024 17:36:10 +0100 Subject: [PATCH] zink: lower unaligned memory accesses Fixes `vload_half` in OpenCL Fixes: 0288cb0a0c4 ("zink: lower vec8/16") Signed-off-by: Karol Herbst Part-of: (cherry picked from commit 2b9c0e376816e44f665473704128f293986a7ba1) --- .pick_status.json | 2 +- src/gallium/drivers/zink/zink_compiler.c | 19 ++++++++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index c537f139cea..03d53f74ae2 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1154,7 +1154,7 @@ "description": "zink: lower unaligned memory accesses", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "0288cb0a0c471fbef07d1dfc1cae843c5396d8e1", "notes": null diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index d487de5443b..203c7a6292c 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -5302,11 +5302,20 @@ mem_access_size_align_cb(nir_intrinsic_op intrin, uint8_t bytes, assert(util_is_power_of_two_nonzero(align)); - return (nir_mem_access_size_align){ - .num_components = MIN2(bytes / (bit_size / 8), 4), - .bit_size = bit_size, - .align = bit_size / 8, - }; + /* simply drop the bit_size for unaligned load/stores */ + if (align < (bit_size / 8)) { + return (nir_mem_access_size_align){ + .num_components = MIN2(bytes / align, 4), + .bit_size = align * 8, + .align = align, + }; + } else { + return (nir_mem_access_size_align){ + .num_components = MIN2(bytes / (bit_size / 8), 4), + .bit_size = bit_size, + .align = bit_size / 8, + }; + } } static nir_mem_access_size_align