From 2e5fb910900dec25407177eb6dedd71a93515445 Mon Sep 17 00:00:00 2001 From: Oskar Rundgren Date: Wed, 10 May 2023 11:45:17 +0100 Subject: [PATCH] pvr: Transfer image to buffer dest rect In copy to buffer region, set dest rect to region size. The rectangle must be block size adjusted in case of block compressed format. Fix test: dEQP-VK.api.copy_and_blit.core.image_to_buffer.regions Signed-off-by: Oskar Rundgren Reviewed-by: Frank Binns Part-of: --- src/imagination/vulkan/pvr_blit.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/imagination/vulkan/pvr_blit.c b/src/imagination/vulkan/pvr_blit.c index a9dc1f3305a..bbc3c64a067 100644 --- a/src/imagination/vulkan/pvr_blit.c +++ b/src/imagination/vulkan/pvr_blit.c @@ -823,6 +823,7 @@ pvr_copy_image_to_buffer_region(struct pvr_device *device, const VkBufferImageCopy2 *region) { const VkImageAspectFlags aspect_mask = region->imageSubresource.aspectMask; + enum pipe_format pformat = vk_format_to_pipe_format(image->vk.format); VkFormat image_format = pvr_get_copy_format(image->vk.format); struct pvr_transfer_cmd_surface dst_surface = { 0 }; VkImageSubresource sub_resource; @@ -889,6 +890,14 @@ pvr_copy_image_to_buffer_region(struct pvr_device *device, dst_rect.extent.width = region->imageExtent.width; dst_rect.extent.height = region->imageExtent.height; + if (util_format_is_compressed(pformat)) { + uint32_t block_width = util_format_get_blockwidth(pformat); + uint32_t block_height = util_format_get_blockheight(pformat); + + dst_rect.extent.width = MAX2(1U, dst_rect.extent.width / block_width); + dst_rect.extent.height = MAX2(1U, dst_rect.extent.height / block_height); + } + sub_resource = (VkImageSubresource){ .aspectMask = region->imageSubresource.aspectMask, .mipLevel = region->imageSubresource.mipLevel,