From 389e4913a5b19993605d1b416cbc4016470abf8e Mon Sep 17 00:00:00 2001 From: Gwenole Beauchesne Date: Fri, 13 Jul 2012 07:27:11 +0200 Subject: [PATCH] wayland: add initial support for EMGD driver. Signed-off-by: Zhao Halley Signed-off-by: Gwenole Beauchesne --- va/wayland/Makefile.am | 2 + va/wayland/va_wayland.c | 3 + va/wayland/va_wayland_emgd.c | 137 +++++++++++++++++++++++++++++++++++++++++++ va/wayland/va_wayland_emgd.h | 52 ++++++++++++++++ 4 files changed, 194 insertions(+) create mode 100644 va/wayland/va_wayland_emgd.c create mode 100644 va/wayland/va_wayland_emgd.h diff --git a/va/wayland/Makefile.am b/va/wayland/Makefile.am index 9e97e2a..a9f9546 100644 --- a/va/wayland/Makefile.am +++ b/va/wayland/Makefile.am @@ -33,6 +33,7 @@ INCLUDES = \ source_c = \ va_wayland.c \ va_wayland_drm.c \ + va_wayland_emgd.c \ $(top_srcdir)/va/drm/va_drm_utils.c \ $(NULL) @@ -43,6 +44,7 @@ source_h = \ source_h_priv = \ va_wayland_drm.h \ + va_wayland_emgd.h \ va_wayland_private.h \ $(NULL) diff --git a/va/wayland/va_wayland.c b/va/wayland/va_wayland.c index 22f916f..88a841f 100644 --- a/va/wayland/va_wayland.c +++ b/va/wayland/va_wayland.c @@ -28,6 +28,7 @@ #include #include "va_wayland.h" #include "va_wayland_drm.h" +#include "va_wayland_emgd.h" #include "va_wayland_private.h" #include "va_backend.h" #include "va_backend_wayland.h" @@ -106,6 +107,8 @@ struct va_wayland_backend { static const struct va_wayland_backend g_backends[] = { { va_wayland_drm_create, va_wayland_drm_destroy }, + { va_wayland_emgd_create, + va_wayland_emgd_destroy }, { NULL, } }; diff --git a/va/wayland/va_wayland_emgd.c b/va/wayland/va_wayland_emgd.c new file mode 100644 index 0000000..73e6802 --- /dev/null +++ b/va/wayland/va_wayland_emgd.c @@ -0,0 +1,137 @@ +/* + * va_wayland_emgd.c - Wayland/EMGD helpers + * + * Copyright (c) 2012 Intel Corporation. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "sysdeps.h" +#include +#include +#include "va_drmcommon.h" +#include "va_wayland_emgd.h" +#include "va_wayland_private.h" + +/* XXX: Wayland/EMGD support currently lives in libwayland-emgd.so.* library */ +#define LIBWAYLAND_EMGD_NAME "libwayland-emgd.so.1" + +typedef struct va_wayland_emgd_context { + struct va_wayland_context base; + void *handle; + struct wl_emgd *emgd; + void *emgd_interface; + unsigned int is_created : 1; +} VADisplayContextWaylandEMGD; + +static inline void +wl_emgd_destroy(struct wl_emgd *emgd) +{ + wl_proxy_destroy((struct wl_proxy *)emgd); +} + +static VAStatus +va_DisplayContextGetDriverName( + VADisplayContextP pDisplayContext, + char **driver_name_ptr +) +{ + *driver_name_ptr = strdup("emgd"); + return VA_STATUS_SUCCESS; +} + +void +va_wayland_emgd_destroy(VADisplayContextP pDisplayContext) +{ + VADriverContextP const ctx = pDisplayContext->pDriverContext; + VADisplayContextWaylandEMGD * const wl_emgd_ctx = pDisplayContext->opaque; + struct drm_state * const drm_state = ctx->drm_state; + + if (wl_emgd_ctx->emgd) { + wl_emgd_destroy(wl_emgd_ctx->emgd); + wl_emgd_ctx->emgd = NULL; + } + wl_emgd_ctx->is_created = 0; + + if (wl_emgd_ctx->handle) { + dlclose(wl_emgd_ctx->handle); + wl_emgd_ctx->handle = NULL; + } + + if (drm_state) { + if (drm_state->fd >= 0) { + close(drm_state->fd); + drm_state->fd = -1; + } + free(ctx->drm_state); + ctx->drm_state = NULL; + } +} + +bool +va_wayland_emgd_create(VADisplayContextP pDisplayContext) +{ + VADriverContextP const ctx = pDisplayContext->pDriverContext; + VADisplayContextWaylandEMGD *wl_emgd_ctx; + struct drm_state *drm_state; + uint32_t id; + + wl_emgd_ctx = malloc(sizeof(*wl_emgd_ctx)); + if (!wl_emgd_ctx) + return false; + wl_emgd_ctx->base.destroy = va_wayland_emgd_destroy; + wl_emgd_ctx->handle = NULL; + wl_emgd_ctx->emgd = NULL; + wl_emgd_ctx->emgd_interface = NULL; + wl_emgd_ctx->is_created = 0; + pDisplayContext->opaque = wl_emgd_ctx; + pDisplayContext->vaGetDriverName = va_DisplayContextGetDriverName; + + drm_state = calloc(1, sizeof(struct drm_state)); + if (!drm_state) + return false; + drm_state->fd = -1; + drm_state->auth_type = 0; + ctx->drm_state = drm_state; + + id = wl_display_get_global(ctx->native_dpy, "wl_emgd", 1); + if (!id) { + wl_display_roundtrip(ctx->native_dpy); + id = wl_display_get_global(ctx->native_dpy, "wl_emgd", 1); + if (!id) + return false; + } + + wl_emgd_ctx->handle = dlopen(LIBWAYLAND_EMGD_NAME, RTLD_LAZY|RTLD_LOCAL); + if (!wl_emgd_ctx->handle) + return false; + + wl_emgd_ctx->emgd_interface = + dlsym(wl_emgd_ctx->handle, "wl_emgd_interface"); + if (!wl_emgd_ctx->emgd_interface) + return false; + + wl_emgd_ctx->emgd = + wl_display_bind(ctx->native_dpy, id, wl_emgd_ctx->emgd_interface); + if (!wl_emgd_ctx->emgd) + return false; + return true; +} diff --git a/va/wayland/va_wayland_emgd.h b/va/wayland/va_wayland_emgd.h new file mode 100644 index 0000000..053b6b4 --- /dev/null +++ b/va/wayland/va_wayland_emgd.h @@ -0,0 +1,52 @@ +/* + * va_wayland_emgd.h - Wayland/EMGD helpers + * + * Copyright (c) 2012 Intel Corporation. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef VA_WAYLAND_EMGD_H +#define VA_WAYLAND_EMGD_H + +#include +#include "va_wayland.h" +#include "va_backend.h" +#include "va_backend_wayland.h" + +/** + * \brief Initializes Wayland/EMGD layer. + * + * This is an internal function used to initialize the VA/EMGD subsystem + * if the application is running on an EMGD-based server. + * + * @param[in] pDisplayContext the VA display context + * @return true if successful + */ +DLL_HIDDEN +bool +va_wayland_emgd_create(VADisplayContextP pDisplayContext); + +DLL_HIDDEN +void +va_wayland_emgd_destroy(VADisplayContextP pDisplayContext); + +#endif /* VA_WAYLAND_EMGD_H */ -- 2.7.4