From: joonbum.ko Date: Tue, 26 Sep 2017 08:19:06 +0000 (+0900) Subject: tpl_wayland_egl_thread: Implemented a vulkan-related initialization in twe_display_add(). X-Git-Tag: accepted/tizen/unified/20171206.063114~21 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F63%2F161963%2F2;p=platform%2Fcore%2Fuifw%2Flibtpl-egl.git tpl_wayland_egl_thread: Implemented a vulkan-related initialization in twe_display_add(). - twe_wl_disp_source distinguishes vulkan from backend_type passed by twe_display_add(). - In the case of vulkan backend, shm flusher is not used. - This structure can be changed. Change-Id: Ibff0fe03a14832079ddd60b24b0df8b9c32ecbe5 Signed-off-by: joonbum.ko --- diff --git a/src/tpl_wayland_egl_thread.c b/src/tpl_wayland_egl_thread.c index 9982113..f38c427 100644 --- a/src/tpl_wayland_egl_thread.c +++ b/src/tpl_wayland_egl_thread.c @@ -14,6 +14,7 @@ #include "wayland-egl/wayland-egl-priv.h" #include "tpl_wayland_egl_thread.h" #include "protocol/tizen-surface-client.h" +#include "wayland-vulkan/wayland-vulkan-client-protocol.h" #include "tpl_utils.h" static int buffer_info_key; @@ -648,6 +649,39 @@ _twe_display_fini_wl_tbm_client(struct wayland_tbm_client *wl_tbm_client) wayland_tbm_client_deinit(wl_tbm_client); } +static void +__cb_wl_vk_support_present_mode_listener(void *data, + struct wayland_vulkan *wayland_vulkan, + uint32_t mode) +{ + twe_wl_disp_source *disp_source = (twe_wl_disp_source *)data; + + switch (mode) { + case WAYLAND_VULKAN_PRESENT_MODE_TYPE_IMMEDIATE: + disp_source->surface_capabilities.present_modes + |= TPL_DISPLAY_PRESENT_MODE_IMMEDIATE; + break; + case WAYLAND_VULKAN_PRESENT_MODE_TYPE_MAILBOX: + disp_source->surface_capabilities.present_modes + |= TPL_DISPLAY_PRESENT_MODE_MAILBOX; + break; + case WAYLAND_VULKAN_PRESENT_MODE_TYPE_FIFO: + disp_source->surface_capabilities.present_modes + |= TPL_DISPLAY_PRESENT_MODE_FIFO; + break; + case WAYLAND_VULKAN_PRESENT_MODE_TYPE_FIFO_RELAXED: + disp_source->surface_capabilities.present_modes + |= TPL_DISPLAY_PRESENT_MODE_FIFO_RELAXED; + break; + default: + TPL_WARN("server sent unknown present type: %d", mode); + } +} + +static struct wayland_vulkan_listener wl_vk_listener = { + __cb_wl_vk_support_present_mode_listener, +}; + #define IMPL_TIZEN_SURFACE_SHM_VERSION 2 void @@ -657,13 +691,22 @@ __cb_wl_resistry_global_callback(void *data, struct wl_registry *wl_registry, { twe_wl_disp_source *disp_source = (twe_wl_disp_source *)data; - if (!strcmp(interface, "tizen_surface_shm")) { + if (!disp_source->is_vulkan_dpy + && !strcmp(interface, "tizen_surface_shm")) { disp_source->tss = wl_registry_bind(wl_registry, name, &tizen_surface_shm_interface, ((version < IMPL_TIZEN_SURFACE_SHM_VERSION) ? version : IMPL_TIZEN_SURFACE_SHM_VERSION)); } + + if (disp_source->is_vulkan_dpy + && !strcmp(interface, "wayland_vulkan")) { + disp_source->wl_vk_client = + wl_registry_bind(wl_registry, name, + &wayland_vulkan_interface, + version); + } } void @@ -748,6 +791,67 @@ _twe_display_shm_fini(twe_wl_disp_source *disp_source) } static void +_twe_display_vk_init(twe_wl_disp_source *disp_source) +{ + struct wl_registry *registry = NULL; + struct wl_event_queue *queue = NULL; + int ret; + + queue = wl_display_create_queue(disp_source->disp); + if (!queue) { + TPL_ERR("Failed to create wl_queue"); + goto fini; + } + + registry = wl_display_get_registry(disp_source->disp); + if (!registry) { + TPL_ERR("Failed to create wl_registry"); + goto fini; + } + + wl_proxy_set_queue((struct wl_proxy *)registry, queue); + if (wl_registry_add_listener(registry, ®istry_listener, + disp_source)) { + TPL_ERR("Failed to wl_registry_add_listener"); + goto fini; + } + + ret = wl_display_roundtrip_queue(disp_source->disp, queue); + if (ret == -1) { + _twe_display_print_err(disp_source, "roundtrip_queue"); + goto fini; + } + + /* set tizen_surface_shm's queue as client's default queue */ + if (disp_source->wl_vk_client) { + wayland_vulkan_add_listener(disp_source->wl_vk_client, + &wl_vk_listener, disp_source); + + wl_display_roundtrip_queue(disp_source->disp, queue); + + wl_proxy_set_queue((struct wl_proxy *)disp_source->wl_vk_client, + NULL); + } + + TPL_LOG_T("WL_VK", "wl_vk_client(%p) init.", disp_source->wl_vk_client); + +fini: + if (queue) + wl_event_queue_destroy(queue); + if (registry) + wl_registry_destroy(registry); +} + +static void +_twe_display_vk_fini(twe_wl_disp_source *disp_source) +{ + if (disp_source->wl_vk_client) { + TPL_LOG_T("WL_VK", "wl_vk_client(%p) fini.", disp_source->wl_vk_client); + wayland_vulkan_destroy(disp_source->wl_vk_client); + } +} + +static void _twe_thread_wl_disp_source_destroy(void *source) { twe_wl_disp_source *disp_source = (twe_wl_disp_source *)source; @@ -824,6 +928,9 @@ twe_display_add(twe_thread* thread, 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; @@ -831,9 +938,9 @@ twe_display_add(twe_thread* thread, source->surface_capabilities.max_buffer = CLIENT_QUEUE_SIZE; source->surface_capabilities.present_modes = TPL_DISPLAY_PRESENT_MODE_FIFO; - } - _twe_display_shm_init(source); + _twe_display_shm_init(source); + } source->disp_del_source = _twe_del_source_init(ctx, source); source->disp_del_source->destroy_target_source_func @@ -865,7 +972,11 @@ twe_display_del(twe_display_h twe_display) disp_del_source = source->disp_del_source; - _twe_display_shm_fini(source); + if (source->is_vulkan_dpy) + _twe_display_vk_fini(source); + else + _twe_display_shm_fini(source); + _twe_display_fini_wl_tbm_client(source->wl_tbm_client); source->wl_tbm_client = NULL;