1*4882a593SmuzhiyunFrom 614634d80f4c252372c180de60f672e74e6c4756 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com>
3*4882a593SmuzhiyunDate: Mon, 15 Jun 2020 10:03:01 +0800
4*4882a593SmuzhiyunSubject: [PATCH 08/41] kmssink: Support setting plane zpos
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunSet env KMSSINK_PLANE_ZPOS to specify plane zpos.
7*4882a593SmuzhiyunSet env KMSSINK_PLANE_ON_TOP to set max zpos.
8*4882a593SmuzhiyunSet env KMSSINK_PLANE_ON_BOTTOM to set min zpos.
9*4882a593Smuzhiyun
10*4882a593SmuzhiyunDefault zpos is max.
11*4882a593Smuzhiyun
12*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
13*4882a593Smuzhiyun---
14*4882a593Smuzhiyun sys/kms/gstkmssink.c | 78 ++++++++++++++++++++++++++++++++++++++++++++
15*4882a593Smuzhiyun sys/kms/gstkmssink.h |  1 +
16*4882a593Smuzhiyun 2 files changed, 79 insertions(+)
17*4882a593Smuzhiyun
18*4882a593Smuzhiyundiff --git a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c
19*4882a593Smuzhiyunindex e20740f..4df343c 100644
20*4882a593Smuzhiyun--- a/sys/kms/gstkmssink.c
21*4882a593Smuzhiyun+++ b/sys/kms/gstkmssink.c
22*4882a593Smuzhiyun@@ -1027,6 +1027,76 @@ gst_kms_sink_update_plane_properties (GstKMSSink * self)
23*4882a593Smuzhiyun   gst_kms_sink_update_properties (&iter, self->plane_props);
24*4882a593Smuzhiyun }
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun+static void
27*4882a593Smuzhiyun+gst_kms_sink_configure_plane_zpos (GstKMSSink * self, gboolean restore)
28*4882a593Smuzhiyun+{
29*4882a593Smuzhiyun+  drmModeObjectPropertiesPtr props = NULL;
30*4882a593Smuzhiyun+  drmModePropertyPtr prop = NULL;
31*4882a593Smuzhiyun+  drmModeResPtr res = NULL;
32*4882a593Smuzhiyun+  guint64 min, max, zpos;
33*4882a593Smuzhiyun+  const gchar *buf;
34*4882a593Smuzhiyun+  gint i;
35*4882a593Smuzhiyun+
36*4882a593Smuzhiyun+  if (self->plane_id <= 0)
37*4882a593Smuzhiyun+    return;
38*4882a593Smuzhiyun+
39*4882a593Smuzhiyun+  if (drmSetClientCap (self->fd, DRM_CLIENT_CAP_ATOMIC, 1))
40*4882a593Smuzhiyun+    return;
41*4882a593Smuzhiyun+
42*4882a593Smuzhiyun+  res = drmModeGetResources (self->fd);
43*4882a593Smuzhiyun+  if (!res)
44*4882a593Smuzhiyun+    return;
45*4882a593Smuzhiyun+
46*4882a593Smuzhiyun+  props = drmModeObjectGetProperties (self->fd, self->plane_id,
47*4882a593Smuzhiyun+      DRM_MODE_OBJECT_PLANE);
48*4882a593Smuzhiyun+  if (!props)
49*4882a593Smuzhiyun+    goto out;
50*4882a593Smuzhiyun+
51*4882a593Smuzhiyun+  for (i = 0; i < props->count_props; i++) {
52*4882a593Smuzhiyun+    prop = drmModeGetProperty (self->fd, props->props[i]);
53*4882a593Smuzhiyun+    if (prop && !strcmp (prop->name, "ZPOS"))
54*4882a593Smuzhiyun+      break;
55*4882a593Smuzhiyun+    drmModeFreeProperty (prop);
56*4882a593Smuzhiyun+    prop = NULL;
57*4882a593Smuzhiyun+  }
58*4882a593Smuzhiyun+
59*4882a593Smuzhiyun+  if (!prop)
60*4882a593Smuzhiyun+    goto out;
61*4882a593Smuzhiyun+
62*4882a593Smuzhiyun+  min = prop->values[0];
63*4882a593Smuzhiyun+  max = prop->values[1];
64*4882a593Smuzhiyun+
65*4882a593Smuzhiyun+  if (restore) {
66*4882a593Smuzhiyun+    if (self->saved_zpos < 0)
67*4882a593Smuzhiyun+      goto out;
68*4882a593Smuzhiyun+
69*4882a593Smuzhiyun+    zpos = self->saved_zpos;
70*4882a593Smuzhiyun+  } else {
71*4882a593Smuzhiyun+    zpos = min + 1;
72*4882a593Smuzhiyun+
73*4882a593Smuzhiyun+    buf = g_getenv ("KMSSINK_PLANE_ZPOS");
74*4882a593Smuzhiyun+    if (buf)
75*4882a593Smuzhiyun+      zpos = atoi (buf);
76*4882a593Smuzhiyun+    else if (g_getenv ("KMSSINK_PLANE_ON_TOP"))
77*4882a593Smuzhiyun+      zpos = max;
78*4882a593Smuzhiyun+    else if (g_getenv ("KMSSINK_PLANE_ON_BOTTOM"))
79*4882a593Smuzhiyun+      zpos = min;
80*4882a593Smuzhiyun+  }
81*4882a593Smuzhiyun+
82*4882a593Smuzhiyun+  GST_INFO_OBJECT (self, "set plane zpos = %lu (%lu~%lu)", zpos, min, max);
83*4882a593Smuzhiyun+
84*4882a593Smuzhiyun+  if (self->saved_zpos < 0)
85*4882a593Smuzhiyun+    self->saved_zpos = props->prop_values[i];
86*4882a593Smuzhiyun+
87*4882a593Smuzhiyun+  drmModeObjectSetProperty (self->fd, self->plane_id,
88*4882a593Smuzhiyun+      DRM_MODE_OBJECT_PLANE, props->props[i], zpos);
89*4882a593Smuzhiyun+
90*4882a593Smuzhiyun+out:
91*4882a593Smuzhiyun+  drmModeFreeProperty (prop);
92*4882a593Smuzhiyun+  drmModeFreeObjectProperties (props);
93*4882a593Smuzhiyun+  drmModeFreeResources (res);
94*4882a593Smuzhiyun+}
95*4882a593Smuzhiyun+
96*4882a593Smuzhiyun static gboolean
97*4882a593Smuzhiyun gst_kms_sink_start (GstBaseSink * bsink)
98*4882a593Smuzhiyun {
99*4882a593Smuzhiyun@@ -1111,6 +1181,8 @@ retry_find_plane:
100*4882a593Smuzhiyun   self->crtc_id = crtc->crtc_id;
101*4882a593Smuzhiyun   self->plane_id = plane->plane_id;
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun+  gst_kms_sink_configure_plane_zpos (self, FALSE);
104*4882a593Smuzhiyun+
105*4882a593Smuzhiyun   GST_INFO_OBJECT (self, "connector id = %d / crtc id = %d / plane id = %d",
106*4882a593Smuzhiyun       self->conn_id, self->crtc_id, self->plane_id);
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun@@ -1246,6 +1318,11 @@ gst_kms_sink_stop (GstBaseSink * bsink)
109*4882a593Smuzhiyun   if (self->allocator)
110*4882a593Smuzhiyun     gst_kms_allocator_clear_cache (self->allocator);
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun+  if (self->saved_zpos >= 0) {
113*4882a593Smuzhiyun+    gst_kms_sink_configure_plane_zpos (self, TRUE);
114*4882a593Smuzhiyun+    self->saved_zpos = -1;
115*4882a593Smuzhiyun+  }
116*4882a593Smuzhiyun+
117*4882a593Smuzhiyun   gst_buffer_replace (&self->last_buffer, NULL);
118*4882a593Smuzhiyun   gst_caps_replace (&self->allowed_caps, NULL);
119*4882a593Smuzhiyun   gst_object_replace ((GstObject **) & self->pool, NULL);
120*4882a593Smuzhiyun@@ -2310,6 +2387,7 @@ gst_kms_sink_init (GstKMSSink * sink)
121*4882a593Smuzhiyun   sink->is_internal_fd = TRUE;
122*4882a593Smuzhiyun   sink->conn_id = -1;
123*4882a593Smuzhiyun   sink->plane_id = -1;
124*4882a593Smuzhiyun+  sink->saved_zpos = -1;
125*4882a593Smuzhiyun   sink->can_scale = TRUE;
126*4882a593Smuzhiyun   gst_poll_fd_init (&sink->pollfd);
127*4882a593Smuzhiyun   sink->poll = gst_poll_new (TRUE);
128*4882a593Smuzhiyundiff --git a/sys/kms/gstkmssink.h b/sys/kms/gstkmssink.h
129*4882a593Smuzhiyunindex a769d9b..f221eb6 100644
130*4882a593Smuzhiyun--- a/sys/kms/gstkmssink.h
131*4882a593Smuzhiyun+++ b/sys/kms/gstkmssink.h
132*4882a593Smuzhiyun@@ -54,6 +54,7 @@ struct _GstKMSSink {
133*4882a593Smuzhiyun   gint crtc_id;
134*4882a593Smuzhiyun   gint plane_id;
135*4882a593Smuzhiyun   guint pipe;
136*4882a593Smuzhiyun+  guint saved_zpos;
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun   /* crtc data */
139*4882a593Smuzhiyun   guint16 hdisplay, vdisplay;
140*4882a593Smuzhiyun--
141*4882a593Smuzhiyun2.20.1
142*4882a593Smuzhiyun
143