Browse Source

Clean up renderers at shutdown

Fixes https://github.com/libsdl-org/SDL/issues/10082
Sam Lantinga 10 months ago
parent
commit
ab3c8552c2
3 changed files with 34 additions and 0 deletions
  1. 2 0
      src/SDL.c
  2. 27 0
      src/render/SDL_render.c
  3. 5 0
      src/render/SDL_sysrender.h

+ 2 - 0
src/SDL.c

@@ -47,6 +47,7 @@
 #include "haptic/SDL_haptic_c.h"
 #include "joystick/SDL_gamepad_c.h"
 #include "joystick/SDL_joystick_c.h"
+#include "render/SDL_sysrender.h"
 #include "sensor/SDL_sensor_c.h"
 #include "stdlib/SDL_getenv_c.h"
 #include "video/SDL_video_c.h"
@@ -474,6 +475,7 @@ void SDL_QuitSubSystem(Uint32 flags)
 #ifndef SDL_VIDEO_DISABLED
     if (flags & SDL_INIT_VIDEO) {
         if (SDL_ShouldQuitSubsystem(SDL_INIT_VIDEO)) {
+            SDL_QuitRender();
             SDL_VideoQuit();
             /* video implies events */
             SDL_QuitSubSystem(SDL_INIT_EVENTS);

+ 27 - 0
src/render/SDL_render.c

@@ -133,6 +133,14 @@ static const SDL_RenderDriver *render_drivers[] = {
 };
 #endif /* !SDL_RENDER_DISABLED */
 
+static SDL_Renderer *SDL_renderers;
+
+void SDL_QuitRender(void)
+{
+    while (SDL_renderers) {
+        SDL_DestroyRenderer(SDL_renderers);
+    }
+}
 
 int SDL_AddSupportedTextureFormat(SDL_Renderer *renderer, SDL_PixelFormatEnum format)
 {
@@ -1105,6 +1113,9 @@ SDL_Renderer *SDL_CreateRendererWithProperties(SDL_PropertiesID props)
     SDL_LogInfo(SDL_LOG_CATEGORY_RENDER,
                 "Created renderer: %s", renderer->name);
 
+    renderer->next = SDL_renderers;
+    SDL_renderers = renderer;
+
 #ifdef SDL_PLATFORM_ANDROID
     Android_ActivityMutex_Unlock();
 #endif
@@ -4619,6 +4630,22 @@ void SDL_DestroyRenderer(SDL_Renderer *renderer)
     if (!renderer->destroyed) {
         SDL_DestroyRendererWithoutFreeing(renderer);
     }
+
+    SDL_Renderer *curr = SDL_renderers;
+    SDL_Renderer *prev = NULL;
+    while (curr) {
+        if (curr == renderer) {
+            if (prev) {
+                prev->next = renderer->next;
+            } else {
+                SDL_renderers = renderer->next;
+            }
+            break;
+        }
+        prev = curr;
+        curr = curr->next;
+    }
+
     SDL_SetObjectValid(renderer, SDL_OBJECT_TYPE_RENDERER, SDL_FALSE);  // It's no longer magical...
 
     SDL_free(renderer->texture_formats);

+ 5 - 0
src/render/SDL_sysrender.h

@@ -291,6 +291,8 @@ struct SDL_Renderer
     SDL_bool destroyed;   // already destroyed by SDL_DestroyWindow; just free this struct in SDL_DestroyRenderer.
 
     void *driverdata;
+
+    SDL_Renderer *next;
 };
 
 /* Define the SDL render driver structure */
@@ -314,6 +316,9 @@ extern SDL_RenderDriver PSP_RenderDriver;
 extern SDL_RenderDriver SW_RenderDriver;
 extern SDL_RenderDriver VITA_GXM_RenderDriver;
 
+/* Clean up any renderers at shutdown */
+extern void SDL_QuitRender(void);
+
 /* Add a supported texture format to a renderer */
 extern int SDL_AddSupportedTextureFormat(SDL_Renderer *renderer, SDL_PixelFormatEnum format);