[Mesa-dev] [PATCH] pipe_loader: Try to connect with the X server before probing pciids v2

Francisco Jerez currojerez at riseup.net
Wed Jul 18 09:35:27 PDT 2012


Tom Stellard <tstellar at 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 <currojerez at 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;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 229 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20120718/ab587aa8/attachment.pgp>


More information about the mesa-dev mailing list