On 28 April 2016 at 21:37, Rob Herring <[email protected]> wrote: > Add support for creating images from Android native buffers with dma-buf > fd. As dma-buf support also requires DRI image loader extension, add > that as well. > > This is based on several originally patches written by Varad Gautam. > I've collapsed them into logical changes and done a bit of reformatting. > Using dma-bufs vs. GEM handles is now a runtime decision similar to the > wayland EGL instead of being compile time selection. The dma-buf support > is also re-written to use common dri2_create_image_dma_buf function in > egl_dri2.c. > > Cc: Varad Gautam <[email protected]> > Cc: Rob Clark <[email protected]> > Cc: Emil Velikov <[email protected]> > Signed-off-by: Rob Herring <[email protected]> > --- > src/egl/drivers/dri2/platform_android.c | 124 > ++++++++++++++++++++++++++++++-- > 1 file changed, 117 insertions(+), 7 deletions(-) > > diff --git a/src/egl/drivers/dri2/platform_android.c > b/src/egl/drivers/dri2/platform_android.c > index a922f01..9747338 100644 > --- a/src/egl/drivers/dri2/platform_android.c > +++ b/src/egl/drivers/dri2/platform_android.c > @@ -65,6 +65,19 @@ get_format_bpp(int native) > return bpp; > } > > +/* createImageFromFds requires fourcc format */ > +static int get_fourcc(int format) > +{ > + switch(format) { > + case __DRI_IMAGE_FORMAT_RGB565: return __DRI_IMAGE_FOURCC_RGB565; > + case __DRI_IMAGE_FORMAT_ARGB8888: return __DRI_IMAGE_FOURCC_ARGB8888; > + case __DRI_IMAGE_FORMAT_XRGB8888: return __DRI_IMAGE_FOURCC_XRGB8888; > + case __DRI_IMAGE_FORMAT_ABGR8888: return __DRI_IMAGE_FOURCC_ABGR8888; > + case __DRI_IMAGE_FORMAT_XBGR8888: return __DRI_IMAGE_FOURCC_XBGR8888; > + } > + return -1; > +} > + > static int get_format(int format) > { > switch (format) { > @@ -80,6 +93,18 @@ static int get_format(int format) > return -1; > } > static int > +get_native_buffer_fd(struct ANativeWindowBuffer *buf) > +{ > + native_handle_t *handle = (native_handle_t *)buf->handle; > + /* > + * Various gralloc implementations exist, but the dma-buf fd tends > + * to be first. Access it directly to avoid a dependency on specific > + * gralloc versions. > + */ > + return (handle && handle->numFds) ? handle->data[0] : -1; > +} > + > +static int > get_native_buffer_name(struct ANativeWindowBuffer *buf) > { > return gralloc_drm_get_gem_handle(buf->handle); > @@ -333,6 +358,66 @@ update_buffers(struct dri2_egl_surface *dri2_surf) > return 0; > } > > +static int > +get_back_bo(struct dri2_egl_surface *dri2_surf) > +{ > + struct dri2_egl_display *dri2_dpy = > + dri2_egl_display(dri2_surf->base.Resource.Display); > + int format, stride; > + int offset = 0, fd; > + > + if (!dri2_surf->buffer) > + return -1; > + > + fd = get_native_buffer_fd(dri2_surf->buffer); > + if (fd < 0) > + return -1; > + > + format = get_format(dri2_surf->buffer->format); > + > + stride = dri2_surf->buffer->stride * > + get_format_bpp(dri2_surf->buffer->format); > + > + dri2_surf->dri_image = > + dri2_dpy->image->createImageFromFds(dri2_dpy->dri_screen, > + dri2_surf->base.Width, > + dri2_surf->base.Height, > + get_fourcc(format), And similar goes here for get_fourcc(), get_format_bpp() and get_format()
Thanks Emil _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
