Initial support for DRI2
authorAustin Yuan <shengquan.yuan@intel.com>
Wed, 22 Apr 2009 16:36:20 +0000 (12:36 -0400)
committerAustin Yuan <shengquan.yuan@intel.com>
Wed, 22 Apr 2009 16:36:20 +0000 (12:36 -0400)
Signed-off-by: Austin Yuan <shengquan.yuan@intel.com>
src/X11/va_x11.c
src/va_backend.h

index bc2429e..f050648 100644 (file)
@@ -89,13 +89,51 @@ static void va_DisplayContextDestroy (
     free(pDisplayContext);
 }
 
-static VAStatus va_DisplayContextGetDriverName (
+
+static VAStatus va_DRI2GetDriverName (
+    VADisplayContextP pDisplayContext,
+    char **driver_name
+)
+{
+    VADriverContextP ctx = pDisplayContext->pDriverContext;
+    VAStatus vaStatus = VA_STATUS_ERROR_UNKNOWN;
+    char *driverName, *deviceName;
+    int driver_major;
+    int driver_minor;
+    int driver_patch;
+    Bool result = True;
+
+    if (!VA_DRI2QueryExtension(ctx->x11_dpy, &eventBase, &errorBase)) {
+        va_infoMessage("DRI2 extension isn't present\n");
+        return VA_STATUS_ERROR_UNKNOWN;
+    }
+
+    if (!VA_DRI2QueryVersion(ctx->x11_dpy, &driver_major, &driver_minor)) {
+        va_errorMessage("VA_DRI2QueryVersion failed\n");
+        return VA_STATUS_ERROR_UNKNOWN;
+    }
+    
+    if (!VA_DRI2Connect(ctx->x11_dpy, RootWindow(ctx->x11_dpy, ctx->x11_screen),
+                    &driver_name, &device_name)) {
+        va_infoMessage("DRI2 isn't enabled, fallback to DRI1\n");
+        return VA_STATUS_ERROR_UNKNOWN;
+    }
+
+    va_infoMessage("VA_DRI2Connect: %d.%d.%d %s (screen %d)\n",
+                   driver_major, driver_minor, driver_patch, *driver_name, ctx->x11_screen);
+    ctx->dri2 = 1;
+    
+    return VA_STATUS_SUCCESS;
+}
+
+static VAStatus va_DRIGetDriverName (
     VADisplayContextP pDisplayContext,
     char **driver_name
 )
 {
     VADriverContextP ctx = pDisplayContext->pDriverContext;
     VAStatus vaStatus = VA_STATUS_ERROR_UNKNOWN;
+    int eventBase, errorBase;
     int direct_capable;
     int driver_major;
     int driver_minor;
@@ -103,18 +141,11 @@ static VAStatus va_DisplayContextGetDriverName (
     Bool result = True;
     char *x_driver_name = NULL;
 
-    if (driver_name)
-       *driver_name = NULL;
-    if (geteuid() == getuid())
-    {
-        /* don't allow setuid apps to use LIBVA_DRIVER_NAME */
-        if (getenv("LIBVA_DRIVER_NAME"))
-        {
-            /* For easier debugging */
-            *driver_name = strdup(getenv("LIBVA_DRIVER_NAME"));
-            return VA_STATUS_SUCCESS;
-        }
+    if (!VA_DRIQueryExtension(ctx->x11_dpy, &eventBase, &errorBase)) {
+        va_errorMessage("VA_DRIQueryExtension failed\n");
+        return VA_STATUS_ERROR_UNKNOWN;
     }
+    
     if (result)
     {
         result = VA_DRIQueryDirectRenderingCapable(ctx->x11_dpy, ctx->x11_screen, &direct_capable);
@@ -154,6 +185,45 @@ static VAStatus va_DisplayContextGetDriverName (
     return vaStatus;
 }
 
+static VAStatus va_DisplayContextGetDriverName (
+    VADisplayContextP pDisplayContext,
+    char **driver_name
+)
+{
+    VADriverContextP ctx = pDisplayContext->pDriverContext;
+    VAStatus vaStatus = VA_STATUS_ERROR_UNKNOWN;
+    int direct_capable;
+    int driver_major;
+    int driver_minor;
+    int driver_patch;
+    Bool result = True;
+    char *x_driver_name = NULL;
+
+    if (driver_name)
+       *driver_name = NULL;
+    
+    vaStatus = va_DRI2GetDriverName(pDisplayContext, driver_name);
+    if (vaStatus != VA_STATUS_SUCCESS)
+        vaStatus = va_DRIGetDriverName(pDisplayContext, driver_name);
+
+    if ((vaStatus == VA_STATUS_SUCCESS)
+        && geteuid() == getuid())
+    {
+        /* don't allow setuid apps to use LIBVA_DRIVER_NAME */
+        if (getenv("LIBVA_DRIVER_NAME"))
+        {
+            /* For easier debugging */
+            if (*driver_name)
+                Xfree(*driver_name);
+            
+            *driver_name = strdup(getenv("LIBVA_DRIVER_NAME"));
+            return VA_STATUS_SUCCESS;
+        }
+    }
+    
+    return vaStatus;
+}
+
 int vaDisplayIsValid(VADisplay dpy)
 {
   VADisplayContextP tmp=NULL;
index 9ab4ce1..5d0785c 100755 (executable)
@@ -423,7 +423,7 @@ struct VADriverContext
 
     Display *x11_dpy;
     int x11_screen;
-
+    int dri2;
     int version_major;
     int version_minor;
     int max_profiles;