summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2013-03-19 15:36:09 +0100
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2013-08-05 14:21:45 +0200
commita4f2f1b9d1c0b6b7f740951525a14b3d328f0acf (patch)
tree7a6ed714e7c5fdb6fa6c9fee89d5e0e2ed52b759
parent2c5ee84d30cbd3fba61a8426b1e6bdd4f385de13 (diff)
downloaddrm-a4f2f1b9d1c0b6b7f740951525a14b3d328f0acf.tar.gz
modetest: Try all possible encoders for a connector
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@ideasonboard.com>
-rw-r--r--tests/modetest/modetest.c35
1 files changed, 25 insertions, 10 deletions
diff --git a/tests/modetest/modetest.c b/tests/modetest/modetest.c
index 66875593..f96b930b 100644
--- a/tests/modetest/modetest.c
+++ b/tests/modetest/modetest.c
@@ -635,6 +635,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;
@@ -728,26 +741,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)