diff --git a/package/sdl2/0001-If-a-CRTC-doesn-t-have-a-mode-configured-use-the-pre.patch b/package/sdl2/0001-If-a-CRTC-doesn-t-have-a-mode-configured-use-the-pre.patch new file mode 100644 index 0000000000..c8be280c56 --- /dev/null +++ b/package/sdl2/0001-If-a-CRTC-doesn-t-have-a-mode-configured-use-the-pre.patch @@ -0,0 +1,76 @@ +From da9ba3a2a1536017e4ce1ee0f4276578d1ce6e29 Mon Sep 17 00:00:00 2001 +From: Sam Lantinga +Date: Fri, 18 Nov 2022 12:17:27 -0800 +Subject: [PATCH] If a CRTC doesn't have a mode configured, use the preferred + or largest mode as the default mode + +Fixes https://github.com/libsdl-org/SDL/issues/6421 + +[mf@go-sys.de: backport from upstream] +Signed-off-by: Michael Fischer +[yann.morin.1998@free.fr: do an actual backport] +Signed-off-by: Yann E. MORIN +--- + src/video/kmsdrm/SDL_kmsdrmvideo.c | 35 +++++++++++++++++++++++++----- + 1 file changed, 29 insertions(+), 6 deletions(-) + +diff --git a/src/video/kmsdrm/SDL_kmsdrmvideo.c b/src/video/kmsdrm/SDL_kmsdrmvideo.c +index eae721455..eeeefef2b 100644 +--- a/src/video/kmsdrm/SDL_kmsdrmvideo.c ++++ b/src/video/kmsdrm/SDL_kmsdrmvideo.c +@@ -666,8 +666,8 @@ KMSDRM_CrtcGetVrr(uint32_t drm_fd, uint32_t crtc_id) + /* Gets a DRM connector, builds an SDL_Display with it, and adds it to the + list of SDL Displays in _this->displays[] */ + static void +-KMSDRM_AddDisplay (_THIS, drmModeConnector *connector, drmModeRes *resources) { +- ++KMSDRM_AddDisplay (_THIS, drmModeConnector *connector, drmModeRes *resources) ++{ + SDL_VideoData *viddata = ((SDL_VideoData *)_this->driverdata); + SDL_DisplayData *dispdata = NULL; + SDL_VideoDisplay display = {0}; +@@ -770,14 +770,37 @@ KMSDRM_AddDisplay (_THIS, drmModeConnector *connector, drmModeRes *resources) { + drmModeModeInfo *mode = &connector->modes[i]; + + if (!SDL_memcmp(mode, &crtc->mode, sizeof(crtc->mode))) { +- mode_index = i; +- break; ++ mode_index = i; ++ break; + } + } + + if (mode_index == -1) { +- ret = SDL_SetError("Failed to find index of mode attached to the CRTC."); +- goto cleanup; ++ int current_area, largest_area = 0; ++ ++ /* Find the preferred mode or the highest resolution mode */ ++ for (i = 0; i < connector->count_modes; i++) { ++ drmModeModeInfo *mode = &connector->modes[i]; ++ ++ if (mode->type & DRM_MODE_TYPE_PREFERRED) { ++ mode_index = i; ++ break; ++ } ++ ++ current_area = mode->hdisplay * mode->vdisplay; ++ if (current_area > largest_area) { ++ mode_index = i; ++ largest_area = current_area; ++ } ++ } ++ if (mode_index != -1) { ++ crtc->mode = connector->modes[mode_index]; ++ } ++ } ++ ++ if (mode_index == -1) { ++ ret = SDL_SetError("Failed to find index of mode attached to the CRTC."); ++ goto cleanup; + } + + /*********************************************/ +-- +2.25.1 +