Kaynağa Gözat

kmsdrm: fix segfault on quit beacuse of freed _this->egl_data.

Manuel Alfayate Corchete 4 yıl önce
ebeveyn
işleme
0d16761cbe

+ 1 - 1
src/video/kmsdrm/SDL_kmsdrmopengles.h

@@ -31,7 +31,7 @@
 /* OpenGLES functions */
 #define KMSDRM_GLES_GetAttribute SDL_EGL_GetAttribute
 #define KMSDRM_GLES_GetProcAddress SDL_EGL_GetProcAddress
-#define KMSDRM_GLES_UnloadLibrary SDL_EGL_UnloadLibrary
+//#define KMSDRM_GLES_UnloadLibrary SDL_EGL_UnloadLibrary
 #define KMSDRM_GLES_DeleteContext SDL_EGL_DeleteContext
 #define KMSDRM_GLES_GetSwapInterval SDL_EGL_GetSwapInterval
 

+ 13 - 1
src/video/kmsdrm/SDL_kmsdrmvideo.c

@@ -652,7 +652,7 @@ KMSDRM_CreateDevice(int devindex)
 #if SDL_VIDEO_OPENGL_EGL
     device->GL_LoadLibrary = KMSDRM_GLES_LoadLibrary;
     device->GL_GetProcAddress = KMSDRM_GLES_GetProcAddress;
-    device->GL_UnloadLibrary = KMSDRM_GLES_UnloadLibrary;
+    //device->GL_UnloadLibrary = KMSDRM_GLES_UnloadLibrary;
     device->GL_CreateContext = KMSDRM_GLES_CreateContext;
     device->GL_MakeCurrent = KMSDRM_GLES_MakeCurrent;
     device->GL_SetSwapInterval = KMSDRM_GLES_SetSwapInterval;
@@ -1211,6 +1211,18 @@ KMSDRM_VideoQuit(_THIS)
         SDL_GL_UnloadLibrary();
     }
 
+    /* Since drm_atomic_commit() uses EGL functions internally, we need "_this->egl_data"
+       NOT to be freed by SDL internals before. 
+       SDL internals call device->GL_UnloadLibrary automatically earlier, so we DON'T assign
+       device->GL_UnloadLibrary to SDL_EGL_UnloadLibrary(), and that way WE DECIDE WHERE
+       we want to free "_this->egl_data" by manually calling SDL_EGL_UnloadLibrary(),
+       which happens to be here.
+    */
+
+#if SDL_VIDEO_OPENGL_EGL
+    SDL_EGL_UnloadLibrary(_this);
+#endif
+
     /* Free connector */
     if (dispdata && dispdata->connector) {
         if (dispdata->connector->connector) {