From 8fb8adfc90fa5ffb059d9b38cec061f7bbcbfc49 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Sat, 13 Jul 2019 17:04:02 -0300 Subject: [PATCH] macOS: Fix SDL_GL_CreateContext/MakeCurrent on non-main threads causing a Main Thread Checker warning when built with Xcode 11 / the macOS 10.15 SDK. Fixes bug #4714. --- src/video/cocoa/SDL_cocoaopengl.m | 16 ++++++++++++++-- src/video/cocoa/SDL_cocoawindow.h | 1 + src/video/cocoa/SDL_cocoawindow.m | 5 +++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/video/cocoa/SDL_cocoaopengl.m b/src/video/cocoa/SDL_cocoaopengl.m index ea59f9946e925..987fa99b8be16 100644 --- a/src/video/cocoa/SDL_cocoaopengl.m +++ b/src/video/cocoa/SDL_cocoaopengl.m @@ -95,6 +95,18 @@ - (void)setWindow:(SDL_Window *)newWindow if (newWindow) { SDL_WindowData *windowdata = (SDL_WindowData *)newWindow->driverdata; + NSView *contentview = windowdata->sdlContentView; + + /* This should never be nil since sdlContentView is only nil if the + window was created via SDL_CreateWindowFrom, and SDL doesn't allow + OpenGL contexts to be created in that case. However, it doesn't hurt + to check. */ + if (contentview == nil) { + /* Prefer to access the cached content view above instead of this, + since as of Xcode 11 + SDK 10.15, [window contentView] causes + Apple's Main Thread Checker to output a warning. */ + contentview = [windowdata->nswindow contentView]; + } /* Now sign up for scheduled updates for the new window. */ NSMutableArray *contexts = windowdata->nscontexts; @@ -102,8 +114,8 @@ - (void)setWindow:(SDL_Window *)newWindow [contexts addObject:self]; } - if ([self view] != [windowdata->nswindow contentView]) { - [self setView:[windowdata->nswindow contentView]]; + if ([self view] != contentview) { + [self setView:contentview]; if (self == [NSOpenGLContext currentContext]) { [self update]; } else { diff --git a/src/video/cocoa/SDL_cocoawindow.h b/src/video/cocoa/SDL_cocoawindow.h index 3c4ff631106e7..9704e18545de5 100644 --- a/src/video/cocoa/SDL_cocoawindow.h +++ b/src/video/cocoa/SDL_cocoawindow.h @@ -113,6 +113,7 @@ struct SDL_WindowData { SDL_Window *window; NSWindow *nswindow; + NSView *sdlContentView; /* nil if window is created via CreateWindowFrom */ NSMutableArray *nscontexts; SDL_bool created; SDL_bool inWindowMove; diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m index 5972568d5d502..faee02cfcd630 100644 --- a/src/video/cocoa/SDL_cocoawindow.m +++ b/src/video/cocoa/SDL_cocoawindow.m @@ -1307,6 +1307,11 @@ - (BOOL)acceptsFirstMouse:(NSEvent *)theEvent data->videodata = videodata; data->nscontexts = [[NSMutableArray alloc] init]; + /* Only store this for windows created by us since the content view might + * get replaced from under us otherwise, and we only need it when the + * window is guaranteed to be created by us (OpenGL contexts). */ + data->sdlContentView = created ? [nswindow contentView] : nil; + /* Create an event listener for the window */ data->listener = [[Cocoa_WindowListener alloc] init];