From db6f5ce008d9b8a4cc7db71659ce1d21d3d7f97f Mon Sep 17 00:00:00 2001 From: Eric Ruei 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 --- 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