On Wed, 20 Dec 2017 12:26:53 +0000 Daniel Stone <dani...@collabora.com> wrote:
> Return a pointer to the plane state, rather than indirecting via a > weston_plane. > > Signed-off-by: Daniel Stone <dani...@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
pgpmh79dWiPjX.pgp
Description: OpenPGP digital signature
_______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel