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