Jogamp
TestTessellationShader01GL4NEWT: Add robustness, i.e. case where tessellation failed...
authorSven Gothel <sgothel@jausoft.com>
Wed, 8 Oct 2014 19:14:35 +0000 (21:14 +0200)
committerSven Gothel <sgothel@jausoft.com>
Wed, 8 Oct 2014 20:32:33 +0000 (22:32 +0200)
make/scripts/tests.sh
src/test/com/jogamp/opengl/test/junit/jogl/demos/gl4/TessellationShader01aGLSL440CoreHardcoded.java [moved from src/test/com/jogamp/opengl/test/junit/jogl/demos/gl4/TessellationShader01aGL4.java with 89% similarity]
src/test/com/jogamp/opengl/test/junit/jogl/demos/gl4/TessellationShader01bGL4.java
src/test/com/jogamp/opengl/test/junit/jogl/demos/gl4/newt/TestTessellationShader01GL4NEWT.java

index c0bfcc5..ae0b247 100644 (file)
@@ -130,7 +130,7 @@ function jrun() {
     #D_ARGS="-Djogl.debug.GLBufferObjectTracker -Djogl.debug.GLArrayData -Djogl.debug.TraceGL -Djogl.debug.DebugGL"
     #D_ARGS="-Djogl.debug.GLSLCode"
     #D_ARGS="-Djogl.debug.GLSLCode -Djogl.debug.TraceGL"
-    #D_ARGS="-Djogl.debug.GLSLCode -Djogl.debug.DebugGL"
+    D_ARGS="-Djogl.debug.GLSLCode -Djogl.debug.DebugGL"
     #D_ARGS="-Djogl.debug.GLContext -Dnativewindow.debug.JAWT -Dnewt.debug.Window"
     #D_ARGS="-Dnativewindow.debug.JAWT -Djogl.debug.GLCanvas"
     #D_ARGS="-Dnativewindow.debug.JAWT -Djogamp.debug.TaskBase.TraceSource"
@@ -432,7 +432,7 @@ function testawtswt() {
 #testnoawt com.jogamp.opengl.test.junit.jogl.demos.gl2.newt.TestGearsNEWT $*
 #testnoawt com.jogamp.opengl.test.junit.jogl.demos.gl2.newt.TestTeapotNEWT $*
 #testnoawt com.jogamp.opengl.test.junit.jogl.demos.gl3.newt.TestGeomShader01TextureGL3NEWT $*
-#testnoawt com.jogamp.opengl.test.junit.jogl.demos.gl4.newt.TestTessellationShader01GL4NEWT $*
+testnoawt com.jogamp.opengl.test.junit.jogl.demos.gl4.newt.TestTessellationShader01GL4NEWT $*
 
 #
 # av demos
@@ -729,7 +729,7 @@ function testawtswt() {
 #testawt com.jogamp.opengl.test.junit.newt.TestListenerCom01AWT
 #testawt com.jogamp.opengl.test.junit.jogl.caps.TestMultisampleES1AWT $*
 #testnoawt com.jogamp.opengl.test.junit.jogl.caps.TestMultisampleES1NEWT $*
-testnoawt com.jogamp.opengl.test.junit.jogl.caps.TestMultisampleES2NEWT $*
+#testnoawt com.jogamp.opengl.test.junit.jogl.caps.TestMultisampleES2NEWT $*
 #testawt com.jogamp.opengl.test.junit.jogl.caps.TestTranslucencyAWT $*
 #testawt com.jogamp.opengl.test.junit.jogl.caps.TestTranslucencyNEWT $*
 #testnoawt com.jogamp.opengl.test.junit.newt.parenting.TestTranslucentChildWindowBug632NEWT $*
@@ -49,7 +49,7 @@ import com.jogamp.opengl.util.glsl.ShaderProgram;
  * @author Raymond L. Rivera, 2014
  * @author Sven Gothel
  */
-public class TessellationShader01aGL4 implements GLEventListener  {
+public class TessellationShader01aGLSL440CoreHardcoded implements GLEventListener  {
     private static final double ANIMATION_RATE = 950.0;
 
     private ShaderProgram program;
@@ -60,6 +60,12 @@ public class TessellationShader01aGL4 implements GLEventListener  {
 
     @Override
     public void init(final GLAutoDrawable auto) {
+        final GL4 gl = auto.getGL().getGL4();
+        program = createProgram(auto);
+        if( null == program ) {
+            return;
+        }
+
         final double theta = System.currentTimeMillis() / ANIMATION_RATE;
         vertexOffset = FloatBuffer.allocate(4);
         vertexOffset.put(0, (float)(Math.sin(theta) * 0.5f));
@@ -73,8 +79,6 @@ public class TessellationShader01aGL4 implements GLEventListener  {
         backgroundColor.put(2, 0.25f);
         backgroundColor.put(3, 1.0f);
 
-        final GL4 gl = auto.getGL().getGL4();
-        program = createProgram(auto);
         gl.glGenVertexArrays(vertexArray.length, vertexArray, 0);
         gl.glBindVertexArray(vertexArray[0]);
         gl.glPatchParameteri(GL4.GL_PATCH_VERTICES, 3);
@@ -83,6 +87,9 @@ public class TessellationShader01aGL4 implements GLEventListener  {
 
     @Override
     public void display(final GLAutoDrawable auto) {
+        if( null == program ) {
+            return;
+        }
         final GL4 gl = auto.getGL().getGL4();
         final double value = System.currentTimeMillis() / ANIMATION_RATE;
         gl.glClearBufferfv(GL2ES3.GL_COLOR, 0, backgroundColor);
@@ -95,6 +102,9 @@ public class TessellationShader01aGL4 implements GLEventListener  {
 
     @Override
     public void dispose(final GLAutoDrawable auto) {
+        if( null == program ) {
+            return;
+        }
         final GL4 gl = auto.getGL().getGL4();
         gl.glDeleteVertexArrays(vertexArray.length, vertexArray, 0);
         program.destroy(gl);
@@ -157,9 +167,27 @@ public class TessellationShader01aGL4 implements GLEventListener  {
             "}                                                          \n";
 
         final ShaderCode vertexShader     = createShader(gl, GL2ES2.GL_VERTEX_SHADER, vertexSource);
+        if( null == vertexShader ) {
+            return null;
+        }
         final ShaderCode tessCtrlShader   = createShader(gl, GL4.GL_TESS_CONTROL_SHADER, tessCtrlSource);
+        if( null == tessCtrlShader ) {
+            vertexShader.destroy(gl);
+            return null;
+        }
         final ShaderCode tessEvalShader   = createShader(gl, GL4.GL_TESS_EVALUATION_SHADER, tessEvalSource);
+        if( null == tessEvalShader ) {
+            vertexShader.destroy(gl);
+            tessCtrlShader.destroy(gl);
+            return null;
+        }
         final ShaderCode fragmentShader   = createShader(gl, GL2ES2.GL_FRAGMENT_SHADER, fragmentSource);
+        if( null == fragmentShader ) {
+            vertexShader.destroy(gl);
+            tessCtrlShader.destroy(gl);
+            tessEvalShader.destroy(gl);
+            return null;
+        }
 
         final ShaderProgram program       = new ShaderProgram();
 
@@ -170,10 +198,13 @@ public class TessellationShader01aGL4 implements GLEventListener  {
         program.add(fragmentShader);
 
         program.link(gl, System.err);
-        if(!program.validateProgram(gl, System.out))
+        if( !program.validateProgram(gl, System.out) ) {
             System.err.println("[error] Program linking failed.");
-
-        return program;
+            program.destroy(gl);
+            return null;
+        } else {
+            return program;
+        }
     }
 
     private ShaderCode createShader(final GL4 gl, final int shaderType, final String source) {
@@ -182,10 +213,13 @@ public class TessellationShader01aGL4 implements GLEventListener  {
         final ShaderCode shader = new ShaderCode(shaderType, sources.length, sources);
 
         final boolean compiled = shader.compile(gl, System.err);
-        if (!compiled)
+        if (!compiled) {
             System.err.println("[error] Shader compilation failed.");
-
-        return shader;
+            shader.destroy(gl);
+            return null;
+        } else {
+            return shader;
+        }
     }
 
 }
index 7be26e4..bcf4fa6 100644 (file)
@@ -61,6 +61,12 @@ public class TessellationShader01bGL4 implements GLEventListener  {
 
     @Override
     public void init(final GLAutoDrawable auto) {
+        final GL4 gl = auto.getGL().getGL4();
+        program = createProgram(auto);
+        if( null == program ) {
+            return;
+        }
+
         final double theta = System.currentTimeMillis() / ANIMATION_RATE;
         vertexOffset = FloatBuffer.allocate(4);
         vertexOffset.put(0, (float)(Math.sin(theta) * 0.5f));
@@ -74,8 +80,6 @@ public class TessellationShader01bGL4 implements GLEventListener  {
         backgroundColor.put(2, 0.25f);
         backgroundColor.put(3, 1.0f);
 
-        final GL4 gl = auto.getGL().getGL4();
-        program = createProgram(auto);
         gl.glGenVertexArrays(vertexArray.length, vertexArray, 0);
         gl.glBindVertexArray(vertexArray[0]);
         gl.glPatchParameteri(GL4.GL_PATCH_VERTICES, 3);
@@ -84,6 +88,9 @@ public class TessellationShader01bGL4 implements GLEventListener  {
 
     @Override
     public void display(final GLAutoDrawable auto) {
+        if( null == program ) {
+            return;
+        }
         final GL4 gl = auto.getGL().getGL4();
         final double value = System.currentTimeMillis() / ANIMATION_RATE;
         gl.glClearBufferfv(GL2ES3.GL_COLOR, 0, backgroundColor);
@@ -96,6 +103,9 @@ public class TessellationShader01bGL4 implements GLEventListener  {
 
     @Override
     public void dispose(final GLAutoDrawable auto) {
+        if( null == program ) {
+            return;
+        }
         final GL4 gl = auto.getGL().getGL4();
         gl.glDeleteVertexArrays(vertexArray.length, vertexArray, 0);
         program.destroy(gl);
@@ -132,11 +142,13 @@ public class TessellationShader01bGL4 implements GLEventListener  {
             sp.add(gl, tcs, System.err);
             sp.add(gl, tes, System.err);
             sp.add(gl, fs, System.err);
-            if(!sp.link(gl, System.err)) {
-                throw new GLException("Couldn't link program: "+sp);
-            }
         }
-
-        return sp;
+        if( !sp.link(gl, System.err) ) {
+            System.err.println("[error] Couldn't link program: "+sp);
+            sp.destroy(gl);
+            return null;
+        } else {
+            return sp;
+        }
     }
 }
index a05dcec..ca26385 100644 (file)
@@ -39,7 +39,7 @@ import org.junit.FixMethodOrder;
 import org.junit.runners.MethodSorters;
 
 import com.jogamp.newt.opengl.GLWindow;
-import com.jogamp.opengl.test.junit.jogl.demos.gl4.TessellationShader01aGL4;
+import com.jogamp.opengl.test.junit.jogl.demos.gl4.TessellationShader01aGLSL440CoreHardcoded;
 import com.jogamp.opengl.test.junit.jogl.demos.gl4.TessellationShader01bGL4;
 import com.jogamp.opengl.test.junit.util.MiscUtils;
 import com.jogamp.opengl.test.junit.util.QuitAdapter;
@@ -65,7 +65,7 @@ public class TestTessellationShader01GL4NEWT extends UITestCase {
     public void test01_01a() throws InterruptedException {
         final GLCapabilities caps = getCaps(GLProfile.GL4);
         if( null == caps ) { return; }
-        testImpl(caps, new TessellationShader01aGL4());
+        testImpl(caps, new TessellationShader01aGLSL440CoreHardcoded());
     }
 
     @Test
http://JogAmp.org git info: FAQ, tutorial and man pages.