aboutsummaryrefslogtreecommitdiff
path: root/backend/drm
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2020-01-10 16:04:19 +0100
committerDrew DeVault <sir@cmpwn.com>2020-03-06 21:32:58 +0100
commit52c67284e25c6a31a260b4918132f7842e18532d (patch)
tree6a147d81ae01e90cc202c7af0f225e32026389d2 /backend/drm
parent9be1af3afb1ffe2b51eacdcc59c1d5f17cf6d205 (diff)
backend/drm: add support for adaptive_sync_enabled
The vrr_capable and VRR_ENABLED properties are used.
Diffstat (limited to 'backend/drm')
-rw-r--r--backend/drm/drm.c42
-rw-r--r--backend/drm/properties.c2
2 files changed, 44 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)) {
diff --git a/backend/drm/properties.c b/backend/drm/properties.c
index 010b71d4..0fafca7b 100644
--- a/backend/drm/properties.c
+++ b/backend/drm/properties.c
@@ -24,6 +24,7 @@ static const struct prop_info connector_info[] = {
{ "EDID", INDEX(edid) },
{ "PATH", INDEX(path) },
{ "link-status", INDEX(link_status) },
+ { "vrr_capable", INDEX(vrr_capable) },
#undef INDEX
};
@@ -33,6 +34,7 @@ static const struct prop_info crtc_info[] = {
{ "GAMMA_LUT", INDEX(gamma_lut) },
{ "GAMMA_LUT_SIZE", INDEX(gamma_lut_size) },
{ "MODE_ID", INDEX(mode_id) },
+ { "VRR_ENABLED", INDEX(vrr_enabled) },
{ "rotation", INDEX(rotation) },
{ "scaling mode", INDEX(scaling_mode) },
#undef INDEX