diff --git a/src/video/cocoa/SDL_cocoaopengl.h b/src/video/cocoa/SDL_cocoaopengl.h index 5debd2331..bae8ce48a 100644 --- a/src/video/cocoa/SDL_cocoaopengl.h +++ b/src/video/cocoa/SDL_cocoaopengl.h @@ -49,6 +49,8 @@ struct SDL_GLDriverData - (void)scheduleUpdate; - (void)updateIfNeeded; - (void)setWindow:(SDL_Window *)window; +- (SDL_Window*)window; +- (void)explicitUpdate; @end diff --git a/src/video/cocoa/SDL_cocoaopengl.m b/src/video/cocoa/SDL_cocoaopengl.m index c4db2565b..257f1a5c5 100644 --- a/src/video/cocoa/SDL_cocoaopengl.m +++ b/src/video/cocoa/SDL_cocoaopengl.m @@ -63,14 +63,10 @@ /* This should only be called on the thread on which a user is using the context. */ - (void)updateIfNeeded { - int value = SDL_AtomicSet(&self->dirty, 0); + const int value = SDL_AtomicSet(&self->dirty, 0); if (value > 0) { /* We call the real underlying update here, since -[SDLOpenGLContext update] just calls us. */ - if ([NSThread isMainThread]) { - [super update]; - } else { - [super performSelectorOnMainThread:@selector(update) withObject:nil waitUntilDone:NO]; - } + [self explicitUpdate]; } } @@ -119,9 +115,13 @@ } if ([self view] != contentview) { - [self setView:contentview]; + if ([NSThread isMainThread]) { + [self setView:contentview]; + } else { + dispatch_sync(dispatch_get_main_queue(), ^{ [self setView:contentview]; }); + } if (self == [NSOpenGLContext currentContext]) { - [self update]; + [self explicitUpdate]; } else { [self scheduleUpdate]; } @@ -129,13 +129,27 @@ } else { [self clearDrawable]; if (self == [NSOpenGLContext currentContext]) { - [self update]; + [self explicitUpdate]; } else { [self scheduleUpdate]; } } } +- (SDL_Window*)window +{ + return self->window; +} + +- (void)explicitUpdate +{ + if ([NSThread isMainThread]) { + [super update]; + } else { + dispatch_sync(dispatch_get_main_queue(), ^{ [super update]; }); + } +} + @end @@ -352,8 +366,10 @@ Cocoa_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) { if (context) { SDLOpenGLContext *nscontext = (SDLOpenGLContext *)context; - [nscontext setWindow:window]; - [nscontext updateIfNeeded]; + if ([nscontext window] != window) { + [nscontext setWindow:window]; + [nscontext updateIfNeeded]; + } [nscontext makeCurrentContext]; } else { [NSOpenGLContext clearCurrentContext];