From: Dave Airlie <airl...@redhat.com> This is just a simple implementation that stores the extra values into the DRIimage struct and just uses the fd importer. I haven't looked into what is required to import YUV or deal with the extra parameters.
Signed-off-by: Dave Airlie <airl...@redhat.com> --- src/gallium/state_trackers/dri/common/dri_screen.h | 9 ++++ src/gallium/state_trackers/dri/drm/dri2.c | 50 +++++++++++++++++++++- 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/gallium/state_trackers/dri/common/dri_screen.h b/src/gallium/state_trackers/dri/common/dri_screen.h index f263a90..7c8e582 100644 --- a/src/gallium/state_trackers/dri/common/dri_screen.h +++ b/src/gallium/state_trackers/dri/common/dri_screen.h @@ -95,6 +95,15 @@ struct __DRIimageRec { uint32_t dri_components; void *loader_private; + + /** + * Provided by EGL_EXT_image_dma_buf_import. + */ + enum __DRIYUVColorSpace yuv_color_space; + enum __DRISampleRange sample_range; + enum __DRIChromaSiting horizontal_siting; + enum __DRIChromaSiting vertical_siting; + }; #ifndef __NOT_HAVE_DRM_H diff --git a/src/gallium/state_trackers/dri/drm/dri2.c b/src/gallium/state_trackers/dri/drm/dri2.c index 2d713aa..2ffaf34 100644 --- a/src/gallium/state_trackers/dri/drm/dri2.c +++ b/src/gallium/state_trackers/dri/drm/dri2.c @@ -972,6 +972,52 @@ dri2_from_fds(__DRIscreen *screen, int width, int height, int fourcc, return img; } +static __DRIimage * +dri2_from_dma_bufs(__DRIscreen *screen, + int width, int height, int fourcc, + int *fds, int num_fds, + int *strides, int *offsets, + enum __DRIYUVColorSpace yuv_color_space, + enum __DRISampleRange sample_range, + enum __DRIChromaSiting horizontal_siting, + enum __DRIChromaSiting vertical_siting, + unsigned *error, + void *loaderPrivate) +{ + __DRIimage *img; + int format, stride, dri_components; + + if (num_fds != 1 || offsets[0] != 0) { + *error = __DRI_IMAGE_ERROR_BAD_MATCH; + return NULL; + } + + format = convert_fourcc(fourcc, &dri_components); + if (format == -1) { + *error = __DRI_IMAGE_ERROR_BAD_MATCH; + return NULL; + } + + /* Strides are in bytes not pixels. */ + stride = strides[0] /4; + + img = dri2_create_image_from_fd(screen, width, height, format, + fds[0], stride, loaderPrivate); + if (img == NULL) { + *error = __DRI_IMAGE_ERROR_BAD_ALLOC; + return NULL; + } + + img->yuv_color_space = yuv_color_space; + img->sample_range = sample_range; + img->horizontal_siting = horizontal_siting; + img->vertical_siting = vertical_siting; + img->dri_components = dri_components; + + *error = __DRI_IMAGE_ERROR_SUCCESS; + return img; +} + static void dri2_destroy_image(__DRIimage *img) { @@ -1041,8 +1087,10 @@ dri2_init_screen(__DRIscreen * sPriv) } if (dmabuf_ret && dmabuf_ret->val.val_bool) { - dri2ImageExtension.base.version = 7; + dri2ImageExtension.base.version = 8; dri2ImageExtension.createImageFromFds = dri2_from_fds; + dri2ImageExtension.createImageFromDmaBufs = dri2_from_dma_bufs; + } sPriv->extensions = dri_screen_extensions; -- 1.8.3.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev