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 <geert@linux-m68k.org>
main
Geert Uytterhoeven 2022-06-30 14:41:48 +02:00
parent 022a4d8a82
commit ea5237e549
1 changed files with 13 additions and 2 deletions

View 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) \