On Mon, 16 Jan 2017 14:40:44 +0000 Daniel Stone <[email protected]> wrote:
> Previously in picking CRTC -> encoder -> connecting routing, we went for > the first triplet we found which claimed to work. > > Preserving the existing routing means that startup will be faster: on a > multi-head system, changing the routing implies disabling both CRTCs, > then re-enabling them with a new configuration, which may involve > retraining links etc. > > Furthermore, the existing routing may be set for a reason; each > CRTC/encoder is not necessarily as capable as the other, so the routing > may be configured to stay within such device limits. > > Try where possible to respect the routing we pick up, rather than > blithely configuring our own. > > Signed-off-by: Daniel Stone <[email protected]> > --- > libweston/compositor-drm.c | 27 ++++++++++++++++++++++----- > 1 file changed, 22 insertions(+), 5 deletions(-) > > diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c > index ecc872e..030f82f 100644 > --- a/libweston/compositor-drm.c > +++ b/libweston/compositor-drm.c > @@ -1794,26 +1794,43 @@ find_crtc_for_connector(struct drm_backend *b, > drmModeRes *resources, drmModeConnector *connector) > { > drmModeEncoder *encoder; > - uint32_t possible_crtcs; > int i, j; > + int ret = -1; > > for (j = 0; j < connector->count_encoders; j++) { > + uint32_t possible_crtcs, encoder_id, crtc_id; > + > encoder = drmModeGetEncoder(b->drm.fd, connector->encoders[j]); > if (encoder == NULL) { > weston_log("Failed to get encoder.\n"); > - return -1; > + continue; > } > + encoder_id = encoder->encoder_id; > possible_crtcs = encoder->possible_crtcs; > + crtc_id = encoder->crtc_id; > drmModeFreeEncoder(encoder); > > for (i = 0; i < resources->count_crtcs; i++) { > - if (possible_crtcs & (1 << i) && > - !(b->crtc_allocator & (1 << resources->crtcs[i]))) > + if (!(possible_crtcs & (1 << i))) > + continue; > + if (b->crtc_allocator & (1 << resources->crtcs[i])) > + continue; > + > + /* Try to preserve the existing > + * CRTC -> encoder -> connector routing; it makes > + * initialisation faster, and also since we have a > + * very dumb picking algorithm, may preserve a better > + * choice. */ > + if (!connector->encoder_id || > + (encoder_id == connector->encoder_id && > + crtc_id == resources->crtcs[i])) > return i; > + > + ret = i; > } > } > > - return -1; > + return ret; > } > > /* Init output state that depends on gl or gbm */ Reviewed-by: Pekka Paalanen <[email protected]> Thanks, pq
pgp9tVentmjkt.pgp
Description: OpenPGP digital signature
_______________________________________________ wayland-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/wayland-devel
