modetest: fix mode_vrefresh() for interlace/dblscan/vscan
authorGeert Uytterhoeven <geert@linux-m68k.org>
Thu, 30 Jun 2022 12:41:48 +0000 (14:41 +0200)
committerGeert Uytterhoeven <geert@linux-m68k.org>
Fri, 8 Sep 2023 18:01:43 +0000 (18:01 +0000)
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>
tests/modetest/modetest.c

index e714818..4e00bed 100644 (file)
@@ -138,8 +138,19 @@ static inline int64_t U642I64(uint64_t val)
 
 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)                                       \