aboutsummaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
authoremersion <contact@emersion.fr>2018-12-16 11:06:46 +0100
committeremersion <contact@emersion.fr>2018-12-16 11:06:46 +0100
commitff6c4f80b25d1c3960fbe050858ca44331ee1111 (patch)
treee9dca74205246bf27e88f4f8774d94188a0e3916 /backend
parent6d4bfa3226123e958ff2bdc4f226489cba49f84d (diff)
backend/drm: don't insert duplicate custom modes, fix refresh rate
Diffstat (limited to 'backend')
-rw-r--r--backend/drm/drm.c11
-rw-r--r--backend/drm/util.c2
2 files changed, 10 insertions, 3 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 <wlr/util/log.h>
#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;