[Mesa-dev] [PATCH] egl_dri2: fix EXT_image_dma_buf_import fds

Pekka Paalanen ppaalanen at gmail.com
Tue Aug 12 23:11:52 PDT 2014


On Wed, 13 Aug 2014 07:41:50 +0200
Gwenole Beauchesne <gb.devel at gmail.com> wrote:

> Hi,
> 
> 2014-08-08 16:28 GMT+02:00 Pekka Paalanen <ppaalanen at gmail.com>:
> > From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
> >
> > The EGL_EXT_image_dma_buf_import specification was revised (according to
> > its revision history) on Dec 5th, 2013, for EGL to not take ownership of
> > the file descriptors.
> >
> > Do not close the file descriptors passed in to eglCreateImageKHR with
> > EGL_LINUX_DMA_BUF_EXT target.
> >
> > It is assumed, that the drivers, which ultimately process the file
> > descriptors, do not close or modify them in any way either. This avoids
> > the need to dup(), as it seems we would only need to just close the
> > dup'd file descriptors right after.
> 
> Since this was a so radical change, shouldn't have change the API
> string name instead to EXT_image_dma_buf_import2 for instance?

It's like this in the Khronos registry, so how could I change the name?
That is, I can write the code, but I need to know that is actually
wanted and correct, and someone will do the same for the specs at
Khronos.

FWIW, when I wrote experimental dma_buf support in Weston, I was
reading the Khronos spec. I just made a temporary hack to briefly be
able to test on Mesa. And I know of a proprietary EGL implementation
that implements this like the new spec, not like Mesa.

I would like to consider this as just a Mesa bug, and a spec bug that
was already fixed.

> Anyway, could you please point to the following bug in your patch?
> https://bugs.freedesktop.org/show_bug.cgi?id=76188

Done, thanks for the pointer. I also commented on the bug.

After someone tells me whether or not I should add the stable CC's, I
can send a new version.


Thanks,
pq

> 
> Thanks.
> 
> > the corresponding Piglit fix has already been sent to the piglit mailing
> > list. Both this and that need to be applied to not regress Mesa' piglit run
> > by one test (ext_image_dma_buf_import-ownership_transfer).
> >
> > This patch fixes my test case on heavily modified Weston.
> >
> > Thanks,
> > pq
> > ---
> >  src/egl/drivers/dri2/egl_dri2.c | 37 ++++++-------------------------------
> >  1 file changed, 6 insertions(+), 31 deletions(-)
> >
> > diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
> > index 5602ec3..cd85fd3 100644
> > --- a/src/egl/drivers/dri2/egl_dri2.c
> > +++ b/src/egl/drivers/dri2/egl_dri2.c
> > @@ -1678,36 +1678,13 @@ dri2_check_dma_buf_format(const _EGLImageAttribs *attrs)
> >  /**
> >   * The spec says:
> >   *
> > - * "If eglCreateImageKHR is successful for a EGL_LINUX_DMA_BUF_EXT target,
> > - *  the EGL takes ownership of the file descriptor and is responsible for
> > - *  closing it, which it may do at any time while the EGLDisplay is
> > - *  initialized."
> > + * "If eglCreateImageKHR is successful for a EGL_LINUX_DMA_BUF_EXT target, the
> > + *  EGL will take a reference to the dma_buf(s) which it will release at any
> > + *  time while the EGLDisplay is initialized. It is the responsibility of the
> > + *  application to close the dma_buf file descriptors."
> > + *
> > + * Therefore we must never close or otherwise modify the file descriptors.
> >   */
> > -static void
> > -dri2_take_dma_buf_ownership(const int *fds, unsigned num_fds)
> > -{
> > -   int already_closed[num_fds];
> > -   unsigned num_closed = 0;
> > -   unsigned i, j;
> > -
> > -   for (i = 0; i < num_fds; ++i) {
> > -      /**
> > -       * The same file descriptor can be referenced multiple times in case more
> > -       * than one plane is found in the same buffer, just with a different
> > -       * offset.
> > -       */
> > -      for (j = 0; j < num_closed; ++j) {
> > -         if (already_closed[j] == fds[i])
> > -            break;
> > -      }
> > -
> > -      if (j == num_closed) {
> > -         close(fds[i]);
> > -         already_closed[num_closed++] = fds[i];
> > -      }
> > -   }
> > -}
> > -
> >  static _EGLImage *
> >  dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
> >                           EGLClientBuffer buffer, const EGLint *attr_list)
> > @@ -1770,8 +1747,6 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
> >        return EGL_NO_IMAGE_KHR;
> >
> >     res = dri2_create_image_from_dri(disp, dri_image);
> > -   if (res)
> > -      dri2_take_dma_buf_ownership(fds, num_fds);
> >
> >     return res;
> >  }
> > --
> > 1.8.5.5
> >
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 
> 
> Regards,



More information about the mesa-dev mailing list