compositor-drm: add _query_dma_formats for linux-dmabuf
also query dma formats form drm driver
Upstream-Status: Inappropriate [i.MX-specific]
Signed-off-by: Haihua Hu <jared.hu@nxp.com>
diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index 125e7b1..4db5d9f 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -3068,6 +3068,46 @@
b->repaint_data = NULL;
}
+static void
+drm_query_dmabuf_formats(struct weston_compositor *compositor, int **formats, int *num_formats)
+{
+ struct drm_backend *b = to_drm_backend(compositor);
+ struct drm_plane *p;
+ uint64_t has_prime;
+ uint32_t i, j;
+ int ret;
+
+ assert(formats);
+ assert(num_formats);
+
+ *num_formats = 0;
+
+ ret = drmGetCap (b->drm.fd, DRM_CAP_PRIME, &has_prime);
+ if (ret || !(bool) (has_prime & DRM_PRIME_CAP_IMPORT)) {
+ weston_log("drm backend not support import DMABUF\n");
+ return;
+ }
+
+ wl_list_for_each(p, &b->plane_list, link) {
+ if (p->type != WDRM_PLANE_TYPE_OVERLAY)
+ continue;
+
+ *formats = calloc(p->count_formats, sizeof(int));
+ if (*formats == NULL) {
+ *num_formats = 0;
+ continue;
+ }
+
+ j = 0;
+ for (i = 0; i < p->count_formats; i++)
+ (*formats)[j++] = p->formats[i].format;
+
+ *num_formats = j;
+ if (*num_formats > 0)
+ break;
+ }
+}
+
#ifdef HAVE_DRM_ATOMIC
static void
atomic_flip_handler(int fd, unsigned int frame, unsigned int sec,
@@ -7021,6 +7061,7 @@
b->base.repaint_flush = drm_repaint_flush;
b->base.repaint_cancel = drm_repaint_cancel;
b->base.create_output = drm_output_create;
+ b->base.query_dmabuf_formats = drm_query_dmabuf_formats;
weston_setup_vt_switch_bindings(compositor);
diff --git a/libweston/compositor.h b/libweston/compositor.h
index 8b7a102..abc9200 100644
--- a/libweston/compositor.h
+++ b/libweston/compositor.h
@@ -1029,6 +1029,9 @@
struct weston_output *
(*create_output)(struct weston_compositor *compositor,
const char *name);
+
+ void (*query_dmabuf_formats)(struct weston_compositor* compositor,
+ int **formats, int *num_formats);
};
/** Callback for saving calibration
diff --git a/libweston/linux-dmabuf.c b/libweston/linux-dmabuf.c
index 148c61f..d908b82 100644
--- a/libweston/linux-dmabuf.c
+++ b/libweston/linux-dmabuf.c
@@ -525,6 +525,19 @@
free(modifiers);
}
free(formats);
+ formats = NULL;
+
+ if (compositor->backend->query_dmabuf_formats) {
+ compositor->backend->query_dmabuf_formats(compositor, &formats, &num_formats);
+
+ if (!formats)
+ return;
+
+ for (i = 0; i < num_formats; i++) {
+ zwp_linux_dmabuf_v1_send_format(resource, formats[i]);
+ }
+ free(formats);
+ }
}
/** Advertise linux_dmabuf support