[PATCH weston v2 1/3] compositor-drm: Remove crtc_allocator

Quentin Glidic sardemff7+wayland at sardemff7.net
Thu Feb 9 17:19:33 UTC 2017


On 09/02/2017 17:44, Daniel Stone wrote:
> crtc_allocator was used as a bitmask of CRTC IDs, so we didn't try to
> use the same CRTC for multiple outputs. Unfortunately, this only works
> to the extent that CRTC object IDs fit within the bitmask; though they
> were previously, they are not guaranteed to be under 32 or even 64.
> 
> Replace the only use of crtc_allocator with a list walk across outputs.
> 
> Signed-off-by: Daniel Stone <daniels at collabora.com>
> Reported-by: Peter Senna Tschudin <peter.senna at collabora.com>

This one’s easy:
Reviewed-by: Quentin Glidic <sardemff7+git at sardemff7.net>

Cheers,


> ---
>   libweston/compositor-drm.c | 32 ++++++++++++++++++++++++++------
>   1 file changed, 26 insertions(+), 6 deletions(-)
> 
> v2: Split drm_output_find_by_crtc into a separate function.
> 
> diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
> index 7f1eeda9a..5f1ca9592 100644
> --- a/libweston/compositor-drm.c
> +++ b/libweston/compositor-drm.c
> @@ -94,7 +94,6 @@ struct drm_backend {
>   		char *filename;
>   	} drm;
>   	struct gbm_device *gbm;
> -	uint32_t crtc_allocator;
>   	uint32_t connector_allocator;
>   	struct wl_listener session_listener;
>   	uint32_t gbm_format;
> @@ -239,6 +238,25 @@ drm_sprite_crtc_supported(struct drm_output *output, struct drm_sprite *sprite)
>   	return !!(sprite->possible_crtcs & (1 << output->pipe));
>   }
>   
> +static struct drm_output *
> +drm_output_find_by_crtc(struct drm_backend *b, uint32_t crtc_id)
> +{
> +	struct drm_output *output;
> +
> +	wl_list_for_each(output, &b->compositor->output_list, base.link) {
> +		if (output->crtc_id == crtc_id)
> +			return output;
> +	}
> +
> +	wl_list_for_each(output, &b->compositor->pending_output_list,
> +			 base.link) {
> +		if (output->crtc_id == crtc_id)
> +			return output;
> +	}
> +
> +	return NULL;
> +}
> +
>   static void
>   drm_fb_destroy_callback(struct gbm_bo *bo, void *data)
>   {
> @@ -1819,9 +1837,13 @@ find_crtc_for_connector(struct drm_backend *b,
>   		drmModeFreeEncoder(encoder);
>   
>   		for (i = 0; i < resources->count_crtcs; i++) {
> -			if (possible_crtcs & (1 << i) &&
> -			    !(b->crtc_allocator & (1 << resources->crtcs[i])))
> -				return i;
> +			if (!(possible_crtcs & (1 << i)))
> +				continue;
> +
> +			if (drm_output_find_by_crtc(b, resources->crtcs[i]))
> +				continue;
> +
> +			return i;
>   		}
>   	}
>   
> @@ -2507,7 +2529,6 @@ drm_output_destroy(struct weston_output *base)
>   	if (output->backlight)
>   		backlight_destroy(output->backlight);
>   
> -	b->crtc_allocator &= ~(1 << output->crtc_id);
>   	b->connector_allocator &= ~(1 << output->connector_id);
>   
>   	free(output);
> @@ -2585,7 +2606,6 @@ create_output_for_connector(struct drm_backend *b,
>   	output->disable_pending = 0;
>   	output->original_crtc = NULL;
>   
> -	b->crtc_allocator |= (1 << output->crtc_id);
>   	b->connector_allocator |= (1 << output->connector_id);
>   
>   	weston_output_init(&output->base, b->compositor);
> 


-- 

Quentin “Sardem FF7” Glidic


More information about the wayland-devel mailing list