From 648550b901c2f7f8743aeb2f3277e9907b6cb5fe Mon Sep 17 00:00:00 2001 From: Joonbum Ko Date: Tue, 18 Jul 2023 19:40:25 +0900 Subject: [PATCH] wl_vk: untrack the swapchain_buffers when destroy_swapchain called Change-Id: I72ed5fdf2fec9f00fa25e5bc87ea26501d1042f9 Signed-off-by: Joonbum Ko --- src/tpl_wl_vk_thread.c | 56 +++++++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/src/tpl_wl_vk_thread.c b/src/tpl_wl_vk_thread.c index bbe15aa..3ad9b00 100644 --- a/src/tpl_wl_vk_thread.c +++ b/src/tpl_wl_vk_thread.c @@ -99,6 +99,10 @@ struct _tpl_wl_vk_swapchain { tbm_surface_h *swapchain_buffers; + /* [TEMP] To fix dEQP-VK.wsi.wayland.swapchain.modify.resize crash issue + * It will be fixed properly using old_swapchain handle */ + tbm_surface_h *old_swapchain_buffers; + tpl_util_atomic_uint ref_cnt; }; @@ -1576,23 +1580,18 @@ _thread_swapchain_create_tbm_queue(tpl_wl_vk_surface_t *wl_vk_surface) return TPL_ERROR_INVALID_PARAMETER; } + if (swapchain->old_swapchain_buffers) { + TPL_ERR("Should be destroy old_swapchain before create"); + swapchain->result = TPL_ERROR_INVALID_OPERATION; + return TPL_ERROR_INVALID_OPERATION; + } + if (swapchain->tbm_queue) { int old_width = tbm_surface_queue_get_width(swapchain->tbm_queue); int old_height = tbm_surface_queue_get_height(swapchain->tbm_queue); if (swapchain->swapchain_buffers) { - int i; - for (i = 0; i < swapchain->properties.buffer_count; i++) { - if (swapchain->swapchain_buffers[i]) { - TPL_INFO("[UNTRACK_BUFFERS]", "[%d] wl_vk_surface(%p) sc(%p) tbm_surface(%p) bo(%d)", - i, wl_vk_surface, swapchain, swapchain->swapchain_buffers[i], - _get_tbm_surface_bo_name(swapchain->swapchain_buffers[i])); - tbm_surface_internal_unref(swapchain->swapchain_buffers[i]); - swapchain->swapchain_buffers[i] = NULL; - } - } - - free(swapchain->swapchain_buffers); + swapchain->old_swapchain_buffers = swapchain->swapchain_buffers; swapchain->swapchain_buffers = NULL; } @@ -1731,6 +1730,8 @@ __tpl_wl_vk_surface_create_swapchain(tpl_surface_t *surface, swapchain->properties.present_mode = present_mode; swapchain->wl_vk_surface = wl_vk_surface; swapchain->properties.format = format; + swapchain->swapchain_buffers = NULL; + swapchain->old_swapchain_buffers = NULL; swapchain->result = TPL_ERROR_NONE; swapchain->create_done = TPL_FALSE; @@ -1775,6 +1776,21 @@ _thread_swapchain_destroy_tbm_queue(tpl_wl_vk_surface_t *wl_vk_surface) } } +void __untrack_swapchain_buffers(tpl_wl_vk_surface_t *wl_vk_surface, tbm_surface_h *sc_buffers) +{ + tpl_wl_vk_swapchain_t *swapchain = wl_vk_surface->swapchain; + + for (int i = 0; i < swapchain->properties.buffer_count; i++) { + if (sc_buffers[i]) { + TPL_INFO("[UNTRACK_BUFFERS]", "[%d] wl_vk_surface(%p) sc(%p) tbm_surface(%p) bo(%d)", + i, wl_vk_surface, swapchain, sc_buffers[i], + _get_tbm_surface_bo_name(sc_buffers[i])); + tbm_surface_internal_unref(sc_buffers[i]); + sc_buffers[i] = NULL; + } + } +} + static tpl_result_t __tpl_wl_vk_surface_destroy_swapchain(tpl_surface_t *surface) { @@ -1808,6 +1824,11 @@ __tpl_wl_vk_surface_destroy_swapchain(tpl_surface_t *surface) TPL_INFO("[DESTROY_SWAPCHAIN]", "wl_vk_surface(%p) swapchain(%p) still valid.", wl_vk_surface, swapchain); + if (swapchain->old_swapchain_buffers) { + __untrack_swapchain_buffers(wl_vk_surface, swapchain->old_swapchain_buffers); + free(swapchain->old_swapchain_buffers); + swapchain->old_swapchain_buffers = NULL; + } return TPL_ERROR_NONE; } @@ -1816,16 +1837,7 @@ __tpl_wl_vk_surface_destroy_swapchain(tpl_surface_t *surface) wl_vk_surface, wl_vk_surface->swapchain); if (swapchain->swapchain_buffers) { - for (int i = 0; i < swapchain->properties.buffer_count; i++) { - if (swapchain->swapchain_buffers[i]) { - TPL_INFO("[UNTRACK_BUFFERS]", "[%d] wl_vk_surface(%p) sc(%p) tbm_surface(%p) bo(%d)", - i, wl_vk_surface, swapchain, swapchain->swapchain_buffers[i], - _get_tbm_surface_bo_name(swapchain->swapchain_buffers[i])); - tbm_surface_internal_unref(swapchain->swapchain_buffers[i]); - swapchain->swapchain_buffers[i] = NULL; - } - } - + __untrack_swapchain_buffers(wl_vk_surface, swapchain->swapchain_buffers); free(swapchain->swapchain_buffers); swapchain->swapchain_buffers = NULL; } -- 2.34.1