Use the extended GBM allocator interface to support modifiers and
multi-planar BOs.

Depends on bwidawsk's 'modifiers' tree.

Signed-off-by: Daniel Stone <[email protected]>
---
 configure.ac               |  3 +++
 libweston/compositor-drm.c | 52 +++++++++++++++++++++++++++++++++++++++-------
 libweston/meson.build      |  6 +++++-
 3 files changed, 52 insertions(+), 9 deletions(-)

diff --git a/configure.ac b/configure.ac
index 861d996e..d50d443d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -217,6 +217,9 @@ if test x$enable_drm_compositor = xyes; then
   PKG_CHECK_MODULES(DRM_COMPOSITOR_GETPLANE2, [libdrm >= 2.4.74],
                    [AC_DEFINE([HAVE_DRM_GETPLANE2], 1, [libdrm supports 
GetPlane2])],
                    [AC_MSG_WARN([libdrm does not support GetPlane2])])
+  PKG_CHECK_MODULES(DRM_COMPOSITOR_GBM_MODIFIERS, [gbm >= 17.1.0],
+                   [AC_DEFINE([HAVE_GBM_MODIFIERS], 1, [GBM supports 
modifiers])],
+                   [AC_MSG_WARN([GBM does not support modifiers])])
 fi
 
 
diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index c62139e0..bc6bab94 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -1073,6 +1073,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);
@@ -1089,10 +1092,21 @@ drm_fb_get_from_bo(struct gbm_bo *bo, struct 
drm_backend *backend,
 
        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->size = fb->strides[0] * fb->height;
+#endif
+
        fb->fd = backend->drm.fd;
 
        if (!fb->format) {
@@ -4114,13 +4128,35 @@ 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) {
+               /* XXX: better error message */
+               weston_log("can't use format for output\n");
+               return -1;
+       }
+
+#ifdef HAVE_GBM_MODIFIERS
+       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
+       output->gbm_surface =
+               gbm_surface_create(b->gbm, mode->width, mode->height, format[0],
+                                  GBM_BO_USE_RENDERING | GBM_BO_USE_SCANOUT);
+#endif
 
-       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;
diff --git a/libweston/meson.build b/libweston/meson.build
index f0d944bb..c302f29d 100644
--- a/libweston/meson.build
+++ b/libweston/meson.build
@@ -156,7 +156,11 @@ if get_option('backend_drm')
        ]
 
        if get_option('renderer_gl')
-               deps_drm += dependency('gbm')
+               dep_gbm = dependency('gbm')
+               if dep_gbm.version().version_compare('>= 17.1')
+                       config_h.set('HAVE_GBM_MODIFIERS', '1')
+               endif
+               deps_drm += dep_gbm
        endif
 
        if get_option('backend_drm_screencast_vaapi')
-- 
2.12.2

_______________________________________________
wayland-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to