From a18c07dc36f1c8462728dce2f214c1f72b00973a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tapani=20P=C3=A4lli?= Date: Mon, 11 May 2026 12:58:35 +0300 Subject: [PATCH] anv: allocate tile sized temporary copy instead of whole size MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This fixes dEQP-VK.image.host_image_copy.* tests that require temp_copy on 32bit builds. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/work_items/15409 Signed-off-by: Tapani Pälli Reviewed-by: Lionel Landwerlin Part-of: --- src/intel/vulkan/anv_image_host_copy.c | 29 +++++++------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/src/intel/vulkan/anv_image_host_copy.c b/src/intel/vulkan/anv_image_host_copy.c index 49d60fd5a75..b903ebf870c 100644 --- a/src/intel/vulkan/anv_image_host_copy.c +++ b/src/intel/vulkan/anv_image_host_copy.c @@ -573,7 +573,14 @@ anv_CopyImageToMemory( VK_HOST_IMAGE_COPY_MEMCPY) != 0; const bool temp_copy = needs_temp_copy(image, pCopyImageToMemoryInfo->flags); void *tmp_mem = NULL; - uint64_t tmp_mem_size = 0; + + /* Allocate single tile size memory for temporary copy. */ + if (temp_copy) { + tmp_mem = vk_alloc(&device->vk.alloc, TMP_BUFFER_SIZE, 8, + VK_SYSTEM_ALLOCATION_SCOPE_COMMAND); + if (!tmp_mem) + return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); + } for (uint32_t r = 0; r < pCopyImageToMemoryInfo->regionCount; r++) { const VkImageToMemoryCopy *region = @@ -601,30 +608,10 @@ anv_CopyImageToMemory( enum isl_format mem_format = use_memcpy ? surf->format : anv_plane_format.isl_format; - uint64_t tmp_copy_row_pitch_B = 0; - if (temp_copy) { mem_format = anv_get_format_plane(device->physical, image->vk.format, plane, VK_IMAGE_TILING_LINEAR).isl_format; - - tmp_copy_row_pitch_B = - calc_mem_row_pitch_B(surf->format, 0, ®ion->imageExtent); - uint64_t tmp_copy_height_pitch_B = - calc_mem_height_pitch_B(surf->format, tmp_copy_row_pitch_B, 0, - ®ion->imageExtent); - - uint64_t tmp_mem_needed_size = tmp_copy_row_pitch_B * tmp_copy_height_pitch_B; - if (tmp_mem_needed_size > tmp_mem_size) { - void *new_tmp_mem = vk_realloc(&device->vk.alloc, tmp_mem, tmp_mem_needed_size, 8, - VK_SYSTEM_ALLOCATION_SCOPE_COMMAND); - if (new_tmp_mem == NULL) { - vk_free(&device->vk.alloc, tmp_mem); - return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); - } - tmp_mem = new_tmp_mem; - tmp_mem_size = tmp_mem_needed_size; - } } VkOffset3D offset_el =