Tom Stellard <tstel...@gmail.com> writes: > When X is running it is neccesary for pipe_loader to authenticate with > DRM, in order to be able to use the device. > > This makes it possible to run OpenCL programs while X is running. > > v2: > - Fix C++ style comments > - Drop Xlib-xcb dependency > - Close the X connection when done > - Split auth code into separate function
Thanks, Reviewed-by: Francisco Jerez <curroje...@riseup.net> > --- > configure.ac | 6 ++ > .../auxiliary/pipe-loader/pipe_loader_drm.c | 61 > ++++++++++++++++++++ > 2 files changed, 67 insertions(+), 0 deletions(-) > > diff --git a/configure.ac b/configure.ac > index 10216a3..35cc579 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -2084,6 +2084,12 @@ if test "x$enable_gallium_loader" = xyes; then > > if test "x$enable_gallium_drm_loader" = xyes; then > GALLIUM_PIPE_LOADER_DEFINES="$GALLIUM_PIPE_LOADER_DEFINES > -DHAVE_PIPE_LOADER_DRM" > + PKG_CHECK_MODULES([GALLIUM_PIPE_LOADER_XCB], [x11-xcb xcb-dri2], > + pipe_loader_have_xcb=yes, pipe_loader_have_xcb=no) > + if test "x$pipe_loader_have_xcb" = xyes; then > + GALLIUM_PIPE_LOADER_DEFINES="$GALLIUM_PIPE_LOADER_DEFINES > -DPIPE_LOADER_HAVE_XCB" > + GALLIUM_PIPE_LOADER_LIBS="$GALLIUM_PIPE_LOADER_LIBS > $GALLIUM_PIPE_LOADER_XCB_LIBS $LIBDRM_LIBS" > + fi > fi > > AC_SUBST([GALLIUM_PIPE_LOADER_DEFINES]) > diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c > b/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c > index 518f3da..64bd921 100644 > --- a/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c > +++ b/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c > @@ -35,6 +35,12 @@ > #include <libudev.h> > #include <xf86drm.h> > > +#ifdef PIPE_LOADER_HAVE_XCB > + > +#include <xcb/dri2.h> > + > +#endif > + > #include "state_tracker/drm_driver.h" > #include "pipe_loader_priv.h" > > @@ -127,6 +133,59 @@ find_drm_driver_name(struct pipe_loader_drm_device *ddev) > > static struct pipe_loader_ops pipe_loader_drm_ops; > > +static void > +pipe_loader_drm_x_auth(int fd) > +{ > +#if PIPE_LOADER_HAVE_XCB > + /* Try authenticate with the X server to give us access to devices that X > + * is running on. */ > + xcb_connection_t *xcb_conn; > + const xcb_setup_t *xcb_setup; > + xcb_screen_iterator_t s; > + xcb_dri2_connect_cookie_t connect_cookie; > + xcb_dri2_connect_reply_t *connect; > + drm_magic_t magic; > + xcb_dri2_authenticate_cookie_t authenticate_cookie; > + xcb_dri2_authenticate_reply_t *authenticate; > + > + xcb_conn = xcb_connect(NULL, NULL); > + > + if(!xcb_conn) > + return; > + > + xcb_setup = xcb_get_setup(xcb_conn); > + > + if (!xcb_setup) > + goto disconnect; > + > + s = xcb_setup_roots_iterator(xcb_setup); > + connect_cookie = xcb_dri2_connect_unchecked(xcb_conn, s.data->root, > + XCB_DRI2_DRIVER_TYPE_DRI); > + connect = xcb_dri2_connect_reply(xcb_conn, connect_cookie, NULL); > + > + if (!connect || connect->driver_name_length > + + connect->device_name_length == 0) { > + > + goto disconnect; > + } > + > + if (drmGetMagic(fd, &magic)) > + goto disconnect; > + > + authenticate_cookie = xcb_dri2_authenticate_unchecked(xcb_conn, > + s.data->root, > + magic); > + authenticate = xcb_dri2_authenticate_reply(xcb_conn, > + authenticate_cookie, > + NULL); > + FREE(authenticate); > + > +disconnect: > + xcb_disconnect(xcb_conn); > + > +#endif > +} > + > boolean > pipe_loader_drm_probe_fd(struct pipe_loader_device **dev, int fd) > { > @@ -136,6 +195,8 @@ pipe_loader_drm_probe_fd(struct pipe_loader_device **dev, > int fd) > ddev->base.ops = &pipe_loader_drm_ops; > ddev->fd = fd; > > + pipe_loader_drm_x_auth(fd); > + > if (!find_drm_pci_id(ddev)) > goto fail;
pgpLkZHmxVcIZ.pgp
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev