diff --git a/backend/drm/drm.c b/backend/drm/drm.c index 6ae9dcbf3..38ed6c26d 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -1614,6 +1614,7 @@ static bool connect_drm_connector(struct wlr_drm_connector *wlr_conn, wlr_log(WLR_INFO, "Detected modes:"); + bool found_current_mode = false; for (int i = 0; i < drm_conn->count_modes; ++i) { if (drm_conn->modes[i].flags & DRM_MODE_FLAG_INTERLACE) { continue; @@ -1632,14 +1633,7 @@ static bool connect_drm_connector(struct wlr_drm_connector *wlr_conn, if (current_modeinfo != NULL && memcmp(&mode->drm_mode, current_modeinfo, sizeof(*current_modeinfo)) == 0) { wlr_output_state_set_mode(&state, &mode->wlr_mode); - - uint64_t mode_id = 0; - get_drm_prop(drm->fd, wlr_conn->crtc->id, - wlr_conn->crtc->props.mode_id, &mode_id); - - wlr_conn->crtc->own_mode_id = false; - wlr_conn->crtc->mode_id = mode_id; - wlr_conn->refresh = calculate_refresh_rate(current_modeinfo); + found_current_mode = true; } wlr_log(WLR_INFO, " %"PRId32"x%"PRId32" @ %.3f Hz %s", @@ -1650,6 +1644,23 @@ static bool connect_drm_connector(struct wlr_drm_connector *wlr_conn, wl_list_insert(modes.prev, &mode->wlr_mode.link); } + if (current_modeinfo != NULL) { + int32_t refresh = calculate_refresh_rate(current_modeinfo); + + if (!found_current_mode) { + wlr_output_state_set_custom_mode(&state, + current_modeinfo->hdisplay, current_modeinfo->vdisplay, refresh); + } + + uint64_t mode_id = 0; + get_drm_prop(drm->fd, wlr_conn->crtc->id, + wlr_conn->crtc->props.mode_id, &mode_id); + + wlr_conn->crtc->own_mode_id = false; + wlr_conn->crtc->mode_id = mode_id; + wlr_conn->refresh = refresh; + } + free(current_modeinfo); wlr_output_init(output, &drm->backend, &output_impl, drm->session->event_loop, &state);