From 80d6d922c166e79e2ca8a5dc983ede16b5b79533 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Tue, 22 Sep 2015 17:24:18 +0900 Subject: [PATCH] Using wl_tbm protocol when get drm fd instead wl_drm protocol because tbm surface isn't work if not install gl packages Change-Id: I20fea28ac97bb31bcaf8d6215d98d2df11b40311 Signed-off-by: Changyeon Lee --- packaging/libtbm.spec | 2 +- src/tbm_wayland.c | 370 +++++++++++++++++++++++--------------------------- 2 files changed, 171 insertions(+), 201 deletions(-) diff --git a/packaging/libtbm.spec b/packaging/libtbm.spec index 29d7410..f8af8b4 100644 --- a/packaging/libtbm.spec +++ b/packaging/libtbm.spec @@ -2,7 +2,7 @@ %bcond_with wayland Name: libtbm -Version: 1.1.8 +Version: 1.1.9 Release: 1 License: MIT Summary: The library for Tizen Buffer Manager diff --git a/src/tbm_wayland.c b/src/tbm_wayland.c index 062e392..a2f6a57 100644 --- a/src/tbm_wayland.c +++ b/src/tbm_wayland.c @@ -36,203 +36,182 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include -#include "wayland-client.h" +#include -struct wl_client; -struct wl_resource; +#include "wayland-util.h" -struct wl_drm; +extern const struct wl_interface wl_buffer_interface; -#ifndef WL_DRM_ERROR_ENUM -#define WL_DRM_ERROR_ENUM -enum wl_drm_error { - WL_DRM_ERROR_AUTHENTICATE_FAIL = 0, - WL_DRM_ERROR_INVALID_FORMAT = 1, - WL_DRM_ERROR_INVALID_NAME = 2, +static const struct wl_interface *types[] = { + NULL, + NULL, + NULL, + &wl_buffer_interface, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + &wl_buffer_interface, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, +}; + +static const struct wl_message wl_tbm_requests[] = { + { "create_buffer", "niiuiiiiiiiiiiuiuuu", types + 3 }, + { "create_buffer_with_fd", "niiuiiiiiiiiiiuihhh", types + 22 }, + { "get_authentication_info", "", types + 0 }, +}; + +static const struct wl_message wl_tbm_events[] = { + { "authentication_info", "suh", types + 0 }, +}; + +WL_EXPORT const struct wl_interface wl_tbm_interface = { + "wl_tbm", 1, + 3, wl_tbm_requests, + 1, wl_tbm_events, }; -#endif /* WL_DRM_ERROR_ENUM */ - - -#ifndef WL_DRM_CAPABILITY_ENUM -#define WL_DRM_CAPABILITY_ENUM -/** - * wl_drm_capability - wl_drm capability bitmask - * @WL_DRM_CAPABILITY_PRIME: wl_drm prime available - * - * Bitmask of capabilities. - */ -enum wl_drm_capability { - WL_DRM_CAPABILITY_PRIME = 1, + +struct wl_buffer; +struct wl_tbm; + +extern const struct wl_interface wl_tbm_interface; + +#ifndef WL_TBM_ERROR_ENUM +#define WL_TBM_ERROR_ENUM +enum wl_tbm_error { + WL_TBM_ERROR_AUTHENTICATE_FAIL = 0, + WL_TBM_ERROR_INVALID_FORMAT = 1, + WL_TBM_ERROR_INVALID_NAME = 2, }; -#endif /* WL_DRM_CAPABILITY_ENUM */ - -struct wl_drm_listener { - /** - * device - (none) - * @name: (none) - */ - void (*device)(void *data, - struct wl_drm *wl_drm, - const char *name); - /** - * format - (none) - * @format: (none) - */ - void (*format)(void *data, - struct wl_drm *wl_drm, - uint32_t format); - /** - * authenticated - (none) - */ - void (*authenticated)(void *data, - struct wl_drm *wl_drm); - /** - * capabilities - (none) - * @value: (none) - */ - void (*capabilities)(void *data, - struct wl_drm *wl_drm, - uint32_t value); +#endif /* WL_TBM_ERROR_ENUM */ + +struct wl_tbm_listener { + /** + * authentication_info - (none) + * @device_name: (none) + * @capabilities: (none) + * @auth_fd: (none) + */ + void (*authentication_info)(void *data, + struct wl_tbm *wl_tbm, + const char *device_name, + uint32_t capabilities, + int32_t auth_fd); }; static inline int -wl_drm_add_listener(struct wl_drm *wl_drm, - const struct wl_drm_listener *listener, void *data) +wl_tbm_add_listener(struct wl_tbm *wl_tbm, + const struct wl_tbm_listener *listener, void *data) { - return wl_proxy_add_listener((struct wl_proxy *) wl_drm, - (void (**)(void)) listener, data); + return wl_proxy_add_listener((struct wl_proxy *) wl_tbm, + (void (**)(void)) listener, data); } -#define WL_DRM_AUTHENTICATE 0 +#define WL_TBM_CREATE_BUFFER 0 +#define WL_TBM_CREATE_BUFFER_WITH_FD 1 +#define WL_TBM_GET_AUTHENTICATION_INFO 2 static inline void -wl_drm_destroy(struct wl_drm *wl_drm) +wl_tbm_set_user_data(struct wl_tbm *wl_tbm, void *user_data) { - wl_proxy_destroy((struct wl_proxy *) wl_drm); + wl_proxy_set_user_data((struct wl_proxy *) wl_tbm, user_data); } -static inline void -wl_drm_authenticate(struct wl_drm *wl_drm, uint32_t id) +static inline void * +wl_tbm_get_user_data(struct wl_tbm *wl_tbm) { - wl_proxy_marshal((struct wl_proxy *) wl_drm, - WL_DRM_AUTHENTICATE, id); + return wl_proxy_get_user_data((struct wl_proxy *) wl_tbm); } -static const struct wl_interface *types[] = { - NULL, - &wl_buffer_interface, - NULL, - NULL, - NULL, - NULL, - NULL, - &wl_buffer_interface, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - &wl_buffer_interface, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, -}; - -static const struct wl_message wl_drm_requests[] = { - { "authenticate", "u", types + 0 }, - { "create_buffer", "nuiiuu", types + 1 }, - { "create_planar_buffer", "nuiiuiiiiii", types + 7 }, - { "create_prime_buffer", "2nhiiuiiiiii", types + 18 }, -}; - -static const struct wl_message wl_drm_events[] = { - { "device", "s", types + 0 }, - { "format", "u", types + 0 }, - { "authenticated", "", types + 0 }, - { "capabilities", "u", types + 0 }, -}; - -static const struct wl_interface wl_drm_interface = { - "wl_drm", 2, - 4, wl_drm_requests, - 4, wl_drm_events, -}; - -#define USE_QUEUE 1 - -struct wl_drm_info { -#if USE_QUEUE - struct wl_event_queue *wl_queue; -#endif - struct wl_drm* wl_drm; - int authenticated; - int fd; -}; - -static void wl_client_drm_handle_device(void *data, struct wl_drm *drm, const char *device) +static inline void +wl_tbm_destroy(struct wl_tbm *wl_tbm) { - struct wl_drm_info *drm_info = (struct wl_drm_info *)data; - drm_magic_t magic; - - printf("device[%s]\n", device); - drm_info->fd = open(device, O_RDWR | O_CLOEXEC); - if (drm_info->fd < 0) { - printf("Failed to open a device: %d (%s)\n", errno, device); - return; - } - - drmGetMagic(drm_info->fd, &magic); - printf("magic[%x]\n", magic); - wl_drm_authenticate(drm_info->wl_drm, magic); + wl_proxy_destroy((struct wl_proxy *) wl_tbm); } -static void wl_client_drm_handle_format(void *data, struct wl_drm *drm, uint32_t format) +static inline void +wl_tbm_get_authentication_info(struct wl_tbm *wl_tbm) { - /* Do nothing */ + wl_proxy_marshal((struct wl_proxy *) wl_tbm, + WL_TBM_GET_AUTHENTICATION_INFO); } -static void wl_client_drm_handle_authenticated(void *data, struct wl_drm *drm) +struct wl_tbm_info { - struct wl_drm_info *drm_info = (struct wl_drm_info *)data; - drm_info->authenticated = 1; -} + struct wl_display* dpy; + struct wl_event_queue *wl_queue; + struct wl_tbm* wl_tbm; -static void wl_client_drm_handle_capabilities(void *data, struct wl_drm *drm, uint32_t value) + uint32_t capabilities; + char *device; + int32_t fd; +}; + +static void +handle_tbm_authentication_info(void *data, + struct wl_tbm *wl_tbm, + const char *device_name, + uint32_t capabilities, + int32_t auth_fd) { - /* Do nothing */ + struct wl_tbm_info *info = (struct wl_tbm_info *)data; + + info->fd = auth_fd; + info->capabilities = capabilities; + if (device_name) + info->device = strndup(device_name, 256); } - +static const struct wl_tbm_listener wl_tbm_client_listener = { + handle_tbm_authentication_info +}; static void wl_client_registry_handle_global(void *data, struct wl_registry *registry, uint32_t name, const char *interface, uint32_t version) { - struct wl_drm_info *info = (struct wl_drm_info *)data; - static const struct wl_drm_listener wl_drm_client_listener = { - wl_client_drm_handle_device, - wl_client_drm_handle_format, - wl_client_drm_handle_authenticated, - wl_client_drm_handle_capabilities - }; + struct wl_tbm_info *info = (struct wl_tbm_info *)data; + + if (!strcmp(interface, "wl_tbm")) + { + info->wl_tbm = wl_registry_bind(registry, name, &wl_tbm_interface, version); + if (!info->wl_tbm) + { + printf("Failed to bind wl_tbm\n"); + return; + } - printf("interface[%s]\n", interface); - if (!strcmp(interface, "wl_drm")) { - info->wl_drm = wl_registry_bind(registry, name, &wl_drm_interface, (version > 2) ? 2 : version); -#if USE_QUEUE - wl_proxy_set_queue((struct wl_proxy *)info->wl_drm, info->wl_queue); -#endif - wl_drm_add_listener(info->wl_drm, &wl_drm_client_listener, data); + wl_tbm_add_listener(info->wl_tbm, &wl_tbm_client_listener, info); + wl_proxy_set_queue((struct wl_proxy *)info->wl_tbm, info->wl_queue); } } @@ -240,15 +219,15 @@ static int tbm_util_get_drm_fd(void *dpy, int *fd) { struct wl_display *disp = NULL; struct wl_registry *wl_registry; - int ret = 0; - struct wl_drm_info info = { -#if USE_QUEUE - .wl_queue = NULL, -#endif - .wl_drm = NULL, - .authenticated = 0, - .fd = -1, - }; + struct wl_tbm_info info = { + .dpy = NULL, + .wl_queue = NULL, + .wl_tbm = NULL, + .capabilities = 0, + .device = NULL, + .fd = 0, + }; + static const struct wl_registry_listener registry_listener = { wl_client_registry_handle_global, NULL @@ -266,8 +245,8 @@ static int tbm_util_get_drm_fd(void *dpy, int *fd) } dpy = disp; } - -#if USE_QUEUE + + info.dpy = dpy; info.wl_queue = wl_display_create_queue(dpy); if (!info.wl_queue) { printf("Failed to create a WL Queue\n"); @@ -276,45 +255,36 @@ static int tbm_util_get_drm_fd(void *dpy, int *fd) } return -1; } -#endif + wl_registry = wl_display_get_registry(dpy); if (!wl_registry) { printf("Failed to get registry\n"); -#if USE_QUEUE wl_event_queue_destroy(info.wl_queue); -#endif if (disp == dpy) { wl_display_disconnect(disp); } return -1; } -#if USE_QUEUE wl_proxy_set_queue((struct wl_proxy *)wl_registry, info.wl_queue); -#endif - wl_registry_add_listener(wl_registry, ®istry_listener, &info); - wl_display_roundtrip(dpy); - - printf("Consuming Dispatch Queue begin\n"); - while (ret != -1 && !info.authenticated) { -#if USE_QUEUE - ret = wl_display_dispatch_queue(dpy, info.wl_queue); -#else - ret = wl_display_dispatch(dpy); -#endif - printf("Dispatch Queue consumed: %d\n", ret); - } - printf("Consuming Dispatch Queue end\n"); - -#if USE_QUEUE + wl_registry_add_listener(wl_registry, ®istry_listener, &info); + wl_display_roundtrip_queue(dpy, info.wl_queue); + + wl_tbm_get_authentication_info(info.wl_tbm); + wl_display_roundtrip_queue(dpy, info.wl_queue); + + *fd = info.fd; + wl_event_queue_destroy(info.wl_queue); -#endif wl_registry_destroy(wl_registry); - wl_drm_destroy(info.wl_drm); - *fd = info.fd; + free(info.device); + wl_tbm_set_user_data (info.wl_tbm, NULL); + wl_tbm_destroy(info.wl_tbm); + if (disp == dpy) { wl_display_disconnect(disp); } + return *fd >= 0 ? 0 : -1; } @@ -322,11 +292,11 @@ int tbm_bufmgr_get_drm_fd_wayland() { int fd = -1; - + if(tbm_util_get_drm_fd(NULL, &fd)) { printf("Failed to get drm_fd\n"); } - + return fd; -} \ No newline at end of file +} -- 2.7.4