From cce6c6051815dbbbd8968dcdd3c87c3f0e7cb98a Mon Sep 17 00:00:00 2001 From: Manuel Alfayate Corchete Date: Mon, 7 Sep 2020 01:33:04 +0200 Subject: [PATCH] kmsdrm: fix errors when trying to free up videomode driverdata pointers on quit. --- src/video/kmsdrm/SDL_kmsdrmvideo.c | 17 ++++++++++++++--- src/video/kmsdrm/SDL_kmsdrmvideo.h | 5 +++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/video/kmsdrm/SDL_kmsdrmvideo.c b/src/video/kmsdrm/SDL_kmsdrmvideo.c index e845f0315..49b577fb6 100644 --- a/src/video/kmsdrm/SDL_kmsdrmvideo.c +++ b/src/video/kmsdrm/SDL_kmsdrmvideo.c @@ -1338,12 +1338,13 @@ KMSDRM_GetDisplayModes(_THIS, SDL_VideoDisplay * display) } #endif +#if 1 /* We are NOT really changing the physical display mode, but using the PRIMARY PLANE and CRTC to scale as we please. But we need that SDL has knowledge of the video modes we are going to use for fullscreen window sizes, even if we are faking their use. If not, SDL only considers the in-use video mode as available, and sets every window to that size -before we get to CreateWindow or ReconfigureWindow. */ +before we get to CreateWindow or ReconfigureWindow. */ void KMSDRM_GetDisplayModes(_THIS, SDL_VideoDisplay * display) { @@ -1352,14 +1353,24 @@ KMSDRM_GetDisplayModes(_THIS, SDL_VideoDisplay * display) SDL_DisplayMode mode; for (int i = 0; i < conn->count_modes; i++) { + SDL_DisplayModeData *modedata = SDL_calloc(1, sizeof(SDL_DisplayModeData)); + + if (modedata) { + modedata->mode_index = i; + } + mode.w = conn->modes[i].hdisplay; mode.h = conn->modes[i].vdisplay; mode.refresh_rate = conn->modes[i].vrefresh; mode.format = SDL_PIXELFORMAT_ARGB8888; + mode.driverdata = modedata; - SDL_AddDisplayMode(display, &mode); - } + if (!SDL_AddDisplayMode(display, &mode)) { + SDL_free(modedata); + } + } } +#endif int KMSDRM_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode) diff --git a/src/video/kmsdrm/SDL_kmsdrmvideo.h b/src/video/kmsdrm/SDL_kmsdrmvideo.h index 16bee133f..ab4ea1e0f 100644 --- a/src/video/kmsdrm/SDL_kmsdrmvideo.h +++ b/src/video/kmsdrm/SDL_kmsdrmvideo.h @@ -132,6 +132,11 @@ typedef struct SDL_WindowData } SDL_WindowData; +typedef struct SDL_DisplayModeData +{ + int mode_index; +} SDL_DisplayModeData; + typedef struct KMSDRM_FBInfo { int drm_fd; /* DRM file desc */