From: Pekka Paalanen Date: Tue, 30 May 2017 11:53:35 +0000 (+0530) Subject: egl/main: add support for fourth plane tokens X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fb2a1c2327bef00014210097e7e805247f37b33d;p=mesa.git egl/main: add support for fourth plane tokens The EGL_EXT_dma_buf_import_modifiers extension adds support for a fourth plane, just like DRM KMS API does. Bump maximum dma_buf plane count to four. v2: prevent attribute tokens from being parsed if EXT_image_dma_buf_import_modifiers is not suported. (Emil Velikov) Signed-off-by: Pekka Paalanen Signed-off-by: Varad Gautam Reviewed-by: Eric Engestrom Reviewed-by: Daniel Stone --- diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index a2c9e417cc0..8f0f1b323a7 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -2090,7 +2090,7 @@ dri2_check_dma_buf_format(const _EGLImageAttribs *attrs) * "If is EGL_LINUX_DMA_BUF_EXT, and the EGL_LINUX_DRM_FOURCC_EXT * attribute indicates a single-plane format, EGL_BAD_ATTRIBUTE is * generated if any of the EGL_DMA_BUF_PLANE1_* or EGL_DMA_BUF_PLANE2_* - * attributes are specified." + * or EGL_DMA_BUF_PLANE3_* attributes are specified." */ for (i = plane_n; i < DMA_BUF_MAX_PLANES; ++i) { if (attrs->DMABufPlaneFds[i].IsPresent || diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h index 4d3d96e1749..9685bed360c 100644 --- a/src/egl/main/egldisplay.h +++ b/src/egl/main/egldisplay.h @@ -102,6 +102,7 @@ struct _egl_extensions EGLBoolean EXT_buffer_age; EGLBoolean EXT_create_context_robustness; EGLBoolean EXT_image_dma_buf_import; + EGLBoolean EXT_image_dma_buf_import_modifiers; EGLBoolean EXT_swap_buffers_with_damage; EGLBoolean KHR_cl_event2; diff --git a/src/egl/main/eglimage.c b/src/egl/main/eglimage.c index d062cbfe014..fed390a4982 100644 --- a/src/egl/main/eglimage.c +++ b/src/egl/main/eglimage.c @@ -130,6 +130,24 @@ _eglParseImageAttribList(_EGLImageAttribs *attrs, _EGLDisplay *dpy, attrs->DMABufPlanePitches[2].Value = val; attrs->DMABufPlanePitches[2].IsPresent = EGL_TRUE; break; + case EGL_DMA_BUF_PLANE3_FD_EXT: + if (!dpy->Extensions.EXT_image_dma_buf_import_modifiers) + err = EGL_BAD_PARAMETER; + attrs->DMABufPlaneFds[3].Value = val; + attrs->DMABufPlaneFds[3].IsPresent = EGL_TRUE; + break; + case EGL_DMA_BUF_PLANE3_OFFSET_EXT: + if (!dpy->Extensions.EXT_image_dma_buf_import_modifiers) + err = EGL_BAD_PARAMETER; + attrs->DMABufPlaneOffsets[3].Value = val; + attrs->DMABufPlaneOffsets[3].IsPresent = EGL_TRUE; + break; + case EGL_DMA_BUF_PLANE3_PITCH_EXT: + if (!dpy->Extensions.EXT_image_dma_buf_import_modifiers) + err = EGL_BAD_PARAMETER; + attrs->DMABufPlanePitches[3].Value = val; + attrs->DMABufPlanePitches[3].IsPresent = EGL_TRUE; + break; case EGL_YUV_COLOR_SPACE_HINT_EXT: if (val != EGL_ITU_REC601_EXT && val != EGL_ITU_REC709_EXT && val != EGL_ITU_REC2020_EXT) { diff --git a/src/egl/main/eglimage.h b/src/egl/main/eglimage.h index 9a75d0c9537..a909d9b5889 100644 --- a/src/egl/main/eglimage.h +++ b/src/egl/main/eglimage.h @@ -46,7 +46,7 @@ struct _egl_image_attrib_int EGLBoolean IsPresent; }; -#define DMA_BUF_MAX_PLANES 3 +#define DMA_BUF_MAX_PLANES 4 struct _egl_image_attribs { @@ -67,7 +67,8 @@ struct _egl_image_attribs /* EGL_WL_bind_wayland_display */ EGLint PlaneWL; - /* EGL_EXT_image_dma_buf_import */ + /* EGL_EXT_image_dma_buf_import and + * EGL_EXT_image_dma_buf_import_modifiers */ struct _egl_image_attrib_int DMABufFourCC; struct _egl_image_attrib_int DMABufPlaneFds[DMA_BUF_MAX_PLANES]; struct _egl_image_attrib_int DMABufPlaneOffsets[DMA_BUF_MAX_PLANES];