aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2023-12-30 20:06:33 +0100
committerSimon Ser <contact@emersion.fr>2023-12-30 20:06:33 +0100
commitf81c3d93cd6f61b20ae784297679283438def8df (patch)
tree3b406bbd30b46965b9eff201f62b4d5509cce59f
parentab924064f230cce2aea2e45bd113adea9d37f286 (diff)
backend/drm: save current refresh rate
wlr_output.refresh is populated by core wlr_output, and thus will be zero for a custom mode with an unset refresh rate. Save the refresh rate from the drmModeModeInfo in wlr_drm_connector instead. Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3791
-rw-r--r--backend/drm/drm.c7
-rw-r--r--include/backend/drm/drm.h2
2 files changed, 8 insertions, 1 deletions
diff --git a/backend/drm/drm.c b/backend/drm/drm.c
index b630c9dd..9c4f569c 100644
--- a/backend/drm/drm.c
+++ b/backend/drm/drm.c
@@ -475,6 +475,10 @@ static bool drm_crtc_commit(struct wlr_drm_connector *conn,
}
drm_connector_set_pending_page_flip(conn, page_flip);
+
+ if (state->base->committed & WLR_OUTPUT_STATE_MODE) {
+ conn->refresh = calculate_refresh_rate(&state->mode);
+ }
} else {
// The set_cursor() hook is a bit special: it's not really synchronized
// to commit() or test(). Once set_cursor() returns true, the new
@@ -1466,6 +1470,7 @@ static bool connect_drm_connector(struct wlr_drm_connector *wlr_conn,
wlr_conn->crtc->props.mode_id, &mode_id);
wlr_conn->crtc->mode_id = mode_id;
+ wlr_conn->refresh = calculate_refresh_rate(current_modeinfo);
}
wlr_log(WLR_INFO, " %"PRId32"x%"PRId32" @ %.3f Hz %s",
@@ -1765,7 +1770,7 @@ static void handle_page_flip(int fd, unsigned seq,
.presented = drm->session->active,
.when = &present_time,
.seq = seq,
- .refresh = mhz_to_nsec(conn->output.refresh),
+ .refresh = mhz_to_nsec(conn->refresh),
.flags = present_flags,
};
wlr_output_send_present(&conn->output, &present_event);
diff --git a/include/backend/drm/drm.h b/include/backend/drm/drm.h
index 88eacc6e..39a247b1 100644
--- a/include/backend/drm/drm.h
+++ b/include/backend/drm/drm.h
@@ -175,6 +175,8 @@ struct wlr_drm_connector {
// Last committed page-flip
struct wlr_drm_page_flip *pending_page_flip;
+
+ int32_t refresh;
};
struct wlr_drm_backend *get_drm_backend_from_backend(