From d41b5efc65bbee42b1bda7ce4814081583d7cd78 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Fri, 16 Feb 2024 18:05:45 +0100 Subject: [PATCH] backend/drm: fix adaptive sync no-op changes When a compositors submits a wlr_output_state with WLR_OUTPUT_STATE_ADAPTIVE_SYNC_ENABLED set and adaptive_sync_enabled = false on an output which doesn't support adaptive sync, we'd fail the commit. Fix this. This bug was previously hidden because wlr_output_commit() drops no-op changes from wlr_output_state.committed. --- backend/drm/atomic.c | 2 +- backend/drm/legacy.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/backend/drm/atomic.c b/backend/drm/atomic.c index cdbb1ec1..fc73e2da 100644 --- a/backend/drm/atomic.c +++ b/backend/drm/atomic.c @@ -276,7 +276,7 @@ bool drm_atomic_connector_prepare(struct wlr_drm_connector_state *state, bool mo output->adaptive_sync_status == WLR_OUTPUT_ADAPTIVE_SYNC_ENABLED; bool vrr_enabled = prev_vrr_enabled; if ((state->base->committed & WLR_OUTPUT_STATE_ADAPTIVE_SYNC_ENABLED)) { - if (!drm_connector_supports_vrr(conn)) { + if (state->base->adaptive_sync_enabled && !drm_connector_supports_vrr(conn)) { return false; } vrr_enabled = state->base->adaptive_sync_enabled; diff --git a/backend/drm/legacy.c b/backend/drm/legacy.c index 1141d401..afa7f8fb 100644 --- a/backend/drm/legacy.c +++ b/backend/drm/legacy.c @@ -110,10 +110,11 @@ static bool legacy_crtc_commit(const struct wlr_drm_connector_state *state, } if (state->base->committed & WLR_OUTPUT_STATE_ADAPTIVE_SYNC_ENABLED) { - if (!drm_connector_supports_vrr(conn)) { + if (state->base->adaptive_sync_enabled && !drm_connector_supports_vrr(conn)) { return false; } - if (drmModeObjectSetProperty(drm->fd, crtc->id, DRM_MODE_OBJECT_CRTC, + if (crtc->props.vrr_enabled != 0 && + drmModeObjectSetProperty(drm->fd, crtc->id, DRM_MODE_OBJECT_CRTC, crtc->props.vrr_enabled, state->base->adaptive_sync_enabled) != 0) { wlr_drm_conn_log_errno(conn, WLR_ERROR,