|
@@ -31,8 +31,10 @@
|
|
|
#include <OpenGL/OpenGL.h>
|
|
|
#include <OpenGL/CGLRenderers.h>
|
|
|
|
|
|
+#include "SDL_hints.h"
|
|
|
#include "SDL_loadso.h"
|
|
|
#include "SDL_opengl.h"
|
|
|
+#include "../../SDL_hints_c.h"
|
|
|
|
|
|
#define DEFAULT_OPENGL "/System/Library/Frameworks/OpenGL.framework/Libraries/libGL.dylib"
|
|
|
|
|
@@ -42,6 +44,14 @@
|
|
|
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
|
|
#endif
|
|
|
|
|
|
+static SDL_bool SDL_opengl_sync_dispatch = SDL_FALSE;
|
|
|
+
|
|
|
+static void SDLCALL
|
|
|
+SDL_OpenGLSyncDispatchChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
|
|
|
+{
|
|
|
+ SDL_opengl_sync_dispatch = SDL_GetStringBoolean(hint, SDL_FALSE);
|
|
|
+}
|
|
|
+
|
|
|
@implementation SDLOpenGLContext : NSOpenGLContext
|
|
|
|
|
|
- (id)initWithFormat:(NSOpenGLPixelFormat *)format
|
|
@@ -52,6 +62,8 @@
|
|
|
SDL_AtomicSet(&self->dirty, 0);
|
|
|
self->window = NULL;
|
|
|
}
|
|
|
+
|
|
|
+ SDL_AddHintCallback(SDL_HINT_MAC_OPENGL_SYNC_DISPATCH, SDL_OpenGLSyncDispatchChanged, NULL);
|
|
|
return self;
|
|
|
}
|
|
|
|
|
@@ -135,10 +147,19 @@
|
|
|
if ([NSThread isMainThread]) {
|
|
|
[super update];
|
|
|
} else {
|
|
|
- dispatch_async(dispatch_get_main_queue(), ^{ [super update]; });
|
|
|
+ if (SDL_opengl_sync_dispatch) {
|
|
|
+ dispatch_sync(dispatch_get_main_queue(), ^{ [super update]; });
|
|
|
+ } else {
|
|
|
+ dispatch_async(dispatch_get_main_queue(), ^{ [super update]; });
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+- (void)dealloc
|
|
|
+{
|
|
|
+ SDL_DelHintCallback(SDL_HINT_MAC_OPENGL_SYNC_DISPATCH, SDL_OpenGLSyncDispatchChanged, NULL);
|
|
|
+}
|
|
|
+
|
|
|
@end
|
|
|
|
|
|
|