Multiplanar formats are supported by using drmModeAddFB2 and bypassing
gbm. If drmModeAddFB2 isn't available, the existing gbm bo import path
is used and multiplanar formats are unsupported.

Signed-off-by: Tomohito Esaki <e...@igel.co.jp>
---
 libweston/compositor-drm.c | 53 +++++++++++++++++++++++-----------------------
 1 file changed, 26 insertions(+), 27 deletions(-)

diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index b15fa01..f0e6f7c 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -1008,11 +1008,9 @@ page_flip_handler(int fd, unsigned int frame,
 
 static uint32_t
 drm_output_check_sprite_format(struct drm_sprite *s,
-                              struct weston_view *ev, struct gbm_bo *bo)
+                              struct weston_view *ev, uint32_t format)
 {
-       uint32_t i, format;
-
-       format = gbm_bo_get_format(bo);
+       uint32_t i;
 
        if (format == GBM_FORMAT_ARGB8888) {
                pixman_region32_t r;
@@ -1053,15 +1051,12 @@ drm_output_prepare_overlay_view(struct drm_output 
*output,
        struct drm_sprite *s;
        struct linux_dmabuf_buffer *dmabuf;
        int found = 0;
-       struct gbm_bo *bo;
+       struct gbm_bo *bo = NULL;
        pixman_region32_t dest_rect, src_rect;
        pixman_box32_t *box, tbox;
        uint32_t format;
        wl_fixed_t sx1, sy1, sx2, sy2;
 
-       if (b->gbm == NULL)
-               return NULL;
-
        if (viewport->buffer.transform != output->base.transform)
                return NULL;
 
@@ -1101,15 +1096,9 @@ drm_output_prepare_overlay_view(struct drm_output 
*output,
        if (!found)
                return NULL;
 
-       if ((dmabuf = linux_dmabuf_buffer_get(buffer_resource))) {
+       if ((dmabuf = linux_dmabuf_buffer_get(buffer_resource)) &&
+           b->no_addfb2 && b->gbm) {
 #ifdef HAVE_GBM_FD_IMPORT
-               /* XXX: TODO:
-                *
-                * Use AddFB2 directly, do not go via GBM.
-                * Add support for multiplanar formats.
-                * Both require refactoring in the DRM-backend to
-                * support a mix of gbm_bos and drmfbs.
-                */
                struct gbm_import_fd_data gbm_dmabuf = {
                        .fd     = dmabuf->attributes.fd[0],
                        .width  = dmabuf->attributes.width,
@@ -1126,22 +1115,32 @@ drm_output_prepare_overlay_view(struct drm_output 
*output,
 #else
                return NULL;
 #endif
-       } else {
+       } else if (b->gbm) {
                bo = gbm_bo_import(b->gbm, GBM_BO_IMPORT_WL_BUFFER,
                                   buffer_resource, GBM_BO_USE_SCANOUT);
        }
-       if (!bo)
-               return NULL;
 
-       format = drm_output_check_sprite_format(s, ev, bo);
-       if (format == 0) {
-               gbm_bo_destroy(bo);
-               return NULL;
-       }
+       if (bo) {
+               format = drm_output_check_sprite_format(
+                       s, ev, gbm_bo_get_format(bo));
+               if (format == 0)
+                       return NULL;
+
+               s->next = drm_fb_get_from_bo(bo, b, format);
+               if (!s->next) {
+                       gbm_bo_destroy(bo);
+                       return NULL;
+               }
+       } else if (dmabuf) {
+               format = drm_output_check_sprite_format(
+                       s, ev, dmabuf->attributes.format);
+               if (format == 0)
+                       return NULL;
 
-       s->next = drm_fb_get_from_bo(bo, b, format);
-       if (!s->next) {
-               gbm_bo_destroy(bo);
+               s->next = drm_fb_create_dmabuf(dmabuf, b, format);
+               if (!s->next)
+                       return NULL;
+       } else {
                return NULL;
        }
 
-- 
2.7.4

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

Reply via email to