Add EGL_DRM_BUFFER_OFFSET_MESA to specify an offset (in bytes) relative to the start of the DRM buffer. Likewise, add an EGL_DRM_BUFFER_PLANE_ID_MESA attribute to specify (name) a plane identifier associated with the generated image.
Add new image formats: - EGL_DRM_BUFFER_FORMAT_R8_MESA: 8-bit red - EGL_DRM_BUFFER_FORMAT_RG8_MESA: 8-bit red + green Add picture structure information: - EGL_DRM_BUFFER_STRUCTURE_TOP_FIELD: interlaced picture, top field - EGL_DRM_BUFFER_STRUCTURE_BOTTOM_FIELD: interlaced picture, bottom field - EGL_DRM_BUFFER_STRUCTURE_FRAME: whole picture --- docs/MESA_drm_image.spec | 11 +++++++++++ include/EGL/eglmesaext.h | 26 ++++++++++++++++++++++++++ src/egl/drivers/dri2/egl_dri2.c | 37 ++++++++++++++++++++++++++++++++----- src/egl/main/eglimage.c | 10 ++++++++++ src/egl/main/eglimage.h | 3 +++ 5 files changed, 82 insertions(+), 5 deletions(-) diff --git a/docs/MESA_drm_image.spec b/docs/MESA_drm_image.spec index 1150a4c..a54476a 100644 --- a/docs/MESA_drm_image.spec +++ b/docs/MESA_drm_image.spec @@ -61,6 +61,8 @@ New Tokens Accepted as values for the EGL_IMAGE_FORMAT_MESA attribute: EGL_DRM_BUFFER_FORMAT_ARGB32_MESA 0x31D2 + EGL_DRM_BUFFER_FORMAT_R8_MESA 0x8229 + EGL_DRM_BUFFER_FORMAT_RG8_MESA 0x822B Bits accepted in EGL_DRM_BUFFER_USE_MESA: @@ -76,6 +78,15 @@ New Tokens EGL_DRM_BUFFER_STRIDE_MESA 0x31D4 EGL_DRM_BUFFER_FORMAT_MESA 0x31D0 + EGL_DRM_BUFFER_PLANE_ID_MESA 0x31D5 + EGL_DRM_BUFFER_OFFSET_MESA 0x31D6 + EGL_DRM_BUFFER_STRUCTURE_MESA 0x31D7 + + Accepted as values for the EGL_DRM_BUFFER_STRUCTURE_MESA attribute: + + EGL_DRM_BUFFER_STRUCTURE_TOP_FIELD 0x0001 + EGL_DRM_BUFFER_STRUCTURE_BOTTOM_FIELD 0x0002 + EGL_DRM_BUFFER_STRUCTURE_FRAME 0x0003 Additions to the EGL 1.4 Specification: diff --git a/include/EGL/eglmesaext.h b/include/EGL/eglmesaext.h index 52dd5b1..202c3fc 100644 --- a/include/EGL/eglmesaext.h +++ b/include/EGL/eglmesaext.h @@ -104,6 +104,32 @@ typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETDRMDISPLAYMESA) (int fd); #ifdef EGL_MESA_drm_image /* Mesa's extension to EGL_MESA_drm_image... */ +#ifndef EGL_DRM_BUFFER_PLANE_ID_MESA +#define EGL_DRM_BUFFER_PLANE_ID_MESA 0x31D6 +#endif +#ifndef EGL_DRM_BUFFER_OFFSET_MESA +#define EGL_DRM_BUFFER_OFFSET_MESA 0x31D7 +#endif +#ifndef EGL_DRM_BUFFER_STRUCTURE_MESA +#define EGL_DRM_BUFFER_STRUCTURE_MESA 0x31D8 +#endif +/* EGL_DRM_BUFFER_FORMAT_MESA attribute values */ +#ifndef EGL_DRM_BUFFER_FORMAT_R8_MESA +#define EGL_DRM_BUFFER_FORMAT_R8_MESA 0x8229 /* 8-bit red */ +#endif +#ifndef EGL_DRM_BUFFER_FORMAT_RG8_MESA +#define EGL_DRM_BUFFER_FORMAT_RG8_MESA 0x822B /* 8-bit red + green */ +#endif +/* EGL_DRM_BUFFER_STRUCTURE_MESA attribute values */ +#ifndef EGL_DRM_BUFFER_STRUCTURE_TOP_FIELD +#define EGL_DRM_BUFFER_STRUCTURE_TOP_FIELD 0x0001 /* Interlaced, top field */ +#endif +#ifndef EGL_DRM_BUFFER_STRUCTURE_BOTTOM_FIELD +#define EGL_DRM_BUFFER_STRUCTURE_BOTTOM_FIELD 0x0002 /* Interlaced, bottom field */ +#endif +#ifndef EGL_DRM_BUFFER_STRUCTURE_FRAME +#define EGL_DRM_BUFFER_STRUCTURE_FRAME 0x0003 /* Whole Picture */ +#endif #ifndef EGL_DRM_BUFFER_USE_CURSOR_MESA #define EGL_DRM_BUFFER_USE_CURSOR_MESA 0x0004 #endif diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index c4d4f2f..755fb49 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -1010,6 +1010,25 @@ dri2_invoke_create_image_from_name(struct dri2_egl_display *dpy, attrs->pitch, user_data); } +static unsigned int +dri2_image_get_picture_structure(uint32_t egl_picture_structure) +{ + unsigned int picture_structure; + + switch (egl_picture_structure) { + case EGL_DRM_BUFFER_STRUCTURE_TOP_FIELD: + picture_structure = __DRI_IMAGE_STRUCTURE_TOP_FIELD; + break; + case EGL_DRM_BUFFER_STRUCTURE_BOTTOM_FIELD: + picture_structure = __DRI_IMAGE_STRUCTURE_BOTTOM_FIELD; + break; + default: + picture_structure = __DRI_IMAGE_STRUCTURE_FRAME; + break; + } + return picture_structure; +} + static _EGLImage * dri2_create_image_drm_name(_EGLDisplay *disp, _EGLContext *ctx, EGLint name, @@ -1034,15 +1053,15 @@ dri2_create_image_drm_name(_EGLDisplay *disp, _EGLContext *ctx, return NULL; } - imageAttrs.plane_id = 0; + imageAttrs.plane_id = attrs->PlaneId; imageAttrs.format = format; imageAttrs.width = attrs->Width; imageAttrs.height = attrs->Height; imageAttrs.pitch = pitch; - imageAttrs.structure = __DRI_IMAGE_STRUCTURE_FRAME; + imageAttrs.structure = dri2_image_get_picture_structure(attrs->DRMBufferStructureMESA); dri2_img->dri_image = dri2_invoke_create_image_from_name( dri2_dpy, - name, 0, + name, attrs->DRMBufferOffsetMESA, &imageAttrs, dri2_img ); if (dri2_img->dri_image == NULL) { @@ -1067,9 +1086,10 @@ dri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx, return NULL; if (attrs.Width <= 0 || attrs.Height <= 0 || - attrs.DRMBufferStrideMESA <= 0) { + attrs.DRMBufferStrideMESA <= 0 || + attrs.DRMBufferOffsetMESA < 0) { _eglError(EGL_BAD_PARAMETER, - "bad width, height or stride"); + "bad width, height, stride or offset"); return NULL; } @@ -1079,6 +1099,13 @@ dri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx, format = __DRI_IMAGE_FORMAT_ARGB8888; pitch /= 4; break; + case EGL_DRM_BUFFER_FORMAT_R8_MESA: + format = __DRI_IMAGE_FORMAT_R8; + break; + case EGL_DRM_BUFFER_FORMAT_RG8_MESA: + format = __DRI_IMAGE_FORMAT_RG88; + pitch /= 2; + break; default: _eglError(EGL_BAD_PARAMETER, "dri2_create_image_khr: unsupported pixmap depth"); diff --git a/src/egl/main/eglimage.c b/src/egl/main/eglimage.c index 1174d0a..96d5bee 100644 --- a/src/egl/main/eglimage.c +++ b/src/egl/main/eglimage.c @@ -49,6 +49,7 @@ _eglParseImageAttribList(_EGLImageAttribs *attrs, _EGLDisplay *dpy, attrs->ImagePreserved = EGL_FALSE; attrs->GLTextureLevel = 0; attrs->GLTextureZOffset = 0; + attrs->DRMBufferStructureMESA = EGL_DRM_BUFFER_STRUCTURE_FRAME; if (!attrib_list) return err; @@ -87,6 +88,15 @@ _eglParseImageAttribList(_EGLImageAttribs *attrs, _EGLDisplay *dpy, case EGL_DRM_BUFFER_STRIDE_MESA: attrs->DRMBufferStrideMESA = val; break; + case EGL_DRM_BUFFER_PLANE_ID_MESA: + attrs->PlaneId = val; + break; + case EGL_DRM_BUFFER_OFFSET_MESA: + attrs->DRMBufferOffsetMESA = val; + break; + case EGL_DRM_BUFFER_STRUCTURE_MESA: + attrs->DRMBufferStructureMESA = val; + break; default: /* unknown attrs are ignored */ diff --git a/src/egl/main/eglimage.h b/src/egl/main/eglimage.h index acb36aa..646e499 100644 --- a/src/egl/main/eglimage.h +++ b/src/egl/main/eglimage.h @@ -47,9 +47,12 @@ struct _egl_image_attribs /* EGL_MESA_drm_image */ EGLint Width; EGLint Height; + EGLint PlaneId; EGLint DRMBufferFormatMESA; EGLint DRMBufferUseMESA; EGLint DRMBufferStrideMESA; + EGLint DRMBufferOffsetMESA; + EGLint DRMBufferStructureMESA; }; /** -- 1.7.5.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev