diff options
author | Carl Zhang <carl.zhang@intel.com> | 2019-12-10 08:55:57 -0500 |
---|---|---|
committer | XinfengZhang <carl.zhang@intel.com> | 2019-12-25 14:31:12 +0800 |
commit | 6650b390d1c21ce4abc78234fbc74e02cf25ddca (patch) | |
tree | 0f81bc46fd9b7be99b697db6d00f493dbdd1ac21 | |
parent | 09c8c2e20b7763fc44299172dbb16061b57f9c71 (diff) | |
download | libva-6650b390d1c21ce4abc78234fbc74e02cf25ddca.tar.gz |
add backend function pointer to query candidates number
add multiple backend driver support part 1
add new function pointer in va_backend.h
vaGetCandidatesNum is used to get driver candidates number
vaGetDriverNameByIndex is used to get driver name by candidate index
and basic implementation of va_getDriverCandidateNum and va_getDriverNameByIndex
Signed-off-by: Carl Zhang <carl.zhang@intel.com>
-rw-r--r-- | va/va.c | 54 | ||||
-rw-r--r-- | va/va_backend.h | 12 |
2 files changed, 59 insertions, 7 deletions
@@ -342,11 +342,53 @@ va_getDriverInitName(char *name, int namelen, int major, int minor) return ret > 0 && ret < namelen; } -static VAStatus va_getDriverName(VADisplay dpy, char **driver_name) +static VAStatus va_getDriverNumCandidates(VADisplay dpy, int *num_candidates) { VADisplayContextP pDisplayContext = (VADisplayContextP)dpy; + *num_candidates = 1; + const char *driver_name_env = NULL; + VAStatus vaStatus = VA_STATUS_SUCCESS; + VADriverContextP ctx; + + ctx = CTX(dpy); + driver_name_env = getenv("LIBVA_DRIVER_NAME"); - return pDisplayContext->vaGetDriverName(pDisplayContext, driver_name); + if (pDisplayContext->vaGetNumCandidates) + vaStatus = pDisplayContext->vaGetNumCandidates(pDisplayContext, num_candidates); + if ((ctx->override_driver_name) || (driver_name_env && (geteuid() == getuid()))) + *num_candidates = 1; + return vaStatus; +} + +static VAStatus va_getDriverNameByIndex(VADisplay dpy, char **driver_name, int candidate_index) +{ + VADisplayContextP pDisplayContext = (VADisplayContextP)dpy; + const char *driver_name_env = NULL; + VADriverContextP ctx; + + ctx = CTX(dpy); + driver_name_env = getenv("LIBVA_DRIVER_NAME"); + + if (ctx->override_driver_name){ + *driver_name = strdup(ctx->override_driver_name); + if (!(*driver_name)) { + va_errorMessage(dpy, "va_getDriverNameByIndex failed with %s, out of memory\n",vaErrorStr(VA_STATUS_ERROR_ALLOCATION_FAILED)); + return VA_STATUS_ERROR_ALLOCATION_FAILED; + } + va_infoMessage(dpy, "User requested driver '%s'\n", *driver_name); + return VA_STATUS_SUCCESS; + } else if (driver_name_env && (geteuid() == getuid())) { + *driver_name = strdup(driver_name_env); + va_infoMessage(dpy, "User environment variable requested driver '%s'\n", *driver_name); + return VA_STATUS_SUCCESS; + } else if (pDisplayContext->vaGetDriverNameByIndex) { + return pDisplayContext->vaGetDriverNameByIndex(pDisplayContext, driver_name, candidate_index); + } else { + if (candidate_index == 0) + return pDisplayContext->vaGetDriverName(pDisplayContext, driver_name); + else + return VA_STATUS_ERROR_INVALID_PARAMETER; + } } static char *va_getDriverPath(const char *driver_dir, const char *driver_name) @@ -674,10 +716,10 @@ VAStatus vaInitialize ( va_infoMessage(dpy, "VA-API version %s\n", VA_VERSION_S); - vaStatus = va_getDriverName(dpy, &driver_name); + vaStatus = va_getDriverNameByIndex(dpy, &driver_name, 0); if (!ctx->override_driver_name) { - va_infoMessage(dpy, "va_getDriverName() returns %d\n", vaStatus); + va_infoMessage(dpy, "va_getDriverNameByIndex() returns %d\n", vaStatus); driver_name_env = getenv("LIBVA_DRIVER_NAME"); } else if (vaStatus == VA_STATUS_SUCCESS) { @@ -696,7 +738,7 @@ VAStatus vaInitialize ( if (driver_name_env && (geteuid() == getuid())) { /* Don't allow setuid apps to use LIBVA_DRIVER_NAME */ - if (driver_name) /* memory is allocated in va_getDriverName */ + if (driver_name) /* memory is allocated in va_getDriverNameByIndex */ free(driver_name); driver_name = strdup(driver_name_env); @@ -711,7 +753,7 @@ VAStatus vaInitialize ( *major_version = VA_MAJOR_VERSION; *minor_version = VA_MINOR_VERSION; } else - va_errorMessage(dpy, "va_getDriverName() failed with %s,driver_name=%s\n", + va_errorMessage(dpy, "va_getDriverNameByIndex() failed with %s,driver_name=%s\n", vaErrorStr(vaStatus), driver_name); if (driver_name) diff --git a/va/va_backend.h b/va/va_backend.h index d078e04..f2cd7b0 100644 --- a/va/va_backend.h +++ b/va/va_backend.h @@ -651,9 +651,19 @@ struct VADisplayContext void *error_callback_user_context; VAMessageCallback info_callback; void *info_callback_user_context; + VAStatus (*vaGetNumCandidates) ( + VADisplayContextP ctx, + int * num_candidates + ); + + VAStatus (*vaGetDriverNameByIndex) ( + VADisplayContextP ctx, + char **driver_name, + int candidate_index + ); /** \brief Reserved bytes for future use, must be zero */ - unsigned long reserved[32]; + unsigned long reserved[30]; }; typedef VAStatus (*VADriverInit) ( |