kmssink: use control node to setplane to avoid getting DRM-Master
a workaround on Linux 4.9 for kmssink multi-user
upstream status: i.mx specific
Signed-off-by: Haihua Hu <jared.hu@nxp.com>
diff --git a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c
index ece36e7..7adb7d1 100644
--- a/sys/kms/gstkmssink.c
+++ b/sys/kms/gstkmssink.c
@@ -52,6 +52,8 @@
#include <drm_fourcc.h>
#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
#include "gstkmssink.h"
#include "gstkmsutils.h"
@@ -584,6 +586,21 @@
return (self->allowed_caps && !gst_caps_is_empty (self->allowed_caps));
}
+static gint
+get_drm_minor_base (gint type)
+{
+ switch (type) {
+ case DRM_NODE_PRIMARY:
+ return 0;
+ case DRM_NODE_CONTROL:
+ return 64;
+ case DRM_NODE_RENDER:
+ return 128;
+ default:
+ return -1;
+ }
+}
+
static gboolean
gst_kms_sink_start (GstBaseSink * bsink)
{
@@ -595,6 +612,7 @@
drmModePlane *plane;
gboolean universal_planes;
gboolean ret;
+ gint minor;
self = GST_KMS_SINK (bsink);
universal_planes = FALSE;
@@ -609,7 +627,11 @@
self->fd = drmOpen (self->devname, self->bus_id);
else
self->fd = kms_open (&self->devname);
- if (self->fd < 0)
+
+ minor = get_drm_minor_base (DRM_NODE_CONTROL);
+ self->ctrl_fd = drmOpenControl(minor);
+
+ if (self->fd < 0 || self->ctrl_fd < 0)
goto open_failed;
log_drm_version (self);
@@ -804,6 +826,11 @@
self->fd = -1;
}
+ if (self->ctrl_fd >= 0) {
+ drmClose (self->ctrl_fd);
+ self->ctrl_fd = -1;
+ }
+
GST_OBJECT_LOCK (bsink);
self->hdisplay = 0;
self->vdisplay = 0;
@@ -1520,7 +1547,7 @@
"drmModeSetPlane at (%i,%i) %ix%i sourcing at (%i,%i) %ix%i",
result.x, result.y, result.w, result.h, src.x, src.y, src.w, src.h);
- ret = drmModeSetPlane (self->fd, self->plane_id, self->crtc_id, fb_id, 0,
+ ret = drmModeSetPlane (self->ctrl_fd, self->plane_id, self->crtc_id, fb_id, 0,
result.x, result.y, result.w, result.h,
/* source/cropping coordinates are given in Q16 */
src.x << 16, src.y << 16, src.w << 16, src.h << 16);
diff --git a/sys/kms/gstkmssink.h b/sys/kms/gstkmssink.h
index a80699c..5dc4772 100644
--- a/sys/kms/gstkmssink.h
+++ b/sys/kms/gstkmssink.h
@@ -49,6 +49,7 @@
/*< private >*/
gint fd;
+ gint ctrl_fd;
gint conn_id;
gint crtc_id;
gint plane_id;