aboutsummaryrefslogtreecommitdiffstats
path: root/make/config
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2020-02-24 05:07:15 +0100
committerSven Gothel <[email protected]>2020-02-24 05:07:15 +0100
commitd1a4d790c89934616fa1883312b4064bda9fa420 (patch)
tree5d2bd10fb4d8a35afceaac057aef90531c241857 /make/config
parent78b96b89a68ff35969aea83de294cd3cc1178f26 (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 'make/config')
-rw-r--r--make/config/jogl/cgl-macosx-CustomJavaCode.java20
-rw-r--r--make/config/jogl/cgl-macosx.cfg1
2 files changed, 21 insertions, 0 deletions
diff --git a/make/config/jogl/cgl-macosx-CustomJavaCode.java b/make/config/jogl/cgl-macosx-CustomJavaCode.java
index fc3ce1c57..2d9b1bd71 100644
--- a/make/config/jogl/cgl-macosx-CustomJavaCode.java
+++ b/make/config/jogl/cgl-macosx-CustomJavaCode.java
@@ -1,4 +1,24 @@
+/**
+ * Interface to C language function: <br> <code>void setContextView(NSOpenGLContext * ctx, NSView * view)</code>
+ * <p>
+ * A GLException is thrown if this method has not been called from the NSApplication Main-Thread.<br>
+ * Bug 1398: Such pre-emptive exception aligns behavior across all OSX variations,
+ * by complying to the newly enforced [NSOpenGLContext setView:] implementation
+ * which crashes with a SIGILL signal.
+ * </p>
+ */
+public static void setContextView(long ctx, long nsView) {
+ if( 0 == ctx ) {
+ throw new IllegalArgumentException("given ctx is null");
+ }
+ if( !OSXUtil.IsMainThread() ) {
+ throw new GLException("Not called from the NSApplication Main-Thread. Current Thread: "+Thread.currentThread());
+ }
+ setContextViewImpl(ctx, nsView);
+}
+
+
/**
* Creates the NSOpenGLLayer for FBO/PBuffer w/ optional GL3 shader program
* <p>
diff --git a/make/config/jogl/cgl-macosx.cfg b/make/config/jogl/cgl-macosx.cfg
index df39bdaab..e97838aff 100644
--- a/make/config/jogl/cgl-macosx.cfg
+++ b/make/config/jogl/cgl-macosx.cfg
@@ -37,6 +37,7 @@ Opaque long NSOpenGLLayer *
CustomCCode #include <machine/types.h>
CustomCCode #include "macosx-window-system.h"
+DelegateImplementation setContextView setContextViewImpl
DelegateImplementation createNSOpenGLLayer createNSOpenGLLayerImpl
DelegateImplementation setNSOpenGLLayerEnabled setNSOpenGLLayerEnabledImpl
DelegateImplementation releaseNSOpenGLLayer releaseNSOpenGLLayerImpl