summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Zhang <carl.zhang@intel.com>2019-12-10 08:55:57 -0500
committerXinfengZhang <carl.zhang@intel.com>2019-12-25 14:31:12 +0800
commit6650b390d1c21ce4abc78234fbc74e02cf25ddca (patch)
tree0f81bc46fd9b7be99b697db6d00f493dbdd1ac21
parent09c8c2e20b7763fc44299172dbb16061b57f9c71 (diff)
downloadlibva-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.c54
-rw-r--r--va/va_backend.h12
2 files changed, 59 insertions, 7 deletions
diff --git a/va/va.c b/va/va.c
index 633377b..39a72dc 100644
--- a/va/va.c
+++ b/va/va.c
@@ -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) (