kmsdrm: fix errors when trying to free up videomode driverdata pointers on quit.

This commit is contained in:
Manuel Alfayate Corchete 2020-09-07 01:33:04 +02:00
parent 9501b1c698
commit cce6c60518
2 changed files with 19 additions and 3 deletions

View File

@ -1338,12 +1338,13 @@ KMSDRM_GetDisplayModes(_THIS, SDL_VideoDisplay * display)
} }
#endif #endif
#if 1
/* We are NOT really changing the physical display mode, but using /* 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 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 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 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 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 void
KMSDRM_GetDisplayModes(_THIS, SDL_VideoDisplay * display) KMSDRM_GetDisplayModes(_THIS, SDL_VideoDisplay * display)
{ {
@ -1352,14 +1353,24 @@ KMSDRM_GetDisplayModes(_THIS, SDL_VideoDisplay * display)
SDL_DisplayMode mode; SDL_DisplayMode mode;
for (int i = 0; i < conn->count_modes; i++) { 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.w = conn->modes[i].hdisplay;
mode.h = conn->modes[i].vdisplay; mode.h = conn->modes[i].vdisplay;
mode.refresh_rate = conn->modes[i].vrefresh; mode.refresh_rate = conn->modes[i].vrefresh;
mode.format = SDL_PIXELFORMAT_ARGB8888; mode.format = SDL_PIXELFORMAT_ARGB8888;
mode.driverdata = modedata;
SDL_AddDisplayMode(display, &mode); if (!SDL_AddDisplayMode(display, &mode)) {
} SDL_free(modedata);
}
}
} }
#endif
int int
KMSDRM_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode) KMSDRM_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode)

View File

@ -132,6 +132,11 @@ typedef struct SDL_WindowData
} SDL_WindowData; } SDL_WindowData;
typedef struct SDL_DisplayModeData
{
int mode_index;
} SDL_DisplayModeData;
typedef struct KMSDRM_FBInfo typedef struct KMSDRM_FBInfo
{ {
int drm_fd; /* DRM file desc */ int drm_fd; /* DRM file desc */