Browse Source

Disassociate the SDLOpenGLContext from the view before deleting it

If we don't do this, the view will be blanked even if another context is current and rendering from that context won't be visible.

Fixes https://github.com/libsdl-org/SDL/issues/4986
Sam Lantinga 2 years ago
parent
commit
f5c0760c6b
2 changed files with 13 additions and 8 deletions
  1. 1 1
      src/video/cocoa/SDL_cocoaopengl.h
  2. 12 7
      src/video/cocoa/SDL_cocoaopengl.m

+ 1 - 1
src/video/cocoa/SDL_cocoaopengl.h

@@ -58,7 +58,7 @@ struct SDL_GLDriverData
 - (void)setWindow:(SDL_Window *)window;
 - (void)setWindow:(SDL_Window *)window;
 - (SDL_Window*)window;
 - (SDL_Window*)window;
 - (void)explicitUpdate;
 - (void)explicitUpdate;
-- (void)dealloc;
+- (void)cleanup;
 
 
 @property (retain, nonatomic) NSOpenGLPixelFormat* openglPixelFormat;  // macOS 10.10 has -[NSOpenGLContext pixelFormat] but this handles older OS releases.
 @property (retain, nonatomic) NSOpenGLPixelFormat* openglPixelFormat;  // macOS 10.10 has -[NSOpenGLContext pixelFormat] but this handles older OS releases.
 
 

+ 12 - 7
src/video/cocoa/SDL_cocoaopengl.m

@@ -176,11 +176,10 @@ DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp* now, const
             }
             }
         }
         }
     } else {
     } else {
-        [self clearDrawable];
-        if (self == [NSOpenGLContext currentContext]) {
-            [self explicitUpdate];
+        if ([NSThread isMainThread]) {
+            [self setView:nil];
         } else {
         } else {
-            [self scheduleUpdate];
+            dispatch_sync(dispatch_get_main_queue(), ^{ [self setView:nil]; });
         }
         }
     }
     }
 }
 }
@@ -203,17 +202,22 @@ DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp* now, const
     }
     }
 }
 }
 
 
-- (void)dealloc
+- (void)cleanup
 {
 {
+    [self setWindow:NULL];
+
     SDL_DelHintCallback(SDL_HINT_MAC_OPENGL_ASYNC_DISPATCH, SDL_OpenGLAsyncDispatchChanged, NULL);
     SDL_DelHintCallback(SDL_HINT_MAC_OPENGL_ASYNC_DISPATCH, SDL_OpenGLAsyncDispatchChanged, NULL);
     if (self->displayLink) {
     if (self->displayLink) {
         CVDisplayLinkRelease(self->displayLink);
         CVDisplayLinkRelease(self->displayLink);
+        self->displayLink = nil;
     }
     }
     if (self->swapIntervalCond) {
     if (self->swapIntervalCond) {
         SDL_DestroyCond(self->swapIntervalCond);
         SDL_DestroyCond(self->swapIntervalCond);
+        self->swapIntervalCond = NULL;
     }
     }
     if (self->swapIntervalMutex) {
     if (self->swapIntervalMutex) {
         SDL_DestroyMutex(self->swapIntervalMutex);
         SDL_DestroyMutex(self->swapIntervalMutex);
+        self->swapIntervalMutex = NULL;
     }
     }
 }
 }
 
 
@@ -516,8 +520,9 @@ void
 Cocoa_GL_DeleteContext(_THIS, SDL_GLContext context)
 Cocoa_GL_DeleteContext(_THIS, SDL_GLContext context)
 { @autoreleasepool
 { @autoreleasepool
 {
 {
-    SDLOpenGLContext *nscontext = (SDLOpenGLContext *)CFBridgingRelease(context);
-    [nscontext setWindow:NULL];
+    SDLOpenGLContext *nscontext = (__bridge SDLOpenGLContext *)context;
+    [nscontext cleanup];
+    CFRelease(context);
 }}
 }}
 
 
 /* We still support OpenGL as long as Apple offers it, deprecated or not, so disable deprecation warnings about it. */
 /* We still support OpenGL as long as Apple offers it, deprecated or not, so disable deprecation warnings about it. */