diff options
Diffstat (limited to 'backend/drm/drm.c')
-rw-r--r-- | backend/drm/drm.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/backend/drm/drm.c b/backend/drm/drm.c index ebea340e..fe989e38 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -412,6 +412,43 @@ static bool drm_connector_commit_buffer(struct wlr_output *output) { return true; } +static void drm_connector_enable_adaptive_sync(struct wlr_output *output, + bool enabled) { + struct wlr_drm_connector *conn = get_drm_connector_from_output(output); + struct wlr_drm_backend *drm = get_drm_backend_from_backend(output->backend); + + struct wlr_drm_crtc *crtc = conn->crtc; + if (!crtc) { + return; + } + + uint64_t vrr_capable; + if (conn->props.vrr_capable == 0 || + !get_drm_prop(drm->fd, conn->id, conn->props.vrr_capable, + &vrr_capable) || !vrr_capable) { + wlr_log(WLR_DEBUG, "Failed to enable adaptive sync: " + "connector '%s' doesn't support VRR", output->name); + return; + } + + if (crtc->props.vrr_enabled == 0) { + wlr_log(WLR_DEBUG, "Failed to enable adaptive sync: " + "CRTC %"PRIu32" doesn't support VRR", crtc->id); + return; + } + + if (drmModeObjectSetProperty(drm->fd, crtc->id, DRM_MODE_OBJECT_CRTC, + crtc->props.vrr_enabled, enabled) != 0) { + wlr_log_errno(WLR_ERROR, "drmModeObjectSetProperty(VRR_ENABLED) failed"); + return; + } + + output->adaptive_sync_status = enabled ? WLR_OUTPUT_ADAPTIVE_SYNC_ENABLED : + WLR_OUTPUT_ADAPTIVE_SYNC_DISABLED; + wlr_log(WLR_DEBUG, "VRR %s on connector '%s'", + enabled ? "enabled" : "disabled", output->name); +} + static bool drm_connector_set_custom_mode(struct wlr_output *output, int32_t width, int32_t height, int32_t refresh); @@ -446,6 +483,11 @@ static bool drm_connector_commit(struct wlr_output *output) { } } + if (output->pending.committed & WLR_OUTPUT_STATE_ADAPTIVE_SYNC_ENABLED) { + drm_connector_enable_adaptive_sync(output, + output->pending.adaptive_sync_enabled); + } + // TODO: support modesetting with a buffer if (output->pending.committed & WLR_OUTPUT_STATE_BUFFER && !(output->pending.committed & WLR_OUTPUT_STATE_MODE)) { |