From 5cb08416a6ed44814065771f469a94f79c49ab3f Mon Sep 17 00:00:00 2001
From: Sven Gothel
* A master {@link GLContext} is the {@link GLContext} which is created first, - * shared {@link GLContext} w/ this master are referred as slave {@link GLContext}. + * shared {@link GLContext} w/ this master are referred as slave {@link GLContext} + * and controls the shared object's lifecycle, i.e. their construction and destruction. *
- *
- * Be aware that the master {@link GLContext} and related resources, i.e. the {@link GLAutoDrawable},
- * shall not be destroyed before it's slave {@link GLContext} instances.
- * Otherwise the OpenGL driver implementation may crash w/ SIGSEGV if shared resources are still used!
- * Note that this is not specified within OpenGL and should work, however, some drivers
- * do not seem to handle this situation well, i.e. they do not postpone resource destruction
- * until the last reference is removed.
- * Since pending destruction of {@link GLContext} and it's {@link GLDrawable} is complex and nearly impossible
- * for us at the top level, considering the different windowing systems and {@link GLAutoDrawable} types,
- * the user shall take care of proper destruction order.
+ * Be aware that the master {@link GLContext} and related resources
+ * shall not be destroyed before it's slave {@link GLContext} instances while they are using them.
+ * Otherwise the OpenGL driver implementation may crash w/ SIGSEGV, since using already destroyed resources,
+ * e.g. OpenGL buffer objects, may not be validated by the driver!
*
- * Users may use a {@link GLDrawableFactory#createDummyDrawable(javax.media.nativewindow.AbstractGraphicsDevice, boolean, GLProfile) dummy} + * Either proper lifecycle synchronization is implemented, e.g. by notifying the slaves about the loss of the shared resources, + * or the slaves validate whether the resources are still valid. + *
+ *
+ * To simplify above lifecycle issues, one may use a {@link GLDrawableFactory#createDummyDrawable(javax.media.nativewindow.AbstractGraphicsDevice, boolean, GLProfile) dummy}
* {@link GLDrawable} and it's {@link GLContext} as the master of all shared slave {@link GLContext}.
- * Same constraints as above apply, i.e. it shall be destroyed after all shared slaves.
+ * Since this dummy instance does not depend on any native windowing system, it can be controlled easily w/o being in sight.
+ * Below code creates a {@link GLAutoDrawable} based on a dummy GLDrawable:
+ *
+ // GLProfile and GLCapabilities should be equal across all shared GL drawable/context. + final GLCapabilitiesImmutable caps = ... ; + final GLProfile glp = caps.getGLProfile(); + .. + final boolean createNewDevice = true; // use 'own' display device! + final GLAutoDrawable sharedDrawable = GLDrawableFactory.getFactory(glp).createDummyAutoDrawable(null, createNewDevice, glp); + sharedDrawable.display(); // triggers GLContext object creation and native realization. + ... + // Later a shared 'slave' can be created e.g.: + GLWindow glad = GLWindow.create(caps); // or any other GLAutoDrawable supporting GLSharedContextSetter + glad.setSharedAutoDrawable(sharedDrawable); + glad.addGLEventListener(..); + glad.setVisible(true); // GLWindow creation .. + ** */ public interface GLSharedContextSetter extends GLAutoDrawable { @@ -69,7 +85,7 @@ public interface GLSharedContextSetter extends GLAutoDrawable { * as long it is not {@link GLContext#isCreated() created natively}. * *
- * See driver stability constraints. + * See Lifecycle Considerations. *
* * @param sharedContext The OpenGL context to be shared by this {@link GLAutoDrawable}'s {@link GLContext}. @@ -93,7 +109,7 @@ public interface GLSharedContextSetter extends GLAutoDrawable { * or has not been {@link GLContext#isCreated() created natively}. * *- * See driver stability constraints. + * See Lifecycle Considerations. *
* * @param sharedContext The GLAutoDrawable, which OpenGL context shall be shared by this {@link GLAutoDrawable}'s {@link GLContext}. diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES2AWT3.java b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES2AWT3.java index 710a9772b..ede01b52f 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES2AWT3.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES2AWT3.java @@ -97,8 +97,7 @@ public class TestSharedContextVBOES2AWT3 extends UITestCase { syncedOneAnimator(true); } - // Don't test erroneous test case ! - // @Test + @Test public void test02SyncedOneAnimatorDirtyDtorOrder() throws InterruptedException, InvocationTargetException { syncedOneAnimator(false); } @@ -234,13 +233,12 @@ public class TestSharedContextVBOES2AWT3 extends UITestCase { } @Test - public void test11SyncEachAnimatorCleanDtorOrder() throws InterruptedException, InvocationTargetException { + public void test11AsyncEachAnimatorCleanDtorOrder() throws InterruptedException, InvocationTargetException { syncedOneAnimator(true); } - // Don't test erroneous test case ! - // @Test - public void test12SyncEachAnimatorDirtyDtorOrder() throws InterruptedException, InvocationTargetException { + @Test + public void test12AsyncEachAnimatorDirtyDtorOrder() throws InterruptedException, InvocationTargetException { asyncEachOneAnimator(false); } diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES2NEWT1.java b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES2NEWT1.java index 827601869..3cd26028b 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES2NEWT1.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES2NEWT1.java @@ -34,11 +34,9 @@ import javax.media.nativewindow.util.InsetsImmutable; import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLCapabilities; import javax.media.opengl.GLContext; -import javax.media.opengl.GLDrawable; import javax.media.opengl.GLDrawableFactory; import javax.media.opengl.GLProfile; -import com.jogamp.opengl.GLAutoDrawableDelegate; import com.jogamp.opengl.util.Animator; import com.jogamp.opengl.test.junit.util.AWTRobotUtil; import com.jogamp.opengl.test.junit.util.MiscUtils; @@ -107,9 +105,7 @@ public class TestSharedContextVBOES2NEWT1 extends UITestCase { glWindow.setVisible(true); sharedDrawable = glWindow; } else { - GLDrawable dummyDrawable = GLDrawableFactory.getFactory(glp).createDummyDrawable(null, true /* createNewDevice */, caps.getGLProfile()); - dummyDrawable.setRealized(true); - sharedDrawable = new GLAutoDrawableDelegate(dummyDrawable, null, null, true /*ownDevice*/, null) { }; + sharedDrawable = GLDrawableFactory.getFactory(glp).createDummyAutoDrawable(null, true /* createNewDevice */, caps.getGLProfile()); } Assert.assertNotNull(sharedDrawable); Assert.assertTrue(AWTRobotUtil.waitForRealized(sharedDrawable, true)); diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES2NEWT2.java b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES2NEWT2.java index d9fe2a949..24dc09ffb 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES2NEWT2.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES2NEWT2.java @@ -100,8 +100,7 @@ public class TestSharedContextVBOES2NEWT2 extends UITestCase { syncedOneAnimator(true); } - // Don't test erroneous test case ! - // @Test + @Test public void test02SyncedOneAnimatorDirtyDtorOrder() throws InterruptedException { syncedOneAnimator(false); } @@ -215,12 +214,11 @@ public class TestSharedContextVBOES2NEWT2 extends UITestCase { } @Test - public void test11ASyncEachAnimatorCleanDtorOrder() throws InterruptedException { + public void test11AsyncEachAnimatorCleanDtorOrder() throws InterruptedException { asyncEachAnimator(true); } - // Don't test erroneous test case ! - // @Test + @Test public void test12AsyncEachAnimatorDirtyDtorOrder() throws InterruptedException { asyncEachAnimator(false); } diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES2NEWT3.java b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES2NEWT3.java index adadf85e3..96a8a5094 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES2NEWT3.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES2NEWT3.java @@ -97,8 +97,7 @@ public class TestSharedContextVBOES2NEWT3 extends UITestCase { syncedOneAnimator(true); } - // Don't test erroneous test case ! - // @Test + @Test public void test02SyncedOneAnimatorDirtyDtorOrder() throws InterruptedException { syncedOneAnimator(false); } @@ -203,8 +202,7 @@ public class TestSharedContextVBOES2NEWT3 extends UITestCase { asyncEachAnimator(true); } - // Don't test erroneous test case ! - // @Test + @Test public void test12AsyncEachAnimatorDirtyDtorOrder() throws InterruptedException { asyncEachAnimator(false); } diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/demos/es1/GearsObjectES1.java b/src/test/com/jogamp/opengl/test/junit/jogl/demos/es1/GearsObjectES1.java index 1edf1c3a8..fb9251e75 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/demos/es1/GearsObjectES1.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/demos/es1/GearsObjectES1.java @@ -52,9 +52,11 @@ public class GearsObjectES1 extends GearsObject { } private void draw(GL2ES1 gl, GLArrayDataServer array, int mode) { - array.enableBuffer(gl, true); - gl.glDrawArrays(mode, 0, array.getElementCount()); - array.enableBuffer(gl, false); + if( !isShared || gl.glIsBuffer(array.getVBOName()) ) { + array.enableBuffer(gl, true); + gl.glDrawArrays(mode, 0, array.getElementCount()); + array.enableBuffer(gl, false); + } } @Override diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/demos/es2/GearsObjectES2.java b/src/test/com/jogamp/opengl/test/junit/jogl/demos/es2/GearsObjectES2.java index 82e9089cf..f3367ad1c 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/demos/es2/GearsObjectES2.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/demos/es2/GearsObjectES2.java @@ -89,10 +89,12 @@ public class GearsObjectES2 extends GearsObject { } private void draw(GL2ES2 gl, GLArrayDataServer array, int mode, int face) { - array.enableBuffer(gl, true); - // System.err.println("XXX Draw face "+face+" of "+this); - gl.glDrawArrays(mode, 0, array.getElementCount()); - array.enableBuffer(gl, false); + if( !isShared || gl.glIsBuffer(array.getVBOName()) ) { + array.enableBuffer(gl, true); + // System.err.println("XXX Draw face "+face+" of "+this); + gl.glDrawArrays(mode, 0, array.getElementCount()); + array.enableBuffer(gl, false); + } } @Override -- cgit v1.2.3