From 4512900ddcb9ce9a498411d257b1b6d6010ec006 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Fri, 4 Jun 2010 05:21:32 +0200 Subject: JOGL: Unify library loading (impl and binding), incl. lookup ; GLAutoDrawable: dispose() calls only with created context. - Using the EGL approach of DynamicLookupHelper, now generalized in abstract GLDynamicLookupHelper, DesktopGLDynamicLookupHelper and EGLGLDynamicLookupHelper. The implementation of these are self contained. - Sharing common code. - Unifying implementation and binding loading, as well as the function lookup within the impl libs. - Removed DRIHack, since its no more required due to the new DesktopGLDynamicLookupHelper. - Removed compile time link to GL and GLU libs - Removed redundant library OS functions from X11/WGL bindings, GlueGen's common code is being used now. - GLAutoDrawable: dispose() calls only with created context. This cleans up stack traces in case of eventual bugs, where context creation is not successful. --- .../classes/com/jogamp/opengl/impl/DRIHack.java | 137 ------------- .../opengl/impl/DesktopGLDynamicLookupHelper.java | 81 ++++++++ .../com/jogamp/opengl/impl/GLContextImpl.java | 15 +- .../jogamp/opengl/impl/GLDrawableFactoryImpl.java | 12 +- .../com/jogamp/opengl/impl/GLDrawableImpl.java | 3 +- .../jogamp/opengl/impl/GLDynamicLookupHelper.java | 184 +++++++++++++++++ .../com/jogamp/opengl/impl/egl/EGLContext.java | 2 +- .../com/jogamp/opengl/impl/egl/EGLDrawable.java | 6 +- .../jogamp/opengl/impl/egl/EGLDrawableFactory.java | 7 +- .../opengl/impl/egl/EGLDynamicLookupHelper.java | 222 ++++----------------- .../opengl/impl/egl/EGLES1DynamicLookupHelper.java | 77 +++---- .../opengl/impl/egl/EGLES2DynamicLookupHelper.java | 77 +++---- .../opengl/impl/macosx/cgl/MacOSXCGLDrawable.java | 4 +- .../impl/macosx/cgl/MacOSXCGLDrawableFactory.java | 19 +- .../macosx/cgl/MacOSXCGLDynamicLookupHelper.java | 93 +++++++++ .../opengl/impl/windows/wgl/WindowsWGLContext.java | 4 +- .../impl/windows/wgl/WindowsWGLDrawable.java | 5 +- .../windows/wgl/WindowsWGLDrawableFactory.java | 53 +---- .../windows/wgl/WindowsWGLDynamicLookupHelper.java | 91 +++++++++ .../jogamp/opengl/impl/x11/glx/X11GLXContext.java | 12 +- .../jogamp/opengl/impl/x11/glx/X11GLXDrawable.java | 4 +- .../opengl/impl/x11/glx/X11GLXDrawableFactory.java | 25 +-- .../impl/x11/glx/X11GLXDynamicLookupHelper.java | 113 +++++++++++ 23 files changed, 747 insertions(+), 499 deletions(-) delete mode 100755 src/jogl/classes/com/jogamp/opengl/impl/DRIHack.java create mode 100755 src/jogl/classes/com/jogamp/opengl/impl/DesktopGLDynamicLookupHelper.java create mode 100755 src/jogl/classes/com/jogamp/opengl/impl/GLDynamicLookupHelper.java create mode 100644 src/jogl/classes/com/jogamp/opengl/impl/macosx/cgl/MacOSXCGLDynamicLookupHelper.java create mode 100644 src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLDynamicLookupHelper.java create mode 100644 src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11GLXDynamicLookupHelper.java (limited to 'src/jogl/classes/com/jogamp/opengl/impl') diff --git a/src/jogl/classes/com/jogamp/opengl/impl/DRIHack.java b/src/jogl/classes/com/jogamp/opengl/impl/DRIHack.java deleted file mode 100755 index 7e81d194b..000000000 --- a/src/jogl/classes/com/jogamp/opengl/impl/DRIHack.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (c) 2006 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. - * - * You acknowledge that this software is not designed or intended for use - * in the design, construction, operation or maintenance of any nuclear - * facility. - * - * Sun gratefully acknowledges that this software was originally authored - * and developed by Kenneth Bradley Russell and Christopher John Kline. - */ - -package com.jogamp.opengl.impl; - -import com.jogamp.common.os.NativeLibrary; -import com.jogamp.common.os.Platform; -import java.io.*; -import java.security.*; - -/** - * Helper class for working around problems with open-source DRI - * drivers. In the current DRI implementation it is required that the - * symbols in libGL.so.1.2 be globally visible to be accessible from - * other libraries that are dynamically loaded by the implementation. - * Applications may typically satisfy this need either by linking - * against libGL.so on the command line (-lGL) or by dlopen'ing - * libGL.so.1.2 with the RTLD_GLOBAL flag. The JOGL implementation - * links against libGL on all platforms rather than forcing all OpenGL - * entry points to be called through a function pointer. This allows - * the JOGL library to link directly to core 1.1 OpenGL entry points - * like glVertex3f, while calling through function pointers for entry - * points from later OpenGL versions as well as from - * extensions. However, because libjogl.so (which links against - * libGL.so) is loaded by the JVM, and because the JVM implicitly uses - * RTLD_LOCAL in the implementation of System.loadLibrary(), this - * means via transitivity that the symbols for libGL.so have only - * RTLD_LOCAL visibility to the rest of the application, so the DRI - * drivers can not find the symbols required.

- * - * There are at least two possible solutions. One would be to change - * the JOGL implementation to call through function pointers uniformly - * so that it does not need to link against libGL.so. This is - * possible, but requires changes to GlueGen and also is not really - * necessary in any other situation than with the DRI drivers. Another - * solution is to force the first load of libGL.so.1.2 to be done - * dynamically with RTLD_GLOBAL before libjogl.so is loaded and causes - * libGL.so.1.2 to be loaded again. The NativeLibrary class in the - * GlueGen runtime has this property, and we use it to implement this - * workaround. - */ - -public class DRIHack { - - private static final boolean DEBUG = Debug.debug("DRIHack"); - private static boolean driHackNeeded; - private static NativeLibrary oglLib; - - static { - // Allow manual overriding for now as a workaround for - // problems seen in some situations -- needs more investigation - if (Debug.getProperty("jogl.drihack.disable", true) != null) { - driHackNeeded = false; - } else { - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - String os = Platform.getOS().toLowerCase(); - // Do DRI hack on all Linux distributions for best robustness - driHackNeeded = os.startsWith("linux") - || new File("/usr/lib/dri").exists() - || new File("/usr/X11R6/lib/modules/dri").exists(); - return null; - } - }); - } - } - - public static void begin() { - - if (driHackNeeded) { - if (DEBUG) { - System.err.println("Beginning DRI hack"); - } - - // Try a few different variants for best robustness - // In theory probably only the first is necessary - oglLib = NativeLibrary.open("libGL.so.1", null); - if (DEBUG && oglLib != null) { - System.err.println(" Found libGL.so.1"); - } - if (oglLib == null) { - oglLib = NativeLibrary.open("/usr/lib/libGL.so.1", null); - if (DEBUG && oglLib != null) { - System.err.println(" Found /usr/lib/libGL.so.1"); - } - } - } - - } - - public static void end() { - if (oglLib != null) { - if (DEBUG) { - System.err.println("Ending DRI hack"); - } - - oglLib.close(); - oglLib = null; - } - } -} diff --git a/src/jogl/classes/com/jogamp/opengl/impl/DesktopGLDynamicLookupHelper.java b/src/jogl/classes/com/jogamp/opengl/impl/DesktopGLDynamicLookupHelper.java new file mode 100755 index 000000000..f9858df62 --- /dev/null +++ b/src/jogl/classes/com/jogamp/opengl/impl/DesktopGLDynamicLookupHelper.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2010, Sven Gothel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions 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 Sven Gothel nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Sven Gothel BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.jogamp.opengl.impl; + +/** + * Abstract implementation of the DynamicLookupHelper for GL, + * which decouples it's dependencies to EGLDrawableFactory. + * + * Currently two implementations exist, one for ES1 and one for ES2. + */ +public abstract class DesktopGLDynamicLookupHelper extends GLDynamicLookupHelper { + private boolean hasGLBinding = false; + private boolean hasGLES12Binding = false; + + public boolean hasGLBinding() { return hasGLBinding; } + public boolean hasGLES12Binding() { return hasGLES12Binding; } + + protected void loadGLJNILibrary() { + Throwable t=null; + + try { + GLJNILibLoader.loadGLDesktop(); + hasGLBinding = true; + } catch (UnsatisfiedLinkError ule) { + t=ule; + } catch (SecurityException se) { + t=se; + } catch (NullPointerException npe) { + t=npe; + } catch (RuntimeException re) { + t=re; + } + if(DEBUG && null!=t) { + System.err.println("DesktopGLDynamicLookupHelper: Desktop GL Binding Library not available"); + t.printStackTrace(); + } + + try { + GLJNILibLoader.loadGLDesktopES12(); + hasGLES12Binding = true; + } catch (UnsatisfiedLinkError ule) { + t=ule; + } catch (SecurityException se) { + t=se; + } catch (NullPointerException npe) { + t=npe; + } catch (RuntimeException re) { + t=re; + } + if(DEBUG && null!=t) { + System.err.println("DesktopGLDynamicLookupHelper: Desktop GLES12 Binding Library not available"); + t.printStackTrace(); + } + } +} + diff --git a/src/jogl/classes/com/jogamp/opengl/impl/GLContextImpl.java b/src/jogl/classes/com/jogamp/opengl/impl/GLContextImpl.java index 416f0d694..0742587dd 100644 --- a/src/jogl/classes/com/jogamp/opengl/impl/GLContextImpl.java +++ b/src/jogl/classes/com/jogamp/opengl/impl/GLContextImpl.java @@ -234,7 +234,7 @@ public abstract class GLContextImpl extends GLContext { * *
* - * Once at startup, ie triggered by the singleton {@link GLDrawableImpl} constructor, + * Once at startup, ie triggered by the singleton constructor of a {@link GLDrawableFactoryImpl} specialization, * calling {@link #createContextARB} will query all available OpenGL versions:
*