diff options
3 files changed, 76 insertions, 38 deletions
diff --git a/make/config/nativewindow/jawt-CustomJavaCode.java b/make/config/nativewindow/jawt-CustomJavaCode.java index d3dc3845f..6ea57dca2 100644 --- a/make/config/nativewindow/jawt-CustomJavaCode.java +++ b/make/config/nativewindow/jawt-CustomJavaCode.java @@ -1,38 +1,23 @@ -/** Available and recommended on Mac OS X >= 10.6 Update 4 */ -public static final int JAWT_MACOSX_USE_CALAYER = 0x80000000; -public static final VersionNumber JAWT_MacOSXCALayerMinVersion = new VersionNumber(10,6,4); - private int jawt_version_cached = 0; public final int getCachedVersion() { return jawt_version_cached; } -/** Helper routine for all users to call to access the JAWT. */ -public static JAWT getJAWT(final int jawt_version_flags) { +protected static boolean getJAWT(final JAWT jawt, final int jawt_version_flags) { JAWTUtil.initSingleton(); // Workaround for 4845371. // Make sure the first reference to the JNI GetDirectBufferAddress is done // from a privileged context so the VM's internal class lookups will succeed. - return AccessController.doPrivileged(new PrivilegedAction<JAWT>() { - public JAWT run() { - int jawt_version_flags_mod = jawt_version_flags; - JAWT jawt = JAWT.create(); - if( 0 != ( jawt_version_flags_mod & JAWT_MACOSX_USE_CALAYER ) ) { - jawt.setVersion(jawt_version_flags_mod); - if (JAWTFactory.JAWT_GetAWT(jawt)) { - jawt.jawt_version_cached = jawt.getVersion(); - return jawt; - } - jawt_version_flags_mod &= ~JAWT_MACOSX_USE_CALAYER; - System.err.println("MacOSX "+Platform.OS_VERSION_NUMBER+" >= "+JAWT_MacOSXCALayerMinVersion+": Failed to use JAWT_MACOSX_USE_CALAYER"); - } - jawt.setVersion(jawt_version_flags_mod); - if (!JAWTFactory.JAWT_GetAWT(jawt)) { - throw new RuntimeException("Unable to initialize JAWT: 0x"+Integer.toHexString(jawt_version_flags_mod)); + return AccessController.doPrivileged(new PrivilegedAction<Boolean>() { + public Boolean run() { + jawt.setVersion(jawt_version_flags); + if (JAWTFactory.JAWT_GetAWT(jawt)) { + jawt.jawt_version_cached = jawt.getVersion(); + return new Boolean(true); } - jawt.jawt_version_cached = jawt.getVersion(); - return jawt; + jawt.jawt_version_cached = 0; + return new Boolean(false); } - }); + }).booleanValue(); } diff --git a/make/config/nativewindow/jawt-DrawingSurfaceInfo-CustomJavaCode.java b/make/config/nativewindow/jawt-DrawingSurfaceInfo-CustomJavaCode.java index 4ff3a45b0..092aa5991 100644 --- a/make/config/nativewindow/jawt-DrawingSurfaceInfo-CustomJavaCode.java +++ b/make/config/nativewindow/jawt-DrawingSurfaceInfo-CustomJavaCode.java @@ -13,7 +13,7 @@ private static JAWT_PlatformInfo newPlatformInfo(JAWT jawt, ByteBuffer buf) { if (Platform.OS_TYPE == Platform.OSType.WINDOWS) { factoryClass = Class.forName("jogamp.nativewindow.jawt.windows.JAWT_Win32DrawingSurfaceInfo"); } else if (Platform.OS_TYPE == Platform.OSType.MACOS) { - if( 0 != ( jawt.getCachedVersion() & JAWT.JAWT_MACOSX_USE_CALAYER ) ) { + if( 0 != ( jawt.getCachedVersion() & JAWTUtil.JAWT_MACOSX_USE_CALAYER ) ) { factoryClass = Class.forName("jogamp.nativewindow.jawt.macosx.JAWT_SurfaceLayers"); } else { factoryClass = Class.forName("jogamp.nativewindow.jawt.macosx.JAWT_MacOSXDrawingSurfaceInfo"); diff --git a/src/nativewindow/classes/jogamp/nativewindow/jawt/JAWTUtil.java b/src/nativewindow/classes/jogamp/nativewindow/jawt/JAWTUtil.java index 21e9a3e09..a9326cc4a 100644 --- a/src/nativewindow/classes/jogamp/nativewindow/jawt/JAWTUtil.java +++ b/src/nativewindow/classes/jogamp/nativewindow/jawt/JAWTUtil.java @@ -52,10 +52,20 @@ import javax.media.nativewindow.NativeWindowException; import jogamp.nativewindow.Debug; import com.jogamp.common.os.Platform; +import com.jogamp.common.util.VersionNumber; public class JAWTUtil { protected static final boolean DEBUG = Debug.debug("JAWT"); + /** OSX JAWT version option to use CALayer */ + public static final int JAWT_MACOSX_USE_CALAYER = 0x80000000; + + /** OSX JAWT CALayer availability on Mac OS X >= 10.6 Update 4 (recommended) */ + public static final VersionNumber JAWT_MacOSXCALayerMinVersion = new VersionNumber(10,6,4); + + /** OSX JAWT CALayer required with Java >= 1.7.0 (implies OS X >= 10.7 */ + public static final VersionNumber JAWT_MacOSXCALayerRequiredForJavaVersion = new VersionNumber(1,7,0); + // See whether we're running in headless mode private static final boolean headlessMode; private static final JAWT jawtLockObject; @@ -80,12 +90,19 @@ public class JAWTUtil { } /** - * Returns true if this platform's JAWT implementation supports - * or uses offscreen layer. + * Returns true if this platform's JAWT implementation supports offscreen layer. */ public static boolean isOffscreenLayerSupported() { return Platform.OS_TYPE == Platform.OSType.MACOS && - Platform.OS_VERSION_NUMBER.compareTo(JAWT.JAWT_MacOSXCALayerMinVersion) >= 0; + Platform.OS_VERSION_NUMBER.compareTo(JAWTUtil.JAWT_MacOSXCALayerMinVersion) >= 0; + } + + /** + * Returns true if this platform's JAWT implementation requires using offscreen layer. + */ + public static boolean isOffscreenLayerRequired() { + return Platform.OS_TYPE == Platform.OSType.MACOS && + Platform.JAVA_VERSION_NUMBER.compareTo(JAWT_MacOSXCALayerRequiredForJavaVersion)>=0; } /** @@ -93,20 +110,56 @@ public class JAWTUtil { * @return */ public static JAWT getJAWT(boolean useOffscreenLayerIfAvailable) { - int jawt_version_flags = JAWTFactory.JAWT_VERSION_1_4; - if(useOffscreenLayerIfAvailable) { - switch(Platform.OS_TYPE) { - case MACOS: - if(Platform.OS_VERSION_NUMBER.compareTo(JAWT.JAWT_MacOSXCALayerMinVersion) >= 0) { - jawt_version_flags |= JAWT.JAWT_MACOSX_USE_CALAYER; - } + final int jawt_version_flags = JAWTFactory.JAWT_VERSION_1_4; + JAWT jawt = JAWT.create(); + + // default queries + boolean tryOffscreenLayer = false; + boolean tryOnscreenLayer = true; + int jawt_version_flags_offscreen = jawt_version_flags; + + if(isOffscreenLayerRequired()) { + if(Platform.OS_TYPE == Platform.OSType.MACOS) { + if(Platform.OS_VERSION_NUMBER.compareTo(JAWTUtil.JAWT_MacOSXCALayerMinVersion) >= 0) { + jawt_version_flags_offscreen |= JAWTUtil.JAWT_MACOSX_USE_CALAYER; + tryOffscreenLayer = true; + tryOnscreenLayer = false; + } else { + throw new RuntimeException("OSX: Invalid version of Java ("+Platform.JAVA_VERSION_NUMBER+") / OS X ("+Platform.OS_VERSION_NUMBER+")"); + } + } else { + throw new InternalError("offscreen required, but n/a for: "+Platform.OS_TYPE); + } + } else if(useOffscreenLayerIfAvailable && isOffscreenLayerSupported()) { + if(Platform.OS_TYPE == Platform.OSType.MACOS) { + jawt_version_flags_offscreen |= JAWTUtil.JAWT_MACOSX_USE_CALAYER; + tryOffscreenLayer = true; + } else { + throw new InternalError("offscreen requested and supported, but n/a for: "+Platform.OS_TYPE); + } + } + + StringBuilder errsb = new StringBuilder(); + if(tryOffscreenLayer) { + errsb.append("Offscreen 0x").append(Integer.toHexString(jawt_version_flags_offscreen)); + if( JAWT.getJAWT(jawt, jawt_version_flags_offscreen) ) { + return jawt; + } + } + if(tryOnscreenLayer) { + if(tryOffscreenLayer) { + errsb.append(", "); } + errsb.append("Onscreen 0x").append(Integer.toHexString(jawt_version_flags)); + if( JAWT.getJAWT(jawt, jawt_version_flags) ) { + return jawt; + } } - return JAWT.getJAWT(jawt_version_flags); + throw new RuntimeException("Unable to initialize JAWT, trials: "+errsb.toString()); } public static boolean isJAWTUsingOffscreenLayer(JAWT jawt) { - return 0 != ( jawt.getCachedVersion() & JAWT.JAWT_MACOSX_USE_CALAYER ); + return 0 != ( jawt.getCachedVersion() & JAWTUtil.JAWT_MACOSX_USE_CALAYER ); } static { |