compositor-drm: add DTRC meta handle

DTRC meta is used for DCSS drm driver, Only overlay plane
has this property. Update it when its value changed

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 3ccb1bb..fe55b41 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -142,6 +142,7 @@
 	WDRM_PLANE_FB_ID,
 	WDRM_PLANE_CRTC_ID,
 	WDRM_PLANE_IN_FORMATS,
+	WDRM_PLANE_DTRC_META,
 	WDRM_PLANE__COUNT
 };
 
@@ -184,6 +185,7 @@
 	[WDRM_PLANE_FB_ID] = { .name = "FB_ID", },
 	[WDRM_PLANE_CRTC_ID] = { .name = "CRTC_ID", },
 	[WDRM_PLANE_IN_FORMATS] = { .name = "IN_FORMATS" },
+	[WDRM_PLANE_DTRC_META] = { .name = "dtrc_table_ofs" },
 };
 
 /**
@@ -361,6 +363,8 @@
 
 	/* Used by dumb fbs */
 	void *map;
+
+	uint64_t dtrc_meta;
 };
 
 struct drm_edid {
@@ -458,6 +462,8 @@
 
 	struct wl_list link;
 
+	uint64_t dtrc_meta;
+
 	struct {
 		uint32_t format;
 		uint32_t count_modifiers;
@@ -1125,6 +1131,7 @@
 	fb->width = dmabuf->attributes.width;
 	fb->height = dmabuf->attributes.height;
 	fb->modifier = dmabuf->attributes.modifier[0];
+	fb->dtrc_meta = dmabuf->attributes.dtrc_meta;
 	fb->size = 0;
 	fb->fd = backend->drm.fd;
 
@@ -2635,6 +2642,14 @@
 		ret |= plane_add_prop(req, plane, WDRM_PLANE_CRTC_H,
 				      plane_state->dest_h);
 
+		if (plane_state->fb && plane_state->fb->dtrc_meta != plane->dtrc_meta
+		    && plane->type == WDRM_PLANE_TYPE_OVERLAY
+			&& plane_state->fb->modifier != DRM_FORMAT_MOD_LINEAR)
+		{
+		        plane_add_prop(req, plane, WDRM_PLANE_DTRC_META, plane_state->fb->dtrc_meta);
+		        plane->dtrc_meta = plane_state->fb->dtrc_meta;
+		}
+
 		if (ret != 0) {
 			weston_log("couldn't set plane state\n");
 			return ret;
diff --git a/libweston/linux-dmabuf.c b/libweston/linux-dmabuf.c
index 0f96e5f..fefd6b1 100644
--- a/libweston/linux-dmabuf.c
+++ b/libweston/linux-dmabuf.c
@@ -334,12 +334,35 @@
 			     format, flags);
 }
 
+static void
+params_add_dtrc_meta(struct wl_client *client,
+		    struct wl_resource *params_resource,
+		    uint32_t rfc_chroma_offset,
+		    uint32_t rfc_luma_offset)
+{
+	struct linux_dmabuf_buffer *buffer;
+
+	buffer = wl_resource_get_user_data(params_resource);
+	if (!buffer) {
+		wl_resource_post_error(params_resource,
+			ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_ALREADY_USED,
+			"params was already used to create a wl_buffer");
+		return;
+	}
+
+	assert(buffer->params_resource == params_resource);
+	assert(!buffer->buffer_resource);
+
+	buffer->attributes.dtrc_meta =  rfc_luma_offset | ((uint64_t)rfc_chroma_offset << 32);
+}
+
 static const struct zwp_linux_buffer_params_v1_interface
 zwp_linux_buffer_params_implementation = {
 	params_destroy,
 	params_add,
 	params_create,
-	params_create_immed
+	params_create_immed,
+	params_add_dtrc_meta
 };
 
 static void
diff --git a/libweston/linux-dmabuf.h b/libweston/linux-dmabuf.h
index dbeda66..cbd83dc 100644
--- a/libweston/linux-dmabuf.h
+++ b/libweston/linux-dmabuf.h
@@ -50,6 +50,7 @@
 	uint32_t offset[MAX_DMABUF_PLANES];
 	uint32_t stride[MAX_DMABUF_PLANES];
 	uint64_t modifier[MAX_DMABUF_PLANES];
+	uint64_t dtrc_meta;
 };
 
 struct linux_dmabuf_buffer {