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: 5bc8284816 ("hk: add Vulkan driver for Apple GPUs")
Signed-off-by: Mary Guillemard <mary@mary.zone>
Reviewed-by: Eric Engestrom <eric@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/38060>
This commit is contained in:
Mary Guillemard 2025-10-24 19:29:48 +02:00 committed by Marge Bot
parent 95a89f7b33
commit 887f06a966

View file

@ -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)