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-06-27 10:01:16 +0200
commit15d941256d275892e46db7ab55a9562399b3da08 (patch)
tree73b79fc0f324785c306b74efc2960d1b3b1b5209
parentd9e804e5d889dc703e51fc88dca2e8379723fbc4 (diff)
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 450c86d2..e49838b4 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)