wayland: merge Wayland 0.95 support from master.
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>
Thu, 15 Nov 2012 12:53:47 +0000 (13:53 +0100)
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>
Thu, 15 Nov 2012 13:03:04 +0000 (14:03 +0100)
Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
configure.ac
va/wayland/va_wayland.c
va/wayland/va_wayland_drm.c
va/wayland/va_wayland_drm.h
va/wayland/va_wayland_private.h

index af9bf82..848eb2e 100644 (file)
@@ -77,6 +77,9 @@ m4_define([libva_lt_age],
 # libdrm minimun version requirement
 m4_define([libdrm_version], [2.4])
 
+# Wayland minimum version number
+m4_define([wayland_api_version], [0.95.0])
+
 AC_PREREQ(2.57)
 AC_INIT([libva], [libva_version], [waldo.bastian@intel.com], libva)
 AC_CONFIG_SRCDIR([Makefile.am])
@@ -269,9 +272,13 @@ fi
 AM_CONDITIONAL(USE_EGL, test "$USE_EGL" = "yes")
 
 # Check for Wayland
+WAYLAND_API_VERSION=wayland_api_version
+AC_SUBST(WAYLAND_API_VERSION)
+
 USE_WAYLAND="no"
 if test "$enable_wayland" = "yes"; then
-    PKG_CHECK_MODULES([WAYLAND], [wayland-client], [USE_WAYLAND="yes"], [:])
+    PKG_CHECK_MODULES([WAYLAND], [wayland-client >= wayland_api_version],
+        [USE_WAYLAND="yes"], [:])
     if test "$USE_WAYLAND" = "yes"; then
         AC_DEFINE([HAVE_VA_WAYLAND], [1],
                   [Defined to 1 if VA/Wayland API is built])
index af509bb..22f916f 100644 (file)
@@ -65,21 +65,23 @@ static void
 va_DisplayContextDestroy(VADisplayContextP pDisplayContext)
 {
     VADriverContextP pDriverContext;
+    VADisplayContextWaylandP pDisplayContextWl;
 
     if (!pDisplayContext)
         return;
 
+    pDisplayContextWl = pDisplayContext->opaque;
+    if (pDisplayContextWl && pDisplayContextWl->destroy)
+        pDisplayContextWl->destroy(pDisplayContext);
+
     pDriverContext = pDisplayContext->pDriverContext;
     if (pDriverContext) {
-        VADisplayContextWaylandP const pDisplayContextWl =
-            pDisplayContext->opaque;
-        if (pDisplayContextWl && pDisplayContextWl->finalize)
-            pDisplayContextWl->finalize(pDisplayContext);
         free(pDriverContext->vtable_wayland);
         pDriverContext->vtable_wayland = NULL;
         free(pDriverContext);
         pDisplayContext->pDriverContext = NULL;
     }
+
     free(pDisplayContext->opaque);
     pDisplayContext->opaque = NULL;
     free(pDisplayContext);
@@ -96,18 +98,22 @@ va_DisplayContextGetDriverName(VADisplayContextP pDisplayContext, char **name)
 /* --- Public interface                                                   --- */
 /* -------------------------------------------------------------------------- */
 
-static const VADisplayContextInitFunc g_display_context_init_funcs[] = {
-    va_wayland_drm_init,
-    NULL
+struct va_wayland_backend {
+    VADisplayContextCreateFunc  create;
+    VADisplayContextDestroyFunc destroy;
+};
+
+static const struct va_wayland_backend g_backends[] = {
+    { va_wayland_drm_create,
+      va_wayland_drm_destroy },
+    { NULL, }
 };
 
 VADisplay
 vaGetDisplayWl(struct wl_display *display)
 {
     VADisplayContextP pDisplayContext = NULL;
-    VADisplayContextWaylandP pDisplayContextWl;
     VADriverContextP pDriverContext;
-    VADisplayContextInitFunc init_backend;
     struct VADriverVTableWayland *vtable;
     unsigned int i;
 
@@ -135,22 +141,12 @@ vaGetDisplayWl(struct wl_display *display)
 
     vtable->version                     = VA_WAYLAND_API_VERSION;
 
-    pDisplayContextWl = calloc(1, sizeof(*pDisplayContextWl));
-    if (!pDisplayContextWl)
-        goto error;
-    pDisplayContext->opaque = pDisplayContextWl;
-
-    init_backend = NULL;
-    for (i = 0; g_display_context_init_funcs[i] != NULL; i++) {
-        init_backend = g_display_context_init_funcs[i];
-        if (init_backend(pDisplayContext))
+    for (i = 0; g_backends[i].create != NULL; i++) {
+        if (g_backends[i].create(pDisplayContext))
             break;
-        if (pDisplayContextWl->finalize)
-            pDisplayContextWl->finalize(pDisplayContext);
-        init_backend = NULL;
+        g_backends[i].destroy(pDisplayContext);
     }
-    if (!init_backend)
-        goto error;
+
     return (VADisplay)pDisplayContext;
 
 error:
index 5647f6c..30c3953 100644 (file)
 #include "va_wayland_private.h"
 #include "wayland-drm-client-protocol.h"
 
-/* XXX: wayland-drm currently lives in libEGL.so.* library */
-#define LIBEGL_NAME "libEGL.so.1"
+/* XXX: Wayland/DRM support currently lives in Mesa libEGL.so.* library */
+#define LIBWAYLAND_DRM_NAME "libEGL.so.1"
+
+typedef struct va_wayland_drm_context {
+    struct va_wayland_context   base;
+    void                       *handle;
+    struct wl_drm              *drm;
+    void                       *drm_interface;
+    unsigned int                is_authenticated        : 1;
+} VADisplayContextWaylandDRM;
 
 static void
 drm_handle_device(void *data, struct wl_drm *drm, const char *device)
 {
     VADisplayContextP const pDisplayContext = data;
     VADriverContextP const ctx = pDisplayContext->pDriverContext;
-    VADisplayContextWaylandP const wl_ctx = pDisplayContext->opaque;
-    VADisplayContextWaylandDRM * const wl_drm_ctx = &wl_ctx->backend.drm;
+    VADisplayContextWaylandDRM * const wl_drm_ctx = pDisplayContext->opaque;
     struct drm_state * const drm_state = ctx->drm_state;
     drm_magic_t magic;
     struct stat st;
@@ -83,11 +90,11 @@ drm_handle_authenticated(void *data, struct wl_drm *drm)
 {
     VADisplayContextP const pDisplayContext = data;
     VADriverContextP const ctx = pDisplayContext->pDriverContext;
-    VADisplayContextWaylandP const wl_ctx = pDisplayContext->opaque;
+    VADisplayContextWaylandDRM * const wl_drm_ctx = pDisplayContext->opaque;
     struct drm_state * const drm_state = ctx->drm_state;
 
-    wl_ctx->backend.drm.is_authenticated = 1;
-    drm_state->auth_type                 = VA_DRM_AUTH_CUSTOM;
+    wl_drm_ctx->is_authenticated = 1;
+    drm_state->auth_type         = VA_DRM_AUTH_CUSTOM;
 }
 
 static const struct wl_drm_listener drm_listener = {
@@ -107,12 +114,11 @@ va_DisplayContextGetDriverName(
     return VA_DRM_GetDriverName(ctx, driver_name_ptr);
 }
 
-static void
-va_wayland_drm_finalize(VADisplayContextP pDisplayContext)
+void
+va_wayland_drm_destroy(VADisplayContextP pDisplayContext)
 {
     VADriverContextP const ctx = pDisplayContext->pDriverContext;
-    VADisplayContextWaylandP const wl_ctx = pDisplayContext->opaque;
-    VADisplayContextWaylandDRM * const wl_drm_ctx = &wl_ctx->backend.drm;
+    struct va_wayland_drm_context * const wl_drm_ctx = pDisplayContext->opaque;
     struct drm_state * const drm_state = ctx->drm_state;
 
     if (wl_drm_ctx->drm) {
@@ -121,9 +127,9 @@ va_wayland_drm_finalize(VADisplayContextP pDisplayContext)
     }
     wl_drm_ctx->is_authenticated = 0;
 
-    if (wl_drm_ctx->libEGL_handle) {
-        dlclose(wl_drm_ctx->libEGL_handle);
-        wl_drm_ctx->libEGL_handle = NULL;
+    if (wl_drm_ctx->handle) {
+        dlclose(wl_drm_ctx->handle);
+        wl_drm_ctx->handle = NULL;
     }
 
     if (drm_state) {
@@ -137,17 +143,22 @@ va_wayland_drm_finalize(VADisplayContextP pDisplayContext)
 }
 
 bool
-va_wayland_drm_init(VADisplayContextP pDisplayContext)
+va_wayland_drm_create(VADisplayContextP pDisplayContext)
 {
     VADriverContextP const ctx = pDisplayContext->pDriverContext;
-    VADisplayContextWaylandP const wl_ctx = pDisplayContext->opaque;
-    VADisplayContextWaylandDRM * const wl_drm_ctx = &wl_ctx->backend.drm;
+    struct va_wayland_drm_context *wl_drm_ctx;
     struct drm_state *drm_state;
     uint32_t id;
 
+    wl_drm_ctx = malloc(sizeof(*wl_drm_ctx));
+    if (!wl_drm_ctx)
+        return false;
+    wl_drm_ctx->base.destroy            = va_wayland_drm_destroy;
+    wl_drm_ctx->handle                  = NULL;
     wl_drm_ctx->drm                     = NULL;
+    wl_drm_ctx->drm_interface           = NULL;
     wl_drm_ctx->is_authenticated        = 0;
-    wl_ctx->finalize                    = va_wayland_drm_finalize;
+    pDisplayContext->opaque             = wl_drm_ctx;
     pDisplayContext->vaGetDriverName    = va_DisplayContextGetDriverName;
 
     drm_state = calloc(1, sizeof(struct drm_state));
@@ -165,12 +176,12 @@ va_wayland_drm_init(VADisplayContextP pDisplayContext)
             return false;
     }
 
-    wl_drm_ctx->libEGL_handle = dlopen(LIBEGL_NAME, RTLD_LAZY|RTLD_LOCAL);
-    if (!wl_drm_ctx->libEGL_handle)
+    wl_drm_ctx->handle = dlopen(LIBWAYLAND_DRM_NAME, RTLD_LAZY|RTLD_LOCAL);
+    if (!wl_drm_ctx->handle)
         return false;
 
     wl_drm_ctx->drm_interface =
-        dlsym(wl_drm_ctx->libEGL_handle, "wl_drm_interface");
+        dlsym(wl_drm_ctx->handle, "wl_drm_interface");
     if (!wl_drm_ctx->drm_interface)
         return false;
 
index 0d06553..6fb8f52 100644 (file)
  */
 DLL_HIDDEN
 bool
-va_wayland_drm_init(VADisplayContextP pDisplayContext);
+va_wayland_drm_create(VADisplayContextP pDisplayContext);
+
+DLL_HIDDEN
+void
+va_wayland_drm_destroy(VADisplayContextP pDisplayContext);
 
 #endif /* VA_WAYLAND_DRM_H */
index c55a7b4..f09f4b7 100644 (file)
 #ifndef VA_WAYLAND_PRIVATE_H
 #define VA_WAYLAND_PRIVATE_H
 
-typedef bool (*VADisplayContextInitFunc)(VADisplayContextP pDisplayContext);
-typedef void (*VADisplayContextFinalizeFunc)(VADisplayContextP pDisplayContext);
+struct va_wayland_context;
 
-typedef struct _VADisplayContextWaylandDRM {
-    /* XXX: wayland-drm lives in libEGL.so.* for now */
-    void                               *libEGL_handle;
-    struct wl_drm                      *drm;
-    void                               *drm_interface;
-    unsigned int                        is_authenticated        : 1;
-} VADisplayContextWaylandDRM;
+typedef bool (*VADisplayContextCreateFunc)(VADisplayContextP pDisplayContext);
+typedef void (*VADisplayContextDestroyFunc)(VADisplayContextP pDisplayContext);
 
-typedef struct _VADisplayContextWayland {
-    union {
-        VADisplayContextWaylandDRM      drm;
-    } backend;
-    VADisplayContextFinalizeFunc        finalize;
+/* VA/Wayland base display context */
+typedef struct va_wayland_context {
+    VADisplayContextDestroyFunc destroy;
 } VADisplayContextWayland, *VADisplayContextWaylandP;
 
 DLL_HIDDEN