Skip to content

Commit

Permalink
macOS: Add hint for blocking thread on OpenGL context update dispatch (
Browse files Browse the repository at this point in the history
  • Loading branch information
frenzibyte committed Aug 10, 2022
1 parent 7eb13c2 commit b4660e9
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 1 deletion.
12 changes: 12 additions & 0 deletions include/SDL_hints.h
Original file line number Diff line number Diff line change
Expand Up @@ -977,6 +977,18 @@ extern "C" {
*/
#define SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK "SDL_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK"

/**
* \brief A variable controlling whether dispatching OpenGL context updates should block the dispatching thread until the main thread finishes processing
*
* This variable can be set to the following values:
* "0" - Dispatching OpenGL context updates will allow the dispatching thread to continue execution.
* "1" - Dispatching OpenGL context updates will block the dispatching thread until the main thread finishes processing.
*
* This hint only applies to Mac OS X
*
*/
#define SDL_HINT_MAC_OPENGL_SYNC_DISPATCH "SDL_MAC_OPENGL_SYNC_DISPATCH"

/**
* \brief A variable setting the double click radius, in pixels.
*/
Expand Down
23 changes: 22 additions & 1 deletion src/video/cocoa/SDL_cocoaopengl.m
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand All @@ -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
Expand All @@ -52,6 +62,8 @@ - (id)initWithFormat:(NSOpenGLPixelFormat *)format
SDL_AtomicSet(&self->dirty, 0);
self->window = NULL;
}

SDL_AddHintCallback(SDL_HINT_MAC_OPENGL_SYNC_DISPATCH, SDL_OpenGLSyncDispatchChanged, NULL);
return self;
}

Expand Down Expand Up @@ -135,10 +147,19 @@ - (void)explicitUpdate
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


Expand Down

0 comments on commit b4660e9

Please sign in to comment.