| Name |
| |
| EXT_image_dma_buf_import |
| |
| Name Strings |
| |
| EGL_EXT_image_dma_buf_import |
| |
| Contributors |
| |
| Jesse Barker |
| Rob Clark |
| Tom Cooksey |
| |
| Contacts |
| |
| Jesse Barker (jesse 'dot' barker 'at' linaro 'dot' org) |
| Tom Cooksey (tom 'dot' cooksey 'at' arm 'dot' com) |
| |
| Status |
| |
| Complete. |
| |
| Version |
| |
| Version 7, December 13, 2013 |
| |
| Number |
| |
| EGL Extension #53 |
| |
| Dependencies |
| |
| EGL 1.2 is required. |
| |
| EGL_KHR_image_base is required. |
| |
| The EGL implementation must be running on a Linux kernel supporting the |
| dma_buf buffer sharing mechanism. |
| |
| This extension is written against the wording of the EGL 1.2 Specification. |
| |
| Overview |
| |
| This extension allows creating an EGLImage from a Linux dma_buf file |
| descriptor or multiple file descriptors in the case of multi-plane YUV |
| images. |
| |
| New Types |
| |
| None |
| |
| New Procedures and Functions |
| |
| None |
| |
| New Tokens |
| |
| Accepted by the <target> parameter of eglCreateImageKHR: |
| |
| EGL_LINUX_DMA_BUF_EXT 0x3270 |
| |
| Accepted as an attribute in the <attrib_list> parameter of |
| eglCreateImageKHR: |
| |
| EGL_LINUX_DRM_FOURCC_EXT 0x3271 |
| EGL_DMA_BUF_PLANE0_FD_EXT 0x3272 |
| EGL_DMA_BUF_PLANE0_OFFSET_EXT 0x3273 |
| EGL_DMA_BUF_PLANE0_PITCH_EXT 0x3274 |
| EGL_DMA_BUF_PLANE1_FD_EXT 0x3275 |
| EGL_DMA_BUF_PLANE1_OFFSET_EXT 0x3276 |
| EGL_DMA_BUF_PLANE1_PITCH_EXT 0x3277 |
| EGL_DMA_BUF_PLANE2_FD_EXT 0x3278 |
| EGL_DMA_BUF_PLANE2_OFFSET_EXT 0x3279 |
| EGL_DMA_BUF_PLANE2_PITCH_EXT 0x327A |
| EGL_YUV_COLOR_SPACE_HINT_EXT 0x327B |
| EGL_SAMPLE_RANGE_HINT_EXT 0x327C |
| EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT 0x327D |
| EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT 0x327E |
| |
| Accepted as the value for the EGL_YUV_COLOR_SPACE_HINT_EXT attribute: |
| |
| EGL_ITU_REC601_EXT 0x327F |
| EGL_ITU_REC709_EXT 0x3280 |
| EGL_ITU_REC2020_EXT 0x3281 |
| |
| Accepted as the value for the EGL_SAMPLE_RANGE_HINT_EXT attribute: |
| |
| EGL_YUV_FULL_RANGE_EXT 0x3282 |
| EGL_YUV_NARROW_RANGE_EXT 0x3283 |
| |
| Accepted as the value for the EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT & |
| EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT attributes: |
| |
| EGL_YUV_CHROMA_SITING_0_EXT 0x3284 |
| EGL_YUV_CHROMA_SITING_0_5_EXT 0x3285 |
| |
| |
| Additions to Chapter 2 of the EGL 1.2 Specification (EGL Operation) |
| |
| Add to section 2.5.1 "EGLImage Specification" (as defined by the |
| EGL_KHR_image_base specification), in the description of |
| eglCreateImageKHR: |
| |
| "Values accepted for <target> are listed in Table aaa, below. |
| |
| +-------------------------+--------------------------------------------+ |
| | <target> | Notes | |
| +-------------------------+--------------------------------------------+ |
| | EGL_LINUX_DMA_BUF_EXT | Used for EGLImages imported from Linux | |
| | | dma_buf file descriptors | |
| +-------------------------+--------------------------------------------+ |
| Table aaa. Legal values for eglCreateImageKHR <target> parameter |
| |
| ... |
| |
| If <target> is EGL_LINUX_DMA_BUF_EXT, <dpy> must be a valid display, <ctx> |
| must be EGL_NO_CONTEXT, and <buffer> must be NULL, cast into the type |
| EGLClientBuffer. The details of the image is specified by the attributes |
| passed into eglCreateImageKHR. Required attributes and their values are as |
| follows: |
| |
| * EGL_WIDTH & EGL_HEIGHT: The logical dimensions of the buffer in pixels |
| |
| * EGL_LINUX_DRM_FOURCC_EXT: The pixel format of the buffer, as specified |
| by drm_fourcc.h and used as the pixel_format parameter of the |
| drm_mode_fb_cmd2 ioctl. |
| |
| * EGL_DMA_BUF_PLANE0_FD_EXT: The dma_buf file descriptor of plane 0 of |
| the image. |
| |
| * EGL_DMA_BUF_PLANE0_OFFSET_EXT: The offset from the start of the |
| dma_buf of the first sample in plane 0, in bytes. |
| |
| * EGL_DMA_BUF_PLANE0_PITCH_EXT: The number of bytes between the start of |
| subsequent rows of samples in plane 0. May have special meaning for |
| non-linear formats. |
| |
| For images in an RGB color-space or those using a single-plane YUV format, |
| only the first plane's file descriptor, offset & pitch should be specified. |
| For semi-planar YUV formats, that first plane (plane 0) holds only the luma |
| samples and chroma samples are stored interleaved in a second plane (plane |
| 1). For fully planar YUV formats, the first plane (plane 0) continues to |
| hold the luma samples however the chroma samples are stored seperately in |
| two additional planes (plane 1 & plane 2). If present, planes 1 & 2 are |
| specified by the following attributes, which have the same meanings as |
| defined above for plane 0: |
| |
| * EGL_DMA_BUF_PLANE1_FD_EXT |
| * EGL_DMA_BUF_PLANE1_OFFSET_EXT |
| * EGL_DMA_BUF_PLANE1_PITCH_EXT |
| * EGL_DMA_BUF_PLANE2_FD_EXT |
| * EGL_DMA_BUF_PLANE2_OFFSET_EXT |
| * EGL_DMA_BUF_PLANE2_PITCH_EXT |
| |
| The ordering of samples within a plane is taken from the drm_fourcc |
| pixel_format specified for EGL_LINUX_DRM_FOURCC_EXT. For example, if |
| EGL_LINUX_DRM_FOURCC_EXT is set to DRM_FORMAT_NV12, the chroma plane |
| specified by EGL_DMA_BUF_PLANE1* contains samples in the order V, U, |
| whereas if EGL_LINUX_DRM_FOURCC_EXT is DRM_FORMAT_NV21, the order is U, |
| V. Similarly, the ordering of planes for fully-planar formats is also taken |
| from the pixel_format specified as EGL_LINUX_DRM_FOURCC_EXT. For example, |
| if EGL_LINUX_DRM_FOURCC_EXT is set to DRM_FORMAT_YUV410, the luma plane is |
| specified by EGL_DMA_BUF_PLANE0*, the plane containing U-samples is |
| specified by EGL_DMA_BUF_PLANE1* and the plane containing the V-samples is |
| specified by EGL_DMA_BUF_PLANE2*, whereas if EGL_LINUX_DRM_FOURCC_EXT is |
| set to DRM_FORMAT_YVU410, plane 1 contains the V-samples and plane 2 |
| contains the U-samples. |
| |
| In addition to the above required attributes, the application may also |
| provide hints as to how the data should be interpreted by the GL. If any of |
| these hints are not specified, the GL will guess based on the pixel format |
| passed as the EGL_LINUX_DRM_FOURCC_EXT attribute or may fall-back to some |
| default value. Not all GLs will be able to support all combinations of |
| these hints and are free to use whatever settings they choose to achieve |
| the closest possible match. |
| |
| * EGL_YUV_COLOR_SPACE_HINT_EXT: The color-space the data is in. Only |
| relevant for images in a YUV format, ignored when specified for an |
| image in an RGB format. Accepted values are: |
| EGL_ITU_REC601_EXT, EGL_ITU_REC709_EXT & EGL_ITU_REC2020_EXT. |
| |
| * EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT & |
| EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT: Where chroma samples are |
| sited relative to luma samples when the image is in a sub-sampled |
| format. When the image is not using chroma sub-sampling, the luma and |
| chroma samples are assumed to be co-sited. Siting is split into the |
| vertical and horizontal and is in a fixed range. A siting of zero |
| means the first luma sample is taken from the same position in that |
| dimension as the chroma sample. This is best illustrated in the |
| diagram below: |
| |
| (0.5, 0.5) (0.0, 0.5) (0.0, 0.0) |
| + + + + + + + + * + * + |
| x x x x |
| + + + + + + + + + + + + |
| |
| + + + + + + + + * + * + |
| x x x x |
| + + + + + + + + + + + + |
| |
| Luma samples (+), Chroma samples (x) Chrome & Luma samples (*) |
| |
| Note this attribute is ignored for RGB images and non sub-sampled |
| YUV images. Accepted values are: EGL_YUV_CHROMA_SITING_0_EXT (0.0) |
| & EGL_YUV_CHROMA_SITING_0_5_EXT (0.5) |
| |
| * EGL_SAMPLE_RANGE_HINT_EXT: The numerical range of samples. Only |
| relevant for images in a YUV format, ignored when specified for |
| images in an RGB format. Accepted values are: EGL_YUV_FULL_RANGE_EXT |
| (0-256) & EGL_YUV_NARROW_RANGE_EXT (16-235). |
| |
| |
| If eglCreateImageKHR is successful for a EGL_LINUX_DMA_BUF_EXT target, the |
| EGL will take a reference to the dma_buf(s) which it will release at any |
| time while the EGLDisplay is initialized. It is the responsibility of the |
| application to close the dma_buf file descriptors." |
| |
| |
| Add to the list of error conditions for eglCreateImageKHR: |
| |
| "* If <target> is EGL_LINUX_DMA_BUF_EXT and <buffer> is not NULL, the |
| error EGL_BAD_PARAMETER is generated. |
| |
| * If <target> is EGL_LINUX_DMA_BUF_EXT, and the list of attributes is |
| incomplete, EGL_BAD_PARAMETER is generated. |
| |
| * If <target> is EGL_LINUX_DMA_BUF_EXT, and the EGL_LINUX_DRM_FOURCC_EXT |
| attribute is set to a format not supported by the EGL, EGL_BAD_MATCH |
| is generated. |
| |
| * If <target> 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. |
| |
| * If <target> is EGL_LINUX_DMA_BUF_EXT and the value specified for |
| EGL_YUV_COLOR_SPACE_HINT_EXT is not EGL_ITU_REC601_EXT, |
| EGL_ITU_REC709_EXT or EGL_ITU_REC2020_EXT, EGL_BAD_ATTRIBUTE is |
| generated. |
| |
| * If <target> is EGL_LINUX_DMA_BUF_EXT and the value specified for |
| EGL_SAMPLE_RANGE_HINT_EXT is not EGL_YUV_FULL_RANGE_EXT or |
| EGL_YUV_NARROW_RANGE_EXT, EGL_BAD_ATTRIBUTE is generated. |
| |
| * If <target> is EGL_LINUX_DMA_BUF_EXT and the value specified for |
| EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT or |
| EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT is not |
| EGL_YUV_CHROMA_SITING_0_EXT or EGL_YUV_CHROMA_SITING_0_5_EXT, |
| EGL_BAD_ATTRIBUTE is generated. |
| |
| * If <target> is EGL_LINUX_DMA_BUF_EXT and one or more of the values |
| specified for a plane's pitch or offset isn't supported by EGL, |
| EGL_BAD_ACCESS is generated. |
| |
| |
| Issues |
| |
| 1. Should this be a KHR or EXT extension? |
| |
| ANSWER: EXT. Khronos EGL working group not keen on this extension as it is |
| seen as contradicting the EGLStream direction the specification is going in. |
| The working group recommends creating additional specs to allow an EGLStream |
| producer/consumer connected to v4l2/DRM or any other Linux interface. |
| |
| 2. Should this be a generic any platform extension, or a Linux-only |
| extension which explicitly states the handles are dma_buf fds? |
| |
| ANSWER: There's currently no intention to port this extension to any OS not |
| based on the Linux kernel. Consequently, this spec can be explicitly written |
| against Linux and the dma_buf API. |
| |
| 3. Does ownership of the file descriptor pass to the EGL library? |
| |
| ANSWER: No, EGL does not take ownership of the file descriptors. It is the |
| responsibility of the application to close the file descriptors on success |
| and failure. |
| |
| 4. How are the different YUV color spaces handled (BT.709/BT.601)? |
| |
| ANSWER: The pixel formats defined in drm_fourcc.h only specify how the data |
| is laid out in memory. It does not define how that data should be |
| interpreted. Added a new EGL_YUV_COLOR_SPACE_HINT_EXT attribute to allow the |
| application to specify which color space the data is in to allow the GL to |
| choose an appropriate set of co-efficients if it needs to convert that data |
| to RGB for example. |
| |
| 5. What chroma-siting is used for sub-sampled YUV formats? |
| |
| ANSWER: The chroma siting is not specified by either the v4l2 or DRM APIs. |
| This is similar to the color-space issue (4) in that the chroma siting |
| doesn't affect how the data is stored in memory. However, the GL will need |
| to know the siting in order to filter the image correctly. While the visual |
| impact of getting the siting wrong is minor, provision should be made to |
| allow an application to specify the siting if desired. Added additional |
| EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT & |
| EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT attributes to allow the siting to |
| be specified using a set of pre-defined values (0 or 0.5). |
| |
| 6. How can an application query which formats the EGL implementation |
| supports? |
| |
| PROPOSAL: Don't provide a query mechanism but instead add an error condition |
| that EGL_BAD_MATCH is raised if the EGL implementation doesn't support that |
| particular format. |
| |
| 7. Which image formats should be supported and how is format specified? |
| |
| Seem to be two options 1) specify a new enum in this specification and |
| enumerate all possible formats. 2) Use an existing enum already in Linux, |
| either v4l2_mbus_pixelcode and/or those formats listed in drm_fourcc.h? |
| |
| ANSWER: Go for option 2) and just use values defined in drm_fourcc.h. |
| |
| 8. How can AYUV images be handled? |
| |
| ANSWER: At least on fourcc.org and in drm_fourcc.h, there only seems to be |
| a single AYUV format and that is a packed format, so everything, including |
| the alpha component would be in the first plane. |
| |
| 9. How can you import interlaced images? |
| |
| ANSWER: Interlaced frames are usually stored with the top & bottom fields |
| interleaved in a single buffer. As the fields would need to be displayed as |
| at different times, the application would create two EGLImages from the same |
| buffer, one for the top field and another for the bottom. Both EGLImages |
| would set the pitch to 2x the buffer width and the second EGLImage would use |
| a suitable offset to indicate it started on the second line of the buffer. |
| This should work regardless of whether the data is packed in a single plane, |
| semi-planar or multi-planar. |
| |
| If each interlaced field is stored in a separate buffer then it should be |
| trivial to create two EGLImages, one for each field's buffer. |
| |
| 10. How are semi-planar/planar formats handled that have a different |
| width/height for Y' and CbCr such as YUV420? |
| |
| ANSWER: The spec says EGL_WIDTH & EGL_HEIGHT specify the *logical* width and |
| height of the buffer in pixels. For pixel formats with sub-sampled Chroma |
| values, it should be trivial for the EGL implementation to calculate the |
| width/height of the Chroma sample buffers using the logical width & height |
| and by inspecting the pixel format passed as the EGL_LINUX_DRM_FOURCC_EXT |
| attribute. I.e. If the pixel format says it's YUV420, the Chroma buffer's |
| width = EGL_WIDTH/2 & height =EGL_HEIGHT/2. |
| |
| 11. How are Bayer formats handled? |
| |
| ANSWER: As of Linux 2.6.34, drm_fourcc.h does not include any Bayer formats. |
| However, future kernel versions may add such formats in which case they |
| would be handled in the same way as any other format. |
| |
| 12. Should the spec support buffers which have samples in a "narrow range"? |
| |
| Content sampled from older analogue sources typically don't use the full |
| (0-256) range of the data type storing the sample and instead use a narrow |
| (16-235) range to allow some headroom & toeroom in the signals to avoid |
| clipping signals which overshoot slightly during processing. This is |
| sometimes known as signals using "studio swing". |
| |
| ANSWER: Add a new attribute to define if the samples use a narrow 16-235 |
| range or the full 0-256 range. |
| |
| 13. Specifying the color space and range seems cumbersome, why not just |
| allow the application to specify the full YUV->RGB color conversion matrix? |
| |
| ANSWER: Some hardware may not be able to use an arbitrary conversion matrix |
| and needs to select an appropriate pre-defined matrix based on the color |
| space and the sample range. |
| |
| 14. How do you handle EGL implementations which have restrictions on pitch |
| and/or offset? |
| |
| ANSWER: Buffers being imported using dma_buf pretty much have to be |
| allocated by a kernel-space driver. As such, it is expected that a system |
| integrator would make sure all devices which allocate buffers suitable for |
| exporting make sure they use a pitch supported by all possible importers. |
| However, it is still possible eglCreateImageKHR can fail due to an |
| unsupported pitch. Added a new error to the list indicating this. |
| |
| 15. Should this specification also describe how to export an existing |
| EGLImage as a dma_buf file descriptor? |
| |
| ANSWER: No. Importing and exporting buffers are two separate operations and |
| importing an existing dma_buf fd into an EGLImage is useful functionality in |
| itself. Agree that exporting an EGLImage as a dma_buf fd is useful, E.g. it |
| could be used by an OpenMAX IL implementation's OMX_UseEGLImage function to |
| give access to the buffer backing an EGLImage to video hardware. However, |
| exporting can be split into a separate extension specification. |
| |
| |
| Revision History |
| |
| #7 (Kristian H. Kristensen, December 13, 2017) |
| - Clarify plane ordering to match Linux FOURCC conventions (Bug 16017). |
| |
| #6 (David Garbett, December 05, 2013) |
| - Application now retains ownership of dma_buf file descriptors. |
| |
| #5 (Tom Cooksey, February 19, 2013) |
| - Assigned enum values |
| - Moved out of drafts |
| |
| #4 (Tom Cooksey, October 04, 2012) |
| - Fixed issue numbering! |
| - Added issues 8 - 15. |
| - Promoted proposal for Issue 3 to be the answer. |
| - Added an additional attribute to allow an application to specify the color |
| space as a hint which should address issue 4. |
| - Added an additional attribute to allow an application to specify the chroma |
| siting as a hint which should address issue 5. |
| - Added an additional attribute to allow an application to specify the sample |
| range as a hint which should address the new issue 12. |
| - Added language to end of error section clarifying who owns the fd passed |
| to eglCreateImageKHR if an error is generated. |
| |
| #3 (Tom Cooksey, August 16, 2012) |
| - Changed name from EGL_EXT_image_external and re-written language to |
| explicitly state this for use with Linux & dma_buf. |
| - Added a list of issues, including some still open ones. |
| |
| #2 (Jesse Barker, May 30, 2012) |
| - Revision to split eglCreateImageKHR functionality from export |
| Functionality. |
| - Update definition of EGLNativeBufferType to be a struct containing a list |
| of handles to support multi-buffer/multi-planar formats. |
| |
| #1 (Jesse Barker, March 20, 2012) |
| - Initial draft. |