diff --git a/.pick_status.json b/.pick_status.json index c818fe9de3d..bd312f51253 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1084,7 +1084,7 @@ "description": "panvk: support binding swapchain memory", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "d970fe2e9d6a8e9997a0ce212146d62013b3b455", "notes": null 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); }