From 94eae65015f188ff88324710d12895aba71d6f9d Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Mon, 17 Sep 2012 00:01:51 +0200 Subject: Analyze crash of shared context each running in multiple threads, disabled test for OSX > 10.7.0 Shared context w/ 3 context each running in there own thread is instable here on OSX 10.7.4/NVidia, SIGSEGV @ glDrawArrays / glBindBuffer .. any shared VBO. Seems to run fine on 10.6.8/NVidia. --- .../jogl/acore/TestSharedContextVBOES2NEWT.java | 124 ++++++++++++++-- .../jogl/acore/TestSharedContextVBOES2NEWT2.java | 156 --------------------- 2 files changed, 109 insertions(+), 171 deletions(-) delete mode 100644 src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES2NEWT2.java (limited to 'src') diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES2NEWT.java b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES2NEWT.java index da91350f1..4aa977ae8 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES2NEWT.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES2NEWT.java @@ -28,12 +28,14 @@ package com.jogamp.opengl.test.junit.jogl.acore; +import com.jogamp.common.os.Platform; +import com.jogamp.common.util.VersionNumber; import com.jogamp.newt.opengl.GLWindow; import javax.media.nativewindow.util.InsetsImmutable; +import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLCapabilities; import javax.media.opengl.GLDrawableFactory; -import javax.media.opengl.GLOffscreenAutoDrawable; import javax.media.opengl.GLProfile; import com.jogamp.opengl.util.Animator; @@ -49,7 +51,7 @@ public class TestSharedContextVBOES2NEWT extends UITestCase { static GLProfile glp; static GLCapabilities caps; static int width, height; - GLOffscreenAutoDrawable sharedDrawable; + GLAutoDrawable sharedDrawable; GearsES2 sharedGears; @BeforeClass @@ -66,8 +68,16 @@ public class TestSharedContextVBOES2NEWT extends UITestCase { } } - private void initShared() { - sharedDrawable = GLDrawableFactory.getFactory(glp).createOffscreenAutoDrawable(null, caps, null, width, height, null); + private void initShared(boolean onscreen) { + if(onscreen) { + GLWindow glWindow = GLWindow.create(caps); + Assert.assertNotNull(glWindow); + glWindow.setSize(width, height); + glWindow.setVisible(true); + sharedDrawable = glWindow; + } else { + sharedDrawable = GLDrawableFactory.getFactory(glp).createOffscreenAutoDrawable(null, caps, null, width, height, null); + } Assert.assertNotNull(sharedDrawable); sharedGears = new GearsES2(); Assert.assertNotNull(sharedGears); @@ -79,6 +89,7 @@ public class TestSharedContextVBOES2NEWT extends UITestCase { private void releaseShared() { Assert.assertNotNull(sharedDrawable); sharedDrawable.destroy(); + sharedDrawable = null; } protected GLWindow runTestGL(Animator animator, int x, int y, boolean useShared, boolean vsync) throws InterruptedException { @@ -86,7 +97,7 @@ public class TestSharedContextVBOES2NEWT extends UITestCase { Assert.assertNotNull(glWindow); glWindow.setTitle("Shared Gears NEWT Test: "+x+"/"+y+" shared "+useShared); if(useShared) { - glWindow.setSharedContext(sharedDrawable.getContext()); + glWindow.setSharedContext(sharedDrawable.getContext()); } glWindow.setSize(width, height); @@ -98,41 +109,120 @@ public class TestSharedContextVBOES2NEWT extends UITestCase { glWindow.addGLEventListener(gears); animator.add(glWindow); - + animator.start(); glWindow.setVisible(true); Assert.assertTrue(AWTRobotUtil.waitForRealized(glWindow, true)); Assert.assertTrue(AWTRobotUtil.waitForVisible(glWindow, true)); - + glWindow.setPosition(x, y); return glWindow; } @Test - public void test01() throws InterruptedException { - initShared(); + public void testCommonAnimatorSharedOnscreen() throws InterruptedException { + initShared(true); + Animator animator = new Animator(); + GLWindow f1 = runTestGL(animator, 0, 0, true, false); + InsetsImmutable insets = f1.getInsets(); + GLWindow f2 = runTestGL(animator, f1.getX()+width+insets.getTotalWidth(), + f1.getY()+0, true, false); + GLWindow f3 = runTestGL(animator, f1.getX()+0, + f1.getY()+height+insets.getTotalHeight(), true, false); + try { + Thread.sleep(duration); + } catch(Exception e) { + e.printStackTrace(); + } + animator.stop(); + + f1.destroy(); + f2.destroy(); + f3.destroy(); + Assert.assertTrue(AWTRobotUtil.waitForVisible(f1, false)); + Assert.assertTrue(AWTRobotUtil.waitForRealized(f1, false)); + Assert.assertTrue(AWTRobotUtil.waitForVisible(f2, false)); + Assert.assertTrue(AWTRobotUtil.waitForRealized(f2, false)); + Assert.assertTrue(AWTRobotUtil.waitForVisible(f3, false)); + Assert.assertTrue(AWTRobotUtil.waitForRealized(f3, false)); + + releaseShared(); + } + + @Test + public void testCommonAnimatorSharedOffscreen() throws InterruptedException { + initShared(false); Animator animator = new Animator(); GLWindow f1 = runTestGL(animator, 0, 0, true, false); InsetsImmutable insets = f1.getInsets(); GLWindow f2 = runTestGL(animator, f1.getX()+width+insets.getTotalWidth(), f1.getY()+0, true, false); GLWindow f3 = runTestGL(animator, f1.getX()+0, - f1.getY()+height+insets.getTotalHeight(), false, true); - animator.setUpdateFPSFrames(1, null); - animator.start(); - while(animator.isAnimating() && animator.getTotalFPSDuration() 0 ) { + // instable on OSX .. driver/OS bug when multi threading (3 animator) + System.err.println("Shared context w/ 3 context each running in there own thread is instable here on OSX 10.7.4/NVidia,"); + System.err.println("SIGSEGV @ glDrawArrays / glBindBuffer .. any shared VBO."); + System.err.println("Seems to run fine on 10.6.8/NVidia."); + return; + } + initShared(false); + Animator animator1 = new Animator(); + Animator animator2 = new Animator(); + Animator animator3 = new Animator(); + GLWindow f1 = runTestGL(animator1, 0, 0, true, false); + InsetsImmutable insets = f1.getInsets(); + GLWindow f2 = runTestGL(animator2, f1.getX()+width+insets.getTotalWidth(), + f1.getY()+0, true, false); + GLWindow f3 = runTestGL(animator3, f1.getX()+0, + f1.getY()+height+insets.getTotalHeight(), true, false); + + try { + Thread.sleep(duration); + } catch(Exception e) { + e.printStackTrace(); + } + animator1.stop(); + animator2.stop(); + animator3.stop(); - static long duration = 500; // ms + f1.destroy(); + f2.destroy(); + f3.destroy(); + Assert.assertTrue(AWTRobotUtil.waitForVisible(f1, false)); + Assert.assertTrue(AWTRobotUtil.waitForRealized(f1, false)); + Assert.assertTrue(AWTRobotUtil.waitForVisible(f2, false)); + Assert.assertTrue(AWTRobotUtil.waitForRealized(f2, false)); + Assert.assertTrue(AWTRobotUtil.waitForVisible(f3, false)); + Assert.assertTrue(AWTRobotUtil.waitForRealized(f3, false)); + + releaseShared(); + } + + static long duration = 2000; // ms public static void main(String args[]) { for(int i=0; i