[PATCH weston v12 05/40] compositor-drm: Use drm_plane for scanout plane
Pekka Paalanen
ppaalanen at gmail.com
Mon Oct 2 14:09:39 UTC 2017
On Tue, 26 Sep 2017 18:15:38 +0100
Daniel Stone <daniels at collabora.com> 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 <daniels at collabora.com>
> ---
> libweston/compositor-drm.c | 167 +++++++++++++++++++++++++++------------------
> 1 file changed, 101 insertions(+), 66 deletions(-)
Hi Daniel,
my comments from last time are mostly fixed.
> diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
> index 33555d00..23ac2dec 100644
> --- a/libweston/compositor-drm.c
> +++ b/libweston/compositor-drm.c
> @@ -2565,10 +2605,6 @@ drm_output_switch_mode(struct weston_output *output_base, struct weston_mode *mo
> * sledgehammer modeswitch first, and only later showing new
> * content.
> */
> - drm_fb_unref(output->fb_current);
> - assert(!output->fb_last);
> - assert(!output->fb_pending);
> - output->fb_last = output->fb_current = NULL;
I know this path is all kinds of broken, but how about at least setting
output->state_invalid = true;
here to guarantee we hit the SetCrtc path the repaint?
>
> if (b->use_pixman) {
> drm_output_fini_pixman(output);
> @@ -2909,14 +2945,16 @@ drm_output_find_special_plane(struct drm_backend *b, struct drm_output *output,
> * same plane for two outputs. */
> wl_list_for_each(tmp, &b->compositor->pending_output_list,
> base.link) {
> - if (tmp->cursor_plane == plane) {
> + if (tmp->cursor_plane == plane ||
> + tmp->scanout_plane == plane) {
> found_elsewhere = true;
> break;
> }
> }
> wl_list_for_each(tmp, &b->compositor->output_list,
> base.link) {
> - if (tmp->cursor_plane == plane) {
> + if (tmp->cursor_plane == plane ||
> + tmp->scanout_plane == plane) {
> found_elsewhere = true;
> break;
> }
> @@ -3839,8 +3877,6 @@ drm_output_enable(struct weston_output *base)
> output->connector->connector_type == DRM_MODE_CONNECTOR_eDP)
> output->base.connection_internal = true;
>
> - weston_plane_init(&output->scanout_plane, b->compositor, 0, 0);
> -
> if (output->cursor_plane)
> weston_compositor_stack_plane(b->compositor,
> &output->cursor_plane->base,
> @@ -3848,7 +3884,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);
>
> weston_log("Output %s, (connector %d, crtc %d)\n",
> @@ -3877,20 +3914,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);
> -
I would assume this has the same issues as the cursor plane patch does.
Deinit should undo weston_compositor_stack_plane().
It probably has the same shutdown problem as well: destroy_sprites()
destroying the plane, then output destruction hitting use-after-free.
> if (output->cursor_plane) {
> /* Turn off hardware cursor */
> drmModeSetCursor(b->drm.fd, output->crtc_id, 0, 0, 0);
> @@ -3960,10 +3988,6 @@ drm_output_disable(struct weston_output *base)
> if (output->base.enabled)
> drm_output_deinit(&output->base);
>
> - assert(!output->fb_last);
> - assert(!output->fb_current);
> - assert(!output->fb_pending);
> -
> output->disable_pending = 0;
>
> weston_log("Disabling output %s\n", output->base.name);
> @@ -4058,6 +4082,16 @@ create_output_for_connector(struct drm_backend *b,
> }
> }
>
> + 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);
> + drm_output_destroy(&output->base);
> + return -1;
> + }
> +
> /* Failing to find a cursor plane is not fatal, as we'll fall back
> * to software cursor. */
> output->cursor_plane =
Other than those, seems fine to me.
I also re-read your scene-graph planes vs. KMS planes comment from last
time, and yeah, agreed. It's a little funny that primary_plane (by
libweston core) is used with renderer damage tracking even when
scanout_plane is used for scanning it out. Maybe when I or someone gets
to fixing the renderer-based clone mode it will get cleaned up.
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/20171002/0166a3b2/attachment.sig>
More information about the wayland-devel
mailing list