[PATCH v16 07/23] compositor-drm: Use plane_state_coords_for_view for scanout

Pekka Paalanen ppaalanen at gmail.com
Fri Jul 6 12:47:54 UTC 2018


On Thu,  5 Jul 2018 18:16:34 +0100
Daniel Stone <daniels at collabora.com> wrote:

> Now that we have a helper to fill the plane state co-ordinates from a
> view, use this for the scanout plane.
> 
> We now explicitly check that the view fills exactly the fullscreen area
> and nothing else. We then use the new helper to fill out the plane state
> values, and do further checks against the filled-in co-ordinates, i.e.
> that we're not trying to show an offset into the buffer, or to scale the
> image.
> 
> An audit of the error paths found some places where we would leave a
> plane state hanging; this makes them all consistent.
> 
> Signed-off-by: Daniel Stone <daniels at collabora.com>
> Tested-by: Emre Ucan <eucan at de.adit-jv.com>
> ---
>  libweston/compositor-drm.c | 64 +++++++++++++++++---------------------
>  1 file changed, 29 insertions(+), 35 deletions(-)
> 
> diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
> index c8eb7ef59..2927a0ebf 100644
> --- a/libweston/compositor-drm.c
> +++ b/libweston/compositor-drm.c
> @@ -1635,8 +1635,8 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state,
>  	struct drm_plane *scanout_plane = output->scanout_plane;
>  	struct drm_plane_state *state;
>  	struct weston_buffer *buffer = ev->surface->buffer_ref.buffer;
> -	struct weston_buffer_viewport *viewport = &ev->surface->buffer_viewport;
>  	struct gbm_bo *bo;
> +	pixman_box32_t *extents;
>  
>  	/* Don't import buffers which span multiple outputs. */
>  	if (ev->output_mask != (1u << output->base.id))
> @@ -1651,23 +1651,13 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state,
>  	if (wl_shm_buffer_get(buffer->resource))
>  		return NULL;
>  
> -	/* Make sure our view is exactly compatible with the output. */
> -	if (ev->geometry.x != output->base.x ||
> -	    ev->geometry.y != output->base.y)
> -		return NULL;
> -	if (buffer->width != output->base.current_mode->width ||
> -	    buffer->height != output->base.current_mode->height)
> -		return NULL;
> -
> -	if (ev->transform.enabled)
> -		return NULL;
> -	if (ev->geometry.scissor_enabled)
> -		return NULL;
> -	if (viewport->buffer.transform != output->base.transform)
> -		return NULL;
> -	if (viewport->buffer.scale != output->base.current_scale)
> -		return NULL;
> -	if (!drm_view_transform_supported(ev, &output->base))
> +	/* Check the view spans exactly the output size, calculated in the
> +	 * logical co-ordinate space. */
> +	extents = pixman_region32_extents(&ev->transform.boundingbox);
> +	if (extents->x1 != output->base.x ||
> +	    extents->y1 != output->base.y ||
> +	    extents->x2 != output->base.x + output->base.width ||
> +	    extents->y2 != output->base.y + output->base.height)
>  		return NULL;

Isn't this check a sub-set of the dest and src rectangles check below?
Is this needed for something? Just an early exit?

>  
>  	if (ev->alpha != 1.0f)
> @@ -1682,44 +1672,48 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state,
>  		return NULL;
>  	}
>  
> +	state->output = output;
> +	if (!drm_plane_state_coords_for_view(state, ev))
> +		goto err;
> +
> +	/* The legacy API does not let us perform cropping or scaling. */
> +	if (state->src_x != 0 || state->src_y != 0 ||
> +	    state->src_w != state->dest_w << 16 ||
> +	    state->src_h != state->dest_h << 16 ||
> +	    state->dest_x != 0 || state->dest_y != 0 ||
> +	    state->dest_w != (unsigned) output->base.current_mode->width ||
> +	    state->dest_h != (unsigned) output->base.current_mode->height)
> +		goto err;
> +
>  	bo = gbm_bo_import(b->gbm, GBM_BO_IMPORT_WL_BUFFER,
>  			   buffer->resource, GBM_BO_USE_SCANOUT);
>  

Anyway:

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: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20180706/fe57ecec/attachment.sig>


More information about the wayland-devel mailing list