[Mesa-dev] [PATCH 2/3] gbm: Add support for __DRIimage based getBuffers when available

Jordan Justen jljusten at gmail.com
Tue Nov 12 00:43:03 PST 2013


On Mon, Nov 11, 2013 at 1:22 PM, Kristian Høgsberg <krh at bitplanet.net> wrote:
> This lets us allocate color buffers as __DRIimages and pass them into
> the driver instead of having to create a __DRIbuffer with the flink
> that requires.

It seems worth mentioning in the commit message that this allows gbm
to work with render nodes.

Series Reviewed-by: Jordan Justen <jordan.l.justen at intel.com>

I tested waffle's gl_basic using render nodes on gbm with this series,
so to that extent 1 & 2 are
Tested-by: Jordan Justen <jordan.l.justen at intel.com>

> Signed-off-by: Kristian Høgsberg <krh at bitplanet.net>
> Cc: "10.0" <mesa-stable at lists.freedesktop.org>
> ---
>  src/egl/drivers/dri2/platform_drm.c | 46 ++++++++++++++++++++++++++++++-------
>  src/gbm/backends/dri/gbm_dri.c      | 28 +++++++++++++++++++++-
>  src/gbm/backends/dri/gbm_driint.h   |  8 ++++++-
>  3 files changed, 72 insertions(+), 10 deletions(-)
>
> diff --git a/src/egl/drivers/dri2/platform_drm.c b/src/egl/drivers/dri2/platform_drm.c
> index 7b1e3a1..181b29d 100644
> --- a/src/egl/drivers/dri2/platform_drm.c
> +++ b/src/egl/drivers/dri2/platform_drm.c
> @@ -175,13 +175,12 @@ dri2_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf)
>  }
>
>  static int
> -get_back_bo(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer)
> +get_back_bo(struct dri2_egl_surface *dri2_surf)
>  {
>     struct dri2_egl_display *dri2_dpy =
>        dri2_egl_display(dri2_surf->base.Resource.Display);
> -   struct gbm_dri_bo *bo;
>     struct gbm_dri_surface *surf = dri2_surf->gbm_surf;
> -   int i, name, pitch;
> +   int i;
>
>     if (dri2_surf->back == NULL) {
>        for (i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
> @@ -201,6 +200,17 @@ get_back_bo(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer)
>     if (dri2_surf->back->bo == NULL)
>        return -1;
>
> +   return 0;
> +}
> +
> +static void
> +back_bo_to_dri_buffer(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer)
> +{
> +   struct dri2_egl_display *dri2_dpy =
> +      dri2_egl_display(dri2_surf->base.Resource.Display);
> +   struct gbm_dri_bo *bo;
> +   int name, pitch;
> +
>     bo = (struct gbm_dri_bo *) dri2_surf->back->bo;
>
>     dri2_dpy->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_NAME, &name);
> @@ -211,8 +221,6 @@ get_back_bo(struct dri2_egl_surface *dri2_surf, __DRIbuffer *buffer)
>     buffer->pitch = pitch;
>     buffer->cpp = 4;
>     buffer->flags = 0;
> -
> -   return 0;
>  }
>
>  static int
> @@ -254,10 +262,11 @@ dri2_get_buffers_with_format(__DRIdrawable *driDrawable,
>
>        switch (attachments[i]) {
>        case __DRI_BUFFER_BACK_LEFT:
> -        if (get_back_bo(dri2_surf, &dri2_surf->buffers[j]) < 0) {
> +        if (get_back_bo(dri2_surf) < 0) {
>             _eglError(EGL_BAD_ALLOC, "failed to allocate color buffer");
>             return NULL;
>          }
> +         back_bo_to_dri_buffer(dri2_surf, &dri2_surf->buffers[j]);
>          break;
>        default:
>          if (get_aux_bo(dri2_surf, attachments[i], attachments[i + 1],
> @@ -312,6 +321,27 @@ dri2_get_buffers(__DRIdrawable * driDrawable,
>     return buffer;
>  }
>
> +static int
> +dri_image_get_buffers(__DRIdrawable *driDrawable,
> +                      unsigned int format,
> +                      uint32_t *stamp,
> +                      void *loaderPrivate,
> +                      uint32_t buffer_mask,
> +                      struct __DRIimageList *buffers)
> +{
> +   struct dri2_egl_surface *dri2_surf = loaderPrivate;
> +   struct gbm_dri_bo *bo;
> +
> +   if (get_back_bo(dri2_surf) < 0)
> +      return 0;
> +
> +   bo = (struct gbm_dri_bo *) dri2_surf->back->bo;
> +   buffers->image_mask = __DRI_IMAGE_BUFFER_BACK;
> +   buffers->back = bo->image;
> +
> +   return 1;
> +}
> +
>  static void
>  dri2_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate)
>  {
> @@ -348,9 +378,8 @@ dri2_query_buffer_age(_EGLDriver *drv,
>                        _EGLDisplay *disp, _EGLSurface *surface)
>  {
>     struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surface);
> -   __DRIbuffer buffer;
>
> -   if (get_back_bo(dri2_surf, &buffer) < 0) {
> +   if (get_back_bo(dri2_surf) < 0) {
>        _eglError(EGL_BAD_ALLOC, "dri2_query_buffer_age");
>        return 0;
>     }
> @@ -469,6 +498,7 @@ dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp)
>     dri2_dpy->gbm_dri->get_buffers = dri2_get_buffers;
>     dri2_dpy->gbm_dri->flush_front_buffer = dri2_flush_front_buffer;
>     dri2_dpy->gbm_dri->get_buffers_with_format = dri2_get_buffers_with_format;
> +   dri2_dpy->gbm_dri->image_get_buffers = dri_image_get_buffers;
>
>     dri2_dpy->gbm_dri->base.base.surface_lock_front_buffer = lock_front_buffer;
>     dri2_dpy->gbm_dri->base.base.surface_release_buffer = release_buffer;
> diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
> index e95fcc7..6c63c75 100644
> --- a/src/gbm/backends/dri/gbm_dri.c
> +++ b/src/gbm/backends/dri/gbm_dri.c
> @@ -104,6 +104,24 @@ dri_get_buffers_with_format(__DRIdrawable * driDrawable,
>                                     count, out_count, surf->dri_private);
>  }
>
> +static int
> +image_get_buffers(__DRIdrawable *driDrawable,
> +                  unsigned int format,
> +                  uint32_t *stamp,
> +                  void *loaderPrivate,
> +                  uint32_t buffer_mask,
> +                  struct __DRIimageList *buffers)
> +{
> +   struct gbm_dri_surface *surf = loaderPrivate;
> +   struct gbm_dri_device *dri = gbm_dri_device(surf->base.gbm);
> +
> +   if (dri->image_get_buffers == NULL)
> +      return 0;
> +
> +   return dri->image_get_buffers(driDrawable, format, stamp,
> +                                 surf->dri_private, buffer_mask, buffers);
> +}
> +
>  static const __DRIuseInvalidateExtension use_invalidate = {
>     { __DRI_USE_INVALIDATE, 1 }
>  };
> @@ -120,6 +138,13 @@ const __DRIdri2LoaderExtension dri2_loader_extension = {
>     dri_get_buffers_with_format,
>  };
>
> +const __DRIimageLoaderExtension image_loader_extension = {
> +   { __DRI_IMAGE_LOADER, 1 },
> +   image_get_buffers,
> +   dri_flush_front_buffer,
> +};
> +
> +
>  struct dri_extension_match {
>     const char *name;
>     int version;
> @@ -258,7 +283,8 @@ dri_screen_create(struct gbm_dri_device *dri)
>     dri->extensions[0] = &image_lookup_extension.base;
>     dri->extensions[1] = &use_invalidate.base;
>     dri->extensions[2] = &dri2_loader_extension.base;
> -   dri->extensions[3] = NULL;
> +   dri->extensions[3] = &image_loader_extension.base;
> +   dri->extensions[4] = NULL;
>
>     if (dri->dri2 == NULL)
>        return -1;
> diff --git a/src/gbm/backends/dri/gbm_driint.h b/src/gbm/backends/dri/gbm_driint.h
> index cb4e477..fb303a3 100644
> --- a/src/gbm/backends/dri/gbm_driint.h
> +++ b/src/gbm/backends/dri/gbm_driint.h
> @@ -52,7 +52,7 @@ struct gbm_dri_device {
>     __DRIdri2LoaderExtension *loader;
>
>     const __DRIconfig   **driver_configs;
> -   const __DRIextension *extensions[4];
> +   const __DRIextension *extensions[5];
>     const __DRIextension **driver_extensions;
>
>     __DRIimage *(*lookup_image)(__DRIscreen *screen, void *image, void *data);
> @@ -67,6 +67,12 @@ struct gbm_dri_device {
>                              int *width, int *height,
>                              unsigned int *attachments, int count,
>                              int *out_count, void *data);
> +   int (*image_get_buffers)(__DRIdrawable *driDrawable,
> +                            unsigned int format,
> +                            uint32_t *stamp,
> +                            void *loaderPrivate,
> +                            uint32_t buffer_mask,
> +                            struct __DRIimageList *buffers);
>
>     struct wl_drm *wl_drm;
>  };
> --
> 1.8.3.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list