From 5e1a88cea05b383d2296ba079eb71300893207de Mon Sep 17 00:00:00 2001 From: Mary Guillemard Date: Fri, 24 Oct 2025 19:29:48 +0200 Subject: [PATCH] hk: Make width and height per block in HIC We were assuming that every formats used for HIC had a block widgh and height of 1x1. This is wrong for compressed formats like BC5, ASTC, ect. Fixes: 5bc828481630 ("hk: add Vulkan driver for Apple GPUs") Signed-off-by: Mary Guillemard Reviewed-by: Eric Engestrom (cherry picked from commit 887f06a966f4ac650701b9d1421dd2f67fc23ae5) Part-of: --- .pick_status.json | 2 +- src/asahi/vulkan/hk_image.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.pick_status.json b/.pick_status.json index a58b941b399..8b8d21c9c37 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -424,7 +424,7 @@ "description": "hk: Make width and height per block in HIC", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "5bc828481630147575348b66677edaade9e891e6", "notes": null diff --git a/src/asahi/vulkan/hk_image.c b/src/asahi/vulkan/hk_image.c index afc29b0a82e..b38d26b918d 100644 --- a/src/asahi/vulkan/hk_image.c +++ b/src/asahi/vulkan/hk_image.c @@ -1424,6 +1424,13 @@ hk_copy_memory_to_image(struct hk_device *device, struct hk_image *dst_image, uint32_t src_height = info->memoryImageHeight ?: extent.height; uint32_t blocksize_B = util_format_get_blocksize(layout->format); + + /* Align width and height to block */ + src_width = + DIV_ROUND_UP(src_width, util_format_get_blockwidth(layout->format)); + src_height = + DIV_ROUND_UP(src_height, util_format_get_blockheight(layout->format)); + uint32_t src_pitch = src_width * blocksize_B; unsigned start_layer = (dst_image->vk.image_type == VK_IMAGE_TYPE_3D) @@ -1496,6 +1503,13 @@ hk_copy_image_to_memory(struct hk_device *device, struct hk_image *src_image, #endif uint32_t blocksize_B = util_format_get_blocksize(layout->format); + + /* Align width and height to block */ + dst_width = + DIV_ROUND_UP(dst_width, util_format_get_blockwidth(layout->format)); + dst_height = + DIV_ROUND_UP(dst_height, util_format_get_blockheight(layout->format)); + uint32_t dst_pitch = dst_width * blocksize_B; unsigned start_layer = (src_image->vk.image_type == VK_IMAGE_TYPE_3D)