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
