backend/drm: de-allocate unused CRTCs

They can be re-used by another output after a subsequent hotplug.
master
emersion 6 years ago
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…
Cancel
Save