backend-drm: Add dmabuf scan-out check for DRM-backend
authorMarius Vlad <marius.vlad@collabora.com>
Sun, 10 Nov 2019 22:27:17 +0000 (00:27 +0200)
committerMarius Vlad <marius.vlad@collabora.com>
Thu, 21 Nov 2019 12:07:54 +0000 (14:07 +0200)
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
libweston/backend-drm/drm-internal.h
libweston/backend-drm/drm.c
libweston/backend-drm/fb.c

index cf588674f8aacf774b6d07d1b422789000968a44..21bece8d274638321d4be1b4fb8a59a26b452942 100644 (file)
@@ -682,12 +682,21 @@ drm_fb_get_from_bo(struct gbm_bo *bo, struct drm_backend *backend,
 #ifdef BUILD_DRM_GBM
 extern struct drm_fb *
 drm_fb_get_from_view(struct drm_output_state *state, struct weston_view *ev);
+extern bool
+drm_can_scanout_dmabuf(struct weston_compositor *ec,
+                      struct linux_dmabuf_buffer *dmabuf);
 #else
 static inline struct drm_fb *
 drm_fb_get_from_view(struct drm_output_state *state, struct weston_view *ev)
 {
        return NULL;
 }
+static inline bool
+drm_can_scanout_dmabuf(struct weston_compositor *ec,
+                      struct linux_dmabuf_buffer *dmabuf)
+{
+       return false;
+}
 #endif
 
 struct drm_pending_state *
index 6e1169c6cb8d4d615a3d4bbfa32ee858ca2e7270..89508a8da4ef772e7d77bf5c0074511db349bd57 100644 (file)
@@ -2893,6 +2893,7 @@ drm_backend_create(struct weston_compositor *compositor,
        b->base.repaint_cancel = drm_repaint_cancel;
        b->base.create_output = drm_output_create;
        b->base.device_changed = drm_device_changed;
+       b->base.can_scanout_dmabuf = drm_can_scanout_dmabuf;
 
        weston_setup_vt_switch_bindings(compositor);
 
index e978b08879d51a1ccb548ec74fba2c47a85804a4..fcbabbea3963cb7fc4587697a0446aa36d171449 100644 (file)
@@ -509,6 +509,24 @@ drm_fb_unref(struct drm_fb *fb)
 }
 
 #ifdef BUILD_DRM_GBM
+bool
+drm_can_scanout_dmabuf(struct weston_compositor *ec,
+                      struct linux_dmabuf_buffer *dmabuf)
+{
+       struct drm_fb *fb;
+       struct drm_backend *b = to_drm_backend(ec);
+       bool ret = false;
+
+       fb = drm_fb_get_from_dmabuf(dmabuf, b, true);
+       if (fb)
+               ret = true;
+
+       drm_fb_unref(fb);
+       drm_debug(b, "[dmabuf] dmabuf %p, import test %s\n", dmabuf,
+                     ret ? "succeeded" : "failed");
+       return ret;
+}
+
 struct drm_fb *
 drm_fb_get_from_view(struct drm_output_state *state, struct weston_view *ev)
 {