From ea5237e549257c47b0edeb445bd63e089f278c0b Mon Sep 17 00:00:00 2001 From: Geert Uytterhoeven Date: Thu, 30 Jun 2022 14:41:48 +0200 Subject: [PATCH] modetest: fix mode_vrefresh() for interlace/dblscan/vscan 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 --- tests/modetest/modetest.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/tests/modetest/modetest.c b/tests/modetest/modetest.c index e714818e..4e00bed9 100644 --- a/tests/modetest/modetest.c +++ b/tests/modetest/modetest.c @@ -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) \