From ff6c4f80b25d1c3960fbe050858ca44331ee1111 Mon Sep 17 00:00:00 2001 From: emersion Date: Sun, 16 Dec 2018 11:06:46 +0100 Subject: backend/drm: don't insert duplicate custom modes, fix refresh rate --- backend/drm/drm.c | 11 +++++++++-- backend/drm/util.c | 2 +- include/backend/drm/util.h | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/backend/drm/drm.c b/backend/drm/drm.c index 0acb0324..332abfe5 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -550,11 +550,18 @@ bool wlr_drm_connector_add_mode(struct wlr_output *output, const drmModeModeInfo *modeinfo) { struct wlr_drm_connector *conn = get_drm_connector_from_output(output); - assert(modeinfo); if (modeinfo->type != DRM_MODE_TYPE_USERDEF) { return false; } + struct wlr_output_mode *wlr_mode; + wl_list_for_each(wlr_mode, &conn->output.modes, link) { + struct wlr_drm_mode *mode = (struct wlr_drm_mode *)wlr_mode; + if (memcmp(&mode->drm_mode, modeinfo, sizeof(*modeinfo)) == 0) { + return true; + } + } + struct wlr_drm_mode *mode = calloc(1, sizeof(*mode)); if (!mode) { return false; @@ -563,7 +570,7 @@ bool wlr_drm_connector_add_mode(struct wlr_output *output, mode->wlr_mode.width = mode->drm_mode.hdisplay; mode->wlr_mode.height = mode->drm_mode.vdisplay; - mode->wlr_mode.refresh = mode->drm_mode.vrefresh; + mode->wlr_mode.refresh = calculate_refresh_rate(modeinfo); wlr_log(WLR_INFO, "Registered custom mode " "%"PRId32"x%"PRId32"@%"PRId32, diff --git a/backend/drm/util.c b/backend/drm/util.c index 6b2c0981..6a8b346a 100644 --- a/backend/drm/util.c +++ b/backend/drm/util.c @@ -6,7 +6,7 @@ #include #include "backend/drm/util.h" -int32_t calculate_refresh_rate(drmModeModeInfo *mode) { +int32_t calculate_refresh_rate(const drmModeModeInfo *mode) { int32_t refresh = (mode->clock * 1000000LL / mode->htotal + mode->vtotal / 2) / mode->vtotal; diff --git a/include/backend/drm/util.h b/include/backend/drm/util.h index 0b55182b..e159d716 100644 --- a/include/backend/drm/util.h +++ b/include/backend/drm/util.h @@ -7,7 +7,7 @@ #include // Calculates a more accurate refresh rate (mHz) than what mode itself provides -int32_t calculate_refresh_rate(drmModeModeInfo *mode); +int32_t calculate_refresh_rate(const drmModeModeInfo *mode); // Populates the make/model/phys_{width,height} of output from the edid data void parse_edid(struct wlr_output *restrict output, size_t len, const uint8_t *data); -- cgit v1.2.3