[Mesa-dev] [PATCH v2] EGL/android: Enhance pbuffer implementation
Tomasz Figa
tfiga at chromium.org
Wed Dec 7 05:45:15 UTC 2016
On Tue, Dec 6, 2016 at 5:49 PM, Liu Zhiquan <zhiquan.liu at intel.com> wrote:
> Some dri drivers will pass multiple bits in buffer_mask parameter
> to droid_image_get_buffer(), more than the actual supported buffer
> type combination. For such case, will go through all the bits, and
> will not return error when unsupported buffer is requested, only
> return error when the allocation for supported buffer failed.
>
Missing changelog. Please see http://www.mesa3d.org/devinfo.html#submitting.
+ few more minor issues inline. Otherwise the behavior seems fine now.
> Signed-off-by: Liu Zhiquan <zhiquan.liu at intel.com>
> Signed-off-by: Long, Zhifang <zhifang.long at intel.com>
> ---
> src/egl/drivers/dri2/platform_android.c | 180 ++++++++++++++++++--------------
> 1 file changed, 101 insertions(+), 79 deletions(-)
>
> diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c
> index 373e2c0..46c6efa 100644
> --- a/src/egl/drivers/dri2/platform_android.c
> +++ b/src/egl/drivers/dri2/platform_android.c
> @@ -434,81 +434,92 @@ update_buffers(struct dri2_egl_surface *dri2_surf)
> }
>
> static int
> -get_back_bo(struct dri2_egl_surface *dri2_surf)
> +get_front_bo(struct dri2_egl_surface *dri2_surf, unsigned int format)
> {
> struct dri2_egl_display *dri2_dpy =
> dri2_egl_display(dri2_surf->base.Resource.Display);
> - int fourcc, pitch;
> - int offset = 0, fd;
>
> - if (dri2_surf->dri_image_back)
> + if (dri2_surf->dri_image_front) {
Style: No need for braces.
> return 0;
> -
> - if (!dri2_surf->buffer)
> - return -1;
> -
> - fd = get_native_buffer_fd(dri2_surf->buffer);
> - if (fd < 0) {
> - _eglLog(_EGL_WARNING, "Could not get native buffer FD");
> - return -1;
> }
>
> - fourcc = get_fourcc(dri2_surf->buffer->format);
> + if (dri2_surf->base.Type == EGL_WINDOW_BIT) {
> + /* According current EGL spec, front buffer rendering
> + * for window surface is not supported now.
> + * and mesa doesn't have the implementation of this case.
> + * Add warning message, but not treat it as error.
> + */
> + _eglLog(_EGL_DEBUG, "DRI driver requested unsupported front buffer for window surface");
>
Style: Unnecessary blank line.
> - pitch = dri2_surf->buffer->stride *
> - get_format_bpp(dri2_surf->buffer->format);
> + } else if (dri2_surf->base.Type == EGL_PBUFFER_BIT) {
>
Style: Unnecessary blank line.
> - if (fourcc == -1 || pitch == 0) {
> - _eglLog(_EGL_WARNING, "Invalid buffer fourcc(%x) or pitch(%d)",
> - fourcc, pitch);
> - return -1;
> + dri2_surf->dri_image_front =
> + dri2_dpy->image->createImage(dri2_dpy->dri_screen,
> + dri2_surf->base.Width,
> + dri2_surf->base.Height,
> + format,
> + 0,
> + dri2_surf);
> + if (!dri2_surf->dri_image_front) {
> + _eglLog(_EGL_WARNING, "dri2_image_front allocation failed");
> + return -1;
> + }
> }
>
> - dri2_surf->dri_image_back =
> - dri2_dpy->image->createImageFromFds(dri2_dpy->dri_screen,
> - dri2_surf->base.Width,
> - dri2_surf->base.Height,
> - fourcc,
> - &fd,
> - 1,
> - &pitch,
> - &offset,
> - dri2_surf);
> - if (!dri2_surf->dri_image_back)
> - return -1;
> -
> return 0;
> }
>
> static int
> -droid_image_get_buffers(__DRIdrawable *driDrawable,
> - unsigned int format,
> - uint32_t *stamp,
> - void *loaderPrivate,
> - uint32_t buffer_mask,
> - struct __DRIimageList *images)
> +get_back_bo(struct dri2_egl_surface *dri2_surf, unsigned int format)
> {
> - struct dri2_egl_surface *dri2_surf = loaderPrivate;
> struct dri2_egl_display *dri2_dpy =
> dri2_egl_display(dri2_surf->base.Resource.Display);
> + int fourcc, pitch;
> + int offset = 0, fd;
>
> - images->image_mask = 0;
> - images->front = NULL;
> - images->back = NULL;
> -
> - if (update_buffers(dri2_surf) < 0)
> + if (dri2_surf->dri_image_back) {
> return 0;
> + }
Style: Unnecessary braces.
>
> - if (buffer_mask & __DRI_IMAGE_BUFFER_FRONT) {
> - if (dri2_surf->base.Type == EGL_WINDOW_BIT) {
> - /* According current EGL spec,
> - * front buffer rendering for window surface is not supported now */
> - _eglLog(_EGL_WARNING,
> - "%s:%d front buffer rendering for window surface is not supported!",
> - __func__, __LINE__);
> - return 0;
> + if (dri2_surf->base.Type == EGL_WINDOW_BIT) {
> + if (!dri2_surf->buffer) {
> + _eglLog(_EGL_WARNING, "Could not get native buffer");
> + return -1;
> + }
> +
> + fd = get_native_buffer_fd(dri2_surf->buffer);
> + if (fd < 0) {
> + _eglLog(_EGL_WARNING, "Could not get native buffer FD");
> + return -1;
> + }
> +
> + fourcc = get_fourcc(dri2_surf->buffer->format);
> +
> + pitch = dri2_surf->buffer->stride *
> + get_format_bpp(dri2_surf->buffer->format);
> +
> + if (fourcc == -1 || pitch == 0) {
> + _eglLog(_EGL_WARNING, "Invalid buffer fourcc(%x) or pitch(%d)",
> + fourcc, pitch);
> + return -1;
> }
>
> + dri2_surf->dri_image_back =
> + dri2_dpy->image->createImageFromFds(dri2_dpy->dri_screen,
> + dri2_surf->base.Width,
> + dri2_surf->base.Height,
> + fourcc,
> + &fd,
> + 1,
> + &pitch,
> + &offset,
> + dri2_surf);
> + if (!dri2_surf->dri_image_back) {
> + _eglLog(_EGL_WARNING, "dri2_image allocation failed");
The error could be more specific, e.g.
"failed to create DRI image from FD"
> + return -1;
> + }
> +
Style: Unnecessary braces.
> + } else if (dri2_surf->base.Type == EGL_PBUFFER_BIT) {
> /* The EGL 1.5 spec states that pbuffers are single-buffered. Specifically,
> * the spec states that they have a back buffer but no front buffer, in
> * contrast to pixmaps, which have a front buffer but no back buffer.
> @@ -522,43 +533,54 @@ droid_image_get_buffers(__DRIdrawable *driDrawable,
> * behavior instead of trying to fix (and hence potentially breaking) the
> * world.
> */
> - if (!dri2_surf->dri_image_front &&
> - dri2_surf->base.Type == EGL_PBUFFER_BIT) {
> - dri2_surf->dri_image_front =
> - dri2_dpy->image->createImage(dri2_dpy->dri_screen,
> - dri2_surf->base.Width,
> - dri2_surf->base.Height,
> - format,
> - 0,
> - dri2_surf);
> - }
> + _eglLog(_EGL_DEBUG, "DRI driver requested unsupported back buffer for pbuffer surface");
> + }
>
> - if (!dri2_surf->dri_image_front) {
> - _eglLog(_EGL_WARNING,
> - "%s:%d dri2_image front buffer allocation failed!",
> - __func__, __LINE__);
> + return 0;
> +}
> +
> +/* Some drivers will pass multiple bits in buffer_mask.
> + * For such case, will go through all the bits, and
> + * will not return error when unsupported buffer is requested, only
> + * return error when the allocation for supported buffer failed.
> + */
> +static int
> +droid_image_get_buffers(__DRIdrawable *driDrawable,
> + unsigned int format,
> + uint32_t *stamp,
> + void *loaderPrivate,
> + uint32_t buffer_mask,
> + struct __DRIimageList *images)
> +{
> + struct dri2_egl_surface *dri2_surf = loaderPrivate;
> +
> + images->image_mask = 0;
> + images->front = NULL;
> + images->back = NULL;
> +
> + if (update_buffers(dri2_surf) < 0)
> + return 0;
> +
> + if (buffer_mask & __DRI_IMAGE_BUFFER_FRONT) {
> + if (get_front_bo(dri2_surf, format) < 0) {
> return 0;
> }
Style: Unnecessary braces.
>
> - images->front = dri2_surf->dri_image_front;
> - images->image_mask |= __DRI_IMAGE_BUFFER_FRONT;
> + if (dri2_surf->dri_image_front) {
> + images->front = dri2_surf->dri_image_front;
> + images->image_mask |= __DRI_IMAGE_BUFFER_FRONT;
> + }
> }
>
> if (buffer_mask & __DRI_IMAGE_BUFFER_BACK) {
> - if (dri2_surf->base.Type == EGL_WINDOW_BIT) {
> - if (get_back_bo(dri2_surf) < 0)
> - return 0;
> - }
> -
> - if (!dri2_surf->dri_image_back) {
> - _eglLog(_EGL_WARNING,
> - "%s:%d dri2_image back buffer allocation failed!",
> - __func__, __LINE__);
> + if (get_back_bo(dri2_surf, format) < 0) {
> return 0;
> }
Style: Unnecessary braces.
Best regards,
Tomasz
More information about the mesa-dev
mailing list