From 887f06a966f4ac650701b9d1421dd2f67fc23ae5 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 Part-of: --- src/asahi/vulkan/hk_image.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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)