aboutsummaryrefslogtreecommitdiff
path: root/backend/drm/drm.c
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2018-10-07 16:00:39 +0200
committerGitHub <noreply@github.com>2018-10-07 16:00:39 +0200
commitfb5572db5aff25e6e103fa9163d58d15d8857531 (patch)
treef71d482c54290769bf8d62ee1dc95f207ad9d280 /backend/drm/drm.c
parenteb44d18cdd62cd04cda2660541996e5bd54504a9 (diff)
parent37de179013987ae56ef40cc2cccf570e3b1a0351 (diff)
Merge pull request #1286 from emersion/drm-no-crtc
backend/drm: better handle GPUs without CRTCs
Diffstat (limited to 'backend/drm/drm.c')
-rw-r--r--backend/drm/drm.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/backend/drm/drm.c b/backend/drm/drm.c
index b9ab7f82..272a168c 100644
--- a/backend/drm/drm.c
+++ b/backend/drm/drm.c
@@ -156,6 +156,11 @@ bool init_drm_resources(struct wlr_drm_backend *drm) {
wlr_log(WLR_INFO, "Found %d DRM CRTCs", res->count_crtcs);
drm->num_crtcs = res->count_crtcs;
+ if (drm->num_crtcs == 0) {
+ drmModeFreeResources(res);
+ return true;
+ }
+
drm->crtcs = calloc(drm->num_crtcs, sizeof(drm->crtcs[0]));
if (!drm->crtcs) {
wlr_log_errno(WLR_ERROR, "Allocation failed");
@@ -433,9 +438,9 @@ static void realloc_planes(struct wlr_drm_backend *drm, const uint32_t *crtc_in,
continue;
}
- uint32_t possible[drm->num_type_planes[type]];
- uint32_t crtc[drm->num_crtcs];
- uint32_t crtc_res[drm->num_crtcs];
+ uint32_t possible[drm->num_type_planes[type] + 1];
+ uint32_t crtc[drm->num_crtcs + 1];
+ uint32_t crtc_res[drm->num_crtcs + 1];
for (size_t i = 0; i < drm->num_type_planes[type]; ++i) {
possible[i] = drm->type_planes[type][i].possible_crtcs;
@@ -1160,7 +1165,7 @@ void scan_drm_connectors(struct wlr_drm_backend *drm) {
}
}
- bool changed_outputs[wl_list_length(&drm->outputs)];
+ bool changed_outputs[wl_list_length(&drm->outputs) + 1];
memset(changed_outputs, false, sizeof(changed_outputs));
for (size_t i = 0; i < new_outputs_len; ++i) {
struct wlr_drm_connector *conn = new_outputs[i];