[PATCH v4 21/21] modetest: Try all possible encoders for a connector

Laurent Pinchart laurent.pinchart at ideasonboard.com
Tue Mar 19 07:56:02 PDT 2013


When building the pipeline, instead of using only the encoders attached
to a connector, take all possible encoders into account to locate a
CRTC.

Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 tests/modetest/modetest.c | 35 +++++++++++++++++++++++++----------
 1 file changed, 25 insertions(+), 10 deletions(-)

diff --git a/tests/modetest/modetest.c b/tests/modetest/modetest.c
index 489cf2c..15aedc8 100644
--- a/tests/modetest/modetest.c
+++ b/tests/modetest/modetest.c
@@ -634,6 +634,19 @@ error:
 	return NULL;
 }
 
+static int get_crtc_index(struct device *dev, uint32_t id)
+{
+	int i;
+
+	for (i = 0; i < dev->resources->res->count_crtcs; ++i) {
+		drmModeCrtc *crtc = dev->resources->crtcs[i].crtc;
+		if (crtc && crtc->crtc_id == id)
+			return i;
+	}
+
+	return -1;
+}
+
 static drmModeConnector *get_connector_by_id(struct device *dev, uint32_t id)
 {
 	drmModeConnector *connector;
@@ -726,26 +739,28 @@ static struct crtc *pipe_find_crtc(struct device *dev, struct pipe_arg *pipe)
 	int j;
 
 	for (i = 0; i < pipe->num_cons; ++i) {
+		uint32_t crtcs_for_connector = 0;
 		drmModeConnector *connector;
 		drmModeEncoder *encoder;
+		int idx;
 
 		connector = get_connector_by_id(dev, pipe->con_ids[i]);
 		if (!connector)
 			return NULL;
 
-		encoder = get_encoder_by_id(dev, connector->encoder_id);
-		if (!encoder)
-			return NULL;
+		for (j = 0; j < connector->count_encoders; ++j) {
+			encoder = get_encoder_by_id(dev, connector->encoders[j]);
+			if (!encoder)
+				continue;
 
-		possible_crtcs &= encoder->possible_crtcs;
+			crtcs_for_connector |= encoder->possible_crtcs;
 
-		for (j = 0; j < dev->resources->res->count_crtcs; ++j) {
-			drmModeCrtc *crtc = dev->resources->crtcs[j].crtc;
-			if (crtc && crtc->crtc_id == encoder->crtc_id) {
-				active_crtcs |= 1 << j;
-				break;
-			}
+			idx = get_crtc_index(dev, encoder->crtc_id);
+			if (idx >= 0)
+				active_crtcs |= 1 << idx;
 		}
+
+		possible_crtcs &= crtcs_for_connector;
 	}
 
 	if (!possible_crtcs)
-- 
1.8.1.5



More information about the dri-devel mailing list