diff options
author | Simon Ser <contact@emersion.fr> | 2021-06-18 12:40:07 +0200 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2022-08-30 17:53:50 +0000 |
commit | 8c70245d5fe044f09882653437e0a9dc7c336a0c (patch) | |
tree | 3e82af4e461fd5370a145a42e00a4aab4ebcbe4a | |
parent | 26e1812ab3eb75ba5c13f1a4060dd74fb4c93263 (diff) |
output: fail commits if adaptive sync cannot be enabled
Previously, adaptive sync was just a hint and wouldn't make any
atomic commit fail if the backend didn't support it. The main reason
is wlr_output_test wasn't supported at the time.
Now that we have a way for compositors to test whether a change can
work, let's remove the exception for adaptive sync and convert it to
a regular output state field.
-rw-r--r-- | backend/drm/atomic.c | 6 | ||||
-rw-r--r-- | backend/drm/drm.c | 9 | ||||
-rw-r--r-- | backend/drm/legacy.c | 6 | ||||
-rw-r--r-- | backend/x11/output.c | 3 | ||||
-rw-r--r-- | include/wlr/interfaces/wlr_output.h | 1 | ||||
-rw-r--r-- | include/wlr/types/wlr_output.h | 5 |
6 files changed, 22 insertions, 8 deletions
diff --git a/backend/drm/atomic.c b/backend/drm/atomic.c index ab1b2160..05d01125 100644 --- a/backend/drm/atomic.c +++ b/backend/drm/atomic.c @@ -254,8 +254,10 @@ static bool atomic_crtc_commit(struct wlr_drm_connector *conn, bool prev_vrr_enabled = 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) && - drm_connector_supports_vrr(conn)) { + if ((state->base->committed & WLR_OUTPUT_STATE_ADAPTIVE_SYNC_ENABLED)) { + if (!drm_connector_supports_vrr(conn)) { + return false; + } vrr_enabled = state->base->adaptive_sync_enabled; } diff --git a/backend/drm/drm.c b/backend/drm/drm.c index 94dd7023..06548ed0 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -36,7 +36,8 @@ static const uint32_t COMMIT_OUTPUT_STATE = WLR_OUTPUT_STATE_BUFFER | WLR_OUTPUT_STATE_MODE | WLR_OUTPUT_STATE_ENABLED | - WLR_OUTPUT_STATE_GAMMA_LUT; + WLR_OUTPUT_STATE_GAMMA_LUT | + WLR_OUTPUT_STATE_ADAPTIVE_SYNC_ENABLED; static const uint32_t SUPPORTED_OUTPUT_STATE = WLR_OUTPUT_STATE_BACKEND_OPTIONAL | COMMIT_OUTPUT_STATE; @@ -489,6 +490,12 @@ static bool drm_connector_test(struct wlr_output *output, } } + if ((state->committed & WLR_OUTPUT_ADAPTIVE_SYNC_ENABLED) && + state->adaptive_sync_enabled && + !drm_connector_supports_vrr(conn)) { + return false; + } + struct wlr_drm_connector_state pending = {0}; drm_connector_state_init(&pending, conn, state); diff --git a/backend/drm/legacy.c b/backend/drm/legacy.c index 84e8a914..bd8813e8 100644 --- a/backend/drm/legacy.c +++ b/backend/drm/legacy.c @@ -115,8 +115,10 @@ static bool legacy_crtc_commit(struct wlr_drm_connector *conn, } } - if ((state->base->committed & WLR_OUTPUT_STATE_ADAPTIVE_SYNC_ENABLED) && - drm_connector_supports_vrr(conn)) { + if (state->base->committed & WLR_OUTPUT_STATE_ADAPTIVE_SYNC_ENABLED) { + if (!drm_connector_supports_vrr(conn)) { + return false; + } if (drmModeObjectSetProperty(drm->fd, crtc->id, DRM_MODE_OBJECT_CRTC, crtc->props.vrr_enabled, state->base->adaptive_sync_enabled) != 0) { diff --git a/backend/x11/output.c b/backend/x11/output.c index f56129ab..0e124f9a 100644 --- a/backend/x11/output.c +++ b/backend/x11/output.c @@ -26,7 +26,8 @@ static const uint32_t SUPPORTED_OUTPUT_STATE = WLR_OUTPUT_STATE_BACKEND_OPTIONAL | WLR_OUTPUT_STATE_BUFFER | - WLR_OUTPUT_STATE_MODE; + WLR_OUTPUT_STATE_MODE | + WLR_OUTPUT_STATE_ADAPTIVE_SYNC_ENABLED; static void parse_xcb_setup(struct wlr_output *output, xcb_connection_t *xcb) { diff --git a/include/wlr/interfaces/wlr_output.h b/include/wlr/interfaces/wlr_output.h index 7a1252db..7ef3de98 100644 --- a/include/wlr/interfaces/wlr_output.h +++ b/include/wlr/interfaces/wlr_output.h @@ -22,7 +22,6 @@ WLR_OUTPUT_STATE_SCALE | \ WLR_OUTPUT_STATE_TRANSFORM | \ WLR_OUTPUT_STATE_RENDER_FORMAT | \ - WLR_OUTPUT_STATE_ADAPTIVE_SYNC_ENABLED | \ WLR_OUTPUT_STATE_SUBPIXEL) /** diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h index 4f8bff0d..2a290b46 100644 --- a/include/wlr/types/wlr_output.h +++ b/include/wlr/types/wlr_output.h @@ -301,7 +301,10 @@ void wlr_output_set_transform(struct wlr_output *output, enum wl_output_transform transform); /** * Enables or disables adaptive sync (ie. variable refresh rate) on this - * output. This is just a hint, the backend is free to ignore this setting. + * output. On some backends, this is just a hint and may be ignored. + * Compositors can inspect `wlr_output.adaptive_sync_status` to query the + * effective status. Backends that don't support adaptive sync will reject + * the output commit. * * When enabled, compositors can submit frames a little bit later than the * deadline without dropping a frame. |