[PATCH weston] compositor-drm: Try to preserve existing output routing

Pekka Paalanen ppaalanen at gmail.com
Tue Feb 14 11:43:19 UTC 2017


On Mon, 16 Jan 2017 14:40:44 +0000
Daniel Stone <daniels at collabora.com> 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 <daniels at collabora.com>
> ---
>  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 <pekka.paalanen at collabora.co.uk>


Thanks,
pq
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 801 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20170214/3041e447/attachment.sig>


More information about the wayland-devel mailing list