[PATCH v19 02/10] compositor-drm: Use sprites_are_broken for scanout plane

Pekka Paalanen ppaalanen at gmail.com
Wed Jul 11 09:06:35 UTC 2018


On Tue, 10 Jul 2018 18:58:41 +0100
Daniel Stone <daniels at collabora.com> wrote:

> When the sprites_are_broken variable is set, do not attempt to promote
> client surfaces to the scanout plane.
> 
> We are currently assuming that every client buffer will be compatible
> with the scanout plane, but that is not the case, particularly with more
> exotic tiled/compressed buffers. Once we promote the client buffer to
> scanout, there is no going back: if the repaint fails, we do not mark
> this as failed and go back to repaint through composition.
> 
> This permanently removes the ability for scanout bypass when using the
> non-atomic path. Future patches lift the restriction when using atomic
> modesetting, as we can actually test and ensure that the view is
> compatible with scanout.
> 
> Signed-off-by: Daniel Stone <daniels at collabora.com>
> Reported-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
> ---
>  libweston/compositor-drm.c | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)

Reviewed-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>


Thanks,
pq

> 
> diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
> index 2305f708f..d045778aa 100644
> --- a/libweston/compositor-drm.c
> +++ b/libweston/compositor-drm.c
> @@ -1944,11 +1944,14 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state,
>  				struct weston_view *ev)
>  {
>  	struct drm_output *output = output_state->output;
> +	struct drm_backend *b = to_drm_backend(output->base.compositor);
>  	struct drm_plane *scanout_plane = output->scanout_plane;
>  	struct drm_plane_state *state;
>  	struct drm_fb *fb;
>  	pixman_box32_t *extents;
>  
> +	assert(!b->sprites_are_broken);
> +
>  	/* Check the view spans exactly the output size, calculated in the
>  	 * logical co-ordinate space. */
>  	extents = pixman_region32_extents(&ev->transform.boundingbox);
> @@ -3004,8 +3007,7 @@ drm_output_prepare_overlay_view(struct drm_output_state *output_state,
>  	struct drm_fb *fb;
>  	unsigned int i;
>  
> -	if (b->sprites_are_broken)
> -		return NULL;
> +	assert(!b->sprites_are_broken);
>  
>  	fb = drm_fb_get_from_view(output_state, ev);
>  	if (!fb)
> @@ -3260,6 +3262,7 @@ drm_output_propose_state(struct weston_output *output_base,
>  			 struct drm_pending_state *pending_state)
>  {
>  	struct drm_output *output = to_drm_output(output_base);
> +	struct drm_backend *b = to_drm_backend(output->base.compositor);
>  	struct drm_output_state *state;
>  	struct weston_view *ev;
>  	pixman_region32_t surface_overlap, renderer_region, occluded_region;
> @@ -3342,6 +3345,9 @@ drm_output_propose_state(struct weston_output *output_base,
>  		if (next_plane == NULL && !drm_view_is_opaque(ev))
>  			next_plane = primary;
>  
> +		if (next_plane == NULL && b->sprites_are_broken)
> +			next_plane = primary;
> +
>  		if (next_plane == NULL)
>  			next_plane = drm_output_prepare_scanout_view(state, ev);
>  

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20180711/5a436181/attachment.sig>


More information about the wayland-devel mailing list