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: d970fe2e9d ("panfrost: Add a Vulkan driver for Midgard/Bifrost GPUs")
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32216>
(cherry picked from commit f77fe432c1)
This commit is contained in:
Erik Faye-Lund
2024-11-19 12:15:47 +01:00
committed by Dylan Baker
parent 9448cd6071
commit e92d808c35
2 changed files with 23 additions and 8 deletions

View File

@@ -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

View File

@@ -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);
}