From f77fe432c11d6ca0c22e98e8a9350b27eb61f98d Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Tue, 19 Nov 2024 12:15:47 +0100 Subject: [PATCH] panvk: support binding swapchain memory This is required by VK_KHR_swapchain, so let's support it. Fixes a crash in this CTS test-case: dEQP-VK.wsi.wayland.swapchain.simulate_oom.image_swapchain_create_info Fixes: d970fe2e9d6 ("panfrost: Add a Vulkan driver for Midgard/Bifrost GPUs") Reviewed-by: Boris Brezillon Part-of: --- src/panfrost/vulkan/panvk_image.c | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/panfrost/vulkan/panvk_image.c b/src/panfrost/vulkan/panvk_image.c index 0d40267eb9b..ec2e692b137 100644 --- a/src/panfrost/vulkan/panvk_image.c +++ b/src/panfrost/vulkan/panvk_image.c @@ -393,19 +393,34 @@ VKAPI_ATTR VkResult VKAPI_CALL panvk_BindImageMemory2(VkDevice device, uint32_t bindInfoCount, const VkBindImageMemoryInfo *pBindInfos) { + const VkBindImageMemorySwapchainInfoKHR *swapchain_info = + vk_find_struct_const(pBindInfos->pNext, BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR); + for (uint32_t i = 0; i < bindInfoCount; ++i) { VK_FROM_HANDLE(panvk_image, image, pBindInfos[i].image); - VK_FROM_HANDLE(panvk_device_memory, mem, pBindInfos[i].memory); struct pan_kmod_bo *old_bo = image->bo; - assert(mem); - image->bo = pan_kmod_bo_get(mem->bo); - image->pimage.data.base = mem->addr.dev; - image->pimage.data.offset = pBindInfos[i].memoryOffset; + if (swapchain_info && swapchain_info->swapchain != VK_NULL_HANDLE) { + VkImage wsi_vk_image = wsi_common_get_image(swapchain_info->swapchain, + swapchain_info->imageIndex); + VK_FROM_HANDLE(panvk_image, wsi_image, wsi_vk_image); + + image->bo = pan_kmod_bo_get(wsi_image->bo); + image->pimage.data.base = wsi_image->pimage.data.base; + image->pimage.data.offset = wsi_image->pimage.data.offset; + } else { + VK_FROM_HANDLE(panvk_device_memory, mem, pBindInfos[i].memory); + assert(mem); + image->bo = pan_kmod_bo_get(mem->bo); + image->pimage.data.base = mem->addr.dev; + image->pimage.data.offset = pBindInfos[i].memoryOffset; + } + /* Reset the AFBC headers */ if (drm_is_afbc(image->pimage.layout.modifier)) { /* Transient CPU mapping */ - void *base = pan_kmod_bo_mmap(mem->bo, 0, pan_kmod_bo_size(mem->bo), + void *base = pan_kmod_bo_mmap(image->bo, 0, + pan_kmod_bo_size(image->bo), PROT_WRITE, MAP_SHARED, NULL); assert(base != MAP_FAILED); @@ -422,7 +437,7 @@ panvk_BindImageMemory2(VkDevice device, uint32_t bindInfoCount, } } - ASSERTED int ret = os_munmap(base, pan_kmod_bo_size(mem->bo)); + ASSERTED int ret = os_munmap(base, pan_kmod_bo_size(image->bo)); assert(!ret); }