aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backend/drm/atomic.c14
-rw-r--r--backend/drm/drm.c5
-rw-r--r--backend/drm/legacy.c5
-rw-r--r--include/backend/drm/iface.h2
4 files changed, 19 insertions, 7 deletions
diff --git a/backend/drm/atomic.c b/backend/drm/atomic.c
index e7374a00..8d98bac2 100644
--- a/backend/drm/atomic.c
+++ b/backend/drm/atomic.c
@@ -123,14 +123,22 @@ static bool atomic_crtc_pageflip(struct wlr_drm_backend *drm,
mode);
}
-static void atomic_conn_enable(struct wlr_drm_backend *drm,
+static bool atomic_conn_enable(struct wlr_drm_backend *drm,
struct wlr_drm_connector *conn, bool enable) {
struct wlr_drm_crtc *crtc = conn->crtc;
- struct atomic atom;
+ struct atomic atom;
atomic_begin(crtc, &atom);
atomic_add(&atom, crtc->id, crtc->props.active, enable);
- atomic_end(drm->fd, &atom);
+ if (enable) {
+ atomic_add(&atom, conn->id, conn->props.crtc_id, crtc->id);
+ atomic_add(&atom, crtc->id, crtc->props.mode_id, crtc->mode_id);
+ } else {
+ atomic_add(&atom, conn->id, conn->props.crtc_id, 0);
+ atomic_add(&atom, crtc->id, crtc->props.mode_id, 0);
+ }
+ return atomic_commit(drm->fd, &atom, conn, DRM_MODE_ATOMIC_ALLOW_MODESET,
+ true);
}
bool legacy_crtc_set_cursor(struct wlr_drm_backend *drm,
diff --git a/backend/drm/drm.c b/backend/drm/drm.c
index 32b2f88c..0d32605a 100644
--- a/backend/drm/drm.c
+++ b/backend/drm/drm.c
@@ -252,7 +252,10 @@ static void wlr_drm_connector_enable(struct wlr_output *output, bool enable) {
}
struct wlr_drm_backend *drm = (struct wlr_drm_backend *)output->backend;
- drm->iface->conn_enable(drm, conn, enable);
+ bool ok = drm->iface->conn_enable(drm, conn, enable);
+ if (!ok) {
+ return;
+ }
if (enable) {
wlr_drm_connector_start_renderer(conn);
diff --git a/backend/drm/legacy.c b/backend/drm/legacy.c
index d75eb2cb..61140cec 100644
--- a/backend/drm/legacy.c
+++ b/backend/drm/legacy.c
@@ -25,10 +25,11 @@ static bool legacy_crtc_pageflip(struct wlr_drm_backend *drm,
return true;
}
-static void legacy_conn_enable(struct wlr_drm_backend *drm,
+static bool legacy_conn_enable(struct wlr_drm_backend *drm,
struct wlr_drm_connector *conn, bool enable) {
- drmModeConnectorSetProperty(drm->fd, conn->id, conn->props.dpms,
+ int ret = drmModeConnectorSetProperty(drm->fd, conn->id, conn->props.dpms,
enable ? DRM_MODE_DPMS_ON : DRM_MODE_DPMS_OFF);
+ return ret >= 0;
}
bool legacy_crtc_set_cursor(struct wlr_drm_backend *drm,
diff --git a/include/backend/drm/iface.h b/include/backend/drm/iface.h
index bc61eb51..4a5d2e9d 100644
--- a/include/backend/drm/iface.h
+++ b/include/backend/drm/iface.h
@@ -15,7 +15,7 @@ struct wlr_drm_crtc;
// Used to provide atomic or legacy DRM functions
struct wlr_drm_interface {
// Enable or disable DPMS for connector
- void (*conn_enable)(struct wlr_drm_backend *drm,
+ bool (*conn_enable)(struct wlr_drm_backend *drm,
struct wlr_drm_connector *conn, bool enable);
// Pageflip on crtc. If mode is non-NULL perform a full modeset using it.
bool (*crtc_pageflip)(struct wlr_drm_backend *drm,