Преглед на файлове

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

Manuel Alfayate Corchete преди 5 години
родител
ревизия
cce6c60518
променени са 2 файла, в които са добавени 19 реда и са изтрити 3 реда
  1. 14 3
      src/video/kmsdrm/SDL_kmsdrmvideo.c
  2. 5 0
      src/video/kmsdrm/SDL_kmsdrmvideo.h

+ 14 - 3
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)

+ 5 - 0
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 */