summaryrefslogtreecommitdiff
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
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>
-rw-r--r--va/va.c91
-rw-r--r--va/va.h9
-rw-r--r--va/va_backend.h4
3 files changed, 99 insertions, 5 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);
diff --git a/va/va.h b/va/va.h
index 83d633f..88fde4e 100644
--- a/va/va.h
+++ b/va/va.h
@@ -232,7 +232,14 @@ const char *vaErrorStr(VAStatus error_status);
typedef void* VANativeDisplay; /* window system dependent */
int vaDisplayIsValid(VADisplay dpy);
-
+
+/**
+ * Set the override driver name instead of queried driver driver.
+ */
+VAStatus vaSetDriverName(VADisplay dpy,
+ char *driver_name
+);
+
/**
* Initialize the library
*/
diff --git a/va/va_backend.h b/va/va_backend.h
index 40d3031..7ab52d2 100644
--- a/va/va_backend.h
+++ b/va/va_backend.h
@@ -524,7 +524,9 @@ struct VADriverContext
*/
struct VADriverVTableVPP *vtable_vpp;
- unsigned long reserved[42]; /* reserve for future add-ins, decrease the subscript accordingly */
+ char *override_driver_name;
+
+ unsigned long reserved[41]; /* reserve for future add-ins, decrease the subscript accordingly */
};
#define VA_DISPLAY_MAGIC 0x56414430 /* VAD0 */