summaryrefslogtreecommitdiff
path: root/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0028-kmssink-use-control-node-to-setplane-to-.patch
blob: 2edd59340e38d0fd6c43d0907fb1fdc86bd98fe3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
From c2dd58fac7dc43280fab80d2234193993076665c Mon Sep 17 00:00:00 2001
From: Haihua Hu <jared.hu@nxp.com>
Date: Tue, 8 Aug 2017 12:55:42 +0800
Subject: [PATCH 1/3] [MMFMWK-7567] kmssink: use control node to setplane to
 avoid getting DRM-Master

a workaround on Linux 4.9 for kmssink multi-user

Upstream-Status: Inappropriate [i.MX specific]

Signed-off-by: Haihua Hu <jared.hu@nxp.com>
---
 sys/kms/gstkmssink.c | 31 +++++++++++++++++++++++++++++--
 sys/kms/gstkmssink.h |  1 +
 2 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c
index d19e19e..e91c211 100644
--- a/sys/kms/gstkmssink.c
+++ b/sys/kms/gstkmssink.c
@@ -51,6 +51,8 @@
 #include <drm_fourcc.h>
 
 #include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
 
 #include "gstkmssink.h"
 #include "gstkmsutils.h"
@@ -485,6 +487,21 @@ ensure_allowed_caps (GstKMSSink * self, drmModeConnector * conn,
   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)
 {
@@ -496,6 +513,7 @@ gst_kms_sink_start (GstBaseSink * bsink)
   drmModePlane *plane;
   gboolean universal_planes;
   gboolean ret;
+  gint minor;
 
   self = GST_KMS_SINK (bsink);
   universal_planes = FALSE;
@@ -510,7 +528,11 @@ gst_kms_sink_start (GstBaseSink * bsink)
     self->fd = drmOpen (self->devname, NULL);
   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);
@@ -689,6 +711,11 @@ gst_kms_sink_stop (GstBaseSink * bsink)
     self->fd = -1;
   }
 
+  if (self->ctrl_fd >= 0) {
+    drmClose (self->ctrl_fd);
+    self->ctrl_fd = -1;
+  }
+
   return TRUE;
 }
 
@@ -1278,7 +1305,7 @@ retry_set_plane:
       "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 214f3ad..f2ab4d4 100644
--- a/sys/kms/gstkmssink.h
+++ b/sys/kms/gstkmssink.h
@@ -49,6 +49,7 @@ struct _GstKMSSink {
 
   /*< private >*/
   gint fd;
+  gint ctrl_fd;
   gint conn_id;
   gint crtc_id;
   gint plane_id;
-- 
1.9.1