[PATCH v14 25/41] compositor-drm: Use plane FB-import helper for scanout

Pekka Paalanen ppaalanen at gmail.com
Thu Jan 25 11:39:09 UTC 2018


On Wed, 20 Dec 2017 12:26:42 +0000
Daniel Stone <daniels at collabora.com> wrote:

> Use the same codepath, which has the added advantage of being able to
> import dmabufs.
> 
> Signed-off-by: Daniel Stone <daniels at collabora.com>
> ---
>  libweston/compositor-drm.c | 48 +++++++++-------------------------------------
>  1 file changed, 9 insertions(+), 39 deletions(-)
> 
> diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
> index 195eef725..09318c98c 100644
> --- a/libweston/compositor-drm.c
> +++ b/libweston/compositor-drm.c
> @@ -1683,24 +1683,19 @@ 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 weston_buffer *buffer = ev->surface->buffer_ref.buffer;
> -	struct gbm_bo *bo;
> -
> -	/* Don't import buffers which span multiple outputs. */
> -	if (ev->output_mask != (1u << output->base.id))
> -		return NULL;
> +	struct drm_fb *fb;
>  
> -	/* We use GBM to import buffers. */
> -	if (b->gbm == NULL)
> +	fb = drm_fb_get_from_view(output_state, ev);
> +	if (!fb)
>  		return NULL;
>  
> -	if (buffer == NULL)
> -		return NULL;
> -	if (wl_shm_buffer_get(buffer->resource))
> +	/* Can't change formats with just a pageflip */
> +	if (fb->format->format != output->gbm_format) {
> +		drm_fb_unref(fb);
>  		return NULL;
> +	}
>  
>  	state = drm_output_state_get_plane(output_state, scanout_plane);
>  	if (state->fb) {
> @@ -1708,9 +1703,11 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state,
>  		 * a client view has already been placed on the scanout
>  		 * view. In that case, do not free or put back the state,
>  		 * but just leave it in place and quietly exit. */
> +		drm_fb_unref(fb);
>  		return NULL;
>  	}
>  
> +	state->fb = fb;
>  	state->output = output;
>  	drm_plane_state_coords_for_view(state, ev);
>  
> @@ -1723,33 +1720,6 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state,
>  	    state->dest_h != (unsigned) output->base.current_mode->height)
>  		goto err;
>  
> -	if (ev->alpha != 1.0f)
> -		goto err;
> -
> -	bo = gbm_bo_import(b->gbm, GBM_BO_IMPORT_WL_BUFFER,
> -			   buffer->resource, GBM_BO_USE_SCANOUT);
> -
> -	/* Unable to use the buffer for scanout */
> -	if (!bo)
> -		goto err;
> -
> -	state->fb = drm_fb_get_from_bo(bo, b, drm_view_is_opaque(ev),
> -				       BUFFER_CLIENT);
> -	if (!state->fb) {
> -		/* We need to explicitly destroy the BO. */
> -		gbm_bo_destroy(bo);
> -		goto err;
> -	}
> -
> -	/* Can't change formats with just a pageflip */
> -	if (state->fb->format->format != output->gbm_format) {
> -		/* No need to destroy the GBM BO here, as it's now owned
> -		 * by the FB. */
> -		goto err;
> -	}
> -
> -	drm_fb_set_buffer(state->fb, buffer);
> -
>  	return &scanout_plane->base;
>  
>  err:

Nice.

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/20180125/cdec8adc/attachment.sig>


More information about the wayland-devel mailing list