[weston, v2, 20/20] compositor-drm: use weston_view_to_output_matrix() to test plane viability

Bryce Harrington bryce at osg.samsung.com
Fri May 8 17:07:40 PDT 2015


On Thu, Oct 16, 2014 at 10:55:38AM -0500, Derek Foreman wrote:
> Instead of comparing buffer transforms to output transforms we now
> use weston_view_to_output_matrix() and weston_matrix_to_transform() to
> test if we can use a drm plane.
> 
> We no longer test scaling, since the drm plane api supports scaling.
> Unfortunately the drmSetPlane() call is far from the viability test and
> has no reasonable fallback, so scaling will need to be revisited in the
> future when atomic mode setting is viable and sprites_are_broken stops
> being universally true...

This patchset was set as deferred pending creation of a headless
renderer based testing facility, which is now proposed on list.  This
patchset should be rebased atop that one, and tests written to accompany
the changed output functionality.

> ---
> src/compositor-drm.c | 41 ++++++++++++++++++-----------------------
>  1 file changed, 18 insertions(+), 23 deletions(-)
> 
> diff --git a/src/compositor-drm.c b/src/compositor-drm.c
> index c0f451e..7d81983 100644
> --- a/src/compositor-drm.c
> +++ b/src/compositor-drm.c
> @@ -824,37 +824,26 @@ drm_output_check_sprite_format(struct drm_sprite *s,
>  	return 0;
>  }
>  
> -static int
> -drm_view_transform_supported(struct weston_view *ev)
> -{
> -	return !ev->transform.enabled ||
> -		(ev->transform.matrix.type < WESTON_MATRIX_TRANSFORM_ROTATE);
> -}
> -
>  static struct weston_plane *
>  drm_output_prepare_overlay_view(struct weston_output *output_base,
>  				struct weston_view *ev)
>  {
>  	struct weston_compositor *ec = output_base->compositor;
>  	struct drm_compositor *c =(struct drm_compositor *) ec;
> -	struct weston_buffer_viewport *viewport = &ev->surface->buffer_viewport;
> +	struct weston_matrix matrix;
>  	struct drm_sprite *s;
>  	int found = 0;
>  	struct gbm_bo *bo;
>  	pixman_region32_t dest_rect, src_rect;
>  	pixman_box32_t *box, tbox;
> +	enum wl_output_transform transform;
>  	uint32_t format;
> +	float scalex, scaley, transx, transy;
>  	int32_t sx1, sy1, sx2, sy2;
>  
>  	if (c->gbm == NULL)
>  		return NULL;
>  
> -	if (viewport->buffer.transform != output_base->transform)
> -		return NULL;
> -
> -	if (viewport->buffer.scale != output_base->current_scale)
> -		return NULL;
> -
>  	if (c->sprites_are_broken)
>  		return NULL;
>  
> @@ -870,7 +859,14 @@ drm_output_prepare_overlay_view(struct weston_output *output_base,
>  	if (wl_shm_buffer_get(ev->surface->buffer_ref.buffer->resource))
>  		return NULL;
>  
> -	if (!drm_view_transform_supported(ev))
> +	weston_view_to_output_matrix(ev, output_base, false, &matrix);
> +
> +	if (!weston_matrix_to_transform(&matrix, &transform,
> +					&scalex, &scaley,
> +					&transx, &transy))
> +		return NULL;
> +
> +	if (transform != WL_OUTPUT_TRANSFORM_NORMAL)
>  		return NULL;
>  
>  	wl_list_for_each(s, &c->sprite_list, link) {
> @@ -936,14 +932,13 @@ drm_output_prepare_overlay_view(struct weston_output *output_base,
>  	weston_view_from_global(ev, box->x1, box->y1, &sx1, &sy1);
>  	weston_view_from_global(ev, box->x2, box->y2, &sx2, &sy2);
>  
> -	if (sx1 < 0)
> -		sx1 = 0;
> -	if (sy1 < 0)
> -		sy1 = 0;
> -	if (sx2 > ev->surface->width)
> -		sx2 = ev->surface->width;
> -	if (sy2 > ev->surface->height)
> -		sy2 = ev->surface->height;
> +
> +	/* Previously we clamped to the surface edge here, but that will
> +	 * result in incorrect scaling, so we just bail.
> +	 */
> +	if (sx1 < 0 || sy1 < 0 ||
> +	    sx2 > ev->surface->width || sy2 > ev->surface->height)
> +		return NULL;
>  
>  	tbox.x1 = sx1;
>  	tbox.y1 = sy1;


More information about the wayland-devel mailing list