Explorar el Código

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 hace 2 años
padre
commit
61309b4382
Se han modificado 2 ficheros con 13 adiciones y 8 borrados
  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

@@ -62,7 +62,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

@@ -174,11 +174,10 @@ static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeSt
             }
             }
         }
         }
     } 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]; });
         }
         }
     }
     }
 }
 }
@@ -205,17 +204,22 @@ static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeSt
     }
     }
 }
 }
 
 
-- (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;
     }
     }
 }
 }
 
 
@@ -518,8 +522,9 @@ int Cocoa_GL_SwapWindow(_THIS, SDL_Window *window)
 int Cocoa_GL_DeleteContext(_THIS, SDL_GLContext context)
 int 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);
     }
     }
     return 0;
     return 0;
 }
 }