#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;
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
{
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
}
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;
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.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
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;