[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