pvr: Transfer image to buffer dest rect
authorOskar Rundgren <oskar.rundgren@imgtec.com>
Wed, 10 May 2023 10:45:17 +0000 (11:45 +0100)
committerMarge Bot <emma+marge@anholt.net>
Wed, 17 May 2023 08:18:26 +0000 (08:18 +0000)
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 <oskar.rundgren@imgtec.com>
Reviewed-by: Frank Binns <frank.binns@imgtec.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22958>

src/imagination/vulkan/pvr_blit.c

index a9dc1f3..bbc3c64 100644 (file)
@@ -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,