[KMSDRM] Unload GL/EGL libs and destroy GBM only when we are destroying the last window.
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
diff --git a/src/video/kmsdrm/SDL_kmsdrmvideo.c b/src/video/kmsdrm/SDL_kmsdrmvideo.c
index ef3568a..703b876 100644
--- a/src/video/kmsdrm/SDL_kmsdrmvideo.c
+++ b/src/video/kmsdrm/SDL_kmsdrmvideo.c
@@ -1079,7 +1079,7 @@ KMSDRM_DestroyWindow(_THIS, SDL_Window *window)
return;
}
- if ( !is_vulkan && viddata->gbm_init ) {
+ if ( !is_vulkan && viddata->gbm_init) {
/* Destroy the window display's cursor GBM BO. */
KMSDRM_DestroyCursorBO(_this, SDL_GetDisplayForWindow(window));
@@ -1087,14 +1087,18 @@ KMSDRM_DestroyWindow(_THIS, SDL_Window *window)
/* Destroy GBM surface and buffers. */
KMSDRM_DestroySurfaces(_this, window);
- /* Unload EGL/GL library and free egl_data. */
- if (_this->egl_data) {
- SDL_EGL_UnloadLibrary(_this);
- _this->gl_config.driver_loaded = 0;
- }
+ /* Unload library and deinit GBM, but only if this is the last remaining window.*/
+ if (viddata->num_windows < 2) {
+
+ /* Unload EGL/GL library and free egl_data. */
+ if (_this->egl_data) {
+ SDL_EGL_UnloadLibrary(_this);
+ _this->gl_config.driver_loaded = 0;
+ }
- /* Free display plane, and destroy GBM device. */
- KMSDRM_GBMDeinit(_this, dispdata);
+ /* Free display plane, and destroy GBM device. */
+ KMSDRM_GBMDeinit(_this, dispdata);
+ }
} else {