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.pinch...@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 450c86d..e49838b 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)
-- 
1.8.1.5

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to