diff --git a/src/video/cocoa/SDL_cocoaopengl.h b/src/video/cocoa/SDL_cocoaopengl.h index 43fdf8f131..20c5eadd58 100644 --- a/src/video/cocoa/SDL_cocoaopengl.h +++ b/src/video/cocoa/SDL_cocoaopengl.h @@ -62,7 +62,7 @@ struct SDL_GLDriverData - (void)setWindow:(SDL_Window *)window; - (SDL_Window *)window; - (void)explicitUpdate; -- (void)dealloc; +- (void)cleanup; @property(retain, nonatomic) NSOpenGLPixelFormat *openglPixelFormat; // macOS 10.10 has -[NSOpenGLContext pixelFormat] but this handles older OS releases. diff --git a/src/video/cocoa/SDL_cocoaopengl.m b/src/video/cocoa/SDL_cocoaopengl.m index 9ce6e50d9c..553cfaf623 100644 --- a/src/video/cocoa/SDL_cocoaopengl.m +++ b/src/video/cocoa/SDL_cocoaopengl.m @@ -174,11 +174,10 @@ static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeSt } } } else { - [self clearDrawable]; - if (self == [NSOpenGLContext currentContext]) { - [self explicitUpdate]; + if ([NSThread isMainThread]) { + [self setView:nil]; } 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); if (self->displayLink) { CVDisplayLinkRelease(self->displayLink); + self->displayLink = nil; } if (self->swapIntervalCond) { SDL_DestroyCond(self->swapIntervalCond); + self->swapIntervalCond = NULL; } if (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) { @autoreleasepool { - SDLOpenGLContext *nscontext = (SDLOpenGLContext *)CFBridgingRelease(context); - [nscontext setWindow:NULL]; + SDLOpenGLContext *nscontext = (__bridge SDLOpenGLContext *)context; + [nscontext cleanup]; + CFRelease(context); } return 0; }