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 {