aboutsummaryrefslogtreecommitdiffstats
path: root/src/jogl/classes/jogamp/opengl/egl
diff options
context:
space:
mode:
Diffstat (limited to 'src/jogl/classes/jogamp/opengl/egl')
-rw-r--r--src/jogl/classes/jogamp/opengl/egl/EGLContext.java1
-rw-r--r--src/jogl/classes/jogamp/opengl/egl/EGLDisplayUtil.java107
-rw-r--r--src/jogl/classes/jogamp/opengl/egl/EGLDrawable.java8
-rw-r--r--src/jogl/classes/jogamp/opengl/egl/EGLDrawableFactory.java6
4 files changed, 115 insertions, 7 deletions
diff --git a/src/jogl/classes/jogamp/opengl/egl/EGLContext.java b/src/jogl/classes/jogamp/opengl/egl/EGLContext.java
index 308757416..9028f4377 100644
--- a/src/jogl/classes/jogamp/opengl/egl/EGLContext.java
+++ b/src/jogl/classes/jogamp/opengl/egl/EGLContext.java
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright (c) 2011 JogAmp Community. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
diff --git a/src/jogl/classes/jogamp/opengl/egl/EGLDisplayUtil.java b/src/jogl/classes/jogamp/opengl/egl/EGLDisplayUtil.java
new file mode 100644
index 000000000..207a8e674
--- /dev/null
+++ b/src/jogl/classes/jogamp/opengl/egl/EGLDisplayUtil.java
@@ -0,0 +1,107 @@
+/**
+ * Copyright 2012 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community OR
+ * CONTRIBUTORS 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.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+
+package jogamp.opengl.egl;
+
+import java.nio.IntBuffer;
+
+import jogamp.opengl.Debug;
+
+import com.jogamp.common.util.LongIntHashMap;
+
+/**
+ * This implementation provides recursive calls to
+ * {@link EGL#eglInitialize(long, IntBuffer, IntBuffer)} and {@link EGL#eglTerminate(long)},
+ * where <code>eglInitialize(..)</code> is issued only for the 1st call per <code>eglDisplay</code>
+ * and <code>eglTerminate(..)</code> is issued only for the last call.
+ * <p>
+ * This class is required, due to implementation bugs within EGL where {@link EGL#eglTerminate(long)}
+ * does not mark the resource for deletion when still in use, bug releases them immediatly.
+ * </p>
+ */
+public class EGLDisplayUtil {
+ protected static final boolean DEBUG = Debug.debug("EGL");
+
+ static LongIntHashMap eglDisplayCounter;
+
+ static {
+ eglDisplayCounter = new LongIntHashMap();
+ eglDisplayCounter.setKeyNotFoundValue(0);
+ }
+
+ public static long eglGetDisplay(long nativeDisplay_id) {
+ return EGL.eglGetDisplay(nativeDisplay_id);
+ }
+
+ public static synchronized boolean eglInitialize(long eglDisplay, int[] major, int major_offset, int[] minor, int minor_offset) {
+ final boolean res;
+ final int refCnt = eglDisplayCounter.get(eglDisplay) + 1; // 0 + 1 = 1 -> 1st init
+ if(1==refCnt) {
+ res = EGL.eglInitialize(eglDisplay, major, major_offset, minor, minor_offset);
+ } else {
+ res = true;
+ }
+ eglDisplayCounter.put(eglDisplay, refCnt);
+ if(DEBUG) {
+ System.err.println("EGL.eglInitialize(0x"+Long.toHexString(eglDisplay)+" ...): #"+refCnt+" = "+res);
+ }
+ return res;
+ }
+
+ public static synchronized boolean eglInitialize(long eglDisplay, IntBuffer major, IntBuffer minor) {
+ final boolean res;
+ final int refCnt = eglDisplayCounter.get(eglDisplay) + 1; // 0 + 1 = 1 -> 1st init
+ if(1==refCnt) { // only initialize once
+ res = EGL.eglInitialize(eglDisplay, major, minor);
+ } else {
+ res = true;
+ }
+ eglDisplayCounter.put(eglDisplay, refCnt);
+ if(DEBUG) {
+ System.err.println("EGL.eglInitialize(0x"+Long.toHexString(eglDisplay)+" ...): #"+refCnt+" = "+res);
+ }
+ return res;
+ }
+
+ public static synchronized boolean eglTerminate(long eglDisplay) {
+ final boolean res;
+ final int refCnt = eglDisplayCounter.get(eglDisplay) - 1; // 1 - 1 = 0 -> final terminate
+ if(0==refCnt) { // no terminate if still in use or already terminated
+ res = EGL.eglTerminate(eglDisplay);
+ } else {
+ res = true;
+ }
+ if(0<=refCnt) { // no negative refCount
+ eglDisplayCounter.put(eglDisplay, refCnt);
+ }
+ if(DEBUG) {
+ System.err.println("EGL.eglTerminate(0x"+Long.toHexString(eglDisplay)+" ...): #"+refCnt+" = "+res);
+ }
+ return res;
+ }
+}
diff --git a/src/jogl/classes/jogamp/opengl/egl/EGLDrawable.java b/src/jogl/classes/jogamp/opengl/egl/EGLDrawable.java
index c4e16b784..a74d7d610 100644
--- a/src/jogl/classes/jogamp/opengl/egl/EGLDrawable.java
+++ b/src/jogl/classes/jogamp/opengl/egl/EGLDrawable.java
@@ -163,20 +163,20 @@ public abstract class EGLDrawable extends GLDrawableImpl {
} else {
nDisplay = aDevice.getHandle(); // 0 == EGL.EGL_DEFAULT_DISPLAY
}
- eglDisplay = EGL.eglGetDisplay(nDisplay);
+ eglDisplay = EGLDisplayUtil.eglGetDisplay(nDisplay);
if (eglDisplay == EGL.EGL_NO_DISPLAY) {
if(DEBUG) {
System.err.println(getThreadName() + ": eglDisplay("+toHexString(nDisplay)+" <surfaceHandle>): failed, using EGL_DEFAULT_DISPLAY");
}
nDisplay = EGL.EGL_DEFAULT_DISPLAY;
- eglDisplay = EGL.eglGetDisplay(nDisplay);
+ eglDisplay = EGLDisplayUtil.eglGetDisplay(nDisplay);
}
if (eglDisplay == EGL.EGL_NO_DISPLAY) {
throw new GLException("Failed to created EGL display: nhandle "+toHexString(nDisplay)+", "+aDevice+", error "+toHexString(EGL.eglGetError()));
} else if(DEBUG) {
System.err.println(getThreadName() + ": eglDisplay("+toHexString(nDisplay)+"): "+toHexString(eglDisplay));
}
- if (!EGL.eglInitialize(eglDisplay, null, null)) {
+ if (!EGLDisplayUtil.eglInitialize(eglDisplay, null, null)) {
throw new GLException("eglInitialize failed"+", error "+Integer.toHexString(EGL.eglGetError()));
}
EGLGraphicsDevice e = new EGLGraphicsDevice(eglDisplay, AbstractGraphicsDevice.DEFAULT_CONNECTION, AbstractGraphicsDevice.DEFAULT_UNIT);
@@ -208,7 +208,7 @@ public abstract class EGLDrawable extends GLDrawableImpl {
if(DEBUG) {
System.err.println(getThreadName() + ": EGLDrawable.setRealized(false): eglTerminate: "+toHexString(eglDisplay));
}
- EGL.eglTerminate(eglDisplay);
+ EGLDisplayUtil.eglTerminate(eglDisplay);
}
eglDisplay=EGL.EGL_NO_DISPLAY;
eglConfig=null;
diff --git a/src/jogl/classes/jogamp/opengl/egl/EGLDrawableFactory.java b/src/jogl/classes/jogamp/opengl/egl/EGLDrawableFactory.java
index 56d14fc8f..2a6985d90 100644
--- a/src/jogl/classes/jogamp/opengl/egl/EGLDrawableFactory.java
+++ b/src/jogl/classes/jogamp/opengl/egl/EGLDrawableFactory.java
@@ -152,7 +152,7 @@ public class EGLDrawableFactory extends GLDrawableFactoryImpl {
if(DEBUG) {
System.err.println("EGLDrawableFactory.destroy("+shutdownType+"): "+sr.device.toString());
}
- EGL.eglTerminate(sr.device.getHandle());
+ EGLDisplayUtil.eglTerminate(sr.device.getHandle());
}
sharedMap.clear();
sharedMap = null;
@@ -249,13 +249,13 @@ public class EGLDrawableFactory extends GLDrawableFactoryImpl {
sr = (SharedResource) sharedMap.get(connection);
}
if(null==sr) {
- long eglDisplay = EGL.eglGetDisplay(EGL.EGL_DEFAULT_DISPLAY);
+ long eglDisplay = EGLDisplayUtil.eglGetDisplay(EGL.EGL_DEFAULT_DISPLAY);
if (eglDisplay == EGL.EGL_NO_DISPLAY) {
throw new GLException("Failed to created EGL default display: error 0x"+Integer.toHexString(EGL.eglGetError()));
} else if(DEBUG) {
System.err.println("EGLDrawableFactory.createShared: eglDisplay(EGL_DEFAULT_DISPLAY): 0x"+Long.toHexString(eglDisplay));
}
- if (!EGL.eglInitialize(eglDisplay, null, null)) {
+ if (!EGLDisplayUtil.eglInitialize(eglDisplay, null, null)) {
throw new GLException("eglInitialize failed"+", error 0x"+Integer.toHexString(EGL.eglGetError()));
}
final EGLGraphicsDevice sharedDevice = new EGLGraphicsDevice(eglDisplay, connection, adevice.getUnitID());