diff options
author | Sven Gothel <sgothel@jausoft.com> | 2011-04-24 12:21:36 +0200 |
---|---|---|
committer | Sven Gothel <sgothel@jausoft.com> | 2011-04-24 12:21:36 +0200 |
commit | 6c0ad949be979d5fed95a1166d59100f7bf5580f (patch) | |
tree | d69242fabf1f066d43418612209597616fba6cdd /src/test/com/jogamp/opengl | |
parent | ea819ff768d507c37a981c1ab0bdc0cad32c6a87 (diff) |
Add unified support for GL_ARB_debug_output and GL_AMD_debug_output.
If GL_ARB_debug_output is not available, but GL_AMD_debug_output exist, fallback to the latter,
offering generic aliased methods translating the delta (AMD category <-> ARB source/type).
Generic aliased methods reside in GLContext*
Enable/Disable via GLContext and GLAutoDrawable.
To enable the GLDebugOutput feature GLContext.enableGLDebugMessage(true)
or GLContext.setContextCreationFlags(GLContext.CTX_OPTION_DEBUG)
shall be called _before_ context creation via GLContext.makeCurrent()!
In case GLAutoDrawable is being used,
GLAutoDrawable.setContextCreationFlags(GLContext.CTX_OPTION_DEBUG)
shall be issued before context creation via GLContext.makeCurrent()!.
After context creation, the GLDebugOutput feature may be enabled or disabled
at any time using this method.
Verify both unit tests for usability.
Diffstat (limited to 'src/test/com/jogamp/opengl')
-rw-r--r-- | src/test/com/jogamp/opengl/test/junit/jogl/acore/TestGLDebug00NEWT.java | 220 | ||||
-rw-r--r-- | src/test/com/jogamp/opengl/test/junit/jogl/acore/TestGLDebug01NEWT.java | 189 |
2 files changed, 409 insertions, 0 deletions
diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestGLDebug00NEWT.java b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestGLDebug00NEWT.java new file mode 100644 index 000000000..c6e78b219 --- /dev/null +++ b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestGLDebug00NEWT.java @@ -0,0 +1,220 @@ +/** + * Copyright 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 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 com.jogamp.opengl.test.junit.jogl.acore; + +import java.io.IOException; + +import javax.media.opengl.GL; +import javax.media.opengl.GL2GL3; +import javax.media.opengl.GLCapabilities; +import javax.media.opengl.GLContext; +import javax.media.opengl.GLDebugListener; +import javax.media.opengl.GLDebugMessage; +import javax.media.opengl.GLDrawable; +import javax.media.opengl.GLDrawableFactory; +import javax.media.opengl.GLProfile; + +import org.junit.Assert; +import org.junit.Test; + +import com.jogamp.newt.Display; +import com.jogamp.newt.NewtFactory; +import com.jogamp.newt.Screen; +import com.jogamp.newt.Window; +import com.jogamp.opengl.test.junit.util.UITestCase; + +public class TestGLDebug00NEWT extends UITestCase { + + static String dbgTstMsg0 = "Hello World"; + static int dbgTstId0 = 42; + + public class WindowContext { + public final Window window; + public final GLContext context; + + public WindowContext(Window w, GLContext c) { + window = w; + context = c; + } + } + + WindowContext createWindow(GLProfile glp, boolean debugGL) { + GLCapabilities caps = new GLCapabilities(glp); + // + // Create native windowing resources .. X11/Win/OSX + // + Display display = NewtFactory.createDisplay(null); // local display + Assert.assertNotNull(display); + + Screen screen = NewtFactory.createScreen(display, 0); // screen 0 + Assert.assertNotNull(screen); + + Window window = NewtFactory.createWindow(screen, caps); + Assert.assertNotNull(window); + window.setSize(128, 128); + window.setVisible(true); + + GLDrawableFactory factory = GLDrawableFactory.getFactory(glp); + GLDrawable drawable = factory.createGLDrawable(window); + Assert.assertNotNull(drawable); + + drawable.setRealized(true); + + GLContext context = drawable.createContext(null); + Assert.assertNotNull(context); + + context.enableGLDebugMessage(debugGL); + + int res = context.makeCurrent(); + Assert.assertTrue(GLContext.CONTEXT_CURRENT_NEW==res || GLContext.CONTEXT_CURRENT==res); + + return new WindowContext(window, context); + } + + void destroyWindow(WindowContext winctx) { + GLDrawable drawable = winctx.context.getGLDrawable(); + + Assert.assertNotNull(winctx.context); + winctx.context.destroy(); + + Assert.assertNotNull(drawable); + drawable.setRealized(false); + + Assert.assertNotNull(winctx.window); + winctx.window.destroy(); + } + + + void test01GLDebug01EnableDisable(boolean enable, String dbgTstMsg, int dbgTstId) throws InterruptedException { + GLProfile glp = GLProfile.getDefault(); + + WindowContext winctx = createWindow(glp, enable); + MyGLDebugListener myGLDebugListener = new MyGLDebugListener(dbgTstMsg, dbgTstId); + if(enable) { + winctx.context.addGLDebugListener(myGLDebugListener); + } + String glDebugExt = winctx.context.getGLDebugMessageExtension(); + System.err.println("glDebug extension: "+glDebugExt); + System.err.println("glDebug enabled: "+winctx.context.isGLDebugMessageEnabled()); + System.err.println("glDebug listener: "+winctx.context.getGLDebugListenerSize()); + System.err.println("context version: "+winctx.context.getGLVersion()); + + Assert.assertEquals((null == glDebugExt) ? false : enable, winctx.context.isGLDebugMessageEnabled()); + Assert.assertEquals(enable?1:0, winctx.context.getGLDebugListenerSize()); + + if(winctx.context.isGLDebugMessageEnabled() && null != dbgTstMsg && 0 <= dbgTstId) { + winctx.context.glDebugMessageInsert(GL2GL3.GL_DEBUG_SOURCE_APPLICATION_ARB, + GL2GL3.GL_DEBUG_TYPE_OTHER_ARB, + dbgTstId, + GL2GL3.GL_DEBUG_SEVERITY_MEDIUM_ARB, -1, dbgTstMsg); + Assert.assertEquals(true, myGLDebugListener.received()); + } + + destroyWindow(winctx); + } + + @Test + public void test01GLDebug01Disabled() throws InterruptedException { + test01GLDebug01EnableDisable(false, null, -1); + } + + @Test + public void test01GLDebug01Enabled() throws InterruptedException { + test01GLDebug01EnableDisable(true, dbgTstMsg0, dbgTstId0); + } + + @Test + public void test02GLDebug01Error() throws InterruptedException { + GLProfile glp = GLProfile.getDefault(); + + WindowContext winctx = createWindow(glp, true); + + MyGLDebugListener myGLDebugListener = new MyGLDebugListener( + GL2GL3.GL_DEBUG_SOURCE_API_ARB, + GL2GL3.GL_DEBUG_TYPE_ERROR_ARB, + GL2GL3.GL_DEBUG_SEVERITY_HIGH_ARB); + winctx.context.addGLDebugListener(myGLDebugListener); + + GL gl = winctx.context.getGL(); + + gl.glBindFramebuffer(-1, -1); // ERROR ! + + if( winctx.context.isGLDebugMessageEnabled() ) { + Assert.assertEquals(true, myGLDebugListener.received()); + } + + destroyWindow(winctx); + } + + + public static void main(String args[]) throws IOException { + String tstname = TestGLDebug00NEWT.class.getName(); + org.junit.runner.JUnitCore.main(tstname); + } + + public class MyGLDebugListener implements GLDebugListener { + int recSource; + int recType; + int recSeverity; + + String recMsg; + int recId; + boolean received = false; + + public MyGLDebugListener(int recSource, int recType, int recSeverity) { + this.recSource = recSource; + this.recType = recType; + this.recSeverity = recSeverity; + this.recMsg = null; + this.recId = -1; + + } + public MyGLDebugListener(String recMsg, int recId) { + this.recSource = -1; + this.recType = -1; + this.recSeverity = -1; + this.recMsg = recMsg; + this.recId = recId; + } + + public boolean received() { return received; } + + public void messageSent(GLDebugMessage event) { + System.err.println("XXX: "+event); + if(null != recMsg && recMsg.equals(event.getDbgMsg()) && recId == event.getDbgId()) { + received = true; + } else if(0 <= recSource && recSource == event.getDbgSource() && + recType == event.getDbgType() && + recSeverity== event.getDbgSeverity() ) { + received = true; + } + } + } +} +
\ No newline at end of file diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestGLDebug01NEWT.java b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestGLDebug01NEWT.java new file mode 100644 index 000000000..05870ee0d --- /dev/null +++ b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestGLDebug01NEWT.java @@ -0,0 +1,189 @@ +/** + * Copyright 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 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 com.jogamp.opengl.test.junit.jogl.acore; + +import java.io.IOException; + +import javax.media.opengl.GL; +import javax.media.opengl.GL2GL3; +import javax.media.opengl.GLAutoDrawable; +import javax.media.opengl.GLCapabilities; +import javax.media.opengl.GLContext; +import javax.media.opengl.GLDebugListener; +import javax.media.opengl.GLDebugMessage; +import javax.media.opengl.GLEventListener; +import javax.media.opengl.GLProfile; +import javax.media.opengl.GLRunnable; + +import org.junit.Assert; +import org.junit.Test; + +import com.jogamp.newt.opengl.GLWindow; +import com.jogamp.opengl.test.junit.util.UITestCase; + +public class TestGLDebug01NEWT extends UITestCase { + + static String dbgTstMsg0 = "Hello World"; + static int dbgTstId0 = 42; + + GLWindow createWindow(GLProfile glp, boolean debugGL) { + GLCapabilities caps = new GLCapabilities(glp); + // + // Create native windowing resources .. X11/Win/OSX + // + GLWindow window = GLWindow.create(caps); + Assert.assertNotNull(window); + window.setContextCreationFlags(debugGL?GLContext.CTX_OPTION_DEBUG:0); + window.setSize(128, 128); + window.setVisible(true); + + Assert.assertNotNull(window.getContext()); + Assert.assertNotNull(window.getContext().isCreated()); + + return window; + } + + void destroyWindow(GLWindow window) { + window.destroy(); + } + + + void test01GLDebug01EnableDisable(boolean enable, final String dbgTstMsg, final int dbgTstId) throws InterruptedException { + GLProfile glp = GLProfile.getDefault(); + + final GLWindow window = createWindow(glp, enable); + final GLContext ctx = window.getContext(); + MyGLDebugListener myGLDebugListener = new MyGLDebugListener(dbgTstMsg, dbgTstId); + if(enable) { + ctx.addGLDebugListener(myGLDebugListener); + } + String glDebugExt = ctx.getGLDebugMessageExtension(); + System.err.println("glDebug extension: "+glDebugExt); + System.err.println("glDebug enabled: "+ctx.isGLDebugMessageEnabled()); + System.err.println("glDebug listener: "+ctx.getGLDebugListenerSize()); + System.err.println("context version: "+ctx.getGLVersion()); + + Assert.assertEquals((null == glDebugExt) ? false : enable, ctx.isGLDebugMessageEnabled()); + Assert.assertEquals(enable?1:0, ctx.getGLDebugListenerSize()); + if(ctx.isGLDebugMessageEnabled() && null != dbgTstMsg && 0 <= dbgTstId) { + window.invoke(true, new GLRunnable() { + public void run(GLAutoDrawable drawable) { + drawable.getContext().glDebugMessageInsert(GL2GL3.GL_DEBUG_SOURCE_APPLICATION_ARB, + GL2GL3.GL_DEBUG_TYPE_OTHER_ARB, + dbgTstId, + GL2GL3.GL_DEBUG_SEVERITY_MEDIUM_ARB, -1, dbgTstMsg); + } + }); + Assert.assertEquals(true, myGLDebugListener.received()); + } + + destroyWindow(window); + } + + @Test + public void test01GLDebug01Disabled() throws InterruptedException { + test01GLDebug01EnableDisable(false, null, -1); + } + + @Test + public void test01GLDebug01Enabled() throws InterruptedException { + test01GLDebug01EnableDisable(true, dbgTstMsg0, dbgTstId0); + } + + @Test + public void test02GLDebug01Error() throws InterruptedException { + GLProfile glp = GLProfile.getDefault(); + + GLWindow window = createWindow(glp, true); + + MyGLDebugListener myGLDebugListener = new MyGLDebugListener( + GL2GL3.GL_DEBUG_SOURCE_API_ARB, + GL2GL3.GL_DEBUG_TYPE_ERROR_ARB, + GL2GL3.GL_DEBUG_SEVERITY_HIGH_ARB); + window.getContext().addGLDebugListener(myGLDebugListener); + + window.invoke(true, new GLRunnable() { + public void run(GLAutoDrawable drawable) { + drawable.getGL().glBindFramebuffer(-1, -1); // ERROR ! + } + } ); + + if( window.getContext().isGLDebugMessageEnabled() ) { + Assert.assertEquals(true, myGLDebugListener.received()); + } + + destroyWindow(window); + } + + + public static void main(String args[]) throws IOException { + String tstname = TestGLDebug01NEWT.class.getName(); + org.junit.runner.JUnitCore.main(tstname); + } + + public class MyGLDebugListener implements GLDebugListener { + int recSource; + int recType; + int recSeverity; + + String recMsg; + int recId; + boolean received = false; + + public MyGLDebugListener(int recSource, int recType, int recSeverity) { + this.recSource = recSource; + this.recType = recType; + this.recSeverity = recSeverity; + this.recMsg = null; + this.recId = -1; + + } + public MyGLDebugListener(String recMsg, int recId) { + this.recSource = -1; + this.recType = -1; + this.recSeverity = -1; + this.recMsg = recMsg; + this.recId = recId; + } + + public boolean received() { return received; } + + public void messageSent(GLDebugMessage event) { + System.err.println("XXX: "+event); + if(null != recMsg && recMsg.equals(event.getDbgMsg()) && recId == event.getDbgId()) { + received = true; + } else if(0 <= recSource && recSource == event.getDbgSource() && + recType == event.getDbgType() && + recSeverity== event.getDbgSeverity() ) { + received = true; + } + } + } +} +
\ No newline at end of file |