diff options
Diffstat (limited to 'src/nativewindow/classes/javax/media')
7 files changed, 46 insertions, 209 deletions
diff --git a/src/nativewindow/classes/javax/media/nativewindow/AbstractGraphicsDevice.java b/src/nativewindow/classes/javax/media/nativewindow/AbstractGraphicsDevice.java index 4240ec81e..c133df5b4 100644 --- a/src/nativewindow/classes/javax/media/nativewindow/AbstractGraphicsDevice.java +++ b/src/nativewindow/classes/javax/media/nativewindow/AbstractGraphicsDevice.java @@ -55,4 +55,8 @@ public interface AbstractGraphicsDevice extends Cloneable { * if such thing exist. */ public long getHandle(); + + public void lock(); + + public void unlock(); } diff --git a/src/nativewindow/classes/javax/media/nativewindow/DefaultGraphicsDevice.java b/src/nativewindow/classes/javax/media/nativewindow/DefaultGraphicsDevice.java index fdc849d0f..e18b7b2dc 100644 --- a/src/nativewindow/classes/javax/media/nativewindow/DefaultGraphicsDevice.java +++ b/src/nativewindow/classes/javax/media/nativewindow/DefaultGraphicsDevice.java @@ -62,6 +62,12 @@ public class DefaultGraphicsDevice implements Cloneable, AbstractGraphicsDevice return handle; } + public void lock() { + } + + public void unlock() { + } + public String toString() { return getClass().toString()+"[type "+getType()+", handle 0x"+Long.toHexString(getHandle())+"]"; } diff --git a/src/nativewindow/classes/javax/media/nativewindow/NativeWindow.java b/src/nativewindow/classes/javax/media/nativewindow/NativeWindow.java index 09c605e1c..7d0c52e3b 100644 --- a/src/nativewindow/classes/javax/media/nativewindow/NativeWindow.java +++ b/src/nativewindow/classes/javax/media/nativewindow/NativeWindow.java @@ -53,6 +53,9 @@ package javax.media.nativewindow; such as the window handle. */ public interface NativeWindow extends SurfaceUpdatedListener { + /** Unlocked state */ + public static final int LOCK_SURFACE_UNLOCKED = 0; + /** Returned by {@link #lockSurface()} if the surface is not ready to be locked. */ public static final int LOCK_SURFACE_NOT_READY = 1; diff --git a/src/nativewindow/classes/javax/media/nativewindow/NativeWindowFactory.java b/src/nativewindow/classes/javax/media/nativewindow/NativeWindowFactory.java index 14cb830e3..41be6e4b2 100644 --- a/src/nativewindow/classes/javax/media/nativewindow/NativeWindowFactory.java +++ b/src/nativewindow/classes/javax/media/nativewindow/NativeWindowFactory.java @@ -76,6 +76,7 @@ public abstract class NativeWindowFactory { private static String nativeOSNameCustom; private static final boolean isAWTAvailable; public static final String AWTComponentClassName = "java.awt.Component" ; + public static final String X11UtilClassName = "com.jogamp.nativewindow.impl.x11.X11Util"; /** Creates a new NativeWindowFactory instance. End users do not need to call this method. */ @@ -112,6 +113,10 @@ public abstract class NativeWindowFactory { nativeWindowingTypeCustom = nativeOSNameCustom; } + if( TYPE_X11.equals(nativeWindowingTypePure) ) { + ReflectionUtil.callStaticMethod( X11UtilClassName, "initSingleton", new Class[] { }, new Object[] { } ); + } + registeredFactories = Collections.synchronizedMap(new HashMap()); String factoryClassName = null; @@ -124,87 +129,25 @@ public abstract class NativeWindowFactory { // We break compile-time dependencies on the AWT here to // make it easier to run this code on mobile devices - isAWTAvailable = !Debug.getBooleanProperty("java.awt.headless", true, acc) && ReflectionUtil.isClassAvailable(AWTComponentClassName) && ReflectionUtil.isClassAvailable("javax.media.nativewindow.awt.AWTGraphicsDevice") ; - boolean toolkitLockForced = Debug.getBooleanProperty("nativewindow.locking", true, acc); - boolean awtToolkitLockDisabled = !isAWTAvailable || - Debug.getBooleanProperty("nativewindow.nolocking", true, acc) ; - - NativeWindowFactory _factory = null; - - if( !awtToolkitLockDisabled && TYPE_X11.equals(nativeWindowingTypeCustom) ) { - // There are certain operations that may be done by - // user-level native code which must share the display - // connection with the underlying window toolkit. In JOGL, - // for example, the AWT GLCanvas makes GLX and OpenGL - // calls against an X Drawable that was created by the - // AWT. In this case, the AWT Native Interface ("JAWT") is - // used to lock and unlock this surface, which grabs and - // releases a lock which is also used internally to the - // AWT implementation. This is required because the AWT - // makes X calls from multiple threads: for example, the - // AWT Toolkit thread and one or more Event Dispatch - // Threads. - // - // There are cases where synchronization with the - // toolkit is required in case of a shared resource pattern, - // e.g. with AWT. From recollection, visual selection is - // performed outside of the cover of the - // toolkit's lock, and the toolkit's display connection is - // used for this operation, so for correctness the toolkit - // must be locked during glXChooseFBConfig / - // glXChooseVisual. Synchronization with the toolkit is - // definitely needed for support of external GLDrawables, - // where JOGL creates additional OpenGL contexts on a - // surface that was created by a third party. External - // GLDrawables are the foundation of the Java 2D / JOGL - // bridge. While this bridge may be historical at this - // point, support for external GLDrawables on platforms - // that can support them (namely, WGL and X11 platforms; - // Mac OS X does not currently have the required - // primitives in its OpenGL window system binding) makes - // the JOGL library more powerful. - // - // The X11AWTNativeWindowFactory provides a locking - // mechanism compatible with the AWT. It may be desirable - // to replace this window factory when using third-party - // toolkits like Newt even when running on Java SE when - // the AWT is available. - - try { - Constructor factoryConstructor = - ReflectionUtil.getConstructor("com.jogamp.nativewindow.impl.x11.awt.X11AWTNativeWindowFactory", new Class[] {}); - _factory = (NativeWindowFactory) factoryConstructor.newInstance(null); - } catch (Exception e) { } - } - - if (toolkitLockForced && null==_factory) { - try { - Constructor factoryConstructor = - ReflectionUtil.getConstructor("com.jogamp.nativewindow.impl.LockingNativeWindowFactory", new Class[] {}); - _factory = (NativeWindowFactory) factoryConstructor.newInstance(null); - } catch (Exception e) { } - } - - if (null !=_factory) { - factory = _factory; - } - if ( isAWTAvailable ) { // register either our default factory or (if exist) the X11/AWT one -> AWT Component registerFactory(ReflectionUtil.getClass(AWTComponentClassName, false), factory); } - defaultFactory = factory; if(DEBUG) { - System.err.println("NativeWindowFactory toolkitLockForced "+toolkitLockForced+ - ", awtToolkitLockDisabled "+awtToolkitLockDisabled+", defaultFactory "+factory); + System.err.println("NativeWindowFactory isAWTAvailable "+isAWTAvailable+ + ", defaultFactory "+factory); } } + public static void initSingleton() { + // just exist to ensure static init has been run + } + /** @return true if not headless, AWT Component and NativeWindow's AWT part available */ public static boolean isAWTAvailable() { return isAWTAvailable; } @@ -216,32 +159,12 @@ public abstract class NativeWindowFactory { return useCustom?nativeWindowingTypeCustom:nativeWindowingTypePure; } - /** Sets the default NativeWindowFactory. Certain operations on - X11 platforms require synchronization, and the implementation - of this synchronization may be specific to the window toolkit - in use. It is impractical to require that all of the APIs that - might require synchronization receive a {@link ToolkitLock - ToolkitLock} as argument. For this reason the concept of a - default NativeWindowFactory is introduced. The toolkit lock - provided via {@link #getToolkitLock getToolkitLock} from this - default NativeWindowFactory will be used for synchronization - within the Java binding to OpenGL. By default, if the AWT is - available, the default toolkit will support the AWT. */ + /** Sets the default NativeWindowFactory. */ public static void setDefaultFactory(NativeWindowFactory factory) { defaultFactory = factory; } - /** Gets the default NativeWindowFactory. Certain operations on - X11 platforms require synchronization, and the implementation - of this synchronization may be specific to the window toolkit - in use. It is impractical to require that all of the APIs that - might require synchronization receive a {@link ToolkitLock - ToolkitLock} as argument. For this reason the concept of a - default NativeWindowFactory is introduced. The toolkit lock - provided via {@link #getToolkitLock getToolkitLock} from this - default NativeWindowFactory will be used for synchronization - within the Java binding to OpenGL. By default, if the AWT is - available, the default toolkit will support the AWT. */ + /** Gets the default NativeWindowFactory. */ public static NativeWindowFactory getDefaultFactory() { return defaultFactory; } @@ -308,10 +231,4 @@ public abstract class NativeWindowFactory { NativeWindow. Implementors of concrete NativeWindowFactory subclasses should override this method. */ protected abstract NativeWindow getNativeWindowImpl(Object winObj, AbstractGraphicsConfiguration config) throws IllegalArgumentException; - - /** Returns the object which provides support for synchronizing - with the underlying window toolkit.<br> - @see ToolkitLock - */ - public abstract ToolkitLock getToolkitLock(); } diff --git a/src/nativewindow/classes/javax/media/nativewindow/ToolkitLock.java b/src/nativewindow/classes/javax/media/nativewindow/ToolkitLock.java deleted file mode 100644 index 6f83896fa..000000000 --- a/src/nativewindow/classes/javax/media/nativewindow/ToolkitLock.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2008 Sun Microsystems, Inc. All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * - Redistribution of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistribution in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * This software is provided "AS IS," without a warranty of any kind. ALL - * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, - * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN - * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR - * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR - * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR - * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR - * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE - * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, - * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF - * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - */ - -package javax.media.nativewindow; - -/** Provides an interface for locking and unlocking the underlying - window toolkit, where this is necessary in the OpenGL - implementation. This mechanism is generally only needed on X11 - platforms. Currently it is only used when the AWT is in use. - Implementations of this lock, if they are not no-ops, must support - reentrant locking and unlocking. <P> - - The ToolkitLock implementation can be aquired by - {@link NativeWindowFactory#getToolkitLock NativeWindowFactory's getToolkitLock()}.<P> - - All toolkit shared resources shall be accessed by encapsulating the - code with a locking block as follows. - <PRE> - NativeWindowFactory.getDefaultFactory().getToolkitLock().lock(); - try { - long displayHandle = X11Util.getThreadLocalDefaultDisplay(); - ... some code dealing with shared resources - ... ie the window surface - } finally { - NativeWindowFactory.getDefaultFactory().getToolkitLock().unlock(); - } - </PRE><P> - - The underlying toolkit's locking mechanism may relate to {@link NativeWindow}'s - {@link NativeWindow#lockSurface lockSurface()}. Hence it is important - that both implementation harmonize well, ie {@link NativeWindow#lockSurface lockSurface()} - shall issue a ToolkitLock lock befor it aquires it's surface lock. This is true - in the AWT implementation for example. Otherwise the surface lock would <i>steal</i> - the ToolkitLock's lock and a deadlock would be unavoidable.<P> - - However the necessity of needing a global state synchronization will of course - impact your performance very much, especially in case of a multithreaded/multiwindow case. - */ -public interface ToolkitLock { - /** Locks the toolkit. */ - public void lock(); - - /** Unlocks the toolkit. */ - public void unlock(); -} diff --git a/src/nativewindow/classes/javax/media/nativewindow/x11/X11GraphicsDevice.java b/src/nativewindow/classes/javax/media/nativewindow/x11/X11GraphicsDevice.java index f0ea11011..192abf775 100644 --- a/src/nativewindow/classes/javax/media/nativewindow/x11/X11GraphicsDevice.java +++ b/src/nativewindow/classes/javax/media/nativewindow/x11/X11GraphicsDevice.java @@ -33,6 +33,8 @@ package javax.media.nativewindow.x11; import javax.media.nativewindow.*; +import com.jogamp.nativewindow.impl.*; +import com.jogamp.nativewindow.impl.x11.X11Util; /** Encapsulates a graphics device on X11 platforms. */ @@ -49,5 +51,14 @@ public class X11GraphicsDevice extends DefaultGraphicsDevice implements Cloneabl public Object clone() { return super.clone(); } + + public void lock() { + X11Util.XLockDisplay(handle); + } + + public void unlock() { + X11Util.XUnlockDisplay(handle); + } + } diff --git a/src/nativewindow/classes/javax/media/nativewindow/x11/X11GraphicsScreen.java b/src/nativewindow/classes/javax/media/nativewindow/x11/X11GraphicsScreen.java index a18ee91c2..97bdc37cf 100644 --- a/src/nativewindow/classes/javax/media/nativewindow/x11/X11GraphicsScreen.java +++ b/src/nativewindow/classes/javax/media/nativewindow/x11/X11GraphicsScreen.java @@ -56,53 +56,23 @@ public class X11GraphicsScreen extends DefaultGraphicsScreen implements Cloneabl /** Creates a new X11GraphicsScreen using a thread local display connection */ public static AbstractGraphicsScreen createDefault() { - NativeWindowFactory.getDefaultFactory().getToolkitLock().lock(); - try { - long display = X11Util.createThreadLocalDefaultDisplay(); - X11Util.XLockDisplay(display); - try{ - int scrnIdx = X11Lib.DefaultScreen(display); - return createScreenDevice(display, scrnIdx); - }finally{ - X11Util.XUnlockDisplay(display); - } - } finally { - NativeWindowFactory.getDefaultFactory().getToolkitLock().unlock(); - } + long display = X11Util.createThreadLocalDisplay(null); + int scrnIdx = X11Lib.DefaultScreen(display); + return createScreenDevice(display, scrnIdx); } public long getDefaultVisualID() { // It still could be an AWT hold handle .. - NativeWindowFactory.getDefaultFactory().getToolkitLock().lock(); - try { - long display = getDevice().getHandle(); - X11Util.XLockDisplay(display); - try{ - int scrnIdx = X11Lib.DefaultScreen(display); - return X11Lib.DefaultVisualID(display, scrnIdx); - }finally{ - X11Util.XUnlockDisplay(display); - } - } finally { - NativeWindowFactory.getDefaultFactory().getToolkitLock().unlock(); - } + long display = getDevice().getHandle(); + int scrnIdx = X11Lib.DefaultScreen(display); + return X11Lib.DefaultVisualID(display, scrnIdx); } private static int fetchScreen(X11GraphicsDevice device, int screen) { // It still could be an AWT hold handle .. - NativeWindowFactory.getDefaultFactory().getToolkitLock().lock(); - try { - long display = device.getHandle(); - X11Util.XLockDisplay(display); - try{ - if(X11Lib.XineramaEnabled(display)) { - screen = 0; // Xinerama -> 1 screen - } - }finally{ - X11Util.XUnlockDisplay(display); - } - } finally { - NativeWindowFactory.getDefaultFactory().getToolkitLock().unlock(); + long display = device.getHandle(); + if(X11Lib.XineramaEnabled(display)) { + screen = 0; // Xinerama -> 1 screen } return screen; } |