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

Manuel Alfayate Corchete 2020-08-25 05:53:13 +02:00
parent d43e666eed
commit 0d16761cbe
2 changed files with 14 additions and 2 deletions

View File

@ -31,7 +31,7 @@
/* OpenGLES functions */ /* OpenGLES functions */
#define KMSDRM_GLES_GetAttribute SDL_EGL_GetAttribute #define KMSDRM_GLES_GetAttribute SDL_EGL_GetAttribute
#define KMSDRM_GLES_GetProcAddress SDL_EGL_GetProcAddress #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_DeleteContext SDL_EGL_DeleteContext
#define KMSDRM_GLES_GetSwapInterval SDL_EGL_GetSwapInterval #define KMSDRM_GLES_GetSwapInterval SDL_EGL_GetSwapInterval

View File

@ -652,7 +652,7 @@ KMSDRM_CreateDevice(int devindex)
#if SDL_VIDEO_OPENGL_EGL #if SDL_VIDEO_OPENGL_EGL
device->GL_LoadLibrary = KMSDRM_GLES_LoadLibrary; device->GL_LoadLibrary = KMSDRM_GLES_LoadLibrary;
device->GL_GetProcAddress = KMSDRM_GLES_GetProcAddress; 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_CreateContext = KMSDRM_GLES_CreateContext;
device->GL_MakeCurrent = KMSDRM_GLES_MakeCurrent; device->GL_MakeCurrent = KMSDRM_GLES_MakeCurrent;
device->GL_SetSwapInterval = KMSDRM_GLES_SetSwapInterval; device->GL_SetSwapInterval = KMSDRM_GLES_SetSwapInterval;
@ -1211,6 +1211,18 @@ KMSDRM_VideoQuit(_THIS)
SDL_GL_UnloadLibrary(); 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 */ /* Free connector */
if (dispdata && dispdata->connector) { if (dispdata && dispdata->connector) {
if (dispdata->connector->connector) { if (dispdata->connector->connector) {