From 45205cc5d743cc9cb4335b441f5edd0fb1a8f6b1 Mon Sep 17 00:00:00 2001 From: Themaister Date: Sun, 13 Jul 2014 19:23:08 +0200 Subject: [PATCH] When modechanging on X11, try to match configured refresh rate. --- gfx/context/drm_egl_ctx.c | 15 ++++----------- gfx/context/x11_common.c | 15 ++++++++++++--- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/gfx/context/drm_egl_ctx.c b/gfx/context/drm_egl_ctx.c index f48ca94647..b3ee18eebe 100644 --- a/gfx/context/drm_egl_ctx.c +++ b/gfx/context/drm_egl_ctx.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -599,19 +600,11 @@ static bool gfx_ctx_set_video_mode(void *data, if (width != g_connector->modes[i].hdisplay || height != g_connector->modes[i].vdisplay) continue; - if (!g_drm_mode) + float diff = fabsf(g_connector->modes[i].vrefresh - g_settings.video.refresh_rate); + if (!g_drm_mode || diff < minimum_fps_diff) { g_drm_mode = &g_connector->modes[i]; - minimum_fps_diff = g_drm_mode->vrefresh - g_settings.video.refresh_rate; - } - else - { - float diff = g_connector->modes[i].vrefresh - g_settings.video.refresh_rate; - if (diff < minimum_fps_diff) - { - g_drm_mode = &g_connector->modes[i]; - minimum_fps_diff = diff; - } + minimum_fps_diff = diff; } } } diff --git a/gfx/context/x11_common.c b/gfx/context/x11_common.c index e492c2320b..79be9810ca 100644 --- a/gfx/context/x11_common.c +++ b/gfx/context/x11_common.c @@ -18,6 +18,7 @@ #include #include #include +#include #include "../image/image.h" #include "../../general.h" #include "../../input/input_common.h" @@ -146,13 +147,21 @@ static bool get_video_mode(Display *dpy, unsigned width, unsigned height, XF86Vi *desktop_mode = *modes[0]; bool ret = false; + float minimum_fps_diff = 0.0f; + for (i = 0; i < num_modes; i++) { - if (modes[i]->hdisplay == width && modes[i]->vdisplay == height) + const XF86VidModeModeInfo *m = modes[i]; + if (m->hdisplay == width && m->vdisplay == height) { - *mode = *modes[i]; + float refresh = m->dotclock * 1000.0f / (m->htotal * m->vtotal); + float diff = fabsf(refresh - g_settings.video.refresh_rate); + if (!ret || diff < minimum_fps_diff) + { + *mode = *m; + minimum_fps_diff = diff; + } ret = true; - break; } }