# 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])
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])
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);
/* --- 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;
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:
#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;
{
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 = {
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) {
}
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) {
}
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));
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;
*/
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 */
#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