[prev in list] [next in list] [prev in thread] [next in thread] 

List:       mesa3d-dev
Subject:    Re: [Mesa-dev] [PATCH 2/2] pipe-loader: Add support for render nodes v2
From:       Tom Stellard <tom () stellard ! net>
Date:       2014-01-31 20:58:00
Message-ID: 20140131205800.GC21981 () freedesktop ! org
[Download RAW message or body]

On Thu, Jan 30, 2014 at 10:16:41PM +0000, Emil Velikov wrote:
> On 27/01/14 16:13, Tom Stellard wrote:
> > From: Tom Stellard <thomas.stellard@amd.com>
> > 
> > v2:
> > - Add missing call to pipe_loader_drm_release()
> > - Fix render node macros
> > - Drop render-node configure option
> > ---
> > 
> > For reference, version 1 of this patch:
> > http://lists.freedesktop.org/archives/mesa-dev/2013-October/047296.html
> > 
> > .../auxiliary/pipe-loader/pipe_loader_drm.c        | 80 +++++++++++++++++++++-
> > 1 file changed, 77 insertions(+), 3 deletions(-)
> > 
> > diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c \
> > b/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c index 9484db8..7a1af91 \
> >                 100644
> > --- a/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
> > +++ b/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
> > @@ -49,6 +49,11 @@
> > #include "util/u_dl.h"
> > #include "util/u_debug.h"
> > 
> > +#define DRM_RENDER_NODE_DEV_NAME_FORMAT "%s/renderD%d"
> > +#define DRM_RENDER_NODE_MAX_NODES 63
> > +#define DRM_RENDER_NODE_MIN_MINOR 128
> > +#define DRM_RENDER_NODE_MAX_MINOR (DRM_RENDER_NODE_MIN_MINOR + \
> > DRM_RENDER_NODE_MAX_NODES) +
> Hello gents,
> Slightly silly question here, so plese be gentle. Shouldn't the above
> defines come from a libdrm header ?
> 
> Similar to the following (from xf86drm.h)
> 
> #define DRM_DIR_NAME  "/dev/dri"
> #define DRM_DEV_NAME  "%s/card%d"
> #define DRM_CONTROL_DEV_NAME  "%s/controlD%d"
> 
> -Emil

I'm not sure about this, maybe David has an opinion.

-Tom

> 
> > struct pipe_loader_drm_device {
> > struct pipe_loader_device base;
> > struct util_dl_library *lib;
> > @@ -152,18 +157,87 @@ open_drm_minor(int minor)
> > return open(path, O_RDWR, 0);
> > }
> > 
> > +static int
> > +open_drm_render_node_minor(int minor)
> > +{
> > +   char path[PATH_MAX];
> > +   snprintf(path, sizeof(path), DRM_RENDER_NODE_DEV_NAME_FORMAT, DRM_DIR_NAME,
> > +            minor);
> > +   return open(path, O_RDWR, 0);
> > +}
> > +
> > int
> > pipe_loader_drm_probe(struct pipe_loader_device **devs, int ndev)
> > {
> > -   int i, j, fd;
> > +   int i, k, fd, num_render_node_devs;
> > +   int j = 0;
> > +
> > +   struct {
> > +      unsigned vendor_id;
> > +      unsigned chip_id;
> > +   } render_node_devs[DRM_RENDER_NODE_MAX_NODES];
> > +
> > +   /* Look for render nodes first */
> > +   for (i = DRM_RENDER_NODE_MIN_MINOR, j = 0;
> > +        i <= DRM_RENDER_NODE_MAX_MINOR; i++) {
> > +      fd = open_drm_render_node_minor(i);
> > +      struct pipe_loader_device *dev;
> > +      if (fd < 0)
> > +         continue;
> > 
> > -   for (i = 0, j = 0; i < DRM_MAX_MINOR; i++) {
> > +      if (!pipe_loader_drm_probe_fd(&dev, fd, false)) {
> > +         close(fd);
> > +         continue;
> > +      }
> > +
> > +      render_node_devs[j].vendor_id = dev->u.pci.vendor_id;
> > +      render_node_devs[j].chip_id = dev->u.pci.chip_id;
> > +
> > +      if (j < ndev) {
> > +         devs[j] = dev;
> > +      } else {
> > +         close(fd);
> > +         dev->ops->release(&dev);
> > +      }
> > +      j++;
> > +   }
> > +
> > +   num_render_node_devs = j;
> > +
> > +   /* Next look for drm devices. */
> > +   for (i = 0; i < DRM_MAX_MINOR; i++) {
> > +      struct pipe_loader_device *dev;
> > +      boolean duplicate = FALSE;
> > fd = open_drm_minor(i);
> > if (fd < 0)
> > continue;
> > 
> > -      if (j >= ndev || !pipe_loader_drm_probe_fd(&devs[j], fd, true))
> > +      if (!pipe_loader_drm_probe_fd(&dev, fd, true)) {
> > close(fd);
> > +         continue;
> > +      }
> > +
> > +      /* Check to make sure we aren't already accessing this device via
> > +       * render nodes.
> > +       */
> > +      for (k = 0; k < num_render_node_devs; k++) {
> > +         if (dev->u.pci.vendor_id == render_node_devs[k].vendor_id &&
> > +             dev->u.pci.chip_id == render_node_devs[k].chip_id) {
> > +            close(fd);
> > +            dev->ops->release(&dev);
> > +            duplicate = TRUE;
> > +            break;
> > +         }
> > +      }
> > +
> > +      if (duplicate)
> > +         continue;
> > +
> > +      if (j < ndev) {
> > +         devs[j] = dev;
> > +      } else {
> > +         dev->ops->release(&dev);
> > +      }
> > 
> > j++;
> > }
> > 
> 
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic