summaryrefslogtreecommitdiff
path: root/va/va.c
diff options
context:
space:
mode:
authorZhao Yakui <yakui.zhao@intel.com>2015-05-23 09:23:23 +0800
committerXiang, Haihao <haihao.xiang@intel.com>2015-05-22 16:42:03 +0800
commit9f2a994643001a03e103aa13268abbd86b49a5c4 (patch)
treed894d6d8877c27f58effd1179dae0f3358b8da11 /va/va.c
parent9bfde38f19d81b7f33db8c4c8e80420c9e60429e (diff)
downloadlibva-9f2a994643001a03e103aa13268abbd86b49a5c4.tar.gz
Add one API to allow the user to specify the loaded backend driver
Sometimes there exist multiple backend vaapi drivers on one system. In such case user hopes to load the specific driver based on the request. Currently it can be specified by using LIBVA_DRIVER_NAME environment. But it is not convenient. So one API is added to allow the user to specify the loaded backend vaapi driver. And it is called by using the following sequence: >vaGetDisplay( >vaSetDriverName(va_dpy, driver_name) >vaInitialize V1->V2: Use the reserved space to store override_driver_name based on Haihao's suggestion. Signed-off-by: Zhao Yakui <yakui.zhao@intel.com>
Diffstat (limited to 'va/va.c')
-rw-r--r--va/va.c91
1 files changed, 88 insertions, 3 deletions
diff --git a/va/va.c b/va/va.c
index 0298068..d260105 100644
--- a/va/va.c
+++ b/va/va.c
@@ -440,7 +440,68 @@ const char *vaErrorStr(VAStatus error_status)
}
return "unknown libva error / description missing";
}
-
+
+const static char *prefer_driver_list[4] = {
+ "i965",
+ "hybrid",
+ "pvr",
+ "iHD",
+};
+
+VAStatus vaSetDriverName(
+ VADisplay dpy,
+ char *driver_name
+)
+{
+ VADriverContextP ctx;
+ VAStatus vaStatus = VA_STATUS_SUCCESS;
+ char *override_driver_name = NULL;
+ int i, found;
+ ctx = CTX(dpy);
+
+ if (geteuid() != getuid()) {
+ vaStatus = VA_STATUS_ERROR_OPERATION_FAILED;
+ va_errorMessage("no permission to vaSetDriverName\n");
+ return vaStatus;
+ }
+
+ if (strlen(driver_name) == 0 || strlen(driver_name) >=256) {
+ vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
+ va_errorMessage("vaSetDriverName returns %s\n",
+ vaErrorStr(vaStatus));
+ return vaStatus;
+ }
+
+ found = 0;
+ for (i = 0; i < sizeof(prefer_driver_list) / sizeof(char *); i++) {
+ if (strlen(prefer_driver_list[i]) != strlen(driver_name))
+ continue;
+ if (!strncmp(prefer_driver_list[i], driver_name, strlen(driver_name))) {
+ found = 1;
+ break;
+ }
+ }
+
+ if (!found) {
+ vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
+ va_errorMessage("vaSetDriverName returns %s. Incorrect parameter\n",
+ vaErrorStr(vaStatus));
+ return vaStatus;
+ }
+
+ override_driver_name = strdup(driver_name);
+
+ if (!override_driver_name) {
+ vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
+ va_errorMessage("vaSetDriverName returns %s. Out of Memory\n",
+ vaErrorStr(vaStatus));
+ return vaStatus;
+ }
+
+ ctx->override_driver_name = override_driver_name;
+ return VA_STATUS_SUCCESS;
+}
+
VAStatus vaInitialize (
VADisplay dpy,
int *major_version, /* out */
@@ -450,9 +511,12 @@ VAStatus vaInitialize (
const char *driver_name_env = NULL;
char *driver_name = NULL;
VAStatus vaStatus;
+ VADriverContextP ctx;
CHECK_DISPLAY(dpy);
+ ctx = CTX(dpy);
+
va_TraceInit(dpy);
va_FoolInit(dpy);
@@ -460,9 +524,25 @@ VAStatus vaInitialize (
va_infoMessage("VA-API version %s\n", VA_VERSION_S);
vaStatus = va_getDriverName(dpy, &driver_name);
- va_infoMessage("va_getDriverName() returns %d\n", vaStatus);
- driver_name_env = getenv("LIBVA_DRIVER_NAME");
+ if (!ctx->override_driver_name) {
+ va_infoMessage("va_getDriverName() returns %d\n", vaStatus);
+
+ driver_name_env = getenv("LIBVA_DRIVER_NAME");
+ } else if (vaStatus == VA_STATUS_SUCCESS) {
+ if (driver_name)
+ free(driver_name);
+
+ driver_name = strdup(ctx->override_driver_name);
+ if (!driver_name) {
+ vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
+ va_errorMessage("vaInitialize() failed with %s, out of memory\n",
+ vaErrorStr(vaStatus));
+ return vaStatus;
+ }
+ va_infoMessage("User requested driver '%s'\n", driver_name);
+ }
+
if ((VA_STATUS_SUCCESS == vaStatus) &&
driver_name_env && (geteuid() == getuid())) {
/* Don't allow setuid apps to use LIBVA_DRIVER_NAME */
@@ -517,6 +597,11 @@ VAStatus vaTerminate (
free(old_ctx->vtable_vpp);
old_ctx->vtable_vpp = NULL;
+ if (old_ctx->override_driver_name) {
+ free(old_ctx->override_driver_name);
+ old_ctx->override_driver_name = NULL;
+ }
+
VA_TRACE_LOG(va_TraceTerminate, dpy);
va_TraceEnd(dpy);