[Mesa-dev] [v6 9/9] egl/dri2: support for creating images out of dma buffers
Chad Versace
chad.versace at linux.intel.com
Tue Jun 4 20:47:36 PDT 2013
On 05/28/2013 02:17 AM, Topi Pohjolainen wrote:
> v2:
> - upon success close the given file descriptors
>
> v3:
> - use specific entry for dma buffers instead of the basic for
> primes, and enable the extension based on the availability
> of the hook
>
> v4 (Chad):
> - use ARRAY_SIZE
> - improve the comment about the number of file descriptors
> - in case of invalid format report EGL_BAD_ATTRIBUTE instead
> of EGL_BAD_MATCH
> - take into account specific error set by the driver.
>
> Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
> ---
> src/egl/drivers/dri2/egl_dri2.c | 275 ++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 275 insertions(+)
> +static _EGLImage *
> +dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
> + EGLClientBuffer buffer, const EGLint *attr_list)
> +{
> + struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
> + _EGLImage *res;
> + EGLint err;
> + _EGLImageAttribs attrs;
> + __DRIimage *dri_image;
> + unsigned num_fds;
> + unsigned i;
> + int fds[3];
> + int pitches[3];
> + int offsets[3];
> + unsigned error;
> +
> + /**
> + * The spec says:
> + *
> + * ""* If <target> is EGL_LINUX_DMA_BUF_EXT and <buffer> is not NULL, the
> + * error EGL_BAD_PARAMETER is generated."
> + */
> + if (buffer != NULL) {
> + _eglError(EGL_BAD_PARAMETER, "buffer not NULL");
> + return NULL;
> + }
> +
> + err = _eglParseImageAttribList(&attrs, disp, attr_list);
> + if (err != EGL_SUCCESS) {
> + _eglError(err, "bad attribute");
> + return NULL;
> + }
> +
> + if (!dri2_check_dma_buf_attribs(&attrs))
> + return NULL;
> +
> + num_fds = dri2_check_dma_buf_format(&attrs);
> + if (!num_fds)
> + return NULL;
> +
> + for (i = 0; i < num_fds; ++i) {
> + fds[i] = attrs.DMABufPlaneFds[i].Value;
> + pitches[i] = attrs.DMABufPlanePitches[i].Value;
> + offsets[i] = attrs.DMABufPlaneOffsets[i].Value;
> + }
> +
> + dri_image =
> + dri2_dpy->image->createImageFromDmaBufs(dri2_dpy->dri_screen,
> + attrs.Width, attrs.Height, attrs.DMABufFourCC.Value,
> + fds, num_fds, pitches, offsets,
> + attrs.DMABufYuvColorSpaceHint.Value,
> + attrs.DMABufSampleRangeHint.Value,
> + attrs.DMABufChromaHorizontalSiting.Value,
> + attrs.DMABufChromaVerticalSiting.Value,
> + &error,
> + NULL);
> + dri2_create_image_khr_texture_error(error);
If dri_image is NULL, then the function must return early here.
Otherwise, calling dri2_creat_image(disp, NULL) below will override
the previously EGL error with EGL_BAD_ALLOC.
More information about the mesa-dev
mailing list