aboutsummaryrefslogtreecommitdiff
path: root/backend/drm/drm.c
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2018-09-10 21:51:36 -0400
committerGitHub <noreply@github.com>2018-09-10 21:51:36 -0400
commitca331c0468415be6f6028c8dd7a2238f132a2c91 (patch)
tree9655f39b71de2541c2eadc92557ddeda73cffbf2 /backend/drm/drm.c
parent76ad4804bce89ae28391873441e3b486d36a31c0 (diff)
parent1fcecd68df14e4a599f83e2f7a590a0f3c14bcbf (diff)
Merge pull request #1235 from emersion/dealloc-unused-crtcs
backend/drm: de-allocate unused CRTCs
Diffstat (limited to 'backend/drm/drm.c')
-rw-r--r--backend/drm/drm.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/backend/drm/drm.c b/backend/drm/drm.c
index 43b6e3b1..e37eba74 100644
--- a/backend/drm/drm.c
+++ b/backend/drm/drm.c
@@ -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) {
if (crtc_res[i] == UNMATCHED) {
+ // De-allocate CRTCs we don't use anymore
+ if (crtc[i] != UNMATCHED) {
+ dealloc_crtc(connectors[crtc[i]]);
+ }
continue;
}
if (crtc_res[i] != crtc[i]) {
changed_outputs[crtc_res[i]] = true;
- struct wlr_drm_connector *c;
- size_t pos = 0;
- wl_list_for_each(c, &drm->outputs, link) {
- if (pos == crtc_res[i]) {
- break;
- }
- pos++;
- }
+ struct wlr_drm_connector *conn = connectors[crtc_res[i]];
- dealloc_crtc(c);
- c->crtc = &drm->crtcs[i];
+ dealloc_crtc(conn);
+ conn->crtc = &drm->crtcs[i];
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);
}
}