tpl_wayland_egl_thread: Implemented a vulkan-related initialization in twe_display_add(). 63/161963/2
authorjoonbum.ko <joonbum.ko@samsung.com>
Tue, 26 Sep 2017 08:19:06 +0000 (17:19 +0900)
committerjoonbum.ko <joonbum.ko@samsung.com>
Tue, 28 Nov 2017 10:28:22 +0000 (19:28 +0900)
 - 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 <joonbum.ko@samsung.com>
src/tpl_wayland_egl_thread.c

index 9982113..f38c427 100644 (file)
@@ -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, &registry_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;