From 95f7e242e67081a11a781617be7d3e767acd0cd0 Mon Sep 17 00:00:00 2001 From: "J?rgen P. Tjern?" Date: Tue, 25 Feb 2014 15:28:12 -0800 Subject: [PATCH] Mac: Immediately update current OpenGL context's shape. Previously we were postponing our -[NSOpenGLContext update] call to the next SDL_GL_SwapWindow, even if the context was current on the current thread. This changes it so that we will do the update immediately if it's the current context. If you're rendering on another thread, you need to call SDL_GL_SwapWindow once after a resize event to ensure your drawable will produce non-garbage data. Bug: https://bugzilla.libsdl.org/show_bug.cgi?id=2339 --- src/video/cocoa/SDL_cocoaopengl.m | 12 ++++++++++-- src/video/cocoa/SDL_cocoawindow.m | 7 ++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/video/cocoa/SDL_cocoaopengl.m b/src/video/cocoa/SDL_cocoaopengl.m index 803b4ecd2f5e4..5c44e31e0fd9c 100644 --- a/src/video/cocoa/SDL_cocoaopengl.m +++ b/src/video/cocoa/SDL_cocoaopengl.m @@ -110,11 +110,19 @@ - (void)setWindow:(SDL_Window *)newWindow if ([self view] != [windowdata->nswindow contentView]) { [self setView:[windowdata->nswindow contentView]]; - [self scheduleUpdate]; + if (self == [NSOpenGLContext currentContext]) { + [self update]; + } else { + [self scheduleUpdate]; + } } } else { [self clearDrawable]; - [self scheduleUpdate]; + if (self == [NSOpenGLContext currentContext]) { + [self update]; + } else { + [self scheduleUpdate]; + } } } diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m index 03ece7b9e3ac5..a773cb684f9fc 100644 --- a/src/video/cocoa/SDL_cocoawindow.m +++ b/src/video/cocoa/SDL_cocoawindow.m @@ -49,10 +49,15 @@ static void ConvertNSRect(NSRect *r) static void ScheduleContextUpdates(SDL_WindowData *data) { + NSOpenGLContext *currentContext = [NSOpenGLContext currentContext]; NSMutableArray *contexts = data->nscontexts; @synchronized (contexts) { for (SDLOpenGLContext *context in contexts) { - [context scheduleUpdate]; + if (context == currentContext) { + [context update]; + } else { + [context scheduleUpdate]; + } } } }