Re: [PATCH v16 15/23] compositor-drm: Support modifiers with GBM

2018-07-09 Thread Pekka Paalanen
On Thu,  5 Jul 2018 18:16:42 +0100
Daniel Stone  wrote:

> Use the extended GBM allocator interface to support modifiers and
> multi-planar BOs.
> 
> Signed-off-by: Daniel Stone 
> Tested-by: Emre Ucan 
> ---
>  configure.ac   |  3 ++
>  libweston/compositor-drm.c | 61 +++---
>  2 files changed, 53 insertions(+), 11 deletions(-)
> 

Hi,

I feel there are two parts in this patch which are not clearly
discussed in the commit message. The changes to drm_fb_get_from_bo()
affect all three of BUFFER_CLIENT, BUFFER_GBM_SURFACE and BUFFER_CURSOR
cases. The changes to drm_output_init_egl() affect only the
BUFFER_GBM_SURFACE case.

If I understand right, this mainly affects GBM import from wl_buffer
and GBM surface use cases.

Is this the final patch that makes etnaviv work? That would be nice to
mention.


> 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 3f8e77554..3471d9b0f 100644
> --- a/libweston/compositor-drm.c
> +++ b/libweston/compositor-drm.c
> @@ -871,7 +871,7 @@ drm_fb_addfb(struct drm_fb *fb)
>   int ret = -EINVAL;
>  #ifdef HAVE_DRM_ADDFB2_MODIFIERS
>   uint64_t mods[4] = { };
> - int i;
> + size_t i;
>  #endif
>  
>   /* If we have a modifier set, we must only use the WithModifiers
> @@ -880,7 +880,7 @@ drm_fb_addfb(struct drm_fb *fb)
>   /* KMS demands that if a modifier is set, it must be the same
>* for all planes. */
>  #ifdef HAVE_DRM_ADDFB2_MODIFIERS
> - for (i = 0; i < (int) ARRAY_LENGTH(mods) && fb->handles[i]; i++)
> + for (i = 0; i < ARRAY_LENGTH(mods) && fb->handles[i]; i++)

This is an unrelated change and would ideally be in a separate patch so
it could land ahead of time.

>   mods[i] = fb->modifier;
>   ret = drmModeAddFB2WithModifiers(fb->fd, fb->width, fb->height,
>fb->format->format,
> @@ -1114,6 +1114,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);
> @@ -1127,15 +1130,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;

Making the size zero should have a rationale in the commit message.

> +
> +#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 = fb->strides[0] * fb->height;
> - fb->fd = backend->drm.fd;
> +#endif
>  
>   if (!fb->format) {
>   weston_log("couldn't look up format 0x%lx\n",
> @@ -4212,13 +4225,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) {
> +

Re: [PATCH v16 15/23] compositor-drm: Support modifiers with GBM

2018-07-06 Thread Daniel Stone
Hey Emil,
On Fri, 6 Jul 2018 at 11:02, Emil Velikov  wrote:
> On 5 July 2018 at 18:16, Daniel Stone  wrote:
> > Use the extended GBM allocator interface to support modifiers and
> > multi-planar BOs.
>
> Instead of such lovely checks and multiple #ifdef blocks through in
> the code, one can use weak symbols.
> See kmscube code has some examples.
>
> That said, it's something that could be handled at a later stage.
> There's no point in delaying the series over that detail.

Yeah, all the options are lovely in their own way. I'd happily check
and review a patch to make it use weak functions to cover all the new
GBM API though.

Cheers,
Daniel
___
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel


Re: [PATCH v16 15/23] compositor-drm: Support modifiers with GBM

2018-07-06 Thread Emil Velikov
Hi Dan,

On 5 July 2018 at 18:16, Daniel Stone  wrote:
> Use the extended GBM allocator interface to support modifiers and
> multi-planar BOs.
>
> Signed-off-by: Daniel Stone 
> Tested-by: Emre Ucan 
> ---
>  configure.ac   |  3 ++
>  libweston/compositor-drm.c | 61 +++---
>  2 files changed, 53 insertions(+), 11 deletions(-)
>
> 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])])

Instead of such lovely checks and multiple #ifdef blocks through in
the code, one can use weak symbols.
See kmscube code has some examples.

That said, it's something that could be handled at a later stage.
There's no point in delaying the series over that detail.

Thanks
Emil
___
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel


[PATCH v16 15/23] compositor-drm: Support modifiers with GBM

2018-07-05 Thread Daniel Stone
Use the extended GBM allocator interface to support modifiers and
multi-planar BOs.

Signed-off-by: Daniel Stone 
Tested-by: Emre Ucan 
---
 configure.ac   |  3 ++
 libweston/compositor-drm.c | 61 +++---
 2 files changed, 53 insertions(+), 11 deletions(-)

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 3f8e77554..3471d9b0f 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -871,7 +871,7 @@ drm_fb_addfb(struct drm_fb *fb)
int ret = -EINVAL;
 #ifdef HAVE_DRM_ADDFB2_MODIFIERS
uint64_t mods[4] = { };
-   int i;
+   size_t i;
 #endif
 
/* If we have a modifier set, we must only use the WithModifiers
@@ -880,7 +880,7 @@ drm_fb_addfb(struct drm_fb *fb)
/* KMS demands that if a modifier is set, it must be the same
 * for all planes. */
 #ifdef HAVE_DRM_ADDFB2_MODIFIERS
-   for (i = 0; i < (int) ARRAY_LENGTH(mods) && fb->handles[i]; i++)
+   for (i = 0; i < ARRAY_LENGTH(mods) && fb->handles[i]; i++)
mods[i] = fb->modifier;
ret = drmModeAddFB2WithModifiers(fb->fd, fb->width, fb->height,
 fb->format->format,
@@ -1114,6 +1114,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);
@@ -1127,15 +1130,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 = fb->strides[0] * fb->height;
-   fb->fd = backend->drm.fd;
+#endif
 
if (!fb->format) {
weston_log("couldn't look up format 0x%lx\n",
@@ -4212,13 +4225,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
+   {
+