[PATCH v14 36/41] compositor-drm: Return plane state from plane preparation

Pekka Paalanen ppaalanen at gmail.com
Mon Jan 29 11:54:45 UTC 2018


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

> Return a pointer to the plane state, rather than indirecting via a
> weston_plane.
> 
> Signed-off-by: Daniel Stone <daniels at collabora.com>
> ---
>  libweston/compositor-drm.c | 68 ++++++++++++++++++++++++++--------------------
>  1 file changed, 38 insertions(+), 30 deletions(-)
> 
> diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
> index ff70f9c29..8709ecff3 100644
> --- a/libweston/compositor-drm.c
> +++ b/libweston/compositor-drm.c

> @@ -3062,7 +3062,6 @@ drm_output_propose_state(struct weston_output *output_base,
>  	struct drm_output_state *state;
>  	struct weston_view *ev;
>  	pixman_region32_t surface_overlap, renderer_region, occluded_region;
> -	struct weston_plane *primary = &output_base->compositor->primary_plane;
>  	bool renderer_ok = (mode != DRM_OUTPUT_PROPOSE_STATE_PLANES_ONLY);
>  	bool planes_ok = !b->sprites_are_broken;
>  
> @@ -3088,7 +3087,8 @@ drm_output_propose_state(struct weston_output *output_base,
>  	pixman_region32_init(&occluded_region);
>  
>  	wl_list_for_each(ev, &output_base->compositor->view_list, link) {
> -		struct weston_plane *next_plane = NULL;
> +		struct drm_plane_state *ps = NULL;
> +		bool force_renderer = false;
>  		pixman_region32_t clipped_view;
>  		bool occluded = false;
>  
> @@ -3100,7 +3100,7 @@ drm_output_propose_state(struct weston_output *output_base,
>  		/* We only assign planes to views which are exclusively present
>  		 * on our output. */
>  		if (ev->output_mask != (1u << output->base.id))
> -			next_plane = primary;
> +			force_renderer = true;
>  
>  		/* Ignore views we know to be totally occluded. */
>  		pixman_region32_init(&clipped_view);
> @@ -3124,40 +3124,48 @@ drm_output_propose_state(struct weston_output *output_base,
>  		pixman_region32_intersect(&surface_overlap, &renderer_region,
>  					  &clipped_view);
>  		if (pixman_region32_not_empty(&surface_overlap))
> -			next_plane = primary;
> +			force_renderer = true;
>  		pixman_region32_fini(&surface_overlap);
>  
> +		if (force_renderer && !renderer_ok) {
> +			pixman_region32_fini(&clipped_view);
> +			goto err;
> +		}
> +
>  		/* The cursor plane is 'special' in the sense that we can still
>  		 * place it in the legacy API, and we gate that with a separate
>  		 * cursors_are_broken flag. */
> -		if (next_plane == NULL && !b->cursors_are_broken)
> -			next_plane = drm_output_prepare_cursor_view(state, ev);
> -
> -		if (next_plane == NULL && !drm_view_is_opaque(ev))
> -			next_plane = primary;
> +		if (!force_renderer && !b->cursors_are_broken)
> +			ps = drm_output_prepare_cursor_view(state, ev);
>  
> -		if (next_plane == NULL && !planes_ok)
> -			next_plane = primary;
> +		if (!planes_ok || !drm_view_is_opaque(ev))
> +			force_renderer = true;
>  
> -		if (next_plane == NULL)
> -			next_plane = drm_output_prepare_scanout_view(state, ev);
> +		if (!drm_view_is_opaque(ev))
> +			force_renderer = true;

The opaque check is done twice.

>  
> -		if (next_plane == NULL)
> -			next_plane = drm_output_prepare_overlay_view(state, ev);
> +		if (!force_renderer && !ps)
> +			ps = drm_output_prepare_scanout_view(state, ev);
> +		if (!force_renderer && !ps)
> +			ps = drm_output_prepare_overlay_view(state, ev);
>  
> -		if (!next_plane || next_plane == primary) {
> -			if (!renderer_ok)
> -				goto err;
> +		if (ps) {
>  

There is an extra empty line here, where you would need to check that a
cursor plane is not counted into occlusions. Now it seems like cursor
plane would add to occlusions.

> -			pixman_region32_union(&renderer_region,
> -					      &renderer_region,
> -					      &clipped_view);
> -		} else if (output->cursor_plane &&
> -			   next_plane != &output->cursor_plane->base) {
>  			pixman_region32_union(&occluded_region,
>  					      &occluded_region,
>  					      &clipped_view);
> +			pixman_region32_fini(&clipped_view);
> +			continue;
>  		}
> +
> +		if (!renderer_ok) {
> +			pixman_region32_fini(&clipped_view);
> +			goto err;
> +		}
> +
> +		pixman_region32_union(&renderer_region,
> +				      &renderer_region,
> +				      &clipped_view);
>  		pixman_region32_fini(&clipped_view);
>  	}
>  	pixman_region32_fini(&renderer_region);

Otherwise looks ok, and this also fixes the clipped_view finis that
were missing earlier.


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/20180129/e39e6a9b/attachment.sig>


More information about the wayland-devel mailing list