1*4882a593SmuzhiyunFrom 7c68fd42db921d845724a54e198226a13da6c9ba 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/43] 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