On Tue, 10 Jul 2018 18:58:41 +0100
Daniel Stone <dani...@collabora.com> wrote:

> When the sprites_are_broken variable is set, do not attempt to promote
> client surfaces to the scanout plane.
> 
> We are currently assuming that every client buffer will be compatible
> with the scanout plane, but that is not the case, particularly with more
> exotic tiled/compressed buffers. Once we promote the client buffer to
> scanout, there is no going back: if the repaint fails, we do not mark
> this as failed and go back to repaint through composition.
> 
> This permanently removes the ability for scanout bypass when using the
> non-atomic path. Future patches lift the restriction when using atomic
> modesetting, as we can actually test and ensure that the view is
> compatible with scanout.
> 
> Signed-off-by: Daniel Stone <dani...@collabora.com>
> Reported-by: Pekka Paalanen <pekka.paala...@collabora.co.uk>
> ---
>  libweston/compositor-drm.c | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)

Reviewed-by: Pekka Paalanen <pekka.paala...@collabora.co.uk>


Thanks,
pq

> 
> diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
> index 2305f708f..d045778aa 100644
> --- a/libweston/compositor-drm.c
> +++ b/libweston/compositor-drm.c
> @@ -1944,11 +1944,14 @@ 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 drm_fb *fb;
>       pixman_box32_t *extents;
>  
> +     assert(!b->sprites_are_broken);
> +
>       /* Check the view spans exactly the output size, calculated in the
>        * logical co-ordinate space. */
>       extents = pixman_region32_extents(&ev->transform.boundingbox);
> @@ -3004,8 +3007,7 @@ drm_output_prepare_overlay_view(struct drm_output_state 
> *output_state,
>       struct drm_fb *fb;
>       unsigned int i;
>  
> -     if (b->sprites_are_broken)
> -             return NULL;
> +     assert(!b->sprites_are_broken);
>  
>       fb = drm_fb_get_from_view(output_state, ev);
>       if (!fb)
> @@ -3260,6 +3262,7 @@ drm_output_propose_state(struct weston_output 
> *output_base,
>                        struct drm_pending_state *pending_state)
>  {
>       struct drm_output *output = to_drm_output(output_base);
> +     struct drm_backend *b = to_drm_backend(output->base.compositor);
>       struct drm_output_state *state;
>       struct weston_view *ev;
>       pixman_region32_t surface_overlap, renderer_region, occluded_region;
> @@ -3342,6 +3345,9 @@ drm_output_propose_state(struct weston_output 
> *output_base,
>               if (next_plane == NULL && !drm_view_is_opaque(ev))
>                       next_plane = primary;
>  
> +             if (next_plane == NULL && b->sprites_are_broken)
> +                     next_plane = primary;
> +
>               if (next_plane == NULL)
>                       next_plane = drm_output_prepare_scanout_view(state, ev);
>  

Attachment: pgp_Lo7ypCXdM.pgp
Description: OpenPGP digital signature

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to