mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-22 12:55:58 +01:00
backend/drm: don't assume possible_crtcs has only one bit set
This isn't necessarily the case [1]. This should fix an assertion failure on Raspberry Pi 4 dual screen. [1]: https://lists.freedesktop.org/archives/dri-devel/2020-August/275142.html Closes: https://github.com/swaywm/wlroots/issues/1943 Co-authored-by: Simon Ser <contact@emersion.fr>
This commit is contained in:
parent
863acb26c0
commit
b790e5ea34
1 changed files with 18 additions and 15 deletions
|
@ -204,23 +204,26 @@ static bool init_planes(struct wlr_drm_backend *drm) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
assert(drm->num_crtcs <= 32);
|
||||||
* This is a very naive implementation of the plane matching
|
struct wlr_drm_crtc *crtc = NULL;
|
||||||
* logic. Primary and cursor planes should only work on a
|
for (size_t j = 0; j < drm->num_crtcs ; j++) {
|
||||||
* single CRTC, and this should be perfectly adequate, but
|
uint32_t crtc_bit = 1 << j;
|
||||||
* overlay planes can potentially work with multiple CRTCs,
|
if ((plane->possible_crtcs & crtc_bit) == 0) {
|
||||||
* meaning this could return inefficient/skewed results.
|
continue;
|
||||||
*
|
}
|
||||||
* possible_crtcs is a bitmask of crtcs, where each bit is an
|
|
||||||
* index into drmModeRes.crtcs. So if bit 0 is set (ffs starts
|
|
||||||
* counting from 1), crtc 0 is possible.
|
|
||||||
*/
|
|
||||||
int crtc_bit = ffs(plane->possible_crtcs) - 1;
|
|
||||||
|
|
||||||
// This would be a kernel bug
|
struct wlr_drm_crtc *candidate = &drm->crtcs[j];
|
||||||
assert(crtc_bit >= 0 && (size_t)crtc_bit < drm->num_crtcs);
|
if ((type == DRM_PLANE_TYPE_PRIMARY && !candidate->primary) ||
|
||||||
|
(type == DRM_PLANE_TYPE_CURSOR && !candidate->cursor)) {
|
||||||
|
crtc = candidate;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!crtc) {
|
||||||
|
drmModeFreePlane(plane);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
struct wlr_drm_crtc *crtc = &drm->crtcs[crtc_bit];
|
|
||||||
if (!add_plane(drm, crtc, plane, type, &props)) {
|
if (!add_plane(drm, crtc, plane, type, &props)) {
|
||||||
drmModeFreePlane(plane);
|
drmModeFreePlane(plane);
|
||||||
goto error;
|
goto error;
|
||||||
|
|
Loading…
Reference in a new issue