tpl_wayland_egl_thread: Modified vulkan to init shm_flusher. 08/177608/1
authorjoonbum.ko <joonbum.ko@samsung.com>
Mon, 30 Apr 2018 10:35:03 +0000 (19:35 +0900)
committerjoonbum.ko <joonbum.ko@samsung.com>
Mon, 30 Apr 2018 10:35:15 +0000 (19:35 +0900)
 - 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 <joonbum.ko@samsung.com>
src/tpl_wayland_egl_thread.c

index 4138e98..c2cebce 100644 (file)
@@ -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