From ddf2ca4faffdd309638aa0ebfcba2c43b4fc439d Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Sat, 9 Dec 2023 23:31:05 +0000 Subject: [PATCH] vulkan/wsi/wayland: ensure drm modifiers stored in chain are immutable Chain stored modifiers point to the mapping of the current feedback shmem of the surface. The surface tracked feedback mapping will be gone and replaced with new mapping during surface_dmabuf_feedback_done. There are two issues here: 1. One issue is that the existing mapping is closed before been used to compare against new modifiers in sets_of_modifiers_are_the_same. 2. The other issue is that when the chain is still optimal, the chain persists while the mapping is still replaced with the one from the new format table shmem. This change makes a deep copy of the modifiers to store in the chain to ensure the modifiers used for the current chain are immutable through the chain lifecycle. Cc: mesa-stable Signed-off-by: Yiwei Zhang Reviewed-by: Lionel Landwerlin Reviewed-by: Leandro Ribeiro Part-of: --- src/vulkan/wsi/wsi_common_wayland.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c index 4d52171e28b..a561a0fc0f8 100644 --- a/src/vulkan/wsi/wsi_common_wayland.c +++ b/src/vulkan/wsi/wsi_common_wayland.c @@ -2212,6 +2212,8 @@ wsi_wl_swapchain_chain_free(struct wsi_wl_swapchain *chain, pthread_mutex_destroy(&chain->present_ids.lock); } + vk_free(pAllocator, (void *)chain->drm_modifiers); + wsi_swapchain_finish(&chain->base); } @@ -2367,7 +2369,16 @@ wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, chain->shm_format = wl_shm_format_for_vk_format(chain->vk_format, alpha); } chain->num_drm_modifiers = num_drm_modifiers; - chain->drm_modifiers = drm_modifiers; + if (num_drm_modifiers) { + uint64_t *drm_modifiers_copy = + vk_alloc(pAllocator, sizeof(*drm_modifiers) * num_drm_modifiers, 8, + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + if (!drm_modifiers_copy) + goto fail; + + typed_memcpy(drm_modifiers_copy, drm_modifiers, num_drm_modifiers); + chain->drm_modifiers = drm_modifiers_copy; + } if (chain->wsi_wl_surface->display->wp_presentation_notwrapped) { if (!wsi_init_pthread_cond_monotonic(&chain->present_ids.list_advanced))