diff options
author | Sven Gothel <sgothel@jausoft.com> | 2010-06-10 09:35:06 +0200 |
---|---|---|
committer | Sven Gothel <sgothel@jausoft.com> | 2010-06-10 09:35:06 +0200 |
commit | 1d333a771ce0bc7c8594e21d031703f698f06a46 (patch) | |
tree | 933d470582896320855fa1d98c1a917edc412c24 /src/jogl/classes/javax/media | |
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/javax/media')
6 files changed, 94 insertions, 42 deletions
diff --git a/src/jogl/classes/javax/media/opengl/GLContext.java b/src/jogl/classes/javax/media/opengl/GLContext.java index efc914de9..21c1b96a0 100644 --- a/src/jogl/classes/javax/media/opengl/GLContext.java +++ b/src/jogl/classes/javax/media/opengl/GLContext.java @@ -278,10 +278,17 @@ public abstract class GLContext { /** * Classname, GL, GLDrawable */ - public final String toString() { + public String toString() { StringBuffer sb = new StringBuffer(); sb.append(getClass().getName()); - sb.append(" [OpenGL "); + sb.append(" ["); + this.append(sb); + sb.append("] "); + return sb.toString(); + } + + public final StringBuffer append(StringBuffer sb) { + sb.append("OpenGL "); sb.append(getGLVersionMajor()); sb.append("."); sb.append(getGLVersionMinor()); @@ -289,6 +296,8 @@ public abstract class GLContext { sb.append(Integer.toHexString(ctxOptions)); sb.append(", "); sb.append(getGLVersion()); + sb.append(", handle "); + sb.append(toHexString(contextHandle)); sb.append(", "); sb.append(getGL()); if(getGLDrawable()!=getGLDrawableRead()) { @@ -300,8 +309,7 @@ public abstract class GLContext { sb.append(",\n\tDrawable Read/Write: "); sb.append(getGLDrawable()); } - sb.append("] "); - return sb.toString(); + return sb; } /** Returns a non-null (but possibly empty) string containing the diff --git a/src/jogl/classes/javax/media/opengl/GLDrawable.java b/src/jogl/classes/javax/media/opengl/GLDrawable.java index 469cc5170..46296ca52 100644 --- a/src/jogl/classes/javax/media/opengl/GLDrawable.java +++ b/src/jogl/classes/javax/media/opengl/GLDrawable.java @@ -157,6 +157,15 @@ public interface GLDrawable { public NativeWindow getNativeWindow(); + /** + * This is the GL/Windowing drawable handle.<br> + * It is usually the {@link javax.media.nativewindow.NativeWindow#getSurfaceHandle()}, + * ie the native surface handle of the underlying windowing toolkit.<br> + * However, on X11/GLX this reflects a GLXDrawable, which represents a GLXWindow, GLXPixmap, or GLXPbuffer.<br> + * On EGL, this represents the EGLSurface.<br> + */ + public long getHandle(); + public GLDrawableFactory getFactory(); public String toString(); diff --git a/src/jogl/classes/javax/media/opengl/GLDrawableFactory.java b/src/jogl/classes/javax/media/opengl/GLDrawableFactory.java index ca6bc7564..81c7d4b4a 100644 --- a/src/jogl/classes/javax/media/opengl/GLDrawableFactory.java +++ b/src/jogl/classes/javax/media/opengl/GLDrawableFactory.java @@ -95,20 +95,9 @@ public abstract class GLDrawableFactory { * Instantiate singleton factories if available, EGLES1, EGLES2 and the OS native ones. */ static { - GLDrawableFactory tmp = null; - try { - tmp = (GLDrawableFactory) ReflectionUtil.createInstance("com.jogamp.opengl.impl.egl.EGLDrawableFactory"); - } catch (JogampRuntimeException jre) { - if (GLProfile.DEBUG) { - System.err.println("GLDrawableFactory.static - EGLDrawableFactory - not available"); - jre.printStackTrace(); - } - } - eglFactory = tmp; - nativeOSType = NativeWindowFactory.getNativeWindowType(true); - tmp = null; + GLDrawableFactory tmp = null; String factoryClassName = Debug.getProperty("jogl.gldrawablefactory.class.name", true, AccessController.getContext()); if (null == factoryClassName) { if ( nativeOSType.equals(NativeWindowFactory.TYPE_X11) ) { @@ -142,6 +131,17 @@ public abstract class GLDrawableFactory { } } nativeOSFactory = tmp; + + tmp = null; + try { + tmp = (GLDrawableFactory) ReflectionUtil.createInstance("com.jogamp.opengl.impl.egl.EGLDrawableFactory"); + } catch (JogampRuntimeException jre) { + if (GLProfile.DEBUG) { + System.err.println("GLDrawableFactory.static - EGLDrawableFactory - not available"); + jre.printStackTrace(); + } + } + eglFactory = tmp; } /** diff --git a/src/jogl/classes/javax/media/opengl/GLProfile.java b/src/jogl/classes/javax/media/opengl/GLProfile.java index 88eac0a92..3d0f4a3ce 100644 --- a/src/jogl/classes/javax/media/opengl/GLProfile.java +++ b/src/jogl/classes/javax/media/opengl/GLProfile.java @@ -40,8 +40,10 @@ import com.jogamp.common.util.*; import com.jogamp.opengl.impl.Debug; import com.jogamp.opengl.impl.GLJNILibLoader; import com.jogamp.opengl.impl.GLDrawableFactoryImpl; -import com.jogamp.opengl.impl.egl.EGLDynamicLookupHelper; +import com.jogamp.opengl.impl.GLDynamicLookupHelper; +import com.jogamp.opengl.impl.GLDynamicLibraryBundleInfo; import com.jogamp.opengl.impl.DesktopGLDynamicLookupHelper; +import com.jogamp.opengl.impl.DesktopGLDynamicLibraryBundleInfo; import com.jogamp.common.jvm.JVMUtil; import java.util.HashMap; import java.util.Iterator; @@ -860,7 +862,7 @@ public class GLProfile implements Cloneable { AccessController.doPrivileged(new PrivilegedAction() { public Object run() { - JVMUtil.initSingleton(); + NativeWindowFactory.initSingleton(); AccessControlContext acc = AccessController.getContext(); @@ -895,9 +897,11 @@ public class GLProfile implements Cloneable { GLDrawableFactoryImpl factory = (GLDrawableFactoryImpl) GLDrawableFactory.getFactoryImpl(GL2); hasNativeOSFactory = null != factory; if(hasNativeOSFactory) { - DesktopGLDynamicLookupHelper deskGLLookupHelper = (DesktopGLDynamicLookupHelper) factory.getGLDynamicLookupHelper(0); - hasDesktopGL = deskGLLookupHelper.hasGLBinding(); - hasDesktopGLES12 = deskGLLookupHelper.hasGLES12Binding(); + DesktopGLDynamicLookupHelper glLookupHelper = (DesktopGLDynamicLookupHelper) factory.getGLDynamicLookupHelper(0); + if(null!=glLookupHelper) { + hasDesktopGL = glLookupHelper.hasGLBinding(); + hasDesktopGLES12 = glLookupHelper.hasGLES12Binding(); + } } } catch (LinkageError le) { t=le; @@ -937,18 +941,18 @@ public class GLProfile implements Cloneable { hasGL2ES12Impl = hasGL2ES12Impl && GLContext.isGL2Available(); } - if ( ReflectionUtil.isClassAvailable("com.jogamp.opengl.impl.egl.EGLDynamicLookupHelper") ) { + if ( ReflectionUtil.isClassAvailable("com.jogamp.opengl.impl.egl.EGLDrawableFactory") ) { t=null; try { GLDrawableFactoryImpl factory = (GLDrawableFactoryImpl) GLDrawableFactory.getFactoryImpl(GLES2); if(null != factory) { - EGLDynamicLookupHelper eglLookupHelper = (EGLDynamicLookupHelper) factory.getGLDynamicLookupHelper(2); + GLDynamicLookupHelper eglLookupHelper = factory.getGLDynamicLookupHelper(2); if(null!=eglLookupHelper) { - hasGLES2Impl = eglLookupHelper.hasESBinding(); + hasGLES2Impl = eglLookupHelper.isLibComplete(); } - eglLookupHelper = (EGLDynamicLookupHelper) factory.getGLDynamicLookupHelper(1); + eglLookupHelper = factory.getGLDynamicLookupHelper(1); if(null!=eglLookupHelper) { - hasGLES1Impl = eglLookupHelper.hasESBinding(); + hasGLES1Impl = eglLookupHelper.isLibComplete(); } } } catch (LinkageError le) { @@ -991,6 +995,15 @@ public class GLProfile implements Cloneable { } } + /** + * It is mandatory to call this methods ASAP, before anything else.<br> + * You may issue the call in your main class static initializer block, or in the static main function.<br> + * This will kick off JOGL's static initialization.<br> + * It is essential to do this at the very beginning, so JOGL has a chance to initialize multithreading support.<br> + */ + public static void initSingleton() { + } + private static final String list2String(String[] list) { StringBuffer msg = new StringBuffer(); msg.append("["); diff --git a/src/jogl/classes/javax/media/opengl/awt/GLCanvas.java b/src/jogl/classes/javax/media/opengl/awt/GLCanvas.java index be42e1da1..77b8e45d3 100644 --- a/src/jogl/classes/javax/media/opengl/awt/GLCanvas.java +++ b/src/jogl/classes/javax/media/opengl/awt/GLCanvas.java @@ -44,6 +44,7 @@ import javax.media.nativewindow.*; import javax.media.nativewindow.awt.*; import com.jogamp.opengl.impl.*; +import com.jogamp.nativewindow.impl.jawt.JAWTUtil; import java.awt.Canvas; import java.awt.Color; @@ -73,9 +74,15 @@ import java.security.*; public class GLCanvas extends Canvas implements AWTGLAutoDrawable { - private static final boolean DEBUG = Debug.debug("GLCanvas"); + private static final boolean DEBUG; + private static final GLProfile defaultGLProfile; + + static { + NativeWindowFactory.initSingleton(); + defaultGLProfile = GLProfile.getDefault(); + DEBUG = Debug.debug("GLCanvas"); + } - static private GLProfile defaultGLProfile = GLProfile.getDefault(); private GLProfile glProfile; private GLDrawableHelper drawableHelper = new GLDrawableHelper(); private GraphicsConfiguration chosen; @@ -396,22 +403,27 @@ public class GLCanvas extends Canvas implements AWTGLAutoDrawable { /* * Save the chosen capabilities for use in getGraphicsConfiguration(). */ - awtConfig = chooseGraphicsConfiguration(capabilities, chooser, device); - if(DEBUG) { - Exception e = new Exception("Created Config: "+awtConfig); - e.printStackTrace(); - } - if(null!=awtConfig) { - // update .. - chosen = awtConfig.getGraphicsConfiguration(); + JAWTUtil.lockToolkit(); + try { + awtConfig = chooseGraphicsConfiguration(capabilities, chooser, device); + if(DEBUG) { + Exception e = new Exception("Created Config: "+awtConfig); + e.printStackTrace(); + } + if(null!=awtConfig) { + // update .. + chosen = awtConfig.getGraphicsConfiguration(); + } + if(null==awtConfig) { + throw new GLException("Error: AWTGraphicsConfiguration is null"); + } + drawable = GLDrawableFactory.getFactory(glProfile).createGLDrawable(NativeWindowFactory.getNativeWindow(this, awtConfig)); + context = (GLContextImpl) drawable.createContext(shareWith); + context.setSynchronized(true); + } finally { + JAWTUtil.unlockToolkit(); } - if(null==awtConfig) { - throw new GLException("Error: AWTGraphicsConfiguration is null"); - } - drawable = GLDrawableFactory.getFactory(glProfile).createGLDrawable(NativeWindowFactory.getNativeWindow(this, awtConfig)); - context = (GLContextImpl) drawable.createContext(shareWith); - context.setSynchronized(true); if(DEBUG) { System.err.println("Created Drawable: "+drawable); @@ -538,6 +550,10 @@ public class GLCanvas extends Canvas implements AWTGLAutoDrawable { return drawable.getNativeWindow(); } + public long getHandle() { + return drawable.getHandle(); + } + public GLDrawableFactory getFactory() { return drawable.getFactory(); } diff --git a/src/jogl/classes/javax/media/opengl/awt/GLJPanel.java b/src/jogl/classes/javax/media/opengl/awt/GLJPanel.java index 61e1429b6..955949415 100644 --- a/src/jogl/classes/javax/media/opengl/awt/GLJPanel.java +++ b/src/jogl/classes/javax/media/opengl/awt/GLJPanel.java @@ -137,6 +137,8 @@ public class GLJPanel extends JPanel implements AWTGLAutoDrawable { private int viewportY; static { + NativeWindowFactory.initSingleton(); + // Force eager initialization of part of the Java2D class since // otherwise it's likely it will try to be initialized while on // the Queue Flusher Thread, which is not allowed @@ -469,6 +471,10 @@ public class GLJPanel extends JPanel implements AWTGLAutoDrawable { throw new GLException("FIXME"); } + public long getHandle() { + throw new GLException("FIXME"); + } + public final GLDrawableFactory getFactory() { return factory; } |