aboutsummaryrefslogtreecommitdiffstats
path: root/src/jogl
diff options
context:
space:
mode:
Diffstat (limited to 'src/jogl')
-rw-r--r--src/jogl/classes/javax/media/opengl/GLRunnable.java6
-rw-r--r--src/jogl/classes/jogamp/opengl/GLDrawableHelper.java30
-rw-r--r--src/jogl/classes/jogamp/opengl/GLRunnableTask.java8
3 files changed, 29 insertions, 15 deletions
diff --git a/src/jogl/classes/javax/media/opengl/GLRunnable.java b/src/jogl/classes/javax/media/opengl/GLRunnable.java
index de0f5df48..cbd086c77 100644
--- a/src/jogl/classes/javax/media/opengl/GLRunnable.java
+++ b/src/jogl/classes/javax/media/opengl/GLRunnable.java
@@ -41,7 +41,11 @@ public interface GLRunnable {
/**
* Called by the drawable to initiate one-shot OpenGL commands by the
* client, like {@link GLEventListener#display(GLAutoDrawable)}.
+ *
+ * @param drawable the associated drawable the implementation shall use
+ * @return false if impl invalidates the back buffers, hence {@link GLAutoDrawable#display()} will
+ * issue another {@link GLEventListener#display(GLAutoDrawable)} call. Otherwise true.
*/
- void run(GLAutoDrawable drawable);
+ boolean run(GLAutoDrawable drawable);
}
diff --git a/src/jogl/classes/jogamp/opengl/GLDrawableHelper.java b/src/jogl/classes/jogamp/opengl/GLDrawableHelper.java
index 887e571cc..9353479ab 100644
--- a/src/jogl/classes/jogamp/opengl/GLDrawableHelper.java
+++ b/src/jogl/classes/jogamp/opengl/GLDrawableHelper.java
@@ -156,16 +156,21 @@ public class GLDrawableHelper {
}
public final void display(GLAutoDrawable drawable) {
- synchronized(listenersLock) {
- for (int i=0; i < listeners.size(); i++) {
- final GLEventListener listener = listeners.get(i) ;
- // GLEventListener may need to be init,
- // in case this one is added after the realization of the GLAutoDrawable
- init( listener, drawable, true ) ;
- listener.display(drawable);
- }
+ displayImpl(drawable);
+ if(!execGLRunnables(drawable)) {
+ displayImpl(drawable);
}
- execGLRunnables(drawable);
+ }
+ private void displayImpl(GLAutoDrawable drawable) {
+ synchronized(listenersLock) {
+ for (int i=0; i < listeners.size(); i++) {
+ final GLEventListener listener = listeners.get(i) ;
+ // GLEventListener may need to be init,
+ // in case this one is added after the realization of the GLAutoDrawable
+ init( listener, drawable, true ) ;
+ listener.display(drawable);
+ }
+ }
}
private void reshape(GLEventListener listener, GLAutoDrawable drawable,
@@ -184,7 +189,8 @@ public class GLDrawableHelper {
}
}
- private void execGLRunnables(GLAutoDrawable drawable) {
+ private boolean execGLRunnables(GLAutoDrawable drawable) {
+ boolean res = true;
if(glRunnables.size()>0) {
// swap one-shot list asap
ArrayList<GLRunnable> _glRunnables = null;
@@ -194,12 +200,14 @@ public class GLDrawableHelper {
glRunnables = new ArrayList<GLRunnable>();
}
}
+
if(null!=_glRunnables) {
for (int i=0; i < _glRunnables.size(); i++) {
- _glRunnables.get(i).run(drawable);
+ res = _glRunnables.get(i).run(drawable) && res;
}
}
}
+ return res;
}
public final void setAnimator(GLAnimatorControl animator) throws GLException {
diff --git a/src/jogl/classes/jogamp/opengl/GLRunnableTask.java b/src/jogl/classes/jogamp/opengl/GLRunnableTask.java
index e5b66b985..448f68423 100644
--- a/src/jogl/classes/jogamp/opengl/GLRunnableTask.java
+++ b/src/jogl/classes/jogamp/opengl/GLRunnableTask.java
@@ -50,10 +50,11 @@ public class GLRunnableTask implements GLRunnable {
isExecuted = false;
}
- public void run(GLAutoDrawable drawable) {
+ public boolean run(GLAutoDrawable drawable) {
+ boolean res = true;
if(null == notifyObject) {
try {
- runnable.run(drawable);
+ res = runnable.run(drawable);
} catch (Throwable t) {
runnableException = t;
if(catchExceptions) {
@@ -67,7 +68,7 @@ public class GLRunnableTask implements GLRunnable {
} else {
synchronized (notifyObject) {
try {
- runnable.run(drawable);
+ res = runnable.run(drawable);
} catch (Throwable t) {
runnableException = t;
if(catchExceptions) {
@@ -81,6 +82,7 @@ public class GLRunnableTask implements GLRunnable {
}
}
}
+ return res;
}
public boolean isExecuted() { return isExecuted; }