From 76d3f87af155ea9f5e2fd2c0041c52041a2f3d2a Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Fri, 8 Aug 2025 14:24:43 +0200 Subject: [PATCH] anv: do not map from_host_ptr bos in image_bind_address Rusticl running on zink might end up creating an 1D image from a host_ptr and zink might bind it with VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT. That ended up hitting an assert inside anv_device_map_bo. Cc: mesa-stable Reviewed-by: Lionel Landwerlin Part-of: (cherry picked from commit 8d8f5558ebde602c2dbd735c30700fa203baea8c) --- .pick_status.json | 2 +- src/intel/vulkan/anv_image.c | 35 +++++++++++++++++++++-------------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index e826a71dae9..1ed65f62a27 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -144,7 +144,7 @@ "description": "anv: do not map from_host_ptr bos in image_bind_address", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index 43b69f035f2..14e2dfc5785 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -1940,7 +1940,7 @@ anv_image_finish(struct anv_image *image) } for (uint32_t b = 0; b < ARRAY_SIZE(image->bindings); b++) { - if (image->bindings[b].host_map != NULL) { + if (image->bindings[b].host_map != NULL && !image->bindings[b].address.bo->from_host_ptr) { anv_device_unmap_bo(device, image->bindings[b].address.bo, image->bindings[b].host_map, @@ -2656,21 +2656,28 @@ anv_image_bind_address(struct anv_device *device, if (image->vk.usage & VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT) { uint64_t offset = image->bindings[binding].address.offset + image->bindings[binding].memory_range.offset; - uint64_t map_offset, map_size; - anv_sanitize_map_params(device, offset, - image->bindings[binding].memory_range.size, - &map_offset, &map_size); - VkResult result = anv_device_map_bo(device, - image->bindings[binding].address.bo, - map_offset, map_size, - NULL /* placed_addr */, - &image->bindings[binding].host_map); - if (result != VK_SUCCESS) - return result; + if (address.bo->from_host_ptr) { + image->bindings[binding].host_map = address.bo->map + address.bo->offset; + image->bindings[binding].map_size = address.bo->size; + image->bindings[binding].map_delta = 0; + } else { + uint64_t map_offset, map_size; + anv_sanitize_map_params(device, offset, + image->bindings[binding].memory_range.size, + &map_offset, &map_size); - image->bindings[binding].map_delta = (offset - map_offset); - image->bindings[binding].map_size = map_size; + VkResult result = anv_device_map_bo(device, + image->bindings[binding].address.bo, + map_offset, map_size, + NULL /* placed_addr */, + &image->bindings[binding].host_map); + if (result != VK_SUCCESS) + return result; + + image->bindings[binding].map_delta = (offset - map_offset); + image->bindings[binding].map_size = map_size; + } } ANV_RMV(image_bind, device, image, binding);