[Mesa-dev] [PATCH v13 07/36] egl: implement eglQueryDmaBufModifiersEXT

Jason Ekstrand jason at jlekstrand.net
Fri May 19 18:19:16 UTC 2017


Just FYI: I'm not checking that you implement the EGL API correctly.  I'm
mostly checking for whether or not it's using DRI correctly.

On Fri, May 19, 2017 at 2:37 AM, Daniel Stone <daniels at collabora.com> wrote:

> From: Varad Gautam <varadgautam at gmail.com>
>
> query and return supported dmabuf format modifiers for
> EGL_EXT_image_dma_buf_import_modifiers.
>
> v2: move format check to the driver instead of making format queries
>     here and then checking.
> v3: Check DRIimageExtension version before query (Daniel Stone)
>
> Signed-off-by: Varad Gautam <varad.gautam at collabora.com>
> Reviewed-by: Daniel Stone <daniels at collabora.com>
> Signed-off-by: Daniel Stone <daniels at collabora.com>
> ---
>  src/egl/drivers/dri2/egl_dri2.c | 36 ++++++++++++++++++++++++++++++++++++
>  src/egl/main/eglapi.c           | 20 ++++++++++++++++++++
>  src/egl/main/eglapi.h           |  5 +++++
>  src/egl/main/eglentrypoint.h    |  1 +
>  4 files changed, 62 insertions(+)
>
> diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_
> dri2.c
> index 55b6fcf1fc..1e0302359f 100644
> --- a/src/egl/drivers/dri2/egl_dri2.c
> +++ b/src/egl/drivers/dri2/egl_dri2.c
> @@ -2131,6 +2131,41 @@ dri2_query_dma_buf_formats(_EGLDriver *drv,
> _EGLDisplay *disp,
>     return EGL_TRUE;
>  }
>
> +static EGLBoolean
> +dri2_query_dma_buf_modifiers(_EGLDriver *drv, _EGLDisplay *disp, EGLint
> format,
> +                             EGLint max, EGLuint64KHR *modifiers,
> +                             EGLBoolean *external_only, EGLint *count)
> +{
> +   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
> +   EGLint i;
> +
> +   if (max < 0) {
> +      _eglError(EGL_BAD_PARAMETER, "invalid value for max count of
> formats");
> +      return EGL_FALSE;
> +   }
> +
> +   if (max > 0 && modifiers == NULL) {
> +      _eglError(EGL_BAD_PARAMETER, "invalid modifiers array");
> +      return EGL_FALSE;
> +   }
> +
> +   if (dri2_dpy->image->base.version < 16)
>

Check for the function pointer...


> +      return EGL_FALSE;
> +
> +   if (dri2_dpy->image->queryDmaBufModifiers(dri2_dpy->dri_screen,
> format,
> +                                             max, modifiers,
> +                                             count) == false) {
> +      _eglError(EGL_BAD_PARAMETER, "invalid format");
> +      return EGL_FALSE;
> +   }
> +   if (external_only != NULL) {
> +      for (i = 0; i < *count && i < max; i++)
> +         external_only[i] = EGL_TRUE;
> +   }
> +
> +   return EGL_TRUE;
> +}
> +
>  /**
>   * The spec says:
>   *
> @@ -3064,6 +3099,7 @@ _eglBuiltInDriverDRI2(const char *args)
>     dri2_drv->base.API.ExportDMABUFImageQueryMESA =
> dri2_export_dma_buf_image_query_mesa;
>     dri2_drv->base.API.ExportDMABUFImageMESA = dri2_export_dma_buf_image_
> mesa;
>     dri2_drv->base.API.QueryDmaBufFormatsEXT = dri2_query_dma_buf_formats;
> +   dri2_drv->base.API.QueryDmaBufModifiersEXT =
> dri2_query_dma_buf_modifiers;
>  #endif
>  #ifdef HAVE_WAYLAND_PLATFORM
>     dri2_drv->base.API.BindWaylandDisplayWL =
> dri2_bind_wayland_display_wl;
> diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
> index e83e3a414e..d0755ec652 100644
> --- a/src/egl/main/eglapi.c
> +++ b/src/egl/main/eglapi.c
> @@ -2403,6 +2403,26 @@ eglQueryDmaBufFormatsEXT(EGLDisplay dpy, EGLint
> max_formats,
>     RETURN_EGL_EVAL(disp, ret);
>  }
>
> +static EGLBoolean EGLAPIENTRY
> +eglQueryDmaBufModifiersEXT(EGLDisplay dpy, EGLint format, EGLint
> max_modifiers,
> +                           EGLuint64KHR *modifiers, EGLBoolean
> *external_only,
> +                           EGLint *num_modifiers)
> +{
> +   _EGLDisplay *disp = _eglLockDisplay(dpy);
> +   _EGLDriver *drv;
> +   EGLBoolean ret;
> +
> +   _EGL_FUNC_START(NULL, EGL_NONE, NULL, EGL_FALSE);
> +
> +   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
> +
> +   ret = drv->API.QueryDmaBufModifiersEXT(drv, disp, format,
> max_modifiers,
> +                                          modifiers, external_only,
> +                                          num_modifiers);
> +
> +   RETURN_EGL_EVAL(disp, ret);
> +}
> +
>  __eglMustCastToProperFunctionPointerType EGLAPIENTRY
>  eglGetProcAddress(const char *procname)
>  {
> diff --git a/src/egl/main/eglapi.h b/src/egl/main/eglapi.h
> index c9f98963db..cab3e9605a 100644
> --- a/src/egl/main/eglapi.h
> +++ b/src/egl/main/eglapi.h
> @@ -202,6 +202,11 @@ struct _egl_api
>     EGLBoolean (*QueryDmaBufFormatsEXT)(_EGLDriver *drv, _EGLDisplay *dpy,
>                                         EGLint max_formats, EGLint
> *formats,
>                                         EGLint *num_formats);
> +   EGLBoolean (*QueryDmaBufModifiersEXT) (_EGLDriver *drv, _EGLDisplay
> *dpy,
> +                                          EGLint format, EGLint
> max_modifiers,
> +                                          EGLuint64KHR *modifiers,
> +                                          EGLBoolean *external_only,
> +                                          EGLint *num_modifiers);
>  };
>
>  #ifdef __cplusplus
> diff --git a/src/egl/main/eglentrypoint.h b/src/egl/main/eglentrypoint.h
> index 91536239e9..b9dca7ceda 100644
> --- a/src/egl/main/eglentrypoint.h
> +++ b/src/egl/main/eglentrypoint.h
> @@ -57,6 +57,7 @@ EGL_ENTRYPOINT(eglQueryAPI)
>  EGL_ENTRYPOINT(eglQueryContext)
>  EGL_ENTRYPOINT(eglQueryDebugKHR)
>  EGL_ENTRYPOINT(eglQueryDmaBufFormatsEXT)
> +EGL_ENTRYPOINT(eglQueryDmaBufModifiersEXT)
>  EGL_ENTRYPOINT(eglQueryString)
>  EGL_ENTRYPOINT(eglQuerySurface)
>  EGL_ENTRYPOINT(eglQueryWaylandBufferWL)
> --
> 2.13.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170519/05b26d83/attachment.html>


More information about the mesa-dev mailing list