summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2012-05-10 12:23:53 -0400
committerKristian Høgsberg <krh@bitplanet.net>2012-05-10 14:09:48 -0400
commitc4621b07f6106c0c360ec5567387beb355e615ac (patch)
treeb1207abe1bb23adeb7c10ef613a3bd7b84785a86
parent34829dec713589518727c2e00bb1d2f2736e3763 (diff)
compositor: Report refresh rates in mHz
We compute the higher resolution from the mode timing parameters.
-rw-r--r--src/compositor-drm.c17
-rw-r--r--src/compositor-x11.c2
2 files changed, 16 insertions, 3 deletions
diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index 7023a8c..2b670b3 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 7fbcb5f..dca2324 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);