Message ID | 20240215010123.3432540-2-rs@ti.com |
---|---|
State | Changes Requested |
Delegated to: | Ryan Eatmon |
Headers | show |
Series | Backport some sanity patches for weston | expand |
Missing Upstream-Status? On Wed, Feb 14, 2024 at 07:01:22PM -0600, Randolph Sapp via lists.yoctoproject.org wrote: > From: Randolph Sapp <rs@ti.com> > > Backport some sanity patches related to plane ordering and positioning. > These are all mandatory for display subsystems that allow primary and > overlay mutable zpos. > > Otherwise Weston will attempt to place sprite/overlay planes above > whatever active primary plane it chooses for scanout, running into > issues if the primary plane is above zpos 0 and there isn't enough > headroom. > > They have all already been accepted upstream already and are only > necessary for Kirkstone's version of Weston. > > Signed-off-by: Randolph Sapp <rs@ti.com> > --- > ...kend-drm-Pre-sort-plane-list-by-zpos.patch | 48 +++++++++++++++ > .../0002-backend-drm-fix-plane-sorting.patch | 38 ++++++++++++ > ...mber-to-set-the-zpos-for-the-scanout.patch | 33 +++++++++++ > ...Assign-plane_idx-by-plane-list-order.patch | 58 +++++++++++++++++++ > 4 files changed, 177 insertions(+) > create mode 100644 meta-arago-distro/recipes-graphics/wayland/weston/0001-backend-drm-Pre-sort-plane-list-by-zpos.patch > create mode 100644 meta-arago-distro/recipes-graphics/wayland/weston/0002-backend-drm-fix-plane-sorting.patch > create mode 100644 meta-arago-distro/recipes-graphics/wayland/weston/0003-drm-backend-Remember-to-set-the-zpos-for-the-scanout.patch > create mode 100644 meta-arago-distro/recipes-graphics/wayland/weston/0004-backend-drm-Assign-plane_idx-by-plane-list-order.patch > > diff --git a/meta-arago-distro/recipes-graphics/wayland/weston/0001-backend-drm-Pre-sort-plane-list-by-zpos.patch b/meta-arago-distro/recipes-graphics/wayland/weston/0001-backend-drm-Pre-sort-plane-list-by-zpos.patch > new file mode 100644 > index 00000000..04ae08f5 > --- /dev/null > +++ b/meta-arago-distro/recipes-graphics/wayland/weston/0001-backend-drm-Pre-sort-plane-list-by-zpos.patch > @@ -0,0 +1,48 @@ > +From 9d2fda2a77cfa0932b2cef9af59033c187ec21d7 Mon Sep 17 00:00:00 2001 > +From: Daniel Stone <daniels@collabora.com> > +Date: Tue, 7 Dec 2021 15:55:42 +0000 > +Subject: [PATCH 1/3] backend-drm: Pre-sort plane list by zpos > + > +Rather than constructing a zpos-sorted list every time, just have > +plane_list be pre-sorted. > + > +Backport: 6609840479934a1145372e8a850592eeffbdaf83 > + > +Signed-off-by: Daniel Stone <daniels@collabora.com> > +--- > + libweston/backend-drm/drm.c | 12 ++++++++++-- > + 1 file changed, 10 insertions(+), 2 deletions(-) > + > +diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c > +index 42787702..102fa2d7 100644 > +--- a/libweston/backend-drm/drm.c > ++++ b/libweston/backend-drm/drm.c > +@@ -760,7 +760,7 @@ init_pixman(struct drm_backend *b) > + static struct drm_plane * > + drm_plane_create(struct drm_backend *b, const drmModePlane *kplane) > + { > +- struct drm_plane *plane; > ++ struct drm_plane *plane, *tmp; > + drmModeObjectProperties *props; > + uint64_t *zpos_range_values; > + > +@@ -817,7 +817,15 @@ drm_plane_create(struct drm_backend *b, const drmModePlane *kplane) > + goto err_props; > + > + weston_plane_init(&plane->base, b->compositor, 0, 0); > +- wl_list_insert(&b->plane_list, &plane->link); > ++ > ++ wl_list_for_each(tmp, &b->plane_list, link) { > ++ if (tmp->zpos_max > plane->zpos_max) { > ++ wl_list_insert(tmp->link.prev, &plane->link); > ++ break; > ++ } > ++ } > ++ if (plane->link.next == NULL) > ++ wl_list_insert(b->plane_list.prev, &plane->link); > + > + return plane; > + > +-- > +2.43.0 > + > diff --git a/meta-arago-distro/recipes-graphics/wayland/weston/0002-backend-drm-fix-plane-sorting.patch b/meta-arago-distro/recipes-graphics/wayland/weston/0002-backend-drm-fix-plane-sorting.patch > new file mode 100644 > index 00000000..cd9a8c5e > --- /dev/null > +++ b/meta-arago-distro/recipes-graphics/wayland/weston/0002-backend-drm-fix-plane-sorting.patch > @@ -0,0 +1,38 @@ > +From 450987334af6546b62aa8f5cce8a4c1b07fe5a5e Mon Sep 17 00:00:00 2001 > +From: Michael Olbrich <m.olbrich@pengutronix.de> > +Date: Tue, 30 Aug 2022 17:10:27 +0200 > +Subject: [PATCH 2/3] backend-drm: fix plane sorting > + > +The planes in the plane_list must be sorted from largest zpos_max to smallest. > + > +Currently the plane order is only correct when the planes are already ordered > +and added starting with the smallest zpos_max. This works accidentally in most > +cases because the primary plane is usually first and there is often only one > +overlay plane or the zpos is sufficiantly configurable. > + > +To fix this, insert a new plane before the first plane with a smaller zpos_max. > +And if none is found, insert it at the end of the list. > + > +Backport: 4cde507be6a116b3828f3a86a0e97639f04d9046 > + > +Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de> > +--- > + libweston/backend-drm/drm.c | 2 +- > + 1 file changed, 1 insertion(+), 1 deletion(-) > + > +diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c > +index 102fa2d7..4c18f76c 100644 > +--- a/libweston/backend-drm/drm.c > ++++ b/libweston/backend-drm/drm.c > +@@ -819,7 +819,7 @@ drm_plane_create(struct drm_backend *b, const drmModePlane *kplane) > + weston_plane_init(&plane->base, b->compositor, 0, 0); > + > + wl_list_for_each(tmp, &b->plane_list, link) { > +- if (tmp->zpos_max > plane->zpos_max) { > ++ if (tmp->zpos_max < plane->zpos_max) { > + wl_list_insert(tmp->link.prev, &plane->link); > + break; > + } > +-- > +2.43.0 > + > diff --git a/meta-arago-distro/recipes-graphics/wayland/weston/0003-drm-backend-Remember-to-set-the-zpos-for-the-scanout.patch b/meta-arago-distro/recipes-graphics/wayland/weston/0003-drm-backend-Remember-to-set-the-zpos-for-the-scanout.patch > new file mode 100644 > index 00000000..eaf074e8 > --- /dev/null > +++ b/meta-arago-distro/recipes-graphics/wayland/weston/0003-drm-backend-Remember-to-set-the-zpos-for-the-scanout.patch > @@ -0,0 +1,33 @@ > +From 84a7c7a7317b0cfd3a34557351041b560645a002 Mon Sep 17 00:00:00 2001 > +From: Derek Foreman <derek.foreman@collabora.com> > +Date: Tue, 31 Jan 2023 10:11:42 -0600 > +Subject: [PATCH 3/3] drm-backend: Remember to set the zpos for the scanout > + plane > + > +We can clear this via drm_plane_state_put_back() at the end of > +drm_output_propose_state(). We need to set it back to the minimum zpos > +when rendering. > + > +Backport: 58dde0e0c0000f1430624ee2fbf12886774ccd40 > + > +Signed-off-by: Derek Foreman <derek.foreman@collabora.com> > +--- > + libweston/backend-drm/drm.c | 2 ++ > + 1 file changed, 2 insertions(+) > + > +diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c > +index 4c18f76c..67d471aa 100644 > +--- a/libweston/backend-drm/drm.c > ++++ b/libweston/backend-drm/drm.c > +@@ -404,6 +404,8 @@ drm_output_render(struct drm_output_state *state, pixman_region32_t *damage) > + scanout_state->dest_w = output->base.current_mode->width; > + scanout_state->dest_h = output->base.current_mode->height; > + > ++ scanout_state->zpos = scanout_plane->zpos_min; > ++ > + pixman_region32_subtract(&c->primary_plane.damage, > + &c->primary_plane.damage, damage); > + > +-- > +2.43.0 > + > diff --git a/meta-arago-distro/recipes-graphics/wayland/weston/0004-backend-drm-Assign-plane_idx-by-plane-list-order.patch b/meta-arago-distro/recipes-graphics/wayland/weston/0004-backend-drm-Assign-plane_idx-by-plane-list-order.patch > new file mode 100644 > index 00000000..ae76af7f > --- /dev/null > +++ b/meta-arago-distro/recipes-graphics/wayland/weston/0004-backend-drm-Assign-plane_idx-by-plane-list-order.patch > @@ -0,0 +1,58 @@ > +From af42fc1e336748b4e401e4441729dd79914425e6 Mon Sep 17 00:00:00 2001 > +From: Daniel Stone <daniels@collabora.com> > +Date: Tue, 7 Dec 2021 15:58:49 +0000 > +Subject: [PATCH] backend-drm: Assign plane_idx by plane list order > + > +Backport: af42fc1e336748b4e401e4441729dd79914425e6 > + > +Signed-off-by: Daniel Stone <daniels@collabora.com> > +--- > + libweston/backend-drm/drm-internal.h | 1 - > + libweston/backend-drm/drm.c | 5 ++++- > + 2 files changed, 4 insertions(+), 2 deletions(-) > + > +diff --git a/libweston/backend-drm/drm-internal.h b/libweston/backend-drm/drm-internal.h > +index 55e9414b..86d7368e 100644 > +--- a/libweston/backend-drm/drm-internal.h > ++++ b/libweston/backend-drm/drm-internal.h > +@@ -276,7 +276,6 @@ struct drm_backend { > + int min_height, max_height; > + > + struct wl_list plane_list; > +- uint32_t next_plane_idx; > + > + void *repaint_data; > + > +diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c > +index 102fa2d7..203b8a4e 100644 > +--- a/libweston/backend-drm/drm.c > ++++ b/libweston/backend-drm/drm.c > +@@ -771,7 +771,6 @@ drm_plane_create(struct drm_backend *b, const drmModePlane *kplane) > + } > + > + plane->backend = b; > +- plane->plane_idx = b->next_plane_idx++; > + plane->state_cur = drm_plane_state_alloc(NULL, plane); > + plane->state_cur->complete = true; > + plane->possible_crtcs = kplane->possible_crtcs; > +@@ -919,6 +918,7 @@ create_sprites(struct drm_backend *b) > + drmModePlane *kplane; > + struct drm_plane *drm_plane; > + uint32_t i; > ++ uint32_t next_plane_idx = 0; > + kplane_res = drmModeGetPlaneResources(b->drm.fd); > + if (!kplane_res) { > + weston_log("failed to get plane resources: %s\n", > +@@ -942,6 +942,9 @@ create_sprites(struct drm_backend *b) > + &b->compositor->primary_plane); > + } > + > ++ wl_list_for_each (drm_plane, &b->plane_list, link) > ++ drm_plane->plane_idx = next_plane_idx++; > ++ > + drmModeFreePlaneResources(kplane_res); > + } > + > +-- > +2.43.0 > + > -- > 2.43.0
Yes. We need to get into the habit of adding the Upstream-Status to these patches, even if kirkstone does not require them. Master and scarthgap do, so let's get into the habit. On 2/14/2024 7:27 PM, Denys Dmytriyenko wrote: > Missing Upstream-Status? > > On Wed, Feb 14, 2024 at 07:01:22PM -0600, Randolph Sapp via lists.yoctoproject.org wrote: >> From: Randolph Sapp <rs@ti.com> >> >> Backport some sanity patches related to plane ordering and positioning. >> These are all mandatory for display subsystems that allow primary and >> overlay mutable zpos. >> >> Otherwise Weston will attempt to place sprite/overlay planes above >> whatever active primary plane it chooses for scanout, running into >> issues if the primary plane is above zpos 0 and there isn't enough >> headroom. >> >> They have all already been accepted upstream already and are only >> necessary for Kirkstone's version of Weston. >> >> Signed-off-by: Randolph Sapp <rs@ti.com> >> --- >> ...kend-drm-Pre-sort-plane-list-by-zpos.patch | 48 +++++++++++++++ >> .../0002-backend-drm-fix-plane-sorting.patch | 38 ++++++++++++ >> ...mber-to-set-the-zpos-for-the-scanout.patch | 33 +++++++++++ >> ...Assign-plane_idx-by-plane-list-order.patch | 58 +++++++++++++++++++ >> 4 files changed, 177 insertions(+) >> create mode 100644 meta-arago-distro/recipes-graphics/wayland/weston/0001-backend-drm-Pre-sort-plane-list-by-zpos.patch >> create mode 100644 meta-arago-distro/recipes-graphics/wayland/weston/0002-backend-drm-fix-plane-sorting.patch >> create mode 100644 meta-arago-distro/recipes-graphics/wayland/weston/0003-drm-backend-Remember-to-set-the-zpos-for-the-scanout.patch >> create mode 100644 meta-arago-distro/recipes-graphics/wayland/weston/0004-backend-drm-Assign-plane_idx-by-plane-list-order.patch >> >> diff --git a/meta-arago-distro/recipes-graphics/wayland/weston/0001-backend-drm-Pre-sort-plane-list-by-zpos.patch b/meta-arago-distro/recipes-graphics/wayland/weston/0001-backend-drm-Pre-sort-plane-list-by-zpos.patch >> new file mode 100644 >> index 00000000..04ae08f5 >> --- /dev/null >> +++ b/meta-arago-distro/recipes-graphics/wayland/weston/0001-backend-drm-Pre-sort-plane-list-by-zpos.patch >> @@ -0,0 +1,48 @@ >> +From 9d2fda2a77cfa0932b2cef9af59033c187ec21d7 Mon Sep 17 00:00:00 2001 >> +From: Daniel Stone <daniels@collabora.com> >> +Date: Tue, 7 Dec 2021 15:55:42 +0000 >> +Subject: [PATCH 1/3] backend-drm: Pre-sort plane list by zpos >> + >> +Rather than constructing a zpos-sorted list every time, just have >> +plane_list be pre-sorted. >> + >> +Backport: 6609840479934a1145372e8a850592eeffbdaf83 >> + >> +Signed-off-by: Daniel Stone <daniels@collabora.com> >> +--- >> + libweston/backend-drm/drm.c | 12 ++++++++++-- >> + 1 file changed, 10 insertions(+), 2 deletions(-) >> + >> +diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c >> +index 42787702..102fa2d7 100644 >> +--- a/libweston/backend-drm/drm.c >> ++++ b/libweston/backend-drm/drm.c >> +@@ -760,7 +760,7 @@ init_pixman(struct drm_backend *b) >> + static struct drm_plane * >> + drm_plane_create(struct drm_backend *b, const drmModePlane *kplane) >> + { >> +- struct drm_plane *plane; >> ++ struct drm_plane *plane, *tmp; >> + drmModeObjectProperties *props; >> + uint64_t *zpos_range_values; >> + >> +@@ -817,7 +817,15 @@ drm_plane_create(struct drm_backend *b, const drmModePlane *kplane) >> + goto err_props; >> + >> + weston_plane_init(&plane->base, b->compositor, 0, 0); >> +- wl_list_insert(&b->plane_list, &plane->link); >> ++ >> ++ wl_list_for_each(tmp, &b->plane_list, link) { >> ++ if (tmp->zpos_max > plane->zpos_max) { >> ++ wl_list_insert(tmp->link.prev, &plane->link); >> ++ break; >> ++ } >> ++ } >> ++ if (plane->link.next == NULL) >> ++ wl_list_insert(b->plane_list.prev, &plane->link); >> + >> + return plane; >> + >> +-- >> +2.43.0 >> + >> diff --git a/meta-arago-distro/recipes-graphics/wayland/weston/0002-backend-drm-fix-plane-sorting.patch b/meta-arago-distro/recipes-graphics/wayland/weston/0002-backend-drm-fix-plane-sorting.patch >> new file mode 100644 >> index 00000000..cd9a8c5e >> --- /dev/null >> +++ b/meta-arago-distro/recipes-graphics/wayland/weston/0002-backend-drm-fix-plane-sorting.patch >> @@ -0,0 +1,38 @@ >> +From 450987334af6546b62aa8f5cce8a4c1b07fe5a5e Mon Sep 17 00:00:00 2001 >> +From: Michael Olbrich <m.olbrich@pengutronix.de> >> +Date: Tue, 30 Aug 2022 17:10:27 +0200 >> +Subject: [PATCH 2/3] backend-drm: fix plane sorting >> + >> +The planes in the plane_list must be sorted from largest zpos_max to smallest. >> + >> +Currently the plane order is only correct when the planes are already ordered >> +and added starting with the smallest zpos_max. This works accidentally in most >> +cases because the primary plane is usually first and there is often only one >> +overlay plane or the zpos is sufficiantly configurable. >> + >> +To fix this, insert a new plane before the first plane with a smaller zpos_max. >> +And if none is found, insert it at the end of the list. >> + >> +Backport: 4cde507be6a116b3828f3a86a0e97639f04d9046 >> + >> +Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de> >> +--- >> + libweston/backend-drm/drm.c | 2 +- >> + 1 file changed, 1 insertion(+), 1 deletion(-) >> + >> +diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c >> +index 102fa2d7..4c18f76c 100644 >> +--- a/libweston/backend-drm/drm.c >> ++++ b/libweston/backend-drm/drm.c >> +@@ -819,7 +819,7 @@ drm_plane_create(struct drm_backend *b, const drmModePlane *kplane) >> + weston_plane_init(&plane->base, b->compositor, 0, 0); >> + >> + wl_list_for_each(tmp, &b->plane_list, link) { >> +- if (tmp->zpos_max > plane->zpos_max) { >> ++ if (tmp->zpos_max < plane->zpos_max) { >> + wl_list_insert(tmp->link.prev, &plane->link); >> + break; >> + } >> +-- >> +2.43.0 >> + >> diff --git a/meta-arago-distro/recipes-graphics/wayland/weston/0003-drm-backend-Remember-to-set-the-zpos-for-the-scanout.patch b/meta-arago-distro/recipes-graphics/wayland/weston/0003-drm-backend-Remember-to-set-the-zpos-for-the-scanout.patch >> new file mode 100644 >> index 00000000..eaf074e8 >> --- /dev/null >> +++ b/meta-arago-distro/recipes-graphics/wayland/weston/0003-drm-backend-Remember-to-set-the-zpos-for-the-scanout.patch >> @@ -0,0 +1,33 @@ >> +From 84a7c7a7317b0cfd3a34557351041b560645a002 Mon Sep 17 00:00:00 2001 >> +From: Derek Foreman <derek.foreman@collabora.com> >> +Date: Tue, 31 Jan 2023 10:11:42 -0600 >> +Subject: [PATCH 3/3] drm-backend: Remember to set the zpos for the scanout >> + plane >> + >> +We can clear this via drm_plane_state_put_back() at the end of >> +drm_output_propose_state(). We need to set it back to the minimum zpos >> +when rendering. >> + >> +Backport: 58dde0e0c0000f1430624ee2fbf12886774ccd40 >> + >> +Signed-off-by: Derek Foreman <derek.foreman@collabora.com> >> +--- >> + libweston/backend-drm/drm.c | 2 ++ >> + 1 file changed, 2 insertions(+) >> + >> +diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c >> +index 4c18f76c..67d471aa 100644 >> +--- a/libweston/backend-drm/drm.c >> ++++ b/libweston/backend-drm/drm.c >> +@@ -404,6 +404,8 @@ drm_output_render(struct drm_output_state *state, pixman_region32_t *damage) >> + scanout_state->dest_w = output->base.current_mode->width; >> + scanout_state->dest_h = output->base.current_mode->height; >> + >> ++ scanout_state->zpos = scanout_plane->zpos_min; >> ++ >> + pixman_region32_subtract(&c->primary_plane.damage, >> + &c->primary_plane.damage, damage); >> + >> +-- >> +2.43.0 >> + >> diff --git a/meta-arago-distro/recipes-graphics/wayland/weston/0004-backend-drm-Assign-plane_idx-by-plane-list-order.patch b/meta-arago-distro/recipes-graphics/wayland/weston/0004-backend-drm-Assign-plane_idx-by-plane-list-order.patch >> new file mode 100644 >> index 00000000..ae76af7f >> --- /dev/null >> +++ b/meta-arago-distro/recipes-graphics/wayland/weston/0004-backend-drm-Assign-plane_idx-by-plane-list-order.patch >> @@ -0,0 +1,58 @@ >> +From af42fc1e336748b4e401e4441729dd79914425e6 Mon Sep 17 00:00:00 2001 >> +From: Daniel Stone <daniels@collabora.com> >> +Date: Tue, 7 Dec 2021 15:58:49 +0000 >> +Subject: [PATCH] backend-drm: Assign plane_idx by plane list order >> + >> +Backport: af42fc1e336748b4e401e4441729dd79914425e6 >> + >> +Signed-off-by: Daniel Stone <daniels@collabora.com> >> +--- >> + libweston/backend-drm/drm-internal.h | 1 - >> + libweston/backend-drm/drm.c | 5 ++++- >> + 2 files changed, 4 insertions(+), 2 deletions(-) >> + >> +diff --git a/libweston/backend-drm/drm-internal.h b/libweston/backend-drm/drm-internal.h >> +index 55e9414b..86d7368e 100644 >> +--- a/libweston/backend-drm/drm-internal.h >> ++++ b/libweston/backend-drm/drm-internal.h >> +@@ -276,7 +276,6 @@ struct drm_backend { >> + int min_height, max_height; >> + >> + struct wl_list plane_list; >> +- uint32_t next_plane_idx; >> + >> + void *repaint_data; >> + >> +diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c >> +index 102fa2d7..203b8a4e 100644 >> +--- a/libweston/backend-drm/drm.c >> ++++ b/libweston/backend-drm/drm.c >> +@@ -771,7 +771,6 @@ drm_plane_create(struct drm_backend *b, const drmModePlane *kplane) >> + } >> + >> + plane->backend = b; >> +- plane->plane_idx = b->next_plane_idx++; >> + plane->state_cur = drm_plane_state_alloc(NULL, plane); >> + plane->state_cur->complete = true; >> + plane->possible_crtcs = kplane->possible_crtcs; >> +@@ -919,6 +918,7 @@ create_sprites(struct drm_backend *b) >> + drmModePlane *kplane; >> + struct drm_plane *drm_plane; >> + uint32_t i; >> ++ uint32_t next_plane_idx = 0; >> + kplane_res = drmModeGetPlaneResources(b->drm.fd); >> + if (!kplane_res) { >> + weston_log("failed to get plane resources: %s\n", >> +@@ -942,6 +942,9 @@ create_sprites(struct drm_backend *b) >> + &b->compositor->primary_plane); >> + } >> + >> ++ wl_list_for_each (drm_plane, &b->plane_list, link) >> ++ drm_plane->plane_idx = next_plane_idx++; >> ++ >> + drmModeFreePlaneResources(kplane_res); >> + } >> + >> +-- >> +2.43.0 >> + >> -- >> 2.43.0
diff --git a/meta-arago-distro/recipes-graphics/wayland/weston/0001-backend-drm-Pre-sort-plane-list-by-zpos.patch b/meta-arago-distro/recipes-graphics/wayland/weston/0001-backend-drm-Pre-sort-plane-list-by-zpos.patch new file mode 100644 index 00000000..04ae08f5 --- /dev/null +++ b/meta-arago-distro/recipes-graphics/wayland/weston/0001-backend-drm-Pre-sort-plane-list-by-zpos.patch @@ -0,0 +1,48 @@ +From 9d2fda2a77cfa0932b2cef9af59033c187ec21d7 Mon Sep 17 00:00:00 2001 +From: Daniel Stone <daniels@collabora.com> +Date: Tue, 7 Dec 2021 15:55:42 +0000 +Subject: [PATCH 1/3] backend-drm: Pre-sort plane list by zpos + +Rather than constructing a zpos-sorted list every time, just have +plane_list be pre-sorted. + +Backport: 6609840479934a1145372e8a850592eeffbdaf83 + +Signed-off-by: Daniel Stone <daniels@collabora.com> +--- + libweston/backend-drm/drm.c | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c +index 42787702..102fa2d7 100644 +--- a/libweston/backend-drm/drm.c ++++ b/libweston/backend-drm/drm.c +@@ -760,7 +760,7 @@ init_pixman(struct drm_backend *b) + static struct drm_plane * + drm_plane_create(struct drm_backend *b, const drmModePlane *kplane) + { +- struct drm_plane *plane; ++ struct drm_plane *plane, *tmp; + drmModeObjectProperties *props; + uint64_t *zpos_range_values; + +@@ -817,7 +817,15 @@ drm_plane_create(struct drm_backend *b, const drmModePlane *kplane) + goto err_props; + + weston_plane_init(&plane->base, b->compositor, 0, 0); +- wl_list_insert(&b->plane_list, &plane->link); ++ ++ wl_list_for_each(tmp, &b->plane_list, link) { ++ if (tmp->zpos_max > plane->zpos_max) { ++ wl_list_insert(tmp->link.prev, &plane->link); ++ break; ++ } ++ } ++ if (plane->link.next == NULL) ++ wl_list_insert(b->plane_list.prev, &plane->link); + + return plane; + +-- +2.43.0 + diff --git a/meta-arago-distro/recipes-graphics/wayland/weston/0002-backend-drm-fix-plane-sorting.patch b/meta-arago-distro/recipes-graphics/wayland/weston/0002-backend-drm-fix-plane-sorting.patch new file mode 100644 index 00000000..cd9a8c5e --- /dev/null +++ b/meta-arago-distro/recipes-graphics/wayland/weston/0002-backend-drm-fix-plane-sorting.patch @@ -0,0 +1,38 @@ +From 450987334af6546b62aa8f5cce8a4c1b07fe5a5e Mon Sep 17 00:00:00 2001 +From: Michael Olbrich <m.olbrich@pengutronix.de> +Date: Tue, 30 Aug 2022 17:10:27 +0200 +Subject: [PATCH 2/3] backend-drm: fix plane sorting + +The planes in the plane_list must be sorted from largest zpos_max to smallest. + +Currently the plane order is only correct when the planes are already ordered +and added starting with the smallest zpos_max. This works accidentally in most +cases because the primary plane is usually first and there is often only one +overlay plane or the zpos is sufficiantly configurable. + +To fix this, insert a new plane before the first plane with a smaller zpos_max. +And if none is found, insert it at the end of the list. + +Backport: 4cde507be6a116b3828f3a86a0e97639f04d9046 + +Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de> +--- + libweston/backend-drm/drm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c +index 102fa2d7..4c18f76c 100644 +--- a/libweston/backend-drm/drm.c ++++ b/libweston/backend-drm/drm.c +@@ -819,7 +819,7 @@ drm_plane_create(struct drm_backend *b, const drmModePlane *kplane) + weston_plane_init(&plane->base, b->compositor, 0, 0); + + wl_list_for_each(tmp, &b->plane_list, link) { +- if (tmp->zpos_max > plane->zpos_max) { ++ if (tmp->zpos_max < plane->zpos_max) { + wl_list_insert(tmp->link.prev, &plane->link); + break; + } +-- +2.43.0 + diff --git a/meta-arago-distro/recipes-graphics/wayland/weston/0003-drm-backend-Remember-to-set-the-zpos-for-the-scanout.patch b/meta-arago-distro/recipes-graphics/wayland/weston/0003-drm-backend-Remember-to-set-the-zpos-for-the-scanout.patch new file mode 100644 index 00000000..eaf074e8 --- /dev/null +++ b/meta-arago-distro/recipes-graphics/wayland/weston/0003-drm-backend-Remember-to-set-the-zpos-for-the-scanout.patch @@ -0,0 +1,33 @@ +From 84a7c7a7317b0cfd3a34557351041b560645a002 Mon Sep 17 00:00:00 2001 +From: Derek Foreman <derek.foreman@collabora.com> +Date: Tue, 31 Jan 2023 10:11:42 -0600 +Subject: [PATCH 3/3] drm-backend: Remember to set the zpos for the scanout + plane + +We can clear this via drm_plane_state_put_back() at the end of +drm_output_propose_state(). We need to set it back to the minimum zpos +when rendering. + +Backport: 58dde0e0c0000f1430624ee2fbf12886774ccd40 + +Signed-off-by: Derek Foreman <derek.foreman@collabora.com> +--- + libweston/backend-drm/drm.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c +index 4c18f76c..67d471aa 100644 +--- a/libweston/backend-drm/drm.c ++++ b/libweston/backend-drm/drm.c +@@ -404,6 +404,8 @@ drm_output_render(struct drm_output_state *state, pixman_region32_t *damage) + scanout_state->dest_w = output->base.current_mode->width; + scanout_state->dest_h = output->base.current_mode->height; + ++ scanout_state->zpos = scanout_plane->zpos_min; ++ + pixman_region32_subtract(&c->primary_plane.damage, + &c->primary_plane.damage, damage); + +-- +2.43.0 + diff --git a/meta-arago-distro/recipes-graphics/wayland/weston/0004-backend-drm-Assign-plane_idx-by-plane-list-order.patch b/meta-arago-distro/recipes-graphics/wayland/weston/0004-backend-drm-Assign-plane_idx-by-plane-list-order.patch new file mode 100644 index 00000000..ae76af7f --- /dev/null +++ b/meta-arago-distro/recipes-graphics/wayland/weston/0004-backend-drm-Assign-plane_idx-by-plane-list-order.patch @@ -0,0 +1,58 @@ +From af42fc1e336748b4e401e4441729dd79914425e6 Mon Sep 17 00:00:00 2001 +From: Daniel Stone <daniels@collabora.com> +Date: Tue, 7 Dec 2021 15:58:49 +0000 +Subject: [PATCH] backend-drm: Assign plane_idx by plane list order + +Backport: af42fc1e336748b4e401e4441729dd79914425e6 + +Signed-off-by: Daniel Stone <daniels@collabora.com> +--- + libweston/backend-drm/drm-internal.h | 1 - + libweston/backend-drm/drm.c | 5 ++++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +diff --git a/libweston/backend-drm/drm-internal.h b/libweston/backend-drm/drm-internal.h +index 55e9414b..86d7368e 100644 +--- a/libweston/backend-drm/drm-internal.h ++++ b/libweston/backend-drm/drm-internal.h +@@ -276,7 +276,6 @@ struct drm_backend { + int min_height, max_height; + + struct wl_list plane_list; +- uint32_t next_plane_idx; + + void *repaint_data; + +diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c +index 102fa2d7..203b8a4e 100644 +--- a/libweston/backend-drm/drm.c ++++ b/libweston/backend-drm/drm.c +@@ -771,7 +771,6 @@ drm_plane_create(struct drm_backend *b, const drmModePlane *kplane) + } + + plane->backend = b; +- plane->plane_idx = b->next_plane_idx++; + plane->state_cur = drm_plane_state_alloc(NULL, plane); + plane->state_cur->complete = true; + plane->possible_crtcs = kplane->possible_crtcs; +@@ -919,6 +918,7 @@ create_sprites(struct drm_backend *b) + drmModePlane *kplane; + struct drm_plane *drm_plane; + uint32_t i; ++ uint32_t next_plane_idx = 0; + kplane_res = drmModeGetPlaneResources(b->drm.fd); + if (!kplane_res) { + weston_log("failed to get plane resources: %s\n", +@@ -942,6 +942,9 @@ create_sprites(struct drm_backend *b) + &b->compositor->primary_plane); + } + ++ wl_list_for_each (drm_plane, &b->plane_list, link) ++ drm_plane->plane_idx = next_plane_idx++; ++ + drmModeFreePlaneResources(kplane_res); + } + +-- +2.43.0 +