Blame va/va.c

Packit Service 9402ce
/*
Packit Service 9402ce
 * Copyright (c) 2007 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 PRECISION INSIGHT 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
#define _GNU_SOURCE 1
Packit Service 9402ce
#include "sysdeps.h"
Packit Service 9402ce
#include "va.h"
Packit Service 9402ce
#include "va_backend.h"
Packit Service 9402ce
#include "va_backend_vpp.h"
Packit Service 9402ce
#include "va_internal.h"
Packit Service 9402ce
#include "va_trace.h"
Packit Service 9402ce
#include "va_fool.h"
Packit Service 9402ce
Packit Service 9402ce
#include <assert.h>
Packit Service 9402ce
#include <stdarg.h>
Packit Service 9402ce
#include <stdio.h>
Packit Service 9402ce
#include <stdlib.h>
Packit Service 9402ce
#include <string.h>
Packit Service 9402ce
#include <dlfcn.h>
Packit Service 9402ce
#include <unistd.h>
Packit Service 9402ce
#ifdef ANDROID
Packit Service 9402ce
#include <log/log.h>
Packit Service 9402ce
/* support versions < JellyBean */
Packit Service 9402ce
#ifndef ALOGE
Packit Service 9402ce
#define ALOGE LOGE
Packit Service 9402ce
#endif
Packit Service 9402ce
#ifndef ALOGI
Packit Service 9402ce
#define ALOGI LOGI
Packit Service 9402ce
#endif
Packit Service 9402ce
#endif
Packit Service 9402ce
Packit Service 9402ce
#define DRIVER_EXTENSION	"_drv_video.so"
Packit Service 9402ce
Packit Service 9402ce
#define ASSERT		assert
Packit Service 9402ce
#define CHECK_VTABLE(s, ctx, func) if (!va_checkVtable(dpy, ctx->vtable->va##func, #func)) s = VA_STATUS_ERROR_UNKNOWN;
Packit Service 9402ce
#define CHECK_MAXIMUM(s, ctx, var) if (!va_checkMaximum(dpy, ctx->max_##var, #var)) s = VA_STATUS_ERROR_UNKNOWN;
Packit Service 9402ce
#define CHECK_STRING(s, ctx, var) if (!va_checkString(dpy, ctx->str_##var, #var)) s = VA_STATUS_ERROR_UNKNOWN;
Packit Service 9402ce
Packit Service 9402ce
/*
Packit Service 9402ce
 * read a config "env" for libva.conf or from environment setting
Packit Service 9402ce
 * libva.conf has higher priority
Packit Service 9402ce
 * return 0: the "env" is set, and the value is copied into env_value
Packit Service 9402ce
 *        1: the env is not set
Packit Service 9402ce
 */
Packit Service 9402ce
int va_parseConfig(char *env, char *env_value)
Packit Service 9402ce
{
Packit Service 9402ce
    char *token, *value, *saveptr;
Packit Service 9402ce
    char oneline[1024];
Packit Service 9402ce
    FILE *fp=NULL;
Packit Service 9402ce
Packit Service 9402ce
    if (env == NULL)
Packit Service 9402ce
        return 1;
Packit Service 9402ce
    
Packit Service 9402ce
    fp = fopen("/etc/libva.conf", "r");
Packit Service 9402ce
    while (fp && (fgets(oneline, 1024, fp) != NULL)) {
Packit Service 9402ce
        if (strlen(oneline) == 1)
Packit Service 9402ce
            continue;
Packit Service 9402ce
        token = strtok_r(oneline, "=\n", &saveptr);
Packit Service 9402ce
        value = strtok_r(NULL, "=\n", &saveptr);
Packit Service 9402ce
Packit Service 9402ce
        if (NULL == token || NULL == value)
Packit Service 9402ce
            continue;
Packit Service 9402ce
Packit Service 9402ce
        if (strcmp(token, env) == 0) {
Packit Service 9402ce
            if (env_value) {
Packit Service 9402ce
                strncpy(env_value,value, 1024);
Packit Service 9402ce
                env_value[1023] = '\0';
Packit Service 9402ce
            }
Packit Service 9402ce
Packit Service 9402ce
            fclose(fp);
Packit Service 9402ce
Packit Service 9402ce
            return 0;
Packit Service 9402ce
        }
Packit Service 9402ce
    }
Packit Service 9402ce
    if (fp)
Packit Service 9402ce
        fclose(fp);
Packit Service 9402ce
Packit Service 9402ce
    /* no setting in config file, use env setting */
Packit Service 9402ce
    value = getenv(env);
Packit Service 9402ce
    if (value) {
Packit Service 9402ce
        if (env_value) {
Packit Service 9402ce
            strncpy(env_value, value, 1024);
Packit Service 9402ce
            env_value[1023] = '\0';
Packit Service 9402ce
        }
Packit Service 9402ce
        return 0;
Packit Service 9402ce
    }
Packit Service 9402ce
    
Packit Service 9402ce
    return 1;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
int vaDisplayIsValid(VADisplay dpy)
Packit Service 9402ce
{
Packit Service 9402ce
    VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
Packit Service 9402ce
    return pDisplayContext && (pDisplayContext->vadpy_magic == VA_DISPLAY_MAGIC) && pDisplayContext->vaIsValid(pDisplayContext);
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/*
Packit Service 9402ce
 * Global log level configured from the config file or environment, which sets
Packit Service 9402ce
 * whether default logging appears or not (always overridden by explicitly
Packit Service 9402ce
 * user-configured logging).
Packit Service 9402ce
 */
Packit Service 9402ce
static int default_log_level = 2;
Packit Service 9402ce
Packit Service 9402ce
static void default_log_error(void *user_context, const char *buffer)
Packit Service 9402ce
{
Packit Service 9402ce
    if (default_log_level < 1)
Packit Service 9402ce
        return;
Packit Service 9402ce
# ifdef ANDROID
Packit Service 9402ce
    ALOGE("%s", buffer);
Packit Service 9402ce
# else
Packit Service 9402ce
    fprintf(stderr, "libva error: %s", buffer);
Packit Service 9402ce
# endif
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
static void default_log_info(void *user_context, const char *buffer)
Packit Service 9402ce
{
Packit Service 9402ce
    if (default_log_level < 2)
Packit Service 9402ce
        return;
Packit Service 9402ce
# ifdef ANDROID
Packit Service 9402ce
    ALOGI("%s", buffer);
Packit Service 9402ce
# else
Packit Service 9402ce
    fprintf(stderr, "libva info: %s", buffer);
Packit Service 9402ce
# endif
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/**
Packit Service 9402ce
 * Set the callback for error messages, or NULL for no logging.
Packit Service 9402ce
 * Returns the previous one, or NULL if it was disabled.
Packit Service 9402ce
 */
Packit Service 9402ce
VAMessageCallback vaSetErrorCallback(VADisplay dpy, VAMessageCallback callback, void *user_context)
Packit Service 9402ce
{
Packit Service 9402ce
    VADisplayContextP dctx;
Packit Service 9402ce
    VAMessageCallback old_callback;
Packit Service 9402ce
Packit Service 9402ce
    if (!vaDisplayIsValid(dpy))
Packit Service 9402ce
        return NULL;
Packit Service 9402ce
Packit Service 9402ce
    dctx = (VADisplayContextP)dpy;
Packit Service 9402ce
    old_callback = dctx->error_callback;
Packit Service 9402ce
Packit Service 9402ce
    dctx->error_callback = callback;
Packit Service 9402ce
    dctx->error_callback_user_context = user_context;
Packit Service 9402ce
Packit Service 9402ce
    return old_callback;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/**
Packit Service 9402ce
 * Set the callback for info messages, or NULL for no logging.
Packit Service 9402ce
 * Returns the previous one, or NULL if it was disabled.
Packit Service 9402ce
 */
Packit Service 9402ce
VAMessageCallback vaSetInfoCallback(VADisplay dpy, VAMessageCallback callback, void *user_context)
Packit Service 9402ce
{
Packit Service 9402ce
    VADisplayContextP dctx;
Packit Service 9402ce
    VAMessageCallback old_callback;
Packit Service 9402ce
Packit Service 9402ce
    if (!vaDisplayIsValid(dpy))
Packit Service 9402ce
        return NULL;
Packit Service 9402ce
Packit Service 9402ce
    dctx = (VADisplayContextP)dpy;
Packit Service 9402ce
    old_callback = dctx->info_callback;
Packit Service 9402ce
Packit Service 9402ce
    dctx->info_callback = callback;
Packit Service 9402ce
    dctx->info_callback_user_context = user_context;
Packit Service 9402ce
Packit Service 9402ce
    return old_callback;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
static void va_MessagingInit()
Packit Service 9402ce
{
Packit Service 9402ce
#if ENABLE_VA_MESSAGING
Packit Service 9402ce
    char env_value[1024];
Packit Service 9402ce
    int ret;
Packit Service 9402ce
Packit Service 9402ce
    if (va_parseConfig("LIBVA_MESSAGING_LEVEL", &env_value[0]) == 0) {
Packit Service 9402ce
        ret = sscanf(env_value, "%d", &default_log_level);
Packit Service 9402ce
        if (ret < 1 || default_log_level < 0 || default_log_level > 2)
Packit Service 9402ce
            default_log_level = 2;
Packit Service 9402ce
    }
Packit Service 9402ce
#endif
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
void va_errorMessage(VADisplay dpy, const char *msg, ...)
Packit Service 9402ce
{
Packit Service 9402ce
#if ENABLE_VA_MESSAGING
Packit Service 9402ce
    VADisplayContextP dctx = (VADisplayContextP)dpy;
Packit Service 9402ce
    char buf[512], *dynbuf;
Packit Service 9402ce
    va_list args;
Packit Service 9402ce
    int n, len;
Packit Service 9402ce
Packit Service 9402ce
    if (dctx->error_callback == NULL)
Packit Service 9402ce
        return;
Packit Service 9402ce
Packit Service 9402ce
    va_start(args, msg);
Packit Service 9402ce
    len = vsnprintf(buf, sizeof(buf), msg, args);
Packit Service 9402ce
    va_end(args);
Packit Service 9402ce
Packit Service 9402ce
    if (len >= (int)sizeof(buf)) {
Packit Service 9402ce
        dynbuf = malloc(len + 1);
Packit Service 9402ce
        if (!dynbuf)
Packit Service 9402ce
            return;
Packit Service 9402ce
        va_start(args, msg);
Packit Service 9402ce
        n = vsnprintf(dynbuf, len + 1, msg, args);
Packit Service 9402ce
        va_end(args);
Packit Service 9402ce
        if (n == len)
Packit Service 9402ce
            dctx->error_callback(dctx->error_callback_user_context, dynbuf);
Packit Service 9402ce
        free(dynbuf);
Packit Service 9402ce
    }
Packit Service 9402ce
    else if (len > 0)
Packit Service 9402ce
        dctx->error_callback(dctx->error_callback_user_context, buf);
Packit Service 9402ce
#endif
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
void va_infoMessage(VADisplay dpy, const char *msg, ...)
Packit Service 9402ce
{
Packit Service 9402ce
#if ENABLE_VA_MESSAGING
Packit Service 9402ce
    VADisplayContextP dctx = (VADisplayContextP)dpy;
Packit Service 9402ce
    char buf[512], *dynbuf;
Packit Service 9402ce
    va_list args;
Packit Service 9402ce
    int n, len;
Packit Service 9402ce
Packit Service 9402ce
    if (dctx->info_callback == NULL)
Packit Service 9402ce
        return;
Packit Service 9402ce
Packit Service 9402ce
    va_start(args, msg);
Packit Service 9402ce
    len = vsnprintf(buf, sizeof(buf), msg, args);
Packit Service 9402ce
    va_end(args);
Packit Service 9402ce
Packit Service 9402ce
    if (len >= (int)sizeof(buf)) {
Packit Service 9402ce
        dynbuf = malloc(len + 1);
Packit Service 9402ce
        if (!dynbuf)
Packit Service 9402ce
            return;
Packit Service 9402ce
        va_start(args, msg);
Packit Service 9402ce
        n = vsnprintf(dynbuf, len + 1, msg, args);
Packit Service 9402ce
        va_end(args);
Packit Service 9402ce
        if (n == len)
Packit Service 9402ce
            dctx->info_callback(dctx->info_callback_user_context, dynbuf);
Packit Service 9402ce
        free(dynbuf);
Packit Service 9402ce
    }
Packit Service 9402ce
    else if (len > 0)
Packit Service 9402ce
        dctx->info_callback(dctx->info_callback_user_context, buf);
Packit Service 9402ce
#endif
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
static void va_driverErrorCallback(VADriverContextP ctx,
Packit Service 9402ce
                                   const char *message)
Packit Service 9402ce
{
Packit Service 9402ce
    VADisplayContextP dctx = ctx->pDisplayContext;
Packit Service 9402ce
    if (!dctx)
Packit Service 9402ce
        return;
Packit Service 9402ce
    dctx->error_callback(dctx->error_callback_user_context, message);
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
static void va_driverInfoCallback(VADriverContextP ctx,
Packit Service 9402ce
                                  const char *message)
Packit Service 9402ce
{
Packit Service 9402ce
    VADisplayContextP dctx = ctx->pDisplayContext;
Packit Service 9402ce
    if (!dctx)
Packit Service 9402ce
        return;
Packit Service 9402ce
    dctx->info_callback(dctx->info_callback_user_context, message);
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VADisplayContextP va_newDisplayContext(void)
Packit Service 9402ce
{
Packit Service 9402ce
    VADisplayContextP dctx = calloc(1, sizeof(*dctx));
Packit Service 9402ce
    if (!dctx)
Packit Service 9402ce
        return NULL;
Packit Service 9402ce
Packit Service 9402ce
    dctx->vadpy_magic = VA_DISPLAY_MAGIC;
Packit Service 9402ce
Packit Service 9402ce
    dctx->error_callback = default_log_error;
Packit Service 9402ce
    dctx->info_callback  = default_log_info;
Packit Service 9402ce
Packit Service 9402ce
    return dctx;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VADriverContextP va_newDriverContext(VADisplayContextP dctx)
Packit Service 9402ce
{
Packit Service 9402ce
    VADriverContextP ctx = calloc(1, sizeof(*ctx));
Packit Service 9402ce
    if (!ctx)
Packit Service 9402ce
        return NULL;
Packit Service 9402ce
Packit Service 9402ce
    dctx->pDriverContext = ctx;
Packit Service 9402ce
    ctx->pDisplayContext = dctx;
Packit Service 9402ce
Packit Service 9402ce
    ctx->error_callback = va_driverErrorCallback;
Packit Service 9402ce
    ctx->info_callback  = va_driverInfoCallback;
Packit Service 9402ce
Packit Service 9402ce
    return ctx;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
static bool va_checkVtable(VADisplay dpy, void *ptr, char *function)
Packit Service 9402ce
{
Packit Service 9402ce
    if (!ptr) {
Packit Service 9402ce
        va_errorMessage(dpy, "No valid vtable entry for va%s\n", function);
Packit Service 9402ce
        return false;
Packit Service 9402ce
    }
Packit Service 9402ce
    return true;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
static bool va_checkMaximum(VADisplay dpy, int value, char *variable)
Packit Service 9402ce
{
Packit Service 9402ce
    if (!value) {
Packit Service 9402ce
        va_errorMessage(dpy, "Failed to define max_%s in init\n", variable);
Packit Service 9402ce
        return false;
Packit Service 9402ce
    }
Packit Service 9402ce
    return true;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
static bool va_checkString(VADisplay dpy, const char* value, char *variable)
Packit Service 9402ce
{
Packit Service 9402ce
    if (!value) {
Packit Service 9402ce
        va_errorMessage(dpy, "Failed to define str_%s in init\n", variable);
Packit Service 9402ce
        return false;
Packit Service 9402ce
    }
Packit Service 9402ce
    return true;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
static inline int
Packit Service 9402ce
va_getDriverInitName(char *name, int namelen, int major, int minor)
Packit Service 9402ce
{
Packit Service 9402ce
    int ret = snprintf(name, namelen, "__vaDriverInit_%d_%d", major, minor);
Packit Service 9402ce
    return ret > 0 && ret < namelen;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
static VAStatus va_getDriverName(VADisplay dpy, char **driver_name)
Packit Service 9402ce
{
Packit Service 9402ce
    VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
Packit Service 9402ce
Packit Service 9402ce
    return pDisplayContext->vaGetDriverName(pDisplayContext, driver_name);
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
static char *va_getDriverPath(const char *driver_dir, const char *driver_name)
Packit Service 9402ce
{
Packit Service 9402ce
  int n = snprintf(0, 0, "%s/%s%s", driver_dir, driver_name, DRIVER_EXTENSION);
Packit Service 9402ce
  if (n < 0)
Packit Service 9402ce
      return NULL;
Packit Service 9402ce
  char *driver_path = (char *) malloc(n + 1);
Packit Service 9402ce
  if (!driver_path)
Packit Service 9402ce
      return NULL;
Packit Service 9402ce
  n = snprintf(driver_path, n + 1, "%s/%s%s",
Packit Service 9402ce
               driver_dir, driver_name, DRIVER_EXTENSION);
Packit Service 9402ce
  if (n < 0) {
Packit Service 9402ce
    free(driver_path);
Packit Service 9402ce
    return NULL;
Packit Service 9402ce
  }
Packit Service 9402ce
  return driver_path;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
static VAStatus va_openDriver(VADisplay dpy, char *driver_name)
Packit Service 9402ce
{
Packit Service 9402ce
    VADriverContextP ctx = CTX(dpy);
Packit Service 9402ce
    VAStatus vaStatus = VA_STATUS_ERROR_UNKNOWN;
Packit Service 9402ce
    char *search_path = NULL;
Packit Service 9402ce
    char *saveptr;
Packit Service 9402ce
    char *driver_dir;
Packit Service 9402ce
    
Packit Service 9402ce
    if (geteuid() == getuid())
Packit Service 9402ce
        /* don't allow setuid apps to use LIBVA_DRIVERS_PATH */
Packit Service 9402ce
        search_path = getenv("LIBVA_DRIVERS_PATH");
Packit Service 9402ce
    if (!search_path)
Packit Service 9402ce
        search_path = VA_DRIVERS_PATH;
Packit Service 9402ce
Packit Service 9402ce
    search_path = strdup((const char *)search_path);
Packit Service 9402ce
    if (!search_path) {
Packit Service 9402ce
         va_errorMessage(dpy, "%s L%d Out of memory\n",
Packit Service 9402ce
                            __FUNCTION__, __LINE__);
Packit Service 9402ce
         return VA_STATUS_ERROR_ALLOCATION_FAILED;
Packit Service 9402ce
    }
Packit Service 9402ce
    driver_dir = strtok_r(search_path, ":", &saveptr);
Packit Service 9402ce
    while (driver_dir) {
Packit Service 9402ce
        void *handle = NULL;
Packit Service 9402ce
        char *driver_path = va_getDriverPath(driver_dir, driver_name);
Packit Service 9402ce
        if (!driver_path) {
Packit Service 9402ce
            va_errorMessage(dpy, "%s L%d Out of memory\n",
Packit Service 9402ce
                            __FUNCTION__, __LINE__);
Packit Service 9402ce
            free(search_path);
Packit Service 9402ce
            return VA_STATUS_ERROR_ALLOCATION_FAILED;
Packit Service 9402ce
        }
Packit Service 9402ce
Packit Service 9402ce
        va_infoMessage(dpy, "Trying to open %s\n", driver_path);
Packit Service 9402ce
#ifndef ANDROID
Packit Service 9402ce
        handle = dlopen( driver_path, RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE );
Packit Service 9402ce
#else
Packit Service 9402ce
        handle = dlopen( driver_path, RTLD_NOW| RTLD_GLOBAL);
Packit Service 9402ce
#endif
Packit Service 9402ce
        if (!handle) {
Packit Service 9402ce
            /* Don't give errors for non-existing files */
Packit Service 9402ce
            if (0 == access( driver_path, F_OK))
Packit Service 9402ce
                va_errorMessage(dpy, "dlopen of %s failed: %s\n", driver_path, dlerror());
Packit Service 9402ce
        } else {
Packit Service 9402ce
            VADriverInit init_func = NULL;
Packit Service 9402ce
            char init_func_s[256];
Packit Service 9402ce
            int i;
Packit Service 9402ce
Packit Service 9402ce
            static const struct {
Packit Service 9402ce
                int major;
Packit Service 9402ce
                int minor;
Packit Service 9402ce
            } compatible_versions[] = {
Packit Service 9402ce
                { VA_MAJOR_VERSION, VA_MINOR_VERSION },
Packit Service 9402ce
                { VA_MAJOR_VERSION, 4 },
Packit Service 9402ce
                { VA_MAJOR_VERSION, 3 },
Packit Service 9402ce
                { VA_MAJOR_VERSION, 2 },
Packit Service 9402ce
                { VA_MAJOR_VERSION, 1 },
Packit Service 9402ce
                { VA_MAJOR_VERSION, 0 },
Packit Service 9402ce
                { -1, -1}
Packit Service 9402ce
            };
Packit Service 9402ce
Packit Service 9402ce
            for (i = 0; compatible_versions[i].major >= 0; i++) {
Packit Service 9402ce
                if (va_getDriverInitName(init_func_s, sizeof(init_func_s),
Packit Service 9402ce
                                         compatible_versions[i].major,
Packit Service 9402ce
                                         compatible_versions[i].minor)) {
Packit Service 9402ce
                    init_func = (VADriverInit)dlsym(handle, init_func_s);
Packit Service 9402ce
                    if (init_func) {
Packit Service 9402ce
                        va_infoMessage(dpy, "Found init function %s\n", init_func_s);
Packit Service 9402ce
                        break;
Packit Service 9402ce
                    }
Packit Service 9402ce
                }
Packit Service 9402ce
            }
Packit Service 9402ce
Packit Service 9402ce
            if (compatible_versions[i].major < 0) {
Packit Service 9402ce
                va_errorMessage(dpy, "%s has no function %s\n",
Packit Service 9402ce
                                driver_path, init_func_s);
Packit Service 9402ce
                dlclose(handle);
Packit Service 9402ce
            } else {
Packit Service 9402ce
                struct VADriverVTable *vtable = ctx->vtable;
Packit Service 9402ce
                struct VADriverVTableVPP *vtable_vpp = ctx->vtable_vpp;
Packit Service 9402ce
Packit Service 9402ce
                vaStatus = VA_STATUS_SUCCESS;
Packit Service 9402ce
                if (!vtable) {
Packit Service 9402ce
                    vtable = calloc(1, sizeof(*vtable));
Packit Service 9402ce
                    if (!vtable)
Packit Service 9402ce
                        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
Packit Service 9402ce
                }
Packit Service 9402ce
                ctx->vtable = vtable;
Packit Service 9402ce
Packit Service 9402ce
                if (!vtable_vpp) {
Packit Service 9402ce
                    vtable_vpp = calloc(1, sizeof(*vtable_vpp));
Packit Service 9402ce
                    if (vtable_vpp)
Packit Service 9402ce
                        vtable_vpp->version = VA_DRIVER_VTABLE_VPP_VERSION;
Packit Service 9402ce
                    else
Packit Service 9402ce
                        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
Packit Service 9402ce
                }
Packit Service 9402ce
                ctx->vtable_vpp = vtable_vpp;
Packit Service 9402ce
Packit Service 9402ce
                if (init_func && VA_STATUS_SUCCESS == vaStatus)
Packit Service 9402ce
                    vaStatus = (*init_func)(ctx);
Packit Service 9402ce
Packit Service 9402ce
                if (VA_STATUS_SUCCESS == vaStatus) {
Packit Service 9402ce
                    CHECK_MAXIMUM(vaStatus, ctx, profiles);
Packit Service 9402ce
                    CHECK_MAXIMUM(vaStatus, ctx, entrypoints);
Packit Service 9402ce
                    CHECK_MAXIMUM(vaStatus, ctx, attributes);
Packit Service 9402ce
                    CHECK_MAXIMUM(vaStatus, ctx, image_formats);
Packit Service 9402ce
                    CHECK_MAXIMUM(vaStatus, ctx, subpic_formats);
Packit Service 9402ce
                    CHECK_STRING(vaStatus, ctx, vendor);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, Terminate);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, QueryConfigProfiles);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, QueryConfigEntrypoints);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, QueryConfigAttributes);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, CreateConfig);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, DestroyConfig);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, GetConfigAttributes);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, CreateSurfaces);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, DestroySurfaces);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, CreateContext);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, DestroyContext);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, CreateBuffer);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, BufferSetNumElements);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, MapBuffer);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, UnmapBuffer);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, DestroyBuffer);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, BeginPicture);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, RenderPicture);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, EndPicture);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, SyncSurface);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, QuerySurfaceStatus);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, PutSurface);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, QueryImageFormats);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, CreateImage);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, DeriveImage);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, DestroyImage);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, SetImagePalette);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, GetImage);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, PutImage);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, QuerySubpictureFormats);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, CreateSubpicture);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, DestroySubpicture);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, SetSubpictureImage);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, SetSubpictureChromakey);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, SetSubpictureGlobalAlpha);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, AssociateSubpicture);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, DeassociateSubpicture);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, QueryDisplayAttributes);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, GetDisplayAttributes);
Packit Service 9402ce
                    CHECK_VTABLE(vaStatus, ctx, SetDisplayAttributes);
Packit Service 9402ce
                }
Packit Service 9402ce
                if (VA_STATUS_SUCCESS != vaStatus) {
Packit Service 9402ce
                    va_errorMessage(dpy, "%s init failed\n", driver_path);
Packit Service 9402ce
                    dlclose(handle);
Packit Service 9402ce
                }
Packit Service 9402ce
                if (VA_STATUS_SUCCESS == vaStatus)
Packit Service 9402ce
                    ctx->handle = handle;
Packit Service 9402ce
                free(driver_path);
Packit Service 9402ce
                break;
Packit Service 9402ce
            }
Packit Service 9402ce
        }
Packit Service 9402ce
        free(driver_path);
Packit Service 9402ce
        
Packit Service 9402ce
        driver_dir = strtok_r(NULL, ":", &saveptr);
Packit Service 9402ce
    }
Packit Service 9402ce
    
Packit Service 9402ce
    free(search_path);    
Packit Service 9402ce
    
Packit Service 9402ce
    return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAPrivFunc vaGetLibFunc(VADisplay dpy, const char *func)
Packit Service 9402ce
{
Packit Service 9402ce
    VADriverContextP ctx;
Packit Service 9402ce
    if (!vaDisplayIsValid(dpy))
Packit Service 9402ce
        return NULL;
Packit Service 9402ce
    ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
    if (NULL == ctx->handle)
Packit Service 9402ce
        return NULL;
Packit Service 9402ce
        
Packit Service 9402ce
    return (VAPrivFunc) dlsym(ctx->handle, func);
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
Packit Service 9402ce
/*
Packit Service 9402ce
 * Returns a short english description of error_status
Packit Service 9402ce
 */
Packit Service 9402ce
const char *vaErrorStr(VAStatus error_status)
Packit Service 9402ce
{
Packit Service 9402ce
    switch(error_status) {
Packit Service 9402ce
        case VA_STATUS_SUCCESS:
Packit Service 9402ce
            return "success (no error)";
Packit Service 9402ce
        case VA_STATUS_ERROR_OPERATION_FAILED:
Packit Service 9402ce
            return "operation failed";
Packit Service 9402ce
        case VA_STATUS_ERROR_ALLOCATION_FAILED:
Packit Service 9402ce
            return "resource allocation failed";
Packit Service 9402ce
        case VA_STATUS_ERROR_INVALID_DISPLAY:
Packit Service 9402ce
            return "invalid VADisplay";
Packit Service 9402ce
        case VA_STATUS_ERROR_INVALID_CONFIG:
Packit Service 9402ce
            return "invalid VAConfigID";
Packit Service 9402ce
        case VA_STATUS_ERROR_INVALID_CONTEXT:
Packit Service 9402ce
            return "invalid VAContextID";
Packit Service 9402ce
        case VA_STATUS_ERROR_INVALID_SURFACE:
Packit Service 9402ce
            return "invalid VASurfaceID";
Packit Service 9402ce
        case VA_STATUS_ERROR_INVALID_BUFFER:
Packit Service 9402ce
            return "invalid VABufferID";
Packit Service 9402ce
        case VA_STATUS_ERROR_INVALID_IMAGE:
Packit Service 9402ce
            return "invalid VAImageID";
Packit Service 9402ce
        case VA_STATUS_ERROR_INVALID_SUBPICTURE:
Packit Service 9402ce
            return "invalid VASubpictureID";
Packit Service 9402ce
        case VA_STATUS_ERROR_ATTR_NOT_SUPPORTED:
Packit Service 9402ce
            return "attribute not supported";
Packit Service 9402ce
        case VA_STATUS_ERROR_MAX_NUM_EXCEEDED:
Packit Service 9402ce
            return "list argument exceeds maximum number";
Packit Service 9402ce
        case VA_STATUS_ERROR_UNSUPPORTED_PROFILE:
Packit Service 9402ce
            return "the requested VAProfile is not supported";
Packit Service 9402ce
        case VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT:
Packit Service 9402ce
            return "the requested VAEntryPoint is not supported";
Packit Service 9402ce
        case VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT:
Packit Service 9402ce
            return "the requested RT Format is not supported";
Packit Service 9402ce
        case VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE:
Packit Service 9402ce
            return "the requested VABufferType is not supported";
Packit Service 9402ce
        case VA_STATUS_ERROR_SURFACE_BUSY:
Packit Service 9402ce
            return "surface is in use";
Packit Service 9402ce
        case VA_STATUS_ERROR_FLAG_NOT_SUPPORTED:
Packit Service 9402ce
            return "flag not supported";
Packit Service 9402ce
        case VA_STATUS_ERROR_INVALID_PARAMETER:
Packit Service 9402ce
            return "invalid parameter";
Packit Service 9402ce
        case VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED:
Packit Service 9402ce
            return "resolution not supported";
Packit Service 9402ce
        case VA_STATUS_ERROR_UNIMPLEMENTED:
Packit Service 9402ce
            return "the requested function is not implemented";
Packit Service 9402ce
        case VA_STATUS_ERROR_SURFACE_IN_DISPLAYING:
Packit Service 9402ce
            return "surface is in displaying (may by overlay)" ;
Packit Service 9402ce
        case VA_STATUS_ERROR_INVALID_IMAGE_FORMAT:
Packit Service 9402ce
            return "invalid VAImageFormat";
Packit Service 9402ce
        case VA_STATUS_ERROR_DECODING_ERROR:
Packit Service 9402ce
            return "internal decoding error";
Packit Service 9402ce
        case VA_STATUS_ERROR_ENCODING_ERROR:
Packit Service 9402ce
            return "internal encoding error";
Packit Service 9402ce
        case VA_STATUS_ERROR_INVALID_VALUE:
Packit Service 9402ce
            return "an invalid/unsupported value was supplied";
Packit Service 9402ce
        case VA_STATUS_ERROR_UNSUPPORTED_FILTER:
Packit Service 9402ce
            return "the requested filter is not supported";
Packit Service 9402ce
        case VA_STATUS_ERROR_INVALID_FILTER_CHAIN:
Packit Service 9402ce
            return "an invalid filter chain was supplied";
Packit Service 9402ce
        case VA_STATUS_ERROR_HW_BUSY:
Packit Service 9402ce
            return "HW busy now";
Packit Service 9402ce
        case VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE:
Packit Service 9402ce
            return "an unsupported memory type was supplied";
Packit Service 9402ce
        case VA_STATUS_ERROR_NOT_ENOUGH_BUFFER:
Packit Service 9402ce
            return "allocated memory size is not enough for input or output";
Packit Service 9402ce
        case VA_STATUS_ERROR_UNKNOWN:
Packit Service 9402ce
            return "unknown libva error";
Packit Service 9402ce
    }
Packit Service 9402ce
    return "unknown libva error / description missing";
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaSetDriverName(
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    char *driver_name
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
    VADriverContextP ctx;
Packit Service 9402ce
    VAStatus vaStatus = VA_STATUS_SUCCESS;
Packit Service 9402ce
    char *override_driver_name = NULL;
Packit Service 9402ce
    ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
    if (strlen(driver_name) == 0 || strlen(driver_name) >=256) {
Packit Service 9402ce
        vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
Packit Service 9402ce
        va_errorMessage(dpy, "vaSetDriverName returns %s\n",
Packit Service 9402ce
                         vaErrorStr(vaStatus));
Packit Service 9402ce
        return vaStatus;
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
    override_driver_name = strdup(driver_name);
Packit Service 9402ce
    if (!override_driver_name) {
Packit Service 9402ce
        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
Packit Service 9402ce
        va_errorMessage(dpy, "vaSetDriverName returns %s. Out of Memory\n",
Packit Service 9402ce
                         vaErrorStr(vaStatus));
Packit Service 9402ce
        return vaStatus;
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
    ctx->override_driver_name = override_driver_name;
Packit Service 9402ce
    return VA_STATUS_SUCCESS;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaInitialize (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    int *major_version,	 /* out */
Packit Service 9402ce
    int *minor_version 	 /* out */
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
    const char *driver_name_env = NULL;
Packit Service 9402ce
    char *driver_name = NULL;
Packit Service 9402ce
    VAStatus vaStatus;
Packit Service 9402ce
    VADriverContextP ctx;
Packit Service 9402ce
Packit Service 9402ce
    CHECK_DISPLAY(dpy);
Packit Service 9402ce
Packit Service 9402ce
    ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
    va_TraceInit(dpy);
Packit Service 9402ce
Packit Service 9402ce
    va_FoolInit(dpy);
Packit Service 9402ce
Packit Service 9402ce
    va_MessagingInit();
Packit Service 9402ce
Packit Service 9402ce
    va_infoMessage(dpy, "VA-API version %s\n", VA_VERSION_S);
Packit Service 9402ce
Packit Service 9402ce
    vaStatus = va_getDriverName(dpy, &driver_name);
Packit Service 9402ce
Packit Service 9402ce
    if (!ctx->override_driver_name) {
Packit Service 9402ce
        va_infoMessage(dpy, "va_getDriverName() returns %d\n", vaStatus);
Packit Service 9402ce
Packit Service 9402ce
        driver_name_env = getenv("LIBVA_DRIVER_NAME");
Packit Service 9402ce
    } else if (vaStatus == VA_STATUS_SUCCESS) {
Packit Service 9402ce
        if (driver_name)
Packit Service 9402ce
            free(driver_name);
Packit Service 9402ce
Packit Service 9402ce
        driver_name = strdup(ctx->override_driver_name);
Packit Service 9402ce
        if (!driver_name) {
Packit Service 9402ce
            vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
Packit Service 9402ce
            va_errorMessage(dpy, "vaInitialize() failed with %s, out of memory\n",
Packit Service 9402ce
                        vaErrorStr(vaStatus));
Packit Service 9402ce
            return vaStatus;
Packit Service 9402ce
        }
Packit Service 9402ce
        va_infoMessage(dpy, "User requested driver '%s'\n", driver_name);
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
    if (driver_name_env && (geteuid() == getuid())) {
Packit Service 9402ce
        /* Don't allow setuid apps to use LIBVA_DRIVER_NAME */
Packit Service 9402ce
        if (driver_name) /* memory is allocated in va_getDriverName */
Packit Service 9402ce
            free(driver_name);
Packit Service 9402ce
        
Packit Service 9402ce
        driver_name = strdup(driver_name_env);
Packit Service 9402ce
        vaStatus = VA_STATUS_SUCCESS;
Packit Service 9402ce
        va_infoMessage(dpy, "User requested driver '%s'\n", driver_name);
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
    if ((VA_STATUS_SUCCESS == vaStatus) && (driver_name != NULL)) {
Packit Service 9402ce
        vaStatus = va_openDriver(dpy, driver_name);
Packit Service 9402ce
        va_infoMessage(dpy, "va_openDriver() returns %d\n", vaStatus);
Packit Service 9402ce
Packit Service 9402ce
        *major_version = VA_MAJOR_VERSION;
Packit Service 9402ce
        *minor_version = VA_MINOR_VERSION;
Packit Service 9402ce
    } else
Packit Service 9402ce
        va_errorMessage(dpy, "va_getDriverName() failed with %s,driver_name=%s\n",
Packit Service 9402ce
                        vaErrorStr(vaStatus), driver_name);
Packit Service 9402ce
Packit Service 9402ce
    if (driver_name)
Packit Service 9402ce
        free(driver_name);
Packit Service 9402ce
    
Packit Service 9402ce
    VA_TRACE_LOG(va_TraceInitialize, dpy, major_version, minor_version);
Packit Service 9402ce
    VA_TRACE_RET(dpy, vaStatus);
Packit Service 9402ce
    return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
Packit Service 9402ce
/*
Packit Service 9402ce
 * After this call, all library internal resources will be cleaned up
Packit Service 9402ce
 */ 
Packit Service 9402ce
VAStatus vaTerminate (
Packit Service 9402ce
    VADisplay dpy
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VAStatus vaStatus = VA_STATUS_SUCCESS;
Packit Service 9402ce
  VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
Packit Service 9402ce
  VADriverContextP old_ctx;
Packit Service 9402ce
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  old_ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  if (old_ctx->handle) {
Packit Service 9402ce
      vaStatus = old_ctx->vtable->vaTerminate(old_ctx);
Packit Service 9402ce
      dlclose(old_ctx->handle);
Packit Service 9402ce
      old_ctx->handle = NULL;
Packit Service 9402ce
  }
Packit Service 9402ce
  free(old_ctx->vtable);
Packit Service 9402ce
  old_ctx->vtable = NULL;
Packit Service 9402ce
  free(old_ctx->vtable_vpp);
Packit Service 9402ce
  old_ctx->vtable_vpp = NULL;
Packit Service 9402ce
Packit Service 9402ce
  if (old_ctx->override_driver_name) {
Packit Service 9402ce
      free(old_ctx->override_driver_name);
Packit Service 9402ce
      old_ctx->override_driver_name = NULL;
Packit Service 9402ce
  }
Packit Service 9402ce
Packit Service 9402ce
  VA_TRACE_LOG(va_TraceTerminate, dpy);
Packit Service 9402ce
  VA_TRACE_RET(dpy, vaStatus);
Packit Service 9402ce
Packit Service 9402ce
  va_TraceEnd(dpy);
Packit Service 9402ce
Packit Service 9402ce
  va_FoolEnd(dpy);
Packit Service 9402ce
Packit Service 9402ce
  if (VA_STATUS_SUCCESS == vaStatus)
Packit Service 9402ce
      pDisplayContext->vaDestroy(pDisplayContext);
Packit Service 9402ce
Packit Service 9402ce
  return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/*
Packit Service 9402ce
 * vaQueryVendorString returns a pointer to a zero-terminated string
Packit Service 9402ce
 * describing some aspects of the VA implemenation on a specific
Packit Service 9402ce
 * hardware accelerator. The format of the returned string is:
Packit Service 9402ce
 * <vendorname>-<major_version>-<minor_version>-<addtional_info>
Packit Service 9402ce
 * e.g. for the Intel GMA500 implementation, an example would be:
Packit Service 9402ce
 * "IntelGMA500-1.0-0.2-patch3
Packit Service 9402ce
 */
Packit Service 9402ce
const char *vaQueryVendorString (
Packit Service 9402ce
    VADisplay dpy
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  if (!vaDisplayIsValid(dpy))
Packit Service 9402ce
      return NULL;
Packit Service 9402ce
  
Packit Service 9402ce
  return CTX(dpy)->str_vendor;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
Packit Service 9402ce
/* Get maximum number of profiles supported by the implementation */
Packit Service 9402ce
int vaMaxNumProfiles (
Packit Service 9402ce
    VADisplay dpy
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  if (!vaDisplayIsValid(dpy))
Packit Service 9402ce
      return 0;
Packit Service 9402ce
  
Packit Service 9402ce
  return CTX(dpy)->max_profiles;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/* Get maximum number of entrypoints supported by the implementation */
Packit Service 9402ce
int vaMaxNumEntrypoints (
Packit Service 9402ce
    VADisplay dpy
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  if (!vaDisplayIsValid(dpy))
Packit Service 9402ce
      return 0;
Packit Service 9402ce
  
Packit Service 9402ce
  return CTX(dpy)->max_entrypoints;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
Packit Service 9402ce
/* Get maximum number of attributs supported by the implementation */
Packit Service 9402ce
int vaMaxNumConfigAttributes (
Packit Service 9402ce
    VADisplay dpy
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  if (!vaDisplayIsValid(dpy))
Packit Service 9402ce
      return 0;
Packit Service 9402ce
  
Packit Service 9402ce
  return CTX(dpy)->max_attributes;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaQueryConfigEntrypoints (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAProfile profile,
Packit Service 9402ce
    VAEntrypoint *entrypoints,	/* out */
Packit Service 9402ce
    int *num_entrypoints	/* out */
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus vaStatus = VA_STATUS_SUCCESS;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  vaStatus = ctx->vtable->vaQueryConfigEntrypoints ( ctx, profile, entrypoints, num_entrypoints);
Packit Service 9402ce
  VA_TRACE_RET(dpy, vaStatus);
Packit Service 9402ce
  return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaGetConfigAttributes (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAProfile profile,
Packit Service 9402ce
    VAEntrypoint entrypoint,
Packit Service 9402ce
    VAConfigAttrib *attrib_list, /* in/out */
Packit Service 9402ce
    int num_attribs
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus vaStatus = VA_STATUS_SUCCESS;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  vaStatus = ctx->vtable->vaGetConfigAttributes ( ctx, profile, entrypoint, attrib_list, num_attribs );
Packit Service 9402ce
  VA_TRACE_RET(dpy, vaStatus);
Packit Service 9402ce
  return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaQueryConfigProfiles (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAProfile *profile_list,	/* out */
Packit Service 9402ce
    int *num_profiles		/* out */
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus vaStatus = VA_STATUS_SUCCESS;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  vaStatus =  ctx->vtable->vaQueryConfigProfiles ( ctx, profile_list, num_profiles );
Packit Service 9402ce
  VA_TRACE_RET(dpy, vaStatus);
Packit Service 9402ce
  return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaCreateConfig (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAProfile profile, 
Packit Service 9402ce
    VAEntrypoint entrypoint, 
Packit Service 9402ce
    VAConfigAttrib *attrib_list,
Packit Service 9402ce
    int num_attribs,
Packit Service 9402ce
    VAConfigID *config_id /* out */
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus vaStatus = VA_STATUS_SUCCESS;
Packit Service 9402ce
  
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  vaStatus = ctx->vtable->vaCreateConfig ( ctx, profile, entrypoint, attrib_list, num_attribs, config_id );
Packit Service 9402ce
Packit Service 9402ce
  /* record the current entrypoint for further trace/fool determination */
Packit Service 9402ce
  VA_TRACE_ALL(va_TraceCreateConfig, dpy, profile, entrypoint, attrib_list, num_attribs, config_id);
Packit Service 9402ce
  VA_FOOL_FUNC(va_FoolCreateConfig, dpy, profile, entrypoint, attrib_list, num_attribs, config_id);
Packit Service 9402ce
  VA_TRACE_RET(dpy, vaStatus); 
Packit Service 9402ce
  return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaDestroyConfig (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAConfigID config_id
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus vaStatus = VA_STATUS_SUCCESS;
Packit Service 9402ce
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  vaStatus = ctx->vtable->vaDestroyConfig ( ctx, config_id );
Packit Service 9402ce
Packit Service 9402ce
  VA_TRACE_ALL(va_TraceDestroyConfig, dpy, config_id);
Packit Service 9402ce
  VA_TRACE_RET(dpy, vaStatus);
Packit Service 9402ce
Packit Service 9402ce
  return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaQueryConfigAttributes (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAConfigID config_id, 
Packit Service 9402ce
    VAProfile *profile, 	/* out */
Packit Service 9402ce
    VAEntrypoint *entrypoint, 	/* out */
Packit Service 9402ce
    VAConfigAttrib *attrib_list,/* out */
Packit Service 9402ce
    int *num_attribs		/* out */
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus vaStatus = VA_STATUS_SUCCESS;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  vaStatus = ctx->vtable->vaQueryConfigAttributes( ctx, config_id, profile, entrypoint, attrib_list, num_attribs);
Packit Service 9402ce
  VA_TRACE_RET(dpy, vaStatus);
Packit Service 9402ce
  return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaQueryProcessingRate (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAConfigID config_id,
Packit Service 9402ce
    VAProcessingRateParameter *proc_buf,
Packit Service 9402ce
    unsigned int *processing_rate	/* out */
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus vaStatus = VA_STATUS_SUCCESS;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
  if(!ctx->vtable->vaQueryProcessingRate)
Packit Service 9402ce
      vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
Packit Service 9402ce
  else
Packit Service 9402ce
      vaStatus = ctx->vtable->vaQueryProcessingRate( ctx, config_id, proc_buf, processing_rate);
Packit Service 9402ce
  VA_TRACE_RET(dpy, vaStatus);
Packit Service 9402ce
  return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/* XXX: this is a slow implementation that will be removed */
Packit Service 9402ce
static VAStatus
Packit Service 9402ce
va_impl_query_surface_attributes(
Packit Service 9402ce
    VADriverContextP    ctx,
Packit Service 9402ce
    VAConfigID          config,
Packit Service 9402ce
    VASurfaceAttrib    *out_attribs,
Packit Service 9402ce
    unsigned int       *out_num_attribs_ptr
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
    VASurfaceAttrib *attribs = NULL;
Packit Service 9402ce
    unsigned int num_attribs, n;
Packit Service 9402ce
    VASurfaceAttrib *out_attrib;
Packit Service 9402ce
    unsigned int out_num_attribs;
Packit Service 9402ce
    VAImageFormat *image_formats = NULL;
Packit Service 9402ce
    int num_image_formats, i;
Packit Service 9402ce
    VAStatus va_status;
Packit Service 9402ce
Packit Service 9402ce
    /* List of surface attributes to query */
Packit Service 9402ce
    struct va_surface_attrib_map {
Packit Service 9402ce
        VASurfaceAttribType type;
Packit Service 9402ce
        VAGenericValueType  value_type;
Packit Service 9402ce
    };
Packit Service 9402ce
    static const struct va_surface_attrib_map attribs_map[] = {
Packit Service 9402ce
        { VASurfaceAttribMinWidth,      VAGenericValueTypeInteger },
Packit Service 9402ce
        { VASurfaceAttribMaxWidth,      VAGenericValueTypeInteger },
Packit Service 9402ce
        { VASurfaceAttribMinHeight,     VAGenericValueTypeInteger },
Packit Service 9402ce
        { VASurfaceAttribMaxHeight,     VAGenericValueTypeInteger },
Packit Service 9402ce
        { VASurfaceAttribMemoryType,    VAGenericValueTypeInteger },
Packit Service 9402ce
        { VASurfaceAttribNone,          VAGenericValueTypeInteger }
Packit Service 9402ce
    };
Packit Service 9402ce
Packit Service 9402ce
    if (!out_attribs || !out_num_attribs_ptr)
Packit Service 9402ce
        return VA_STATUS_ERROR_INVALID_PARAMETER;
Packit Service 9402ce
    if (!ctx->vtable->vaGetSurfaceAttributes)
Packit Service 9402ce
        return VA_STATUS_ERROR_UNIMPLEMENTED;
Packit Service 9402ce
Packit Service 9402ce
    num_image_formats = ctx->max_image_formats;
Packit Service 9402ce
    image_formats = malloc(num_image_formats * sizeof(*image_formats));
Packit Service 9402ce
    if (!image_formats) {
Packit Service 9402ce
        va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
Packit Service 9402ce
        goto end;
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
    va_status = ctx->vtable->vaQueryImageFormats(
Packit Service 9402ce
        ctx, image_formats, &num_image_formats);
Packit Service 9402ce
    if (va_status != VA_STATUS_SUCCESS)
Packit Service 9402ce
        goto end;
Packit Service 9402ce
Packit Service 9402ce
    num_attribs = VASurfaceAttribCount + num_image_formats;
Packit Service 9402ce
    attribs = malloc(num_attribs * sizeof(*attribs));
Packit Service 9402ce
    if (!attribs) {
Packit Service 9402ce
        va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
Packit Service 9402ce
        goto end;
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
    /* Initialize with base surface attributes, except pixel-formats */
Packit Service 9402ce
    for (n = 0; attribs_map[n].type != VASurfaceAttribNone; n++) {
Packit Service 9402ce
        VASurfaceAttrib * const attrib = &attribs[n];
Packit Service 9402ce
        attrib->type = attribs_map[n].type;
Packit Service 9402ce
        attrib->flags = VA_SURFACE_ATTRIB_GETTABLE;
Packit Service 9402ce
        attrib->value.type = attribs_map[n].value_type;
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
    /* Append image formats */
Packit Service 9402ce
    for (i = 0; i < num_image_formats; i++) {
Packit Service 9402ce
        VASurfaceAttrib * const attrib = &attribs[n];
Packit Service 9402ce
        attrib->type = VASurfaceAttribPixelFormat;
Packit Service 9402ce
        attrib->flags = VA_SURFACE_ATTRIB_GETTABLE|VA_SURFACE_ATTRIB_SETTABLE;
Packit Service 9402ce
        attrib->value.type = VAGenericValueTypeInteger;
Packit Service 9402ce
        attrib->value.value.i = image_formats[i].fourcc;
Packit Service 9402ce
        if (++n == num_attribs) {
Packit Service 9402ce
            va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
Packit Service 9402ce
            goto end;
Packit Service 9402ce
        }
Packit Service 9402ce
    }
Packit Service 9402ce
    num_attribs = n;
Packit Service 9402ce
Packit Service 9402ce
    va_status = ctx->vtable->vaGetSurfaceAttributes(
Packit Service 9402ce
        ctx, config, attribs, num_attribs);
Packit Service 9402ce
    if (va_status != VA_STATUS_SUCCESS)
Packit Service 9402ce
        goto end;
Packit Service 9402ce
Packit Service 9402ce
    /* Remove invalid entries */
Packit Service 9402ce
    out_num_attribs = 0;
Packit Service 9402ce
    for (n = 0; n < num_attribs; n++) {
Packit Service 9402ce
        VASurfaceAttrib * const attrib = &attribs[n];
Packit Service 9402ce
Packit Service 9402ce
        if (attrib->flags == VA_SURFACE_ATTRIB_NOT_SUPPORTED)
Packit Service 9402ce
            continue;
Packit Service 9402ce
Packit Service 9402ce
        // Accept all surface attributes that are not pixel-formats
Packit Service 9402ce
        if (attrib->type != VASurfaceAttribPixelFormat) {
Packit Service 9402ce
            out_num_attribs++;
Packit Service 9402ce
            continue;
Packit Service 9402ce
        }
Packit Service 9402ce
Packit Service 9402ce
        // Drop invalid pixel-format attribute
Packit Service 9402ce
        if (!attrib->value.value.i) {
Packit Service 9402ce
            attrib->flags = VA_SURFACE_ATTRIB_NOT_SUPPORTED;
Packit Service 9402ce
            continue;
Packit Service 9402ce
        }
Packit Service 9402ce
Packit Service 9402ce
        // Check for duplicates
Packit Service 9402ce
        int is_duplicate = 0;
Packit Service 9402ce
        for (i = n - 1; i >= 0 && !is_duplicate; i--) {
Packit Service 9402ce
            const VASurfaceAttrib * const prev_attrib = &attribs[i];
Packit Service 9402ce
            if (prev_attrib->type != VASurfaceAttribPixelFormat)
Packit Service 9402ce
                break;
Packit Service 9402ce
            is_duplicate = prev_attrib->value.value.i == attrib->value.value.i;
Packit Service 9402ce
        }
Packit Service 9402ce
        if (is_duplicate)
Packit Service 9402ce
            attrib->flags = VA_SURFACE_ATTRIB_NOT_SUPPORTED;
Packit Service 9402ce
        else
Packit Service 9402ce
            out_num_attribs++;
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
    if (*out_num_attribs_ptr < out_num_attribs) {
Packit Service 9402ce
        *out_num_attribs_ptr = out_num_attribs;
Packit Service 9402ce
        va_status = VA_STATUS_ERROR_MAX_NUM_EXCEEDED;
Packit Service 9402ce
        goto end;
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
    out_attrib = out_attribs;
Packit Service 9402ce
    for (n = 0; n < num_attribs; n++) {
Packit Service 9402ce
        const VASurfaceAttrib * const attrib = &attribs[n];
Packit Service 9402ce
        if (attrib->flags == VA_SURFACE_ATTRIB_NOT_SUPPORTED)
Packit Service 9402ce
            continue;
Packit Service 9402ce
        *out_attrib++ = *attrib;
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
end:
Packit Service 9402ce
    free(attribs);
Packit Service 9402ce
    free(image_formats);
Packit Service 9402ce
    return va_status;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus
Packit Service 9402ce
vaQuerySurfaceAttributes(
Packit Service 9402ce
    VADisplay           dpy,
Packit Service 9402ce
    VAConfigID          config,
Packit Service 9402ce
    VASurfaceAttrib    *attrib_list,
Packit Service 9402ce
    unsigned int       *num_attribs
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
    VADriverContextP ctx;
Packit Service 9402ce
    VAStatus vaStatus;
Packit Service 9402ce
Packit Service 9402ce
    CHECK_DISPLAY(dpy);
Packit Service 9402ce
    ctx = CTX(dpy);
Packit Service 9402ce
    if (!ctx)
Packit Service 9402ce
        return VA_STATUS_ERROR_INVALID_DISPLAY;
Packit Service 9402ce
Packit Service 9402ce
    if (!ctx->vtable->vaQuerySurfaceAttributes)
Packit Service 9402ce
        vaStatus = va_impl_query_surface_attributes(ctx, config,
Packit Service 9402ce
                                                    attrib_list, num_attribs);
Packit Service 9402ce
    else
Packit Service 9402ce
        vaStatus = ctx->vtable->vaQuerySurfaceAttributes(ctx, config,
Packit Service 9402ce
                                                         attrib_list, num_attribs);
Packit Service 9402ce
Packit Service 9402ce
    VA_TRACE_LOG(va_TraceQuerySurfaceAttributes, dpy, config, attrib_list, num_attribs);
Packit Service 9402ce
    VA_TRACE_RET(dpy, vaStatus); 
Packit Service 9402ce
Packit Service 9402ce
    return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus
Packit Service 9402ce
vaCreateSurfaces(
Packit Service 9402ce
    VADisplay           dpy,
Packit Service 9402ce
    unsigned int        format,
Packit Service 9402ce
    unsigned int        width,
Packit Service 9402ce
    unsigned int        height,
Packit Service 9402ce
    VASurfaceID        *surfaces,
Packit Service 9402ce
    unsigned int        num_surfaces,
Packit Service 9402ce
    VASurfaceAttrib    *attrib_list,
Packit Service 9402ce
    unsigned int        num_attribs
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
    VADriverContextP ctx;
Packit Service 9402ce
    VAStatus vaStatus;
Packit Service 9402ce
Packit Service 9402ce
    CHECK_DISPLAY(dpy);
Packit Service 9402ce
    ctx = CTX(dpy);
Packit Service 9402ce
    if (!ctx)
Packit Service 9402ce
        return VA_STATUS_ERROR_INVALID_DISPLAY;
Packit Service 9402ce
Packit Service 9402ce
    if (ctx->vtable->vaCreateSurfaces2)
Packit Service 9402ce
        vaStatus = ctx->vtable->vaCreateSurfaces2(ctx, format, width, height,
Packit Service 9402ce
                                              surfaces, num_surfaces,
Packit Service 9402ce
                                              attrib_list, num_attribs);
Packit Service 9402ce
    else if (attrib_list && num_attribs > 0)
Packit Service 9402ce
        vaStatus = VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
Packit Service 9402ce
    else
Packit Service 9402ce
        vaStatus = ctx->vtable->vaCreateSurfaces(ctx, width, height, format,
Packit Service 9402ce
                                                 num_surfaces, surfaces);
Packit Service 9402ce
    VA_TRACE_LOG(va_TraceCreateSurfaces,
Packit Service 9402ce
                 dpy, width, height, format, num_surfaces, surfaces,
Packit Service 9402ce
                 attrib_list, num_attribs);
Packit Service 9402ce
    VA_TRACE_RET(dpy, vaStatus); 
Packit Service 9402ce
Packit Service 9402ce
    return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaDestroySurfaces (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VASurfaceID *surface_list,
Packit Service 9402ce
    int num_surfaces
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus vaStatus;
Packit Service 9402ce
  
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  VA_TRACE_LOG(va_TraceDestroySurfaces,
Packit Service 9402ce
               dpy, surface_list, num_surfaces);
Packit Service 9402ce
  
Packit Service 9402ce
  vaStatus = ctx->vtable->vaDestroySurfaces( ctx, surface_list, num_surfaces );
Packit Service 9402ce
  VA_TRACE_RET(dpy, vaStatus); 
Packit Service 9402ce
  
Packit Service 9402ce
  return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaCreateContext (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAConfigID config_id,
Packit Service 9402ce
    int picture_width,
Packit Service 9402ce
    int picture_height,
Packit Service 9402ce
    int flag,
Packit Service 9402ce
    VASurfaceID *render_targets,
Packit Service 9402ce
    int num_render_targets,
Packit Service 9402ce
    VAContextID *context		/* out */
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus vaStatus;
Packit Service 9402ce
  
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  vaStatus = ctx->vtable->vaCreateContext( ctx, config_id, picture_width, picture_height,
Packit Service 9402ce
                                      flag, render_targets, num_render_targets, context );
Packit Service 9402ce
Packit Service 9402ce
  /* keep current encode/decode resoluton */
Packit Service 9402ce
  VA_TRACE_ALL(va_TraceCreateContext, dpy, config_id, picture_width, picture_height, flag, render_targets, num_render_targets, context);
Packit Service 9402ce
  VA_TRACE_RET(dpy, vaStatus); 
Packit Service 9402ce
Packit Service 9402ce
  return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaDestroyContext (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAContextID context
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus vaStatus;
Packit Service 9402ce
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  vaStatus = ctx->vtable->vaDestroyContext( ctx, context );
Packit Service 9402ce
Packit Service 9402ce
  VA_TRACE_ALL(va_TraceDestroyContext, dpy, context);
Packit Service 9402ce
  VA_TRACE_RET(dpy, vaStatus); 
Packit Service 9402ce
Packit Service 9402ce
  return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaCreateMFContext (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAMFContextID *mf_context    /* out */
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
    VADriverContextP ctx;
Packit Service 9402ce
    VAStatus vaStatus;
Packit Service 9402ce
    
Packit Service 9402ce
    CHECK_DISPLAY(dpy);
Packit Service 9402ce
    ctx = CTX(dpy);
Packit Service 9402ce
    if(ctx->vtable->vaCreateMFContext == NULL)
Packit Service 9402ce
        vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
Packit Service 9402ce
    else
Packit Service 9402ce
    {
Packit Service 9402ce
        vaStatus = ctx->vtable->vaCreateMFContext( ctx, mf_context);
Packit Service 9402ce
        VA_TRACE_ALL(va_TraceCreateMFContext, dpy, mf_context);
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
    VA_TRACE_RET(dpy, vaStatus); 
Packit Service 9402ce
    return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaMFAddContext (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAMFContextID mf_context,
Packit Service 9402ce
    VAContextID context
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
    VADriverContextP ctx;
Packit Service 9402ce
    VAStatus vaStatus;
Packit Service 9402ce
Packit Service 9402ce
    CHECK_DISPLAY(dpy);
Packit Service 9402ce
    ctx = CTX(dpy);
Packit Service 9402ce
    
Packit Service 9402ce
    if(ctx->vtable->vaMFAddContext == NULL)
Packit Service 9402ce
        vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
Packit Service 9402ce
    else
Packit Service 9402ce
    {
Packit Service 9402ce
        vaStatus = ctx->vtable->vaMFAddContext( ctx, context, mf_context);
Packit Service 9402ce
        VA_TRACE_ALL(va_TraceMFAddContext, dpy, context, mf_context);
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
    VA_TRACE_RET(dpy, vaStatus); 
Packit Service 9402ce
    return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaMFReleaseContext (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAMFContextID mf_context,
Packit Service 9402ce
    VAContextID context
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
    VADriverContextP ctx;
Packit Service 9402ce
    VAStatus vaStatus;
Packit Service 9402ce
Packit Service 9402ce
    CHECK_DISPLAY(dpy);
Packit Service 9402ce
    ctx = CTX(dpy);
Packit Service 9402ce
    if(ctx->vtable->vaMFReleaseContext == NULL)
Packit Service 9402ce
        vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
Packit Service 9402ce
    else
Packit Service 9402ce
    {
Packit Service 9402ce
        vaStatus = ctx->vtable->vaMFReleaseContext( ctx, context, mf_context);
Packit Service 9402ce
        VA_TRACE_ALL(va_TraceMFReleaseContext, dpy, context, mf_context);
Packit Service 9402ce
    }
Packit Service 9402ce
    VA_TRACE_RET(dpy, vaStatus); 
Packit Service 9402ce
Packit Service 9402ce
    return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaMFSubmit (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAMFContextID mf_context,
Packit Service 9402ce
    VAContextID *contexts,
Packit Service 9402ce
    int num_contexts
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
    VADriverContextP ctx;
Packit Service 9402ce
    VAStatus vaStatus;
Packit Service 9402ce
Packit Service 9402ce
    CHECK_DISPLAY(dpy);
Packit Service 9402ce
    ctx = CTX(dpy);
Packit Service 9402ce
    CHECK_VTABLE(vaStatus, ctx, MFSubmit);
Packit Service 9402ce
    if(ctx->vtable->vaMFSubmit == NULL)
Packit Service 9402ce
        vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
Packit Service 9402ce
    else
Packit Service 9402ce
    {
Packit Service 9402ce
        vaStatus = ctx->vtable->vaMFSubmit( ctx, mf_context, contexts, num_contexts);
Packit Service 9402ce
        VA_TRACE_ALL(va_TraceMFSubmit, dpy, mf_context, contexts, num_contexts);
Packit Service 9402ce
    }
Packit Service 9402ce
    VA_TRACE_RET(dpy, vaStatus); 
Packit Service 9402ce
Packit Service 9402ce
    return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaCreateBuffer (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAContextID context,	/* in */
Packit Service 9402ce
    VABufferType type,		/* in */
Packit Service 9402ce
    unsigned int size,		/* in */
Packit Service 9402ce
    unsigned int num_elements,	/* in */
Packit Service 9402ce
    void *data,			/* in */
Packit Service 9402ce
    VABufferID *buf_id		/* out */
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus vaStatus;
Packit Service 9402ce
  
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  VA_FOOL_FUNC(va_FoolCreateBuffer, dpy, context, type, size, num_elements, data, buf_id);
Packit Service 9402ce
Packit Service 9402ce
  vaStatus = ctx->vtable->vaCreateBuffer( ctx, context, type, size, num_elements, data, buf_id);
Packit Service 9402ce
Packit Service 9402ce
  VA_TRACE_LOG(va_TraceCreateBuffer,
Packit Service 9402ce
               dpy, context, type, size, num_elements, data, buf_id);
Packit Service 9402ce
  
Packit Service 9402ce
  VA_TRACE_RET(dpy, vaStatus); 
Packit Service 9402ce
  return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaCreateBuffer2 (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAContextID context,
Packit Service 9402ce
    VABufferType type,
Packit Service 9402ce
    unsigned int width,
Packit Service 9402ce
    unsigned int height,
Packit Service 9402ce
    unsigned int *unit_size,
Packit Service 9402ce
    unsigned int *pitch,
Packit Service 9402ce
    VABufferID *buf_id
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus vaStatus;
Packit Service 9402ce
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
  if(!ctx->vtable->vaCreateBuffer2)
Packit Service 9402ce
     return VA_STATUS_ERROR_UNIMPLEMENTED;
Packit Service 9402ce
Packit Service 9402ce
  vaStatus = ctx->vtable->vaCreateBuffer2( ctx, context, type, width, height ,unit_size, pitch, buf_id);
Packit Service 9402ce
Packit Service 9402ce
  VA_TRACE_LOG(va_TraceCreateBuffer,
Packit Service 9402ce
               dpy, context, type, *pitch, height, NULL, buf_id);
Packit Service 9402ce
  VA_TRACE_RET(dpy, vaStatus); 
Packit Service 9402ce
Packit Service 9402ce
  return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaBufferSetNumElements (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VABufferID buf_id,	/* in */
Packit Service 9402ce
    unsigned int num_elements /* in */
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus vaStatus = VA_STATUS_SUCCESS;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
Packit Service 9402ce
  
Packit Service 9402ce
  vaStatus = ctx->vtable->vaBufferSetNumElements( ctx, buf_id, num_elements );
Packit Service 9402ce
  VA_TRACE_RET(dpy, vaStatus);
Packit Service 9402ce
  return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaMapBuffer (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VABufferID buf_id,	/* in */
Packit Service 9402ce
    void **pbuf 	/* out */
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus va_status;
Packit Service 9402ce
  
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
  
Packit Service 9402ce
  VA_FOOL_FUNC(va_FoolMapBuffer, dpy, buf_id, pbuf);
Packit Service 9402ce
  
Packit Service 9402ce
  va_status = ctx->vtable->vaMapBuffer( ctx, buf_id, pbuf );
Packit Service 9402ce
Packit Service 9402ce
  VA_TRACE_ALL(va_TraceMapBuffer, dpy, buf_id, pbuf);
Packit Service 9402ce
  VA_TRACE_RET(dpy, va_status); 
Packit Service 9402ce
  
Packit Service 9402ce
  return va_status;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaUnmapBuffer (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VABufferID buf_id	/* in */
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus vaStatus = VA_STATUS_SUCCESS;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
Packit Service 9402ce
Packit Service 9402ce
  vaStatus = ctx->vtable->vaUnmapBuffer( ctx, buf_id );
Packit Service 9402ce
  VA_TRACE_RET(dpy, vaStatus);
Packit Service 9402ce
  return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaDestroyBuffer (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VABufferID buffer_id
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus vaStatus = VA_STATUS_SUCCESS;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
Packit Service 9402ce
Packit Service 9402ce
  VA_TRACE_LOG(va_TraceDestroyBuffer,
Packit Service 9402ce
               dpy, buffer_id);
Packit Service 9402ce
  
Packit Service 9402ce
  vaStatus = ctx->vtable->vaDestroyBuffer( ctx, buffer_id );
Packit Service 9402ce
  VA_TRACE_RET(dpy, vaStatus);
Packit Service 9402ce
  return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaBufferInfo (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAContextID context,	/* in */
Packit Service 9402ce
    VABufferID buf_id,		/* in */
Packit Service 9402ce
    VABufferType *type,		/* out */
Packit Service 9402ce
    unsigned int *size,		/* out */
Packit Service 9402ce
    unsigned int *num_elements	/* out */
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus vaStatus = VA_STATUS_SUCCESS;
Packit Service 9402ce
  
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  VA_FOOL_FUNC(va_FoolBufferInfo, dpy, buf_id, type, size, num_elements);
Packit Service 9402ce
  
Packit Service 9402ce
  vaStatus = ctx->vtable->vaBufferInfo( ctx, buf_id, type, size, num_elements );
Packit Service 9402ce
  VA_TRACE_RET(dpy, vaStatus);
Packit Service 9402ce
  return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/* Locks buffer for external API usage */
Packit Service 9402ce
VAStatus
Packit Service 9402ce
vaAcquireBufferHandle(VADisplay dpy, VABufferID buf_id, VABufferInfo *buf_info)
Packit Service 9402ce
{
Packit Service 9402ce
    VADriverContextP ctx;
Packit Service 9402ce
    VAStatus vaStatus = VA_STATUS_SUCCESS;
Packit Service 9402ce
Packit Service 9402ce
    CHECK_DISPLAY(dpy);
Packit Service 9402ce
    ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
    if (!ctx->vtable->vaAcquireBufferHandle)
Packit Service 9402ce
        vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
Packit Service 9402ce
    else
Packit Service 9402ce
        vaStatus = ctx->vtable->vaAcquireBufferHandle(ctx, buf_id, buf_info);
Packit Service 9402ce
    VA_TRACE_RET(dpy, vaStatus);
Packit Service 9402ce
    return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/* Unlocks buffer after usage from external API */
Packit Service 9402ce
VAStatus
Packit Service 9402ce
vaReleaseBufferHandle(VADisplay dpy, VABufferID buf_id)
Packit Service 9402ce
{
Packit Service 9402ce
    VADriverContextP ctx;
Packit Service 9402ce
    VAStatus vaStatus = VA_STATUS_SUCCESS;
Packit Service 9402ce
Packit Service 9402ce
    CHECK_DISPLAY(dpy);
Packit Service 9402ce
    ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
    if (!ctx->vtable->vaReleaseBufferHandle)
Packit Service 9402ce
        vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
Packit Service 9402ce
    else
Packit Service 9402ce
        vaStatus = ctx->vtable->vaReleaseBufferHandle(ctx, buf_id);
Packit Service 9402ce
    VA_TRACE_RET(dpy, vaStatus);
Packit Service 9402ce
    return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus
Packit Service 9402ce
vaExportSurfaceHandle(VADisplay dpy, VASurfaceID surface_id,
Packit Service 9402ce
                      uint32_t mem_type, uint32_t flags,
Packit Service 9402ce
                      void *descriptor)
Packit Service 9402ce
{
Packit Service 9402ce
    VADriverContextP ctx;
Packit Service 9402ce
    VAStatus vaStatus = VA_STATUS_SUCCESS;
Packit Service 9402ce
Packit Service 9402ce
    CHECK_DISPLAY(dpy);
Packit Service 9402ce
    ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
    if (!ctx->vtable->vaExportSurfaceHandle)
Packit Service 9402ce
        vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
Packit Service 9402ce
    else
Packit Service 9402ce
        vaStatus = ctx->vtable->vaExportSurfaceHandle(ctx, surface_id,
Packit Service 9402ce
                                              mem_type, flags,
Packit Service 9402ce
                                              descriptor);
Packit Service 9402ce
    VA_TRACE_RET(dpy, vaStatus);
Packit Service 9402ce
    return vaStatus;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaBeginPicture (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAContextID context,
Packit Service 9402ce
    VASurfaceID render_target
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus va_status;
Packit Service 9402ce
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  VA_TRACE_ALL(va_TraceBeginPicture, dpy, context, render_target);
Packit Service 9402ce
  VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
Packit Service 9402ce
  
Packit Service 9402ce
  va_status = ctx->vtable->vaBeginPicture( ctx, context, render_target );
Packit Service 9402ce
  VA_TRACE_RET(dpy, va_status);
Packit Service 9402ce
  
Packit Service 9402ce
  return va_status;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaRenderPicture (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAContextID context,
Packit Service 9402ce
    VABufferID *buffers,
Packit Service 9402ce
    int num_buffers
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus vaStatus = VA_STATUS_SUCCESS;
Packit Service 9402ce
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  VA_TRACE_LOG(va_TraceRenderPicture, dpy, context, buffers, num_buffers);
Packit Service 9402ce
  VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
Packit Service 9402ce
Packit Service 9402ce
  vaStatus = ctx->vtable->vaRenderPicture( ctx, context, buffers, num_buffers );
Packit Service 9402ce
  VA_TRACE_RET(dpy, vaStatus);
Packit Service 9402ce
  return vaStatus; 
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaEndPicture (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAContextID context
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VAStatus va_status = VA_STATUS_SUCCESS;
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
Packit Service 9402ce
Packit Service 9402ce
  va_status = ctx->vtable->vaEndPicture( ctx, context );
Packit Service 9402ce
Packit Service 9402ce
  /* dump surface content */
Packit Service 9402ce
  VA_TRACE_ALL(va_TraceEndPicture, dpy, context, 1);
Packit Service 9402ce
  VA_TRACE_RET(dpy, va_status);
Packit Service 9402ce
Packit Service 9402ce
  return va_status;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaSyncSurface (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VASurfaceID render_target
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VAStatus va_status;
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  va_status = ctx->vtable->vaSyncSurface( ctx, render_target );
Packit Service 9402ce
  VA_TRACE_LOG(va_TraceSyncSurface, dpy, render_target);
Packit Service 9402ce
  VA_TRACE_RET(dpy, va_status);
Packit Service 9402ce
Packit Service 9402ce
  return va_status;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaQuerySurfaceStatus (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VASurfaceID render_target,
Packit Service 9402ce
    VASurfaceStatus *status	/* out */
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VAStatus va_status;
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  va_status = ctx->vtable->vaQuerySurfaceStatus( ctx, render_target, status );
Packit Service 9402ce
Packit Service 9402ce
  VA_TRACE_LOG(va_TraceQuerySurfaceStatus, dpy, render_target, status);
Packit Service 9402ce
  VA_TRACE_RET(dpy, va_status);
Packit Service 9402ce
Packit Service 9402ce
  return va_status;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaQuerySurfaceError (
Packit Service 9402ce
	VADisplay dpy,
Packit Service 9402ce
	VASurfaceID surface,
Packit Service 9402ce
	VAStatus error_status,
Packit Service 9402ce
	void **error_info /*out*/
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VAStatus va_status;
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  va_status = ctx->vtable->vaQuerySurfaceError( ctx, surface, error_status, error_info );
Packit Service 9402ce
Packit Service 9402ce
  VA_TRACE_LOG(va_TraceQuerySurfaceError, dpy, surface, error_status, error_info);
Packit Service 9402ce
  VA_TRACE_RET(dpy, va_status); 
Packit Service 9402ce
Packit Service 9402ce
  return va_status;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/* Get maximum number of image formats supported by the implementation */
Packit Service 9402ce
int vaMaxNumImageFormats (
Packit Service 9402ce
    VADisplay dpy
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  if (!vaDisplayIsValid(dpy))
Packit Service 9402ce
      return 0;
Packit Service 9402ce
  
Packit Service 9402ce
  return CTX(dpy)->max_image_formats;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaQueryImageFormats (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAImageFormat *format_list,	/* out */
Packit Service 9402ce
    int *num_formats		/* out */
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  return ctx->vtable->vaQueryImageFormats ( ctx, format_list, num_formats);
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/* 
Packit Service 9402ce
 * The width and height fields returned in the VAImage structure may get 
Packit Service 9402ce
 * enlarged for some YUV formats. The size of the data buffer that needs
Packit Service 9402ce
 * to be allocated will be given in the "data_size" field in VAImage.
Packit Service 9402ce
 * Image data is not allocated by this function.  The client should
Packit Service 9402ce
 * allocate the memory and fill in the VAImage structure's data field
Packit Service 9402ce
 * after looking at "data_size" returned from the library.
Packit Service 9402ce
 */
Packit Service 9402ce
VAStatus vaCreateImage (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAImageFormat *format,
Packit Service 9402ce
    int width,
Packit Service 9402ce
    int height,
Packit Service 9402ce
    VAImage *image	/* out */
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus va_status = VA_STATUS_SUCCESS;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  va_status = ctx->vtable->vaCreateImage ( ctx, format, width, height, image);
Packit Service 9402ce
  VA_TRACE_RET(dpy, va_status);
Packit Service 9402ce
  return va_status;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/*
Packit Service 9402ce
 * Should call DestroyImage before destroying the surface it is bound to
Packit Service 9402ce
 */
Packit Service 9402ce
VAStatus vaDestroyImage (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAImageID image
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus va_status = VA_STATUS_SUCCESS;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  va_status = ctx->vtable->vaDestroyImage ( ctx, image);
Packit Service 9402ce
  VA_TRACE_RET(dpy, va_status);
Packit Service 9402ce
  return va_status;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaSetImagePalette (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAImageID image,
Packit Service 9402ce
    unsigned char *palette
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus va_status = VA_STATUS_SUCCESS;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  va_status = ctx->vtable->vaSetImagePalette ( ctx, image, palette);
Packit Service 9402ce
  VA_TRACE_RET(dpy, va_status);
Packit Service 9402ce
  return va_status;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/*
Packit Service 9402ce
 * Retrieve surface data into a VAImage
Packit Service 9402ce
 * Image must be in a format supported by the implementation
Packit Service 9402ce
 */
Packit Service 9402ce
VAStatus vaGetImage (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VASurfaceID surface,
Packit Service 9402ce
    int x,	/* coordinates of the upper left source pixel */
Packit Service 9402ce
    int y,
Packit Service 9402ce
    unsigned int width, /* width and height of the region */
Packit Service 9402ce
    unsigned int height,
Packit Service 9402ce
    VAImageID image
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus va_status = VA_STATUS_SUCCESS;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  va_status = ctx->vtable->vaGetImage ( ctx, surface, x, y, width, height, image);
Packit Service 9402ce
  VA_TRACE_RET(dpy, va_status);
Packit Service 9402ce
  return va_status;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/*
Packit Service 9402ce
 * Copy data from a VAImage to a surface
Packit Service 9402ce
 * Image must be in a format supported by the implementation
Packit Service 9402ce
 */
Packit Service 9402ce
VAStatus vaPutImage (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VASurfaceID surface,
Packit Service 9402ce
    VAImageID image,
Packit Service 9402ce
    int src_x,
Packit Service 9402ce
    int src_y,
Packit Service 9402ce
    unsigned int src_width,
Packit Service 9402ce
    unsigned int src_height,
Packit Service 9402ce
    int dest_x,
Packit Service 9402ce
    int dest_y,
Packit Service 9402ce
    unsigned int dest_width,
Packit Service 9402ce
    unsigned int dest_height
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus va_status = VA_STATUS_SUCCESS;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  va_status = ctx->vtable->vaPutImage ( ctx, surface, image, src_x, src_y, src_width, src_height, dest_x, dest_y, dest_width, dest_height );
Packit Service 9402ce
  VA_TRACE_RET(dpy, va_status);
Packit Service 9402ce
  return va_status;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/*
Packit Service 9402ce
 * Derive an VAImage from an existing surface.
Packit Service 9402ce
 * This interface will derive a VAImage and corresponding image buffer from
Packit Service 9402ce
 * an existing VA Surface. The image buffer can then be mapped/unmapped for
Packit Service 9402ce
 * direct CPU access. This operation is only possible on implementations with
Packit Service 9402ce
 * direct rendering capabilities and internal surface formats that can be
Packit Service 9402ce
 * represented with a VAImage. When the operation is not possible this interface
Packit Service 9402ce
 * will return VA_STATUS_ERROR_OPERATION_FAILED. Clients should then fall back
Packit Service 9402ce
 * to using vaCreateImage + vaPutImage to accomplish the same task in an
Packit Service 9402ce
 * indirect manner.
Packit Service 9402ce
 *
Packit Service 9402ce
 * Implementations should only return success when the resulting image buffer
Packit Service 9402ce
 * would be useable with vaMap/Unmap.
Packit Service 9402ce
 *
Packit Service 9402ce
 * When directly accessing a surface special care must be taken to insure
Packit Service 9402ce
 * proper synchronization with the graphics hardware. Clients should call
Packit Service 9402ce
 * vaQuerySurfaceStatus to insure that a surface is not the target of concurrent
Packit Service 9402ce
 * rendering or currently being displayed by an overlay.
Packit Service 9402ce
 *
Packit Service 9402ce
 * Additionally nothing about the contents of a surface should be assumed
Packit Service 9402ce
 * following a vaPutSurface. Implementations are free to modify the surface for
Packit Service 9402ce
 * scaling or subpicture blending within a call to vaPutImage.
Packit Service 9402ce
 *
Packit Service 9402ce
 * Calls to vaPutImage or vaGetImage using the same surface from which the image
Packit Service 9402ce
 * has been derived will return VA_STATUS_ERROR_SURFACE_BUSY. vaPutImage or
Packit Service 9402ce
 * vaGetImage with other surfaces is supported.
Packit Service 9402ce
 *
Packit Service 9402ce
 * An image created with vaDeriveImage should be freed with vaDestroyImage. The
Packit Service 9402ce
 * image and image buffer structures will be destroyed; however, the underlying
Packit Service 9402ce
 * surface will remain unchanged until freed with vaDestroySurfaces.
Packit Service 9402ce
 */
Packit Service 9402ce
VAStatus vaDeriveImage (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VASurfaceID surface,
Packit Service 9402ce
    VAImage *image	/* out */
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus va_status = VA_STATUS_SUCCESS;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  va_status = ctx->vtable->vaDeriveImage ( ctx, surface, image );
Packit Service 9402ce
  VA_TRACE_RET(dpy, va_status);
Packit Service 9402ce
  return va_status;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
Packit Service 9402ce
/* Get maximum number of subpicture formats supported by the implementation */
Packit Service 9402ce
int vaMaxNumSubpictureFormats (
Packit Service 9402ce
    VADisplay dpy
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  if (!vaDisplayIsValid(dpy))
Packit Service 9402ce
      return 0;
Packit Service 9402ce
  
Packit Service 9402ce
  return CTX(dpy)->max_subpic_formats;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/* 
Packit Service 9402ce
 * Query supported subpicture formats 
Packit Service 9402ce
 * The caller must provide a "format_list" array that can hold at
Packit Service 9402ce
 * least vaMaxNumSubpictureFormats() entries. The flags arrary holds the flag 
Packit Service 9402ce
 * for each format to indicate additional capabilities for that format. The actual 
Packit Service 9402ce
 * number of formats returned in "format_list" is returned in "num_formats".
Packit Service 9402ce
 */
Packit Service 9402ce
VAStatus vaQuerySubpictureFormats (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAImageFormat *format_list,	/* out */
Packit Service 9402ce
    unsigned int *flags,	/* out */
Packit Service 9402ce
    unsigned int *num_formats	/* out */
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  return ctx->vtable->vaQuerySubpictureFormats ( ctx, format_list, flags, num_formats);
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/* 
Packit Service 9402ce
 * Subpictures are created with an image associated. 
Packit Service 9402ce
 */
Packit Service 9402ce
VAStatus vaCreateSubpicture (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VAImageID image,
Packit Service 9402ce
    VASubpictureID *subpicture	/* out */
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  return ctx->vtable->vaCreateSubpicture ( ctx, image, subpicture );
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/*
Packit Service 9402ce
 * Destroy the subpicture before destroying the image it is assocated to
Packit Service 9402ce
 */
Packit Service 9402ce
VAStatus vaDestroySubpicture (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VASubpictureID subpicture
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  return ctx->vtable->vaDestroySubpicture ( ctx, subpicture);
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaSetSubpictureImage (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VASubpictureID subpicture,
Packit Service 9402ce
    VAImageID image
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  return ctx->vtable->vaSetSubpictureImage ( ctx, subpicture, image);
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
Packit Service 9402ce
/*
Packit Service 9402ce
 * If chromakey is enabled, then the area where the source value falls within
Packit Service 9402ce
 * the chromakey [min, max] range is transparent
Packit Service 9402ce
 */
Packit Service 9402ce
VAStatus vaSetSubpictureChromakey (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VASubpictureID subpicture,
Packit Service 9402ce
    unsigned int chromakey_min,
Packit Service 9402ce
    unsigned int chromakey_max,
Packit Service 9402ce
    unsigned int chromakey_mask
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  return ctx->vtable->vaSetSubpictureChromakey ( ctx, subpicture, chromakey_min, chromakey_max, chromakey_mask );
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
Packit Service 9402ce
/*
Packit Service 9402ce
 * Global alpha value is between 0 and 1. A value of 1 means fully opaque and 
Packit Service 9402ce
 * a value of 0 means fully transparent. If per-pixel alpha is also specified then
Packit Service 9402ce
 * the overall alpha is per-pixel alpha multiplied by the global alpha
Packit Service 9402ce
 */
Packit Service 9402ce
VAStatus vaSetSubpictureGlobalAlpha (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VASubpictureID subpicture,
Packit Service 9402ce
    float global_alpha 
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  return ctx->vtable->vaSetSubpictureGlobalAlpha ( ctx, subpicture, global_alpha );
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/*
Packit Service 9402ce
  vaAssociateSubpicture associates the subpicture with the target_surface.
Packit Service 9402ce
  It defines the region mapping between the subpicture and the target 
Packit Service 9402ce
  surface through source and destination rectangles (with the same width and height).
Packit Service 9402ce
  Both will be displayed at the next call to vaPutSurface.  Additional
Packit Service 9402ce
  associations before the call to vaPutSurface simply overrides the association.
Packit Service 9402ce
*/
Packit Service 9402ce
VAStatus vaAssociateSubpicture (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VASubpictureID subpicture,
Packit Service 9402ce
    VASurfaceID *target_surfaces,
Packit Service 9402ce
    int num_surfaces,
Packit Service 9402ce
    short src_x, /* upper left offset in subpicture */
Packit Service 9402ce
    short src_y,
Packit Service 9402ce
    unsigned short src_width,
Packit Service 9402ce
    unsigned short src_height,
Packit Service 9402ce
    short dest_x, /* upper left offset in surface */
Packit Service 9402ce
    short dest_y,
Packit Service 9402ce
    unsigned short dest_width,
Packit Service 9402ce
    unsigned short dest_height,
Packit Service 9402ce
    /*
Packit Service 9402ce
     * whether to enable chroma-keying or global-alpha
Packit Service 9402ce
     * see VA_SUBPICTURE_XXX values
Packit Service 9402ce
     */
Packit Service 9402ce
    unsigned int flags
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  return ctx->vtable->vaAssociateSubpicture ( ctx, subpicture, target_surfaces, num_surfaces, src_x, src_y, src_width, src_height, dest_x, dest_y, dest_width, dest_height, flags );
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/*
Packit Service 9402ce
 * vaDeassociateSubpicture removes the association of the subpicture with target_surfaces.
Packit Service 9402ce
 */
Packit Service 9402ce
VAStatus vaDeassociateSubpicture (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VASubpictureID subpicture,
Packit Service 9402ce
    VASurfaceID *target_surfaces,
Packit Service 9402ce
    int num_surfaces
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  return ctx->vtable->vaDeassociateSubpicture ( ctx, subpicture, target_surfaces, num_surfaces );
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
Packit Service 9402ce
/* Get maximum number of display attributes supported by the implementation */
Packit Service 9402ce
int vaMaxNumDisplayAttributes (
Packit Service 9402ce
    VADisplay dpy
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  int tmp;
Packit Service 9402ce
    
Packit Service 9402ce
  if (!vaDisplayIsValid(dpy))
Packit Service 9402ce
      return 0;
Packit Service 9402ce
  
Packit Service 9402ce
  tmp = CTX(dpy)->max_display_attributes;
Packit Service 9402ce
Packit Service 9402ce
  VA_TRACE_LOG(va_TraceMaxNumDisplayAttributes, dpy, tmp);
Packit Service 9402ce
  
Packit Service 9402ce
  return tmp;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/* 
Packit Service 9402ce
 * Query display attributes 
Packit Service 9402ce
 * The caller must provide a "attr_list" array that can hold at
Packit Service 9402ce
 * least vaMaxNumDisplayAttributes() entries. The actual number of attributes
Packit Service 9402ce
 * returned in "attr_list" is returned in "num_attributes".
Packit Service 9402ce
 */
Packit Service 9402ce
VAStatus vaQueryDisplayAttributes (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VADisplayAttribute *attr_list,	/* out */
Packit Service 9402ce
    int *num_attributes			/* out */
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus va_status;
Packit Service 9402ce
  
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
  va_status = ctx->vtable->vaQueryDisplayAttributes ( ctx, attr_list, num_attributes );
Packit Service 9402ce
Packit Service 9402ce
  VA_TRACE_LOG(va_TraceQueryDisplayAttributes, dpy, attr_list, num_attributes);
Packit Service 9402ce
  VA_TRACE_RET(dpy, va_status); 
Packit Service 9402ce
Packit Service 9402ce
  return va_status;
Packit Service 9402ce
  
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/* 
Packit Service 9402ce
 * Get display attributes 
Packit Service 9402ce
 * This function returns the current attribute values in "attr_list".
Packit Service 9402ce
 * Only attributes returned with VA_DISPLAY_ATTRIB_GETTABLE set in the "flags" field
Packit Service 9402ce
 * from vaQueryDisplayAttributes() can have their values retrieved.  
Packit Service 9402ce
 */
Packit Service 9402ce
VAStatus vaGetDisplayAttributes (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VADisplayAttribute *attr_list,	/* in/out */
Packit Service 9402ce
    int num_attributes
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus va_status;
Packit Service 9402ce
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
  va_status = ctx->vtable->vaGetDisplayAttributes ( ctx, attr_list, num_attributes );
Packit Service 9402ce
Packit Service 9402ce
  VA_TRACE_LOG(va_TraceGetDisplayAttributes, dpy, attr_list, num_attributes);
Packit Service 9402ce
  VA_TRACE_RET(dpy, va_status); 
Packit Service 9402ce
  
Packit Service 9402ce
  return va_status;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/* 
Packit Service 9402ce
 * Set display attributes 
Packit Service 9402ce
 * Only attributes returned with VA_DISPLAY_ATTRIB_SETTABLE set in the "flags" field
Packit Service 9402ce
 * from vaQueryDisplayAttributes() can be set.  If the attribute is not settable or 
Packit Service 9402ce
 * the value is out of range, the function returns VA_STATUS_ERROR_ATTR_NOT_SUPPORTED
Packit Service 9402ce
 */
Packit Service 9402ce
VAStatus vaSetDisplayAttributes (
Packit Service 9402ce
    VADisplay dpy,
Packit Service 9402ce
    VADisplayAttribute *attr_list,
Packit Service 9402ce
    int num_attributes
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus va_status;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  va_status = ctx->vtable->vaSetDisplayAttributes ( ctx, attr_list, num_attributes );
Packit Service 9402ce
  VA_TRACE_LOG(va_TraceSetDisplayAttributes, dpy, attr_list, num_attributes);
Packit Service 9402ce
  VA_TRACE_RET(dpy, va_status); 
Packit Service 9402ce
  
Packit Service 9402ce
  return va_status;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaLockSurface(VADisplay dpy,
Packit Service 9402ce
    VASurfaceID surface,
Packit Service 9402ce
    unsigned int *fourcc, /* following are output argument */
Packit Service 9402ce
    unsigned int *luma_stride,
Packit Service 9402ce
    unsigned int *chroma_u_stride,
Packit Service 9402ce
    unsigned int *chroma_v_stride,
Packit Service 9402ce
    unsigned int *luma_offset,
Packit Service 9402ce
    unsigned int *chroma_u_offset,
Packit Service 9402ce
    unsigned int *chroma_v_offset,
Packit Service 9402ce
    unsigned int *buffer_name,
Packit Service 9402ce
    void **buffer 
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus va_status = VA_STATUS_SUCCESS;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  va_status = ctx->vtable->vaLockSurface( ctx, surface, fourcc, luma_stride, chroma_u_stride, chroma_v_stride, luma_offset, chroma_u_offset, chroma_v_offset, buffer_name, buffer);
Packit Service 9402ce
  VA_TRACE_RET(dpy, va_status);
Packit Service 9402ce
Packit Service 9402ce
  return va_status;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
Packit Service 9402ce
VAStatus vaUnlockSurface(VADisplay dpy,
Packit Service 9402ce
    VASurfaceID surface
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
  VADriverContextP ctx;
Packit Service 9402ce
  VAStatus va_status = VA_STATUS_SUCCESS;
Packit Service 9402ce
  CHECK_DISPLAY(dpy);
Packit Service 9402ce
  ctx = CTX(dpy);
Packit Service 9402ce
Packit Service 9402ce
  va_status = ctx->vtable->vaUnlockSurface( ctx, surface );
Packit Service 9402ce
  VA_TRACE_RET(dpy, va_status);
Packit Service 9402ce
Packit Service 9402ce
  return va_status;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
/* Video Processing */
Packit Service 9402ce
#define VA_VPP_INIT_CONTEXT(ctx, dpy) do {              \
Packit Service 9402ce
        CHECK_DISPLAY(dpy);                             \
Packit Service 9402ce
        ctx = CTX(dpy);                                 \
Packit Service 9402ce
        if (!ctx)                                       \
Packit Service 9402ce
            return VA_STATUS_ERROR_INVALID_DISPLAY;     \
Packit Service 9402ce
    } while (0)
Packit Service 9402ce
Packit Service 9402ce
#define VA_VPP_INVOKE(dpy, func, args) do {             \
Packit Service 9402ce
        if (!ctx->vtable_vpp->va##func)                 \
Packit Service 9402ce
            return VA_STATUS_ERROR_UNIMPLEMENTED;       \
Packit Service 9402ce
        status = ctx->vtable_vpp->va##func args;        \
Packit Service 9402ce
    } while (0)
Packit Service 9402ce
Packit Service 9402ce
VAStatus
Packit Service 9402ce
vaQueryVideoProcFilters(
Packit Service 9402ce
    VADisplay           dpy,
Packit Service 9402ce
    VAContextID         context,
Packit Service 9402ce
    VAProcFilterType   *filters,
Packit Service 9402ce
    unsigned int       *num_filters
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
    VADriverContextP ctx;
Packit Service 9402ce
    VAStatus status;
Packit Service 9402ce
Packit Service 9402ce
    VA_VPP_INIT_CONTEXT(ctx, dpy);
Packit Service 9402ce
    VA_VPP_INVOKE(
Packit Service 9402ce
        ctx,
Packit Service 9402ce
        QueryVideoProcFilters,
Packit Service 9402ce
        (ctx, context, filters, num_filters)
Packit Service 9402ce
    );
Packit Service 9402ce
    VA_TRACE_RET(dpy, status);
Packit Service 9402ce
Packit Service 9402ce
    return status;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus
Packit Service 9402ce
vaQueryVideoProcFilterCaps(
Packit Service 9402ce
    VADisplay           dpy,
Packit Service 9402ce
    VAContextID         context,
Packit Service 9402ce
    VAProcFilterType    type,
Packit Service 9402ce
    void               *filter_caps,
Packit Service 9402ce
    unsigned int       *num_filter_caps
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
    VADriverContextP ctx;
Packit Service 9402ce
    VAStatus status;
Packit Service 9402ce
Packit Service 9402ce
    VA_VPP_INIT_CONTEXT(ctx, dpy);
Packit Service 9402ce
    VA_VPP_INVOKE(
Packit Service 9402ce
        ctx,
Packit Service 9402ce
        QueryVideoProcFilterCaps,
Packit Service 9402ce
        (ctx, context, type, filter_caps, num_filter_caps)
Packit Service 9402ce
    );
Packit Service 9402ce
    VA_TRACE_RET(dpy, status);
Packit Service 9402ce
    return status;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VAStatus
Packit Service 9402ce
vaQueryVideoProcPipelineCaps(
Packit Service 9402ce
    VADisplay           dpy,
Packit Service 9402ce
    VAContextID         context,
Packit Service 9402ce
    VABufferID         *filters,
Packit Service 9402ce
    unsigned int        num_filters,
Packit Service 9402ce
    VAProcPipelineCaps *pipeline_caps
Packit Service 9402ce
)
Packit Service 9402ce
{
Packit Service 9402ce
    VADriverContextP ctx;
Packit Service 9402ce
    VAStatus status;
Packit Service 9402ce
Packit Service 9402ce
    VA_VPP_INIT_CONTEXT(ctx, dpy);
Packit Service 9402ce
    VA_VPP_INVOKE(
Packit Service 9402ce
        ctx,
Packit Service 9402ce
        QueryVideoProcPipelineCaps,
Packit Service 9402ce
        (ctx, context, filters, num_filters, pipeline_caps)
Packit Service 9402ce
    );
Packit Service 9402ce
    VA_TRACE_RET(dpy, status);
Packit Service 9402ce
    return status;
Packit Service 9402ce
}