[PATCH v16 03/23] compositor-drm: Make alpha-to-opaque handling common

Pekka Paalanen ppaalanen at gmail.com
Fri Jul 6 10:57:36 UTC 2018


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

> Rather than a hardcoded ARGB8888 -> XRGB8888 translation inside a
> GBM-specific helper, just determine whether or not the view is opaque,
> and use the generic helpers to implement the format translation.
> 
> As a consequence of reordering the calls in
> drm_output_prepare_overlay_view(), we move the GBM BO dereference into a
> different failure path, before it gets captured by the plane state.
> 
> Signed-off-by: Daniel Stone <daniels at collabora.com>
> Tested-by: Emre Ucan <eucan at de.adit-jv.com>
> ---
>  libweston/compositor-drm.c | 118 ++++++++++++++-----------------------
>  1 file changed, 45 insertions(+), 73 deletions(-)
> 
> diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
> index cfd7d268f..93a0fb59f 100644
> --- a/libweston/compositor-drm.c
> +++ b/libweston/compositor-drm.c
> @@ -950,7 +950,7 @@ drm_fb_ref(struct drm_fb *fb)
>  
>  static struct drm_fb *
>  drm_fb_get_from_bo(struct gbm_bo *bo, struct drm_backend *backend,
> -		   uint32_t format, enum drm_fb_type type)
> +		   bool is_opaque, enum drm_fb_type type)
>  {
>  	struct drm_fb *fb = gbm_bo_get_user_data(bo);
>  	uint32_t handles[4] = { 0 }, pitches[4] = { 0 }, offsets[4] = { 0 };
> @@ -961,8 +961,6 @@ drm_fb_get_from_bo(struct gbm_bo *bo, struct drm_backend *backend,
>  		return drm_fb_ref(fb);
>  	}
>  
> -	assert(format != 0);
> -
>  	fb = zalloc(sizeof *fb);
>  	if (fb == NULL)
>  		return NULL;
> @@ -975,16 +973,19 @@ drm_fb_get_from_bo(struct gbm_bo *bo, struct drm_backend *backend,
>  	fb->height = gbm_bo_get_height(bo);
>  	fb->stride = gbm_bo_get_stride(bo);
>  	fb->handle = gbm_bo_get_handle(bo).u32;
> -	fb->format = pixel_format_get_info(format);
> +	fb->format = pixel_format_get_info(gbm_bo_get_format(bo));
>  	fb->size = fb->stride * fb->height;
>  	fb->fd = backend->drm.fd;
>  
>  	if (!fb->format) {
>  		weston_log("couldn't look up format 0x%lx\n",
> -			   (unsigned long) format);
> +			   (unsigned long) gbm_bo_get_format(bo));
>  		goto err_free;
>  	}
>  
> +	if (is_opaque)
> +		fb->format = pixel_format_get_opaque_substitute(fb->format);
> +
>  	if (backend->min_width > fb->width ||
>  	    fb->width > backend->max_width ||
>  	    backend->min_height > fb->height ||
> @@ -1515,34 +1516,26 @@ drm_view_transform_supported(struct weston_view *ev)
>  		(ev->transform.matrix.type < WESTON_MATRIX_TRANSFORM_ROTATE);
>  }
>  
> -static uint32_t
> -drm_output_check_scanout_format(struct drm_output *output,
> -				struct weston_surface *es, struct gbm_bo *bo)
> +static bool
> +drm_view_is_opaque(struct weston_view *ev)
>  {
> -	uint32_t format;
>  	pixman_region32_t r;
> +	bool ret = false;
>  
> -	format = gbm_bo_get_format(bo);
> -
> -	if (format == GBM_FORMAT_ARGB8888) {
> -		/* We can scanout an ARGB buffer if the surface's
> -		 * opaque region covers the whole output, but we have
> -		 * to use XRGB as the KMS format code. */
> -		pixman_region32_init_rect(&r, 0, 0,
> -					  output->base.width,
> -					  output->base.height);
> -		pixman_region32_subtract(&r, &r, &es->opaque);
> +	/* We can scanout an ARGB buffer if the surface's
> +	 * opaque region covers the whole output, but we have
> +	 * to use XRGB as the KMS format code. */

This comment seems a bit out of place now, there are no formats in this
function. Would be nice to move it into, say, drm_fb_get_from_bo()?

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


Thanks,
pq

> +	pixman_region32_init_rect(&r, 0, 0,
> +				  ev->surface->width,
> +				  ev->surface->height);
> +	pixman_region32_subtract(&r, &r, &ev->surface->opaque);
>  
> -		if (!pixman_region32_not_empty(&r))
> -			format = GBM_FORMAT_XRGB8888;
> +	if (!pixman_region32_not_empty(&r))
> +		ret = true;
>  
> -		pixman_region32_fini(&r);
> -	}
> +	pixman_region32_fini(&r);
>  
> -	if (output->gbm_format == format)
> -		return format;
> -
> -	return 0;
> +	return ret;
>  }
>  
-------------- 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/4a9df940/attachment.sig>


More information about the wayland-devel mailing list