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 commitf77fe432c1
)
This commit is contained in:

committed by
Dylan Baker

parent
9448cd6071
commit
e92d808c35
@@ -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
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user