Browse Source

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

Fixes #10900.

(cherry picked from commit 5cb87ff99f01d930f618dabda75c39c1bc57e537)
Ryan C. Gordon 5 months ago
parent
commit
dcdb763de8
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__