Blame va/wayland/va_wayland.c

Packit Service 9402ce
/*
Packit Service 9402ce
 * va_wayland.c - Wayland API
Packit Service 9402ce
 *
Packit Service 9402ce
 * Copyright (c) 2012 Intel Corporation. All Rights Reserved.
Packit Service 9402ce
 *
Packit Service 9402ce
 * Permission is hereby granted, free of charge, to any person obtaining a
Packit Service 9402ce
 * copy of this software and associated documentation files (the
Packit Service 9402ce
 * "Software"), to deal in the Software without restriction, including
Packit Service 9402ce
 * without limitation the rights to use, copy, modify, merge, publish,
Packit Service 9402ce
 * distribute, sub license, and/or sell copies of the Software, and to
Packit Service 9402ce
 * permit persons to whom the Software is furnished to do so, subject to
Packit Service 9402ce
 * the following conditions:
Packit Service 9402ce
 * 
Packit Service 9402ce
 * The above copyright notice and this permission notice (including the
Packit Service 9402ce
 * next paragraph) shall be included in all copies or substantial portions
Packit Service 9402ce
 * of the Software.
Packit Service 9402ce
 * 
Packit Service 9402ce
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
Packit Service 9402ce
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Packit Service 9402ce
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
Packit Service 9402ce
 * IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE LIABLE FOR
Packit Service 9402ce
 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
Packit Service 9402ce
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
Packit Service 9402ce
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit Service 9402ce
 */
Packit Service 9402ce
Packit Service 9402ce
#include "sysdeps.h"
Packit Service 9402ce
#include <stdarg.h>
Packit Service 9402ce
#include "va_wayland.h"
Packit Service 9402ce
#include "va_wayland_drm.h"
Packit Service 9402ce
#include "va_wayland_emgd.h"
Packit Service 9402ce
#include "va_wayland_private.h"
Packit Service 9402ce
#include "va_backend.h"
Packit Service 9402ce
#include "va_backend_wayland.h"
Packit Service 9402ce
#include "va_internal.h"
Packit Service 9402ce
Packit Service 9402ce
static inline VADriverContextP
Packit Service 9402ce
get_driver_context(VADisplay dpy)
Packit Service 9402ce
{
Packit Service 9402ce
    if (!vaDisplayIsValid(dpy))
Packit Service 9402ce
        return NULL;
Packit Service 9402ce
    return ((VADisplayContextP)dpy)->pDriverContext;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
void
Packit Service 9402ce
va_wayland_error(const char *format, ...)
Packit Service 9402ce
{
Packit Service 9402ce
    va_list args;
Packit Service 9402ce
Packit Service 9402ce
    va_start(args, format);
Packit Service 9402ce
    fprintf(stderr, "VA error: wayland: ");
Packit Service 9402ce
    vfprintf(stderr, format, args);
Packit Service 9402ce
    fprintf(stderr, "\n");
Packit Service 9402ce
    va_end(args);
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
static int
Packit Service 9402ce
va_DisplayContextIsValid(VADisplayContextP pDisplayContext)
Packit Service 9402ce
{
Packit Service 9402ce
    VADriverContextP const pDriverContext = pDisplayContext->pDriverContext;
Packit Service 9402ce
Packit Service 9402ce
    return (pDriverContext &&
Packit Service 9402ce
            pDriverContext->display_type == VA_DISPLAY_WAYLAND);
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
static void
Packit Service 9402ce
va_DisplayContextDestroy(VADisplayContextP pDisplayContext)
Packit Service 9402ce
{
Packit Service 9402ce
    VADriverContextP pDriverContext;
Packit Service 9402ce
    VADisplayContextWaylandP pDisplayContextWl;
Packit Service 9402ce
Packit Service 9402ce
    if (!pDisplayContext)
Packit Service 9402ce
        return;
Packit Service 9402ce
Packit Service 9402ce
    pDisplayContextWl = pDisplayContext->opaque;
Packit Service 9402ce
    if (pDisplayContextWl && pDisplayContextWl->destroy)
Packit Service 9402ce
        pDisplayContextWl->destroy(pDisplayContext);
Packit Service 9402ce
Packit Service 9402ce
    pDriverContext = pDisplayContext->pDriverContext;
Packit Service 9402ce
    if (pDriverContext) {
Packit Service 9402ce
        free(pDriverContext->vtable_wayland);
Packit Service 9402ce
        pDriverContext->vtable_wayland = NULL;
Packit Service 9402ce
        free(pDriverContext);
Packit Service 9402ce
        pDisplayContext->pDriverContext = NULL;
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
    free(pDisplayContext->opaque);
Packit Service 9402ce
    pDisplayContext->opaque = NULL;
Packit Service 9402ce
    free(pDisplayContext);
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
static VAStatus
Packit Service 9402ce
va_DisplayContextGetDriverName(VADisplayContextP pDisplayContext, char **name)
Packit Service 9402ce
{
Packit Service 9402ce
    *name = NULL;
Packit Service 9402ce
    return VA_STATUS_ERROR_UNKNOWN;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/* -------------------------------------------------------------------------- */
Packit Service 9402ce
/* --- Public interface                                                   --- */
Packit Service 9402ce
/* -------------------------------------------------------------------------- */
Packit Service 9402ce
Packit Service 9402ce
struct va_wayland_backend {
Packit Service 9402ce
    VADisplayContextCreateFunc  create;
Packit Service 9402ce
    VADisplayContextDestroyFunc destroy;
Packit Service 9402ce
};
Packit Service 9402ce
Packit Service 9402ce
static const struct va_wayland_backend g_backends[] = {
Packit Service 9402ce
    { va_wayland_drm_create,
Packit Service 9402ce
      va_wayland_drm_destroy },
Packit Service 9402ce
    { va_wayland_emgd_create,
Packit Service 9402ce
      va_wayland_emgd_destroy },
Packit Service 9402ce
    { NULL, }
Packit Service 9402ce
};
Packit Service 9402ce
Packit Service 9402ce
VADisplay
Packit Service 9402ce
vaGetDisplayWl(struct wl_display *display)
Packit Service 9402ce
{
Packit Service 9402ce
    VADisplayContextP pDisplayContext = NULL;
Packit Service 9402ce
    VADriverContextP pDriverContext;
Packit Service 9402ce
    struct VADriverVTableWayland *vtable;
Packit Service 9402ce
    unsigned int i;
Packit Service 9402ce
Packit Service 9402ce
    pDisplayContext = va_newDisplayContext();
Packit Service 9402ce
    if (!pDisplayContext)
Packit Service 9402ce
        return NULL;
Packit Service 9402ce
Packit Service 9402ce
    pDisplayContext->vaIsValid          = va_DisplayContextIsValid;
Packit Service 9402ce
    pDisplayContext->vaDestroy          = va_DisplayContextDestroy;
Packit Service 9402ce
    pDisplayContext->vaGetDriverName    = va_DisplayContextGetDriverName;
Packit Service 9402ce
Packit Service 9402ce
    pDriverContext = va_newDriverContext(pDisplayContext);
Packit Service 9402ce
    if (!pDriverContext)
Packit Service 9402ce
        goto error;
Packit Service 9402ce
Packit Service 9402ce
    pDriverContext->native_dpy          = display;
Packit Service 9402ce
    pDriverContext->display_type        = VA_DISPLAY_WAYLAND;
Packit Service 9402ce
Packit Service 9402ce
    vtable = calloc(1, sizeof(*vtable));
Packit Service 9402ce
    if (!vtable)
Packit Service 9402ce
        goto error;
Packit Service 9402ce
    pDriverContext->vtable_wayland      = vtable;
Packit Service 9402ce
Packit Service 9402ce
    vtable->version                     = VA_WAYLAND_API_VERSION;
Packit Service 9402ce
Packit Service 9402ce
    for (i = 0; g_backends[i].create != NULL; i++) {
Packit Service 9402ce
        if (g_backends[i].create(pDisplayContext))
Packit Service 9402ce
            break;
Packit Service 9402ce
        g_backends[i].destroy(pDisplayContext);
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
    return (VADisplay)pDisplayContext;
Packit Service 9402ce
Packit Service 9402ce
error:
Packit Service 9402ce
    va_DisplayContextDestroy(pDisplayContext);
Packit Service 9402ce
    return NULL;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus
Packit Service 9402ce
vaGetSurfaceBufferWl(
Packit Service 9402ce
    VADisplay           dpy,
Packit Service 9402ce
    VASurfaceID         surface,
Packit Service 9402ce
    unsigned int        flags,
Packit Service 9402ce
    struct wl_buffer  **out_buffer
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
    VADriverContextP const ctx = get_driver_context(dpy);
Packit Service 9402ce
Packit Service 9402ce
    if (!ctx)
Packit Service 9402ce
        return VA_STATUS_ERROR_INVALID_DISPLAY;
Packit Service 9402ce
    if (!ctx->vtable_wayland || !ctx->vtable_wayland->vaGetSurfaceBufferWl)
Packit Service 9402ce
        return VA_STATUS_ERROR_UNIMPLEMENTED;
Packit Service 9402ce
    return ctx->vtable_wayland->vaGetSurfaceBufferWl(ctx, surface, flags,
Packit Service 9402ce
                                                     out_buffer);
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus
Packit Service 9402ce
vaGetImageBufferWl(
Packit Service 9402ce
    VADisplay           dpy,
Packit Service 9402ce
    VAImageID           image,
Packit Service 9402ce
    unsigned int        flags,
Packit Service 9402ce
    struct wl_buffer  **out_buffer
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
    VADriverContextP const ctx = get_driver_context(dpy);
Packit Service 9402ce
Packit Service 9402ce
    if (!ctx)
Packit Service 9402ce
        return VA_STATUS_ERROR_INVALID_DISPLAY;
Packit Service 9402ce
    if (!ctx->vtable_wayland || !ctx->vtable_wayland->vaGetImageBufferWl)
Packit Service 9402ce
        return VA_STATUS_ERROR_UNIMPLEMENTED;
Packit Service 9402ce
    return ctx->vtable_wayland->vaGetImageBufferWl(ctx, image, flags,
Packit Service 9402ce
                                                   out_buffer);
Packit Service 9402ce
}