From c4621b07f6106c0c360ec5567387beb355e615ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Thu, 10 May 2012 12:23:53 -0400 Subject: [PATCH] compositor: Report refresh rates in mHz We compute the higher resolution from the mode timing parameters. --- src/compositor-drm.c | 17 +++++++++++++++-- src/compositor-x11.c | 2 +- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/compositor-drm.c b/src/compositor-drm.c index 7023a8c5..2b670b3f 100644 --- a/src/compositor-drm.c +++ b/src/compositor-drm.c @@ -885,7 +885,7 @@ drm_output_switch_mode(struct weston_output *output_base, struct weston_mode *mo fprintf(stderr, "failed to set mode (%dx%d) %u Hz\n", drm_mode->base.width, drm_mode->base.height, - drm_mode->base.refresh); + drm_mode->base.refresh / 1000); ret = -1; } else { output->base.current->flags = 0; @@ -1090,6 +1090,7 @@ static int drm_output_add_mode(struct drm_output *output, drmModeModeInfo *info) { struct drm_mode *mode; + uint64_t refresh; mode = malloc(sizeof *mode); if (mode == NULL) @@ -1098,7 +1099,19 @@ drm_output_add_mode(struct drm_output *output, drmModeModeInfo *info) mode->base.flags = 0; mode->base.width = info->hdisplay; mode->base.height = info->vdisplay; - mode->base.refresh = info->vrefresh; + + /* Calculate higher precision (mHz) refresh rate */ + refresh = (info->clock * 1000000LL / info->htotal + + info->vtotal / 2) / info->vtotal; + + if (info->flags & DRM_MODE_FLAG_INTERLACE) + refresh *= 2; + if (info->flags & DRM_MODE_FLAG_DBLSCAN) + refresh /= 2; + if (info->vscan > 1) + refresh /= info->vscan; + + mode->base.refresh = refresh; mode->mode_info = *info; wl_list_insert(output->base.mode_list.prev, &mode->base.link); diff --git a/src/compositor-x11.c b/src/compositor-x11.c index 7fbcb5fa..dca2324c 100644 --- a/src/compositor-x11.c +++ b/src/compositor-x11.c @@ -383,7 +383,7 @@ x11_compositor_create_output(struct x11_compositor *c, int x, int y, WL_OUTPUT_MODE_CURRENT | WL_OUTPUT_MODE_PREFERRED; output->mode.width = width; output->mode.height = height; - output->mode.refresh = 60; + output->mode.refresh = 60000; wl_list_init(&output->base.mode_list); wl_list_insert(&output->base.mode_list, &output->mode.link);