From: Varad Gautam <varad.gau...@collabora.com> support importing dmabufs into DRIimage taking format modifiers in account, as per DRIimage extension version 14.
Signed-off-by: Varad Gautam <varad.gau...@collabora.com> --- src/gallium/include/state_tracker/drm_driver.h | 2 ++ src/gallium/state_trackers/dri/dri2.c | 45 +++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/gallium/include/state_tracker/drm_driver.h b/src/gallium/include/state_tracker/drm_driver.h index c80fb09..8b9d6bc 100644 --- a/src/gallium/include/state_tracker/drm_driver.h +++ b/src/gallium/include/state_tracker/drm_driver.h @@ -45,6 +45,8 @@ struct winsys_handle * Output for texture_get_handle. */ unsigned offset; + + uint64_t modifier; }; diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c index 9ec069b..a2b87a7 100644 --- a/src/gallium/state_trackers/dri/dri2.c +++ b/src/gallium/state_trackers/dri/dri2.c @@ -884,7 +884,7 @@ static __DRIimage * dri2_create_image_from_fd(__DRIscreen *_screen, int width, int height, int fourcc, int *fds, int num_fds, int *strides, - int *offsets, unsigned *error, + int *offsets, uint64_t *modifiers, unsigned *error, int *dri_components, void *loaderPrivate) { struct winsys_handle whandles[3]; @@ -929,6 +929,8 @@ dri2_create_image_from_fd(__DRIscreen *_screen, whandles[i].handle = (unsigned)fds[i]; whandles[i].stride = (unsigned)strides[i]; whandles[i].offset = (unsigned)offsets[i]; + if (modifiers) + whandles[i].modifier = modifiers[i]; } if (fourcc == __DRI_IMAGE_FOURCC_YVU420) { @@ -1248,7 +1250,7 @@ dri2_from_fds(__DRIscreen *screen, int width, int height, int fourcc, int dri_components; img = dri2_create_image_from_fd(screen, width, height, fourcc, - fds, num_fds, strides, offsets, NULL, + fds, num_fds, strides, offsets, NULL, NULL, &dri_components, loaderPrivate); if (img == NULL) return NULL; @@ -1273,7 +1275,7 @@ dri2_from_dma_bufs(__DRIscreen *screen, int dri_components; img = dri2_create_image_from_fd(screen, width, height, fourcc, - fds, num_fds, strides, offsets, error, + fds, num_fds, strides, offsets, NULL, error, &dri_components, loaderPrivate); if (img == NULL) return NULL; @@ -1288,6 +1290,38 @@ dri2_from_dma_bufs(__DRIscreen *screen, return img; } +static __DRIimage * +dri2_from_dma_bufs2(__DRIscreen *screen, + int width, int height, int fourcc, + int *fds, int num_fds, + int *strides, int *offsets, + uint64_t *modifiers, + enum __DRIYUVColorSpace yuv_color_space, + enum __DRISampleRange sample_range, + enum __DRIChromaSiting horizontal_siting, + enum __DRIChromaSiting vertical_siting, + unsigned *error, + void *loaderPrivate) +{ + __DRIimage *img; + int dri_components; + + img = dri2_create_image_from_fd(screen, width, height, fourcc, + fds, num_fds, strides, offsets, modifiers, + error, &dri_components, loaderPrivate); + if (img == NULL) + 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_blit_image(__DRIcontext *context, __DRIimage *dst, __DRIimage *src, int dstx0, int dsty0, int dstwidth, int dstheight, @@ -1391,7 +1425,7 @@ dri2_get_capabilities(__DRIscreen *_screen) /* The extension is modified during runtime if DRI_PRIME is detected */ static __DRIimageExtension dri2ImageExtension = { - .base = { __DRI_IMAGE, 12 }, + .base = { __DRI_IMAGE, 14 }, .createImageFromName = dri2_create_image_from_name, .createImageFromRenderbuffer = dri2_create_image_from_renderbuffer, @@ -1409,6 +1443,7 @@ static __DRIimageExtension dri2ImageExtension = { .getCapabilities = dri2_get_capabilities, .mapImage = dri2_map_image, .unmapImage = dri2_unmap_image, + .createImageFromDmaBufs2 = NULL, }; @@ -1902,6 +1937,7 @@ dri2_init_screen(__DRIscreen * sPriv) (cap & DRM_PRIME_CAP_IMPORT)) { dri2ImageExtension.createImageFromFds = dri2_from_fds; dri2ImageExtension.createImageFromDmaBufs = dri2_from_dma_bufs; + dri2ImageExtension.createImageFromDmaBufs2 = dri2_from_dma_bufs2; } } @@ -1974,6 +2010,7 @@ dri_kms_init_screen(__DRIscreen * sPriv) (cap & DRM_PRIME_CAP_IMPORT)) { dri2ImageExtension.createImageFromFds = dri2_from_fds; dri2ImageExtension.createImageFromDmaBufs = dri2_from_dma_bufs; + dri2ImageExtension.createImageFromDmaBufs2 = dri2_from_dma_bufs2; } sPriv->extensions = dri_screen_extensions; -- 2.6.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev