compositor: Report refresh rates in mHz
authorKristian Høgsberg <krh@bitplanet.net>
Thu, 10 May 2012 16:23:53 +0000 (12:23 -0400)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 10 May 2012 18:09:48 +0000 (14:09 -0400)
We compute the higher resolution from the mode timing parameters.

src/compositor-drm.c
src/compositor-x11.c

index 7023a8c..2b670b3 100644 (file)
@@ -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);
 
index 7fbcb5f..dca2324 100644 (file)
@@ -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);