diff options
author | Sven Gothel <[email protected]> | 2010-06-10 09:35:06 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2010-06-10 09:35:06 +0200 |
commit | 1d333a771ce0bc7c8594e21d031703f698f06a46 (patch) | |
tree | 933d470582896320855fa1d98c1a917edc412c24 /src/jogl/classes/com/jogamp/opengl/impl/GLDynamicLookupHelper.java | |
parent | 4512900ddcb9ce9a498411d257b1b6d6010ec006 (diff) |
Fix: Locking/Threading; Common IntIntHashMap and Buffers; Fix: glMap*Buffer*; GLX/WGL/CgGL: All runtime dynamic; Misc ..
TODO: Compile and test on MacOSX ..
Fix:
=====
Multithreading/Locking:
See jogl/doc/Implementation/MultiThreading.txt
- Locking layer is not platform agnostic, ie GLContextImpl, GLDrawableImpl, ..
and NEWT: Window/Display
- No more use of JAWT global lock necessary, removed.
- No need for X11 Display lock, on the contrary,
this made the NV driver hang.
- Use common window/surface lock
- All NativeWindow surfaceLock's are recursive now
glMapBuffer: If size is 0, don't do cont with the native call.
glMapBufferRange: Fix capacity.
glNamedBufferDataEXT: Track the size.
glMapNamedBufferEXT: Manual impl. - use the tracked size
glXGetVisualFromFBConfig, glXChooseFBConfig, glXChooseVisual: Instead of
ignoring and implement a renamed version (*Copied), we just use ManualImplementation
for the proper copy-result code.
DesktopGLDynamicLookupHelper: Initialize _hasGLBinding* attributes
in the determing loadGLJNILibrary() method, which is called by super().
Otherwise static init will overwrite them after the super() call.
X11GLXDrawableFactory: Don't release anything at shutdown (removed sharedContext.destroy()),
since this caused a freeze/SEGV sometimes.
Fixed NEWT's reparentWindow() functionality incl NewtCanvasAWT usage.
- Native: if not visible, don't focus, etc
- NewtCanvasAWT: Use the container size to start with
- Run the command on the EDT
Using GlueGen's new DynamicLibraryBundle utility:
- X11, Windows and MacOSX OpenGL adapted to DynamicLibraryBundleInfo.
- X11GLXDynamicLookupHelper -> X11GLXDynamicLibraryBundleInfo
- Remove all path from lib names.
- GL order: libGL.so.1, libGL.so, GL
- shallLinkGlobal: true -> to server some 'old' DRI systems
-> http://dri.sourceforge.net/doc/DRIuserguide.html
- shallLookupGlobal: false
- Try both : glXGetProcAddressARB and glXGetProcAddress
- Using bootstrap: GLX.glXGetProcAddress(long glxGetProcAddressHandle, String glFuncName)
Found the issue with LIBGL_DRIVERS_PATH, ie if not set
no valid GL instance can be found (ie ATI fglrx/DRI).
This may happen if using a differen user than the desktop user
for whom the env var is set within some /etc/X11/Xsession.d/ script.
Enhancements:
=============
GLBufferSizeTracker: Use IntIntHashMap and add DirectState size tracking.
GLBufferStateTracker: Use IntIntHashMap.
GLStateTracker: Use IntIntHashMap.
GLDynamicLookupHelper: More generic (global loading/lookup and GetProcAddress function name list),
remove redundant code.
FIXME:
MacOSXCGLDynamicLookupHelper:
- Not tested
- Not using NSImage lookup anymore as recommended by OSX API Doc,
so dlsym is used always (to be tested)
WindowsWGLDynamicLookupHelper:
- Not tested
GLX/WGL/CgGL is all runtime-dynamic as now, ie loaded and looked-up at runtime,
no compile time dependencies to GL anymore, nor a need to specify CgGL.
Split up WGL in GDI and WGL, to allow proper dynamic runtime linkage of OpenGL32
while using static binding to GDI32
NEWT events generated by native code are enqueued and not send directly.
This should ease locking mechanisms .. if any are necessary.
NEWT: More platform specific code moved to *Impl method,
simplifying the generic code of the superclass and impl protocol.
Cleanup:
=========
Replace all InternalBufferUtil's with com.jogamp.common.nio.Buffers
Removed all InternalBufferUtil's from repository
Removed GLContextImpl notion of 'optimized' surface locking,
where the surface gets unlocked during makeCurrent/release.
This just makes no sense and would impact multithreading in a horrible way.
Diffstat (limited to 'src/jogl/classes/com/jogamp/opengl/impl/GLDynamicLookupHelper.java')
-rwxr-xr-x | src/jogl/classes/com/jogamp/opengl/impl/GLDynamicLookupHelper.java | 151 |
1 files changed, 8 insertions, 143 deletions
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/GLDynamicLookupHelper.java b/src/jogl/classes/com/jogamp/opengl/impl/GLDynamicLookupHelper.java index ce0649997..89dbb4a78 100755 --- a/src/jogl/classes/com/jogamp/opengl/impl/GLDynamicLookupHelper.java +++ b/src/jogl/classes/com/jogamp/opengl/impl/GLDynamicLookupHelper.java @@ -27,158 +27,23 @@ package com.jogamp.opengl.impl; +import com.jogamp.common.os.DynamicLibraryBundle; +import com.jogamp.common.os.DynamicLibraryBundleInfo; import com.jogamp.common.os.DynamicLookupHelper; import com.jogamp.common.os.NativeLibrary; import java.util.*; import java.security.*; import javax.media.opengl.GLException; -/** - * 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 GLDynamicLookupHelper implements DynamicLookupHelper { - protected static final boolean DEBUG = com.jogamp.opengl.impl.Debug.debug("GL"); - protected static final boolean DEBUG_LOOKUP; - - static { - AccessControlContext localACC=AccessController.getContext(); - DEBUG_LOOKUP = com.jogamp.opengl.impl.Debug.isPropertyDefined("jogl.debug.DynamicLookup", true, localACC); - } - - protected List/*<NativeLibrary>*/ glLibraries; - private long glxGetProcAddressHandle; - private String glxGetProcAddressFuncName; - - protected GLDynamicLookupHelper() { - glLibraries = new ArrayList(); - loadGLLibrary(); - glxGetProcAddressFuncName = getGLXGetProcAddressFuncName(); - glxGetProcAddressHandle = getGLXGetProcAddressHandle(); - } - - /** Must return at least one OpenGL library name, eg GL, OpenGL32, .. */ - protected abstract List/*<String>*/ getGLLibNames(); +public class GLDynamicLookupHelper extends DynamicLibraryBundle { - /** May return OpenGL Platform library name(s), eg EGL, GLX, .. */ - protected abstract List/*<String>*/ getGLXLibNames(); - - protected boolean shallGLLibLoadedGlobal() { return false; } - - protected boolean shallGLXLibLoadedGlobal() { return false; } - - /** Shall return the OpenGL Platform function name to lookup function pointer, eg eglGetProcAddress */ - protected abstract String getGLXGetProcAddressFuncName() ; - - protected abstract long dynamicLookupFunctionOnGLX(long glxGetProcAddressHandle, String glFuncName); - - /** Shall load the JNI binding */ - protected abstract void loadGLJNILibrary(); - - /** May load the native GLU library, default: None **/ - public void loadGLULibrary() { } - - protected long getGLXGetProcAddressHandle() { - long aptr = dynamicLookupFunctionOnLibs(glxGetProcAddressFuncName); - if(0==aptr) { - GLException e = new GLException("Couldn't find "+glxGetProcAddressFuncName+" function entry"); - if(DEBUG) { - e.printStackTrace(); - } - throw e; - } - return aptr; + public GLDynamicLookupHelper(GLDynamicLibraryBundleInfo info) { + super(info); } - protected NativeLibrary loadFirstAvailable(List/*<String>*/ libNames, ClassLoader loader, boolean global) { - for (Iterator iter = libNames.iterator(); iter.hasNext(); ) { - NativeLibrary lib = NativeLibrary.open((String) iter.next(), loader, global); - if (lib != null) { - return lib; - } - } - return null; - } + public GLDynamicLibraryBundleInfo getGLBundleInfo() { return (GLDynamicLibraryBundleInfo) getBundleInfo(); } - private boolean loadGLXLibrary(ClassLoader loader, List/*<String>*/ osLibNames) { - if(null!=osLibNames && osLibNames.size()>0) { - NativeLibrary lib = loadFirstAvailable(osLibNames, loader, shallGLXLibLoadedGlobal()); - if ( null != lib ) { - glLibraries.add(lib); - } - return null!=lib; - } - return true; // none is ok - } - - private void loadGLLibrary() { - List/*<String>*/ glLibNames = getGLLibNames(); - List/*<String>*/ osLibNames = getGLXLibNames(); - - ClassLoader loader = getClass().getClassLoader(); - NativeLibrary lib = null; - - // GL libraries .. - lib = loadFirstAvailable(glLibNames, loader, shallGLLibLoadedGlobal()); - if ( null == lib ) { - throw new GLException("Unable to dynamically load OpenGL library: "+getClass().getName()); - } - glLibraries.add(lib); - - // GL Platform libraries .. - if ( !loadGLXLibrary(loader, osLibNames) ) { - throw new GLException("Unable to dynamically load GL Platform library: " + getClass().getName()); - } - - loadGLJNILibrary(); - } - - private long dynamicLookupFunctionOnLibs(String glFuncName) { - String funcName=glFuncName; - long addr = dynamicLookupFunctionOnLibsImpl(funcName); - if(DEBUG_LOOKUP) { - if(0!=addr) { - System.err.println("Lookup-Native: "+glFuncName+" / "+funcName+" 0x"+Long.toHexString(addr)); - } else { - System.err.println("Lookup-Native: "+glFuncName+" / "+funcName+" ** FAILED ** "); - } - } - return addr; - } - - private long dynamicLookupFunctionOnLibsImpl(String glFuncName) { - // Look up this function name in all known libraries - for (Iterator iter = glLibraries.iterator(); iter.hasNext(); ) { - NativeLibrary lib = (NativeLibrary) iter.next(); - long addr = lib.dynamicLookupFunction(glFuncName); - if (addr != 0) { - return addr; - } - } - return 0; - } - - public long dynamicLookupFunction(String glFuncName) { - if(null==glFuncName) { - return 0; - } - - if(glFuncName.equals(glxGetProcAddressFuncName)) { - return glxGetProcAddressHandle; - } - - long addr = dynamicLookupFunctionOnGLX(glxGetProcAddressHandle, glFuncName); - if(DEBUG_LOOKUP) { - if(0!=addr) { - System.err.println("Lookup: <"+glFuncName+"> 0x"+Long.toHexString(addr)); - } - } - if(0==addr) { - addr = dynamicLookupFunctionOnLibs(glFuncName); - } - return addr; - } + /** NOP per default */ + public boolean loadGLULibrary() { return false; } } |