diff options
author | Dave Airlie <[email protected]> | 2013-07-25 13:31:26 +1000 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2013-07-26 08:42:00 +1000 |
commit | 19338157c97becac1e61cc51dc0904ddfab8e9da (patch) | |
tree | 2ade6516fb765de9a5d48a52eb013749b80d5b7e | |
parent | 0e9549e2bd57168086421468cbf1db0821c36730 (diff) |
gallium/vl: add prime support
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 <[email protected]>
Cc: [email protected]
Reviewed-by: Christian König <[email protected]>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=67283
Tested-by: Armin K. <[email protected]>
-rw-r--r-- | src/gallium/auxiliary/vl/vl_winsys_dri.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/gallium/auxiliary/vl/vl_winsys_dri.c b/src/gallium/auxiliary/vl/vl_winsys_dri.c index 88e17fefb8a..7aec3fee685 100644 --- a/src/gallium/auxiliary/vl/vl_winsys_dri.c +++ b/src/gallium/auxiliary/vl/vl_winsys_dri.c @@ -32,8 +32,10 @@ #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; |