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.

Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
This commit is contained in:
Michael Olbrich 2022-08-30 17:10:27 +02:00
parent 4990e28ff2
commit 4cde507be6

View File

@ -840,13 +840,13 @@ drm_plane_create(struct drm_device *device, const drmModePlane *kplane)
weston_plane_init(&plane->base, compositor, 0, 0);
wl_list_for_each(tmp, &device->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;
}
}
if (plane->link.next == NULL)
wl_list_insert(&device->plane_list, &plane->link);
wl_list_insert(device->plane_list.prev, &plane->link);
return plane;