On Mon,  9 Jul 2018 14:23:12 +0100
Daniel Stone <dani...@collabora.com> wrote:

> Now that we collect information about which modifiers are supported for
> KMS display, and are able to create KMS framebuffers with modifiers,
> begin using the modifier-aware GBM API.
> 
> Client buffers from dmabuf already store multi-plane and modifier
> information into drm_fb. Extend this to drm_fb_get_from_bo(), used for
> wl_buffer, cursor, and gbm_surface buffers. wl_buffer buffers should by
> convention not require modifiers. Cursor buffers must not require
> modifiers, as they should be linear. Prior to this patch, GBM buffers
> must have been single-planar, and able to used without explicitly naming
> modifiers.
> 
> Using gbm_surface_create_with_modifiers allows us to pass the list of
> modifiers acceptable to KMS for scanout to GBM, so it can allocate
> multi-planar buffers or those which are otherwise only addressible with
> modifiers. On platforms supporting and preferring modifiers for scanout,
> this means that the gbm_bos we get from our scanout surface need to use
> the extended API to query multiple planes, offsets, modifiers, etc.
> 
> Signed-off-by: Daniel Stone <dani...@collabora.com>
> Tested-by: Emre Ucan <eu...@de.adit-jv.com>
> ---
>  configure.ac               |  3 ++
>  libweston/compositor-drm.c | 57 ++++++++++++++++++++++++++++++++------
>  2 files changed, 51 insertions(+), 9 deletions(-)
> 

Reviewed-by: Pekka Paalanen <pekka.paala...@collabora.co.uk>

Thanks,
pq

> diff --git a/configure.ac b/configure.ac
> index c550198ae..357b6471e 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -215,6 +215,9 @@ if test x$enable_drm_compositor = xyes; then
>    PKG_CHECK_MODULES(DRM_COMPOSITOR_FORMATS_BLOB, [libdrm >= 2.4.83],
>                   [AC_DEFINE([HAVE_DRM_FORMATS_BLOB], 1, [libdrm supports 
> modifier advertisement])],
>                   [AC_MSG_WARN([libdrm does not support modifier 
> advertisement])])
> +  PKG_CHECK_MODULES(DRM_COMPOSITOR_GBM_MODIFIERS, [gbm >= 17.1],
> +                 [AC_DEFINE([HAVE_GBM_MODIFIERS], 1, [GBM supports 
> modifiers])],
> +                 [AC_MSG_WARN([GBM does not support modifiers])])
>    PKG_CHECK_MODULES(DRM_COMPOSITOR_GBM, [gbm >= 17.2],
>                   [AC_DEFINE([HAVE_GBM_FD_IMPORT], 1, [gbm supports import 
> with modifiers])],
>                   [AC_MSG_WARN([GBM does not support dmabuf import, will omit 
> that capability])])
> diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
> index bc4022201..acaf2639e 100644
> --- a/libweston/compositor-drm.c
> +++ b/libweston/compositor-drm.c
> @@ -1189,6 +1189,9 @@ drm_fb_get_from_bo(struct gbm_bo *bo, struct 
> drm_backend *backend,
>                  bool is_opaque, enum drm_fb_type type)
>  {
>       struct drm_fb *fb = gbm_bo_get_user_data(bo);
> +#ifdef HAVE_GBM_MODIFIERS
> +     int i;
> +#endif
>  
>       if (fb) {
>               assert(fb->type == type);
> @@ -1202,15 +1205,25 @@ drm_fb_get_from_bo(struct gbm_bo *bo, struct 
> drm_backend *backend,
>       fb->type = type;
>       fb->refcnt = 1;
>       fb->bo = bo;
> +     fb->fd = backend->drm.fd;
>  
>       fb->width = gbm_bo_get_width(bo);
>       fb->height = gbm_bo_get_height(bo);
> +     fb->format = pixel_format_get_info(gbm_bo_get_format(bo));
> +     fb->size = 0;
> +
> +#ifdef HAVE_GBM_MODIFIERS
> +     fb->modifier = gbm_bo_get_modifier(bo);
> +     for (i = 0; i < gbm_bo_get_plane_count(bo); i++) {
> +             fb->strides[i] = gbm_bo_get_stride_for_plane(bo, i);
> +             fb->handles[i] = gbm_bo_get_handle_for_plane(bo, i).u32;
> +             fb->offsets[i] = gbm_bo_get_offset(bo, i);
> +     }
> +#else
>       fb->strides[0] = gbm_bo_get_stride(bo);
>       fb->handles[0] = gbm_bo_get_handle(bo).u32;
> -     fb->format = pixel_format_get_info(gbm_bo_get_format(bo));
>       fb->modifier = DRM_FORMAT_MOD_INVALID;
> -     fb->size = 0;
> -     fb->fd = backend->drm.fd;
> +#endif
>  
>       if (!fb->format) {
>               weston_log("couldn't look up format 0x%lx\n",
> @@ -4355,13 +4368,39 @@ drm_output_init_egl(struct drm_output *output, struct 
> drm_backend *b)
>               fallback_format_for(output->gbm_format),
>       };
>       int n_formats = 1;
> +     struct weston_mode *mode = output->base.current_mode;
> +     struct drm_plane *plane = output->scanout_plane;
> +     unsigned int i;
> +
> +     for (i = 0; i < plane->count_formats; i++) {
> +             if (plane->formats[i].format == output->gbm_format)
> +                     break;
> +     }
> +
> +     if (i == plane->count_formats) {
> +             weston_log("format 0x%x not supported by output %s\n",
> +                        output->gbm_format, output->base.name);
> +             return -1;
> +     }
> +
> +#ifdef HAVE_GBM_MODIFIERS
> +     if (plane->formats[i].count_modifiers > 0) {
> +             output->gbm_surface =
> +                     gbm_surface_create_with_modifiers(b->gbm,
> +                                                       mode->width,
> +                                                       mode->height,
> +                                                       output->gbm_format,
> +                                                       
> plane->formats[i].modifiers,
> +                                                       
> plane->formats[i].count_modifiers);
> +     } else
> +#endif
> +     {
> +             output->gbm_surface =
> +                 gbm_surface_create(b->gbm, mode->width, mode->height,
> +                                    output->gbm_format,
> +                                    GBM_BO_USE_RENDERING | 
> GBM_BO_USE_SCANOUT);
> +     }
>  
> -     output->gbm_surface = gbm_surface_create(b->gbm,
> -                                          output->base.current_mode->width,
> -                                          output->base.current_mode->height,
> -                                          format[0],
> -                                          GBM_BO_USE_SCANOUT |
> -                                          GBM_BO_USE_RENDERING);
>       if (!output->gbm_surface) {
>               weston_log("failed to create gbm surface\n");
>               return -1;

Attachment: pgp4kyIlh8unG.pgp
Description: OpenPGP digital signature

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to