wl_vk: untrack the swapchain_buffers when destroy_swapchain called 42/296242/1
authorJoonbum Ko <joonbum.ko@samsung.com>
Tue, 18 Jul 2023 10:40:25 +0000 (19:40 +0900)
committerJoonbum Ko <joonbum.ko@samsung.com>
Mon, 24 Jul 2023 07:14:33 +0000 (16:14 +0900)
Change-Id: I72ed5fdf2fec9f00fa25e5bc87ea26501d1042f9
Signed-off-by: Joonbum Ko <joonbum.ko@samsung.com>
src/tpl_wl_vk_thread.c

index bbe15aa..3ad9b00 100644 (file)
@@ -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;
        }