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 - EGL_DRM_BUFFER_FORMAT_L8_MESA: 8-bit luminance - EGL_DRM_BUFFER_FORMAT_LA8_MESA: 8-bit luminance + alpha 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 | 13 +++++++++++ include/EGL/eglext.h | 10 ++++++++ src/egl/drivers/dri2/egl_dri2.c | 44 ++++++++++++++++++++++++++++++++++---- src/egl/main/eglimage.c | 10 ++++++++ src/egl/main/eglimage.h | 3 ++ 5 files changed, 75 insertions(+), 5 deletions(-) diff --git a/docs/MESA_drm_image.spec b/docs/MESA_drm_image.spec index 1150a4c..5b4c609 100644 --- a/docs/MESA_drm_image.spec +++ b/docs/MESA_drm_image.spec @@ -61,6 +61,10 @@ 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 + EGL_DRM_BUFFER_FORMAT_L8_MESA 0x1909 + EGL_DRM_BUFFER_FORMAT_LA8_MESA 0x190A Bits accepted in EGL_DRM_BUFFER_USE_MESA: @@ -76,6 +80,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/eglext.h b/include/EGL/eglext.h index a7ea2ea..b5c2b40 100644 --- a/include/EGL/eglext.h +++ b/include/EGL/eglext.h @@ -274,6 +274,16 @@ typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPIXMAPSURFACEHIPROC) (EGLDisplay dp #define EGL_DRM_BUFFER_FORMAT_ARGB32_MESA 0x31D2 /* EGL_IMAGE_FORMAT_MESA attribute value */ #define EGL_DRM_BUFFER_MESA 0x31D3 /* eglCreateImageKHR target */ #define EGL_DRM_BUFFER_STRIDE_MESA 0x31D4 +#define EGL_DRM_BUFFER_PLANE_ID_MESA 0x31D5 +#define EGL_DRM_BUFFER_OFFSET_MESA 0x31D6 +#define EGL_DRM_BUFFER_STRUCTURE_MESA 0x31D7 +#define EGL_DRM_BUFFER_FORMAT_R8_MESA 0x8229 /* EGL_IMAGE_FORMAT_MESA attribute value (8-bit red) */ +#define EGL_DRM_BUFFER_FORMAT_RG8_MESA 0x822B /* EGL_IMAGE_FORMAT_MESA attribute value (8-bit red + green) */ +#define EGL_DRM_BUFFER_FORMAT_L8_MESA 0x1909 /* EGL_IMAGE_FORMAT_MESA attribute value (8-bit luminance) */ +#define EGL_DRM_BUFFER_FORMAT_LA8_MESA 0x190A /* EGL_IMAGE_FORMAT_MESA attribute value (8-bit luminance + alpha) */ +#define EGL_DRM_BUFFER_STRUCTURE_TOP_FIELD 0x0001 /* EGL_DRM_BUFFER_STRUCTURE_MESA attribute value (interlaced, top field) */ +#define EGL_DRM_BUFFER_STRUCTURE_BOTTOM_FIELD 0x0002 /* EGL_DRM_BUFFER_STRUCTURE_MESA attribute value (interlaced, bottom field) */ +#define EGL_DRM_BUFFER_STRUCTURE_FRAME 0x0003 /* EGL_DRM_BUFFER_STRUCTURE_MESA attribute value (whole picture) */ #define EGL_DRM_BUFFER_USE_SCANOUT_MESA 0x00000001 /* EGL_DRM_BUFFER_USE_MESA bits */ #define EGL_DRM_BUFFER_USE_SHARE_MESA 0x00000002 /* EGL_DRM_BUFFER_USE_MESA bits */ #ifdef EGL_EGLEXT_PROTOTYPES diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index c4d4f2f..016f539 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->DRMBufferPlaneIdMESA; 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,20 @@ 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; + case EGL_DRM_BUFFER_FORMAT_L8_MESA: + format = __DRI_IMAGE_FORMAT_L8; + break; + case EGL_DRM_BUFFER_FORMAT_LA8_MESA: + format = __DRI_IMAGE_FORMAT_LA88; + 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..02a3706 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->DRMBufferPlaneIdMESA = 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..5f9ede1 100644 --- a/src/egl/main/eglimage.h +++ b/src/egl/main/eglimage.h @@ -50,6 +50,9 @@ struct _egl_image_attribs EGLint DRMBufferFormatMESA; EGLint DRMBufferUseMESA; EGLint DRMBufferStrideMESA; + EGLint DRMBufferPlaneIdMESA; + 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