Browse Source

cocoa: Make sure GL context destruction happens on the main thread.

Fixes #10900.

(cherry picked from commit 344546b4ea79a070e8b6bcccab542551ab5bdf55)
Ryan C. Gordon 5 months ago
parent
commit
5cb87ff99f
1 changed files with 25 additions and 5 deletions
  1. 25 5
      src/video/cocoa/SDL_cocoaopengl.m

+ 25 - 5
src/video/cocoa/SDL_cocoaopengl.m

@@ -507,13 +507,33 @@ int Cocoa_GL_SwapWindow(_THIS, SDL_Window * window)
     return 0;
 }}
 
+static void DispatchedDeleteContext(SDL_GLContext context)
+{
+    @autoreleasepool {
+        SDLOpenGLContext *nscontext = (__bridge SDLOpenGLContext *)context;
+        [nscontext cleanup];
+        CFRelease(context);
+    }
+}
+
 void Cocoa_GL_DeleteContext(_THIS, SDL_GLContext context)
-{ @autoreleasepool
 {
-    SDLOpenGLContext *nscontext = (__bridge SDLOpenGLContext *)context;
-    [nscontext cleanup];
-    CFRelease(context);
-}}
+    if ([NSThread isMainThread]) {
+        DispatchedDeleteContext(context);
+    } else {
+        if (SDL_opengl_async_dispatch) {
+            dispatch_async(dispatch_get_main_queue(), ^{
+              DispatchedDeleteContext(context);
+            });
+        } else {
+            dispatch_sync(dispatch_get_main_queue(), ^{
+              DispatchedDeleteContext(context);
+            });
+        }
+    }
+
+    return true;
+}
 
 /* We still support OpenGL as long as Apple offers it, deprecated or not, so disable deprecation warnings about it. */
 #ifdef __clang__