gallium/vl: add prime support
authorDave Airlie <airlied@redhat.com>
Thu, 25 Jul 2013 03:31:26 +0000 (13:31 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 25 Jul 2013 22:42:00 +0000 (08:42 +1000)
This fixes the dri2 opening to check if DRI_PRIME is set,
and picks the correct drm device path to open, this along
with a change to libvdpau allows vdpauinfo to work at least,

Martin Peres tested with nouveau, and there seems to be a
further issue with final displaying, it only works sometimes,
but this patch is at least necessary to help debug further.

Signed-off-by: Dave Airlie <airlied@redhat.com>
Cc: mesa-stable@lists.freedesktop.org
Reviewed-by: Christian König <christian.koenig@amd.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=67283
Tested-by: Armin K. <krejzi@email.com>
src/gallium/auxiliary/vl/vl_winsys_dri.c

index 88e17fefb8a8c6d5f10bf5ba7b1863b1f5783129..7aec3fee685e7d1e8e19adcf67b85103299d284c 100644 (file)
 #include <fcntl.h>
 
 #include <X11/Xlib-xcb.h>
+#include <X11/extensions/dri2tokens.h>
 #include <xcb/dri2.h>
 #include <xf86drm.h>
+#include <errno.h>
 
 #include "pipe/p_screen.h"
 #include "pipe/p_context.h"
@@ -305,6 +307,7 @@ vl_screen_create(Display *display, int screen)
    xcb_generic_error_t *error = NULL;
    char *device_name;
    int fd, device_name_length;
+   unsigned int driverType;
 
    drm_magic_t magic;
 
@@ -332,7 +335,22 @@ vl_screen_create(Display *display, int screen)
    s = xcb_setup_roots_iterator(xcb_get_setup(scrn->conn));
    while (screen--)
        xcb_screen_next(&s);
-   connect_cookie = xcb_dri2_connect_unchecked(scrn->conn, s.data->root, XCB_DRI2_DRIVER_TYPE_DRI);
+   driverType = XCB_DRI2_DRIVER_TYPE_DRI;
+#ifdef DRI2DriverPrimeShift
+   {
+      char *prime = getenv("DRI_PRIME");
+      if (prime) {
+         unsigned int primeid;
+         errno = 0;
+         primeid = strtoul(prime, NULL, 0);
+         if (errno == 0)
+            driverType |=
+               ((primeid & DRI2DriverPrimeMask) << DRI2DriverPrimeShift);
+      }
+   }
+#endif
+
+   connect_cookie = xcb_dri2_connect_unchecked(scrn->conn, s.data->root, driverType);
    connect = xcb_dri2_connect_reply(scrn->conn, connect_cookie, NULL);
    if (connect == NULL || connect->driver_name_length + connect->device_name_length == 0)
       goto free_screen;