diff options
author | Sven Gothel <[email protected]> | 2020-02-24 05:07:15 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2020-02-24 05:07:15 +0100 |
commit | d1a4d790c89934616fa1883312b4064bda9fa420 (patch) | |
tree | 5d2bd10fb4d8a35afceaac057aef90531c241857 /src/jogl/native/macosx/MacOSXWindowSystemInterface.m | |
parent | 78b96b89a68ff35969aea83de294cd3cc1178f26 (diff) |
Bug 1398: MacOS: Perform [NSOpenGLContext setView:] on main-thread async w/o blocking
Set NSOpenGLContext's NSView via [NSOpenGLContext setView:]
on the main-thread as enforced since XCode 11 using SDL macosx10.15, using Runnable SetNSViewCmd.
This operation must be performed async w/o blocking to allow
other tasks locking the NativeSurface on main-thread to complete.
Further, since [NSOpenGLContext setView:] acquired the CGLContext lock,
it can't be locked until this task has been completed.
Worst case scenario for a late [NSOpenGLContext setView:] issuance
might be corrupt initial frame(s) displayed.
Since all concurrent locking is performed within JOGL,
the unlocked CGLContext window risk is only academic.
However, if native 3rd party toolkits take share control,
we might have a situation.
+++
SetNSViewCmd is issued @ makeCurrent() now as opposed to createContext(..)
and associateDrawable(true). The latter was actually late as well,
as it also happened after makeCurrent when updating the drawable
association. It also missed setting a null NSView when detached!
release() will also set a null NSView if called after associateDrawable(false).
SetNSViewCmd will only be issued if the NSView has been changed,
i.e. first makeCurrent() or changing the drawable.
If issued, makeCurrent() will not lock the underlying CGLContext
and hence allow SetNSViewCmd to perform - see above.
+++
NSViewDescriptor class structure replaces the less convenient method 'getNSViewHandle(..)',
exposing all collected drawable characteristics as fields.
NSViewDescriptor also respects a ProxySurface's OPT_UPSTREAM_SURFACELESS mode,
which results in not using any underlying NSView - similar to OPT_UPSTREAM_WINDOW_INVISIBLE.
This change ensures that all surfaceless GL operations will not use any NSView.
Diffstat (limited to 'src/jogl/native/macosx/MacOSXWindowSystemInterface.m')
-rw-r--r-- | src/jogl/native/macosx/MacOSXWindowSystemInterface.m | 53 |
1 files changed, 23 insertions, 30 deletions
diff --git a/src/jogl/native/macosx/MacOSXWindowSystemInterface.m b/src/jogl/native/macosx/MacOSXWindowSystemInterface.m index 462b5393d..16b85974e 100644 --- a/src/jogl/native/macosx/MacOSXWindowSystemInterface.m +++ b/src/jogl/native/macosx/MacOSXWindowSystemInterface.m @@ -524,42 +524,20 @@ static Bool lockViewIfReady(NSView *view) { } NSOpenGLContext* createContext(NSOpenGLContext* share, - NSView* view, - Bool incompleteView, NSOpenGLPixelFormat* fmt, - Bool opaque, - int* viewNotReady) + Bool opaque) { NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; getRendererInfo(); - DBG_PRINT("createContext.0: share %p, view %p, incompleteView %d, pixfmt %p, opaque %d\n", - share, view, (int)incompleteView, fmt, opaque); - - Bool viewReadyAndLocked = incompleteView ? false : lockViewIfReady(view); - - if (nil != viewNotReady) { - *viewNotReady = 1; - } - - if (nil != view && !incompleteView && !viewReadyAndLocked) { - DBG_PRINT("createContext.X: Assumed complete view not ready yet\n"); - [pool release]; - return NULL; - } + DBG_PRINT("createContext.0: share %p, pixfmt %p, opaque %d\n", share, fmt, opaque); NSOpenGLContext* ctx = [[NSOpenGLContext alloc] initWithFormat:fmt shareContext:share]; - if ( nil != ctx && nil != view ) { - if(!opaque) { - GLint zeroOpacity = 0; - [ctx setValues:&zeroOpacity forParameter:NSOpenGLCPSurfaceOpacity]; - } - [ctx setView:view]; // Bug 1087: Set default framebuffer, hence enforce NSView realization - if( viewReadyAndLocked ) { - [view unlockFocus]; - } + if ( nil != ctx && !opaque ) { + GLint zeroOpacity = 0; + [ctx setValues:&zeroOpacity forParameter:NSOpenGLCPSurfaceOpacity]; } DBG_PRINT("createContext.X: ctx: %p\n", ctx); @@ -567,19 +545,34 @@ NSOpenGLContext* createContext(NSOpenGLContext* share, return ctx; } +// #define NSOPENGLCONTEXT_LOCK_NSVIEW 1 + void setContextView(NSOpenGLContext* ctx, NSView* view) { NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + BOOL isMainThread = [NSThread isMainThread]; + DBG_PRINT("setContextView.0: ctx %p, view %p, isMainThread %d\n", ctx, view, isMainThread); +#ifdef NSOPENGLCONTEXT_LOCK_NSVIEW if ( nil != ctx ) { if ( nil != view ) { Bool viewReadyAndLocked = lockViewIfReady(view); - DBG_PRINT("setContextView.0: ctx %p, view %p: setView: %d\n", ctx, view, viewReadyAndLocked); + DBG_PRINT("setContextView.1a: ctx %p, view %p: viewReadyAndLocked: %d\n", ctx, view, viewReadyAndLocked); + [ctx setView:view]; // Bug 1087: Set default framebuffer, hence enforce NSView realization if( viewReadyAndLocked ) { - [ctx setView:view]; + // [ctx setView:view]; [view unlockFocus]; } + } else { + DBG_PRINT("setContextView.1b: ctx %p, view %p\n", ctx, view); + [ctx setView:view]; } - DBG_PRINT("setContextView.X\n"); } +#else + if ( nil != ctx ) { + DBG_PRINT("setContextView.1c: ctx %p, view %p\n", ctx, view); + [ctx setView:view]; + } +#endif + DBG_PRINT("setContextView.X: ctx %p, view %p\n", ctx, view); [pool release]; } |