diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2013-03-19 15:36:09 +0100 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2013-06-27 10:01:16 +0200 |
commit | 15d941256d275892e46db7ab55a9562399b3da08 (patch) | |
tree | 73b79fc0f324785c306b74efc2960d1b3b1b5209 | |
parent | d9e804e5d889dc703e51fc88dca2e8379723fbc4 (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.c | 35 |
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) |