kmsdrm: fix segfault on quit beacuse of freed _this->egl_data.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
diff --git a/src/video/kmsdrm/SDL_kmsdrmopengles.h b/src/video/kmsdrm/SDL_kmsdrmopengles.h
index cd8ec49..b92b24c 100644
--- a/src/video/kmsdrm/SDL_kmsdrmopengles.h
+++ b/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
diff --git a/src/video/kmsdrm/SDL_kmsdrmvideo.c b/src/video/kmsdrm/SDL_kmsdrmvideo.c
index 00b954a..9bfa6dc 100644
--- a/src/video/kmsdrm/SDL_kmsdrmvideo.c
+++ b/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) {