From d9cb0782997c7b11eda542627ab29640afb0f904 Mon Sep 17 00:00:00 2001 From: maiphi <39464783+maiphi@users.noreply.github.com> Date: Sun, 31 Aug 2025 11:34:05 +0200 Subject: [PATCH] FindNearestConnectorMode: prefer mode with smallest number of unused pixels (#5158) Co-authored-by: Philipp Maierhoefer --- src/platforms/rcore_drm.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/platforms/rcore_drm.c b/src/platforms/rcore_drm.c index 2354bb3d2..a2151ea38 100644 --- a/src/platforms/rcore_drm.c +++ b/src/platforms/rcore_drm.c @@ -53,6 +53,7 @@ #include // POSIX terminal control definitions - tcgetattr(), tcsetattr() #include // POSIX threads management (inputs reading) #include // POSIX directory browsing +#include // INT_MAX #include // Required for: ioctl() - UNIX System call for device-specific input/output operations #include // Linux: KDSKBMODE, K_MEDIUMRAM constants definition @@ -2150,6 +2151,8 @@ static int FindNearestConnectorMode(const drmModeConnector *connector, uint widt if (NULL == connector) return -1; int nearestIndex = -1; + int minUnusedPixels = INT_MAX; + int minFpsDiff = INT_MAX; for (int i = 0; i < platform.connector->count_modes; i++) { const drmModeModeInfo *const mode = &platform.connector->modes[i]; @@ -2169,21 +2172,17 @@ static int FindNearestConnectorMode(const drmModeConnector *connector, uint widt continue; } - if (nearestIndex < 0) + const int unusedPixels = (mode->hdisplay - width) * (mode->vdisplay - height); + const int fpsDiff = mode->vrefresh - fps; + + if ((unusedPixels < minUnusedPixels) || + ((unusedPixels == minUnusedPixels) && (abs(fpsDiff) < abs(minFpsDiff))) || + ((unusedPixels == minUnusedPixels) && (abs(fpsDiff) == abs(minFpsDiff)) && (fpsDiff > 0))) { nearestIndex = i; - continue; + minUnusedPixels = unusedPixels; + minFpsDiff = fpsDiff; } - - const int widthDiff = abs(mode->hdisplay - width); - const int heightDiff = abs(mode->vdisplay - height); - const int fpsDiff = abs(mode->vrefresh - fps); - - const int nearestWidthDiff = abs(platform.connector->modes[nearestIndex].hdisplay - width); - const int nearestHeightDiff = abs(platform.connector->modes[nearestIndex].vdisplay - height); - const int nearestFpsDiff = abs(platform.connector->modes[nearestIndex].vrefresh - fps); - - if ((widthDiff < nearestWidthDiff) || (heightDiff < nearestHeightDiff) || (fpsDiff < nearestFpsDiff)) nearestIndex = i; } return nearestIndex;