backend/drm: de-allocate unused CRTCs
They can be re-used by another output after a subsequent hotplug.
This commit is contained in:
parent
0086dbed09
commit
1fcecd68df
|
@ -783,28 +783,32 @@ void realloc_crtcs(struct wlr_drm_backend *drm, bool *changed_outputs) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct wlr_drm_connector *connectors[num_outputs];
|
||||||
|
i = 0;
|
||||||
|
wl_list_for_each(conn, &drm->outputs, link) {
|
||||||
|
connectors[i] = conn;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < drm->num_crtcs; ++i) {
|
for (size_t i = 0; i < drm->num_crtcs; ++i) {
|
||||||
if (crtc_res[i] == UNMATCHED) {
|
if (crtc_res[i] == UNMATCHED) {
|
||||||
|
// De-allocate CRTCs we don't use anymore
|
||||||
|
if (crtc[i] != UNMATCHED) {
|
||||||
|
dealloc_crtc(connectors[crtc[i]]);
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (crtc_res[i] != crtc[i]) {
|
if (crtc_res[i] != crtc[i]) {
|
||||||
changed_outputs[crtc_res[i]] = true;
|
changed_outputs[crtc_res[i]] = true;
|
||||||
|
|
||||||
struct wlr_drm_connector *c;
|
struct wlr_drm_connector *conn = connectors[crtc_res[i]];
|
||||||
size_t pos = 0;
|
|
||||||
wl_list_for_each(c, &drm->outputs, link) {
|
|
||||||
if (pos == crtc_res[i]) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pos++;
|
|
||||||
}
|
|
||||||
|
|
||||||
dealloc_crtc(c);
|
dealloc_crtc(conn);
|
||||||
c->crtc = &drm->crtcs[i];
|
conn->crtc = &drm->crtcs[i];
|
||||||
|
|
||||||
wlr_log(WLR_DEBUG, "Assigning CRTC %zu to output %d -> %d '%s'",
|
wlr_log(WLR_DEBUG, "Assigning CRTC %zu to output %d -> %d '%s'",
|
||||||
i, crtc[i], crtc_res[i], c->output.name);
|
i, crtc[i], crtc_res[i], conn->output.name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue