summaryrefslogtreecommitdiffstats
path: root/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0005-weston-drm-fix-dual-display-issue.patch
blob: 9b06b81b32dd3e8041d3cce5315a2d5c72ff818d (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
From db6f5ce008d9b8a4cc7db71659ce1d21d3d7f97f Mon Sep 17 00:00:00 2001
From: Eric Ruei <e-ruei1@ti.com>
Date: Tue, 26 Mar 2019 13:32:31 -0400
Subject: [PATCH 3/3] weston: drm: fix dual display issue

This patch fixes the dual display issue by enhancing the primary plane
search algorithm to keep the plane which is connected to the crtc of
the output because the direct switching of active planes is not allowed.

Upstream status: Pending

Signed-off-by: Eric Ruei <e-ruei1@ti.com>
---
 libweston/compositor-drm.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index 3891176..fa694c3 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -428,6 +428,7 @@ struct drm_plane {
 
 	uint32_t possible_crtcs;
 	uint32_t plane_id;
+	uint32_t crtc_id;
 	uint32_t count_formats;
 
 	struct drm_property_info props[WDRM_PLANE__COUNT];
@@ -4073,6 +4074,7 @@ drm_plane_create(struct drm_backend *b, const drmModePlane *kplane,
 	if (kplane) {
 		plane->possible_crtcs = kplane->possible_crtcs;
 		plane->plane_id = kplane->plane_id;
+		plane->crtc_id = kplane->crtc_id;
 
 		props = drmModeObjectGetProperties(b->drm.fd, kplane->plane_id,
 						   DRM_MODE_OBJECT_PLANE);
@@ -4097,6 +4099,7 @@ drm_plane_create(struct drm_backend *b, const drmModePlane *kplane,
 	else {
 		plane->possible_crtcs = (1 << output->pipe);
 		plane->plane_id = 0;
+		plane->crtc_id = 0;
 		plane->count_formats = 1;
 		plane->formats[0].format = format;
 		plane->type = type;
@@ -4157,6 +4160,7 @@ drm_output_find_special_plane(struct drm_backend *b, struct drm_output *output,
 			      enum wdrm_plane_type type)
 {
 	struct drm_plane *plane;
+	struct drm_plane *plane2 = NULL; /* secondary plane */
 
 	if (!b->universal_planes) {
 		uint32_t format;
@@ -4204,11 +4208,22 @@ drm_output_find_special_plane(struct drm_backend *b, struct drm_output *output,
 		if (found_elsewhere)
 			continue;
 
+		/* The output should keep the primary plane connected to its
+		 * crtc since the direct switching of active plane is not
+		 * allowed. */
+		if ((type == WDRM_PLANE_TYPE_PRIMARY) &&
+		    (plane->crtc_id != output->crtc_id)) {
+			if (plane->crtc_id == 0) {
+				plane->possible_crtcs = (1 << output->pipe);
+				plane2 = plane;
+			}
+			continue;
+		}
 		plane->possible_crtcs = (1 << output->pipe);
 		return plane;
 	}
 
-	return NULL;
+	return plane2;
 }
 
 /**
-- 
1.9.1