new file mode 100644
@@ -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.
+
+Upstream-Status: 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
+
new file mode 100644
@@ -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.
+
+Upstream-Status: 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
+
new file mode 100644
@@ -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.
+
+Upstream-Status: 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
+
new file mode 100644
@@ -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
+
+Upstream-Status: 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
+