Hi Daniel,

On Tue, 2017-07-18 at 14:14 +0100, Daniel Stone wrote:
> Use a real drm_plane to back the scanout plane, displacing
> output->fb_{last,cur,pending} to their plane-tracked equivalents.
> 
> Signed-off-by: Daniel Stone <dani...@collabora.com>
> ---
>  libweston/compositor-drm.c | 157 
> ++++++++++++++++++++++++++-------------------
>  1 file changed, 91 insertions(+), 66 deletions(-)
> 
> diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
> index 2ede76b6..bf3273ba 100644
> --- a/libweston/compositor-drm.c
> +++ b/libweston/compositor-drm.c
[...]
> @@ -3755,6 +3784,15 @@ drm_output_enable(struct weston_output *base)
>       if (b->pageflip_timeout)
>               drm_output_pageflip_timer_create(output);
>  
> +     output->scanout_plane =
> +             drm_output_find_special_plane(b, output,
> +                                           WDRM_PLANE_TYPE_PRIMARY);
> +     if (!output->scanout_plane) {
> +             weston_log("Failed to find primary plane for output %s\n",
> +                        output->base.name);
> +             goto err;
> +     }
> +
>       /* Failing to find a cursor plane is not fatal, as we'll fall back
>        * to software cursor. */
>       output->cursor_plane =
> @@ -3795,8 +3833,6 @@ drm_output_enable(struct weston_output *base)
>           output->connector->connector_type == DRM_MODE_CONNECTOR_eDP)
>               output->base.connection_internal = 1;
>  
> -     weston_plane_init(&output->scanout_plane, b->compositor, 0, 0);
> -
>       if (output->cursor_plane)
>               weston_compositor_stack_plane(b->compositor,
>                                             &output->cursor_plane->base,
> @@ -3804,7 +3840,8 @@ drm_output_enable(struct weston_output *base)
>       else
>               b->cursors_are_broken = 1;
>  
> -     weston_compositor_stack_plane(b->compositor, &output->scanout_plane,
> +     weston_compositor_stack_plane(b->compositor,
> +                                   &output->scanout_plane->base,
>                                     &b->compositor->primary_plane);

If the scanout plane is still stacked during output enable ...

>       weston_log("Output %s, (connector %d, crtc %d)\n",
> @@ -3831,20 +3868,11 @@ drm_output_deinit(struct weston_output *base)
>       struct drm_output *output = to_drm_output(base);
>       struct drm_backend *b = to_drm_backend(base->compositor);
>  
> -     /* output->fb_last and output->fb_pending must not be set here;
> -      * destroy_pending/disable_pending exist to guarantee exactly this. */
> -     assert(!output->fb_last);
> -     assert(!output->fb_pending);
> -     drm_fb_unref(output->fb_current);
> -     output->fb_current = NULL;
> -
>       if (b->use_pixman)
>               drm_output_fini_pixman(output);
>       else
>               drm_output_fini_egl(output);
>  
> -     weston_plane_release(&output->scanout_plane);
> -

... but not released anymore during deinit, won't then unplugging and
plugging in a monitor cause the second drm_output_enable to try to
insert the scanout plane into ec->plane_list a second time?

Also, will all view->plane references to the scanout plane in the
compositor->view_list still be cleared with this removed?

regards
Philipp

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

Reply via email to