mode_vrefresh() does not take into account interlaced, doublescan, and
multiscan modes, leading to incorrect refresh rates.
Fix this, based on drm_mode_vrefresh() in Linux.
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
static float mode_vrefresh(drmModeModeInfo *mode)
{
static float mode_vrefresh(drmModeModeInfo *mode)
{
- return mode->clock * 1000.00
- / (mode->htotal * mode->vtotal);
+ unsigned int num, den;
+
+ num = mode->clock;
+ den = mode->htotal * mode->vtotal;
+
+ if (mode->flags & DRM_MODE_FLAG_INTERLACE)
+ num *= 2;
+ if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
+ den *= 2;
+ if (mode->vscan > 1)
+ den *= mode->vscan;
+
+ return num * 1000.00 / den;
}
#define bit_name_fn(res) \
}
#define bit_name_fn(res) \