From 97094abb26ceb95f4a20d2958890768755b3e0f2 Mon Sep 17 00:00:00 2001 From: "joonbum.ko" Date: Mon, 30 Apr 2018 19:35:03 +0900 Subject: [PATCH] tpl_wayland_egl_thread: Modified vulkan to init shm_flusher. - If tbm_surface_queue of wl_surface without get_flusher() is iconified, wl_tbm will do tbm_surface_queue_flush() forcely. - This can cause unexpected problems. - So, initalize flusher to allow control of queue inside TPL, but does not actually do queue_flush() Change-Id: I12378b2b2935026da9552ca19b597e04abaf41e1 Signed-off-by: joonbum.ko --- src/tpl_wayland_egl_thread.c | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/src/tpl_wayland_egl_thread.c b/src/tpl_wayland_egl_thread.c index 4138e98..c2cebce 100644 --- a/src/tpl_wayland_egl_thread.c +++ b/src/tpl_wayland_egl_thread.c @@ -746,8 +746,7 @@ __cb_wl_resistry_global_callback(void *data, struct wl_registry *wl_registry, { twe_wl_disp_source *disp_source = (twe_wl_disp_source *)data; - if (!disp_source->is_vulkan_dpy - && !strcmp(interface, "tizen_surface_shm")) { + if (!strcmp(interface, "tizen_surface_shm")) { disp_source->tss = wl_registry_bind(wl_registry, name, &tizen_surface_shm_interface, @@ -985,24 +984,18 @@ twe_display_add(twe_thread* thread, if (backend == TPL_BACKEND_WAYLAND_VULKAN_WSI || backend == TPL_BACKEND_WAYLAND_VULKAN_WSI_THREAD) { source->is_vulkan_dpy = TPL_TRUE; - source->surface_capabilities.min_buffer = 2; - source->surface_capabilities.max_buffer = VK_CLIENT_QUEUE_SIZE; - source->surface_capabilities.present_modes = - TPL_DISPLAY_PRESENT_MODE_MAILBOX; - - _twe_display_vk_init(source); } else { /* wayland_egl backend */ /* These are not used. It just be initialized. */ source->is_vulkan_dpy = TPL_FALSE; - source->surface_capabilities.min_buffer = 2; - source->surface_capabilities.max_buffer = CLIENT_QUEUE_SIZE; - source->surface_capabilities.present_modes = - TPL_DISPLAY_PRESENT_MODE_FIFO; - - _twe_display_shm_init(source); } + source->surface_capabilities.min_buffer = 2; + source->surface_capabilities.max_buffer = VK_CLIENT_QUEUE_SIZE; + source->surface_capabilities.present_modes = + TPL_DISPLAY_PRESENT_MODE_FIFO; + _twe_display_shm_init(source); + source->disp_del_source = _twe_del_source_init(ctx, source); source->disp_del_source->destroy_target_source_func = _twe_thread_wl_disp_source_destroy; @@ -1035,8 +1028,8 @@ twe_display_del(twe_display_h twe_display) if (source->is_vulkan_dpy) _twe_display_vk_fini(source); - else - _twe_display_shm_fini(source); + + _twe_display_shm_fini(source); _twe_display_fini_wl_tbm_client(source->wl_tbm_client); source->wl_tbm_client = NULL; @@ -1201,6 +1194,11 @@ static void __cb_tss_flusher_flush_callback(void *data, TPL_LOG_T(BACKEND, "[FLUSH_CB] surf_source(%p)", surf_source); + if (surf_source->disp_source->is_vulkan_dpy) { + TPL_WARN("Vulkan do not support buffer flush"); + return; + } + tsq_err = tbm_surface_queue_flush(surf_source->tbm_queue); if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE) { TPL_ERR("Failed to free flush tbm_queue(%p)", surf_source->tbm_queue); @@ -1216,6 +1214,11 @@ static void __cb_tss_flusher_free_flush_callback(void *data, TPL_LOG_T(BACKEND, "[FREE_FLUSH_CB] surf_source(%p)", surf_source); + if (surf_source->disp_source->is_vulkan_dpy) { + TPL_WARN("Vulkan do not support buffer flush"); + return; + } + tsq_err = tbm_surface_queue_free_flush(surf_source->tbm_queue); if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE) { TPL_ERR("Failed to free flush tbm_queue(%p)", surf_source->tbm_queue); @@ -2265,9 +2268,7 @@ _twe_thread_wl_surf_source_destroy(void *source) surf_source->vblank_waiting_buffers = NULL; } - if (!disp_source->is_vulkan_dpy) { - _twe_surface_buffer_flusher_fini(surf_source); - } + _twe_surface_buffer_flusher_fini(surf_source); if (surf_source->tbm_queue) { tbm_surface_queue_destroy(surf_source->tbm_queue); @@ -2411,7 +2412,6 @@ twe_surface_add(twe_thread* thread, source->surf = wl_egl_window->surface; source->latest_transform = wl_egl_window->transform; - _twe_surface_buffer_flusher_init(source); } else { struct wl_surface *wl_surf = (struct wl_surface *)native_handle; @@ -2419,6 +2419,8 @@ twe_surface_add(twe_thread* thread, source->surf = wl_surf; } + _twe_surface_buffer_flusher_init(source); + source->surf_del_source = _twe_del_source_init(ctx, source); if (source->surf_del_source) { source->surf_del_source->destroy_target_source_func -- 2.7.4