diff options
41 files changed, 784 insertions, 426 deletions
diff --git a/README.txt b/README.txt index 4ce55f7de..b5211719d 100644 --- a/README.txt +++ b/README.txt @@ -21,7 +21,7 @@ Contact Us --------------- Web http://jogamp.org/ -Forum/Mailinglist http://jogamp.762907.n3.nabble.com/ +Forum/Mailinglist http://forum.jogamp.org/ JogAmp Channel server: conference.jabber.org room: jogamp Repository http://jogamp.org/git/ Email mediastream _at_ jogamp _dot_ org @@ -38,6 +38,9 @@ of all of the individuals who have advanced the project. For sure we are not able to list all of them here. Please contact us if you like to be added to this list. +This list can hardly cover all contributors and their contributions. +You may like to check the author field of our SCM. + (Chronological) Gerard Ziemski contributed the original port of JOGL to Mac OS X. @@ -74,7 +77,12 @@ Java2D and JOGL in Java SE 6, and also co-authored the TextureIO subsystem. Sven Gothel refactored the windowing subsystem layer to be generic, -introduced the support for multiple GL profiles, realized NEWT and more.. +introduced the support for multiple GL profiles, realized NEWT etc. +Teamed up with Rami Santina, the new graph package was realized, +exposing generic curve, text and UI support. + +Rami Santina researched and implemented the math behind the new +graph package, published .. <FIXME: Add reference>, etc. The following individuals made significant contributions to various areas of the project (Alphabetical): @@ -84,10 +92,12 @@ Alban Cousini� Athomas Goldberg Yuri Vladimir Gushchin Gregory Pierce -Rami Santina +Dominik Str�hlein (DemoscenePassivist) +Wade Walker Carsten Weisse The JogAmp Community is grateful for the support of the -javagaming.org community, from where dozens, if not hundreds, of -individuals have contributed discussions, bug reports, bug fixes, and -other forms of support. +javagaming.org community and it's own JogAmp forum, +from where dozens, if not hundreds, of individuals have +contributed discussions, bug reports, bug fixes, and other forms of support. + diff --git a/REPOSITORIES.txt b/REPOSITORIES.txt index fafd45349..decf4b36a 100644 --- a/REPOSITORIES.txt +++ b/REPOSITORIES.txt @@ -1 +1,5 @@ -test .. +jogamp git://jogamp.org/srv/scm/jogl.git (fetch) +sgothel git://github.com/sgothel/jogl.git (fetch) +rsantina git://github.com/rsantina/jogl.git (fetch) +wwalker git://github.com/WadeWalker/jogl.git (fetch) +jausoft git://jausoft.com/srv/scm/jogl.git (fetch) diff --git a/make/scripts/tests.sh b/make/scripts/tests.sh index 5ba1c6e0e..d95a75004 100755 --- a/make/scripts/tests.sh +++ b/make/scripts/tests.sh @@ -77,7 +77,7 @@ function jrun() { #D_ARGS="-Djogl.debug.GraphicsConfiguration" #D_ARGS="-Djogl.debug.GLCanvas -Djogl.debug.GraphicsConfiguration" #D_ARGS="-Djogl.debug.GLCanvas" - D_ARGS="-Djogl.debug.DebugGL -Djogl.debug.GLDebugMessageHandler -Djogl.debug.GLSLCode" + #D_ARGS="-Djogl.debug.DebugGL -Djogl.debug.GLDebugMessageHandler -Djogl.debug.GLSLCode" #D_ARGS="-Djogl.debug.DebugGL -Djogl.debug.TraceGL" #D_ARGS="-Djogl.debug.GLDebugMessageHandler -Dnewt.debug.Window -Dnewt.debug.Display -Dnewt.debug.EDT" #D_ARGS="-Djogl.debug.GLDebugMessageHandler" @@ -137,7 +137,9 @@ function testawtmt() { #testnoawt com.jogamp.opengl.test.junit.jogl.acore.TestGLDebug00NEWT $* #testnoawt com.jogamp.opengl.test.junit.jogl.acore.TestGLDebug01NEWT $* #testawt com.jogamp.opengl.test.junit.jogl.acore.TestGLProfile01NEWT $* -#testawt com.jogamp.opengl.test.junit.jogl.acore.TestSharedContextListNEWT $* +#testnoawt com.jogamp.opengl.test.junit.jogl.acore.TestSharedContextListNEWT $* +#testnoawt com.jogamp.opengl.test.junit.jogl.acore.TestSharedContextVBOES1NEWT $* +testnoawt com.jogamp.opengl.test.junit.jogl.acore.TestSharedContextVBOES2NEWT $* #testnoawt com.jogamp.opengl.test.junit.newt.TestRemoteWindow01NEWT $* #testnoawt com.jogamp.opengl.test.junit.newt.TestRemoteGLWindows01NEWT $* #testawt com.jogamp.opengl.test.junit.jogl.demos.gl2.newt.TestGearsNEWT $* @@ -152,7 +154,7 @@ function testawtmt() { #testawt com.jogamp.opengl.test.junit.newt.TestScreenMode00NEWT #testnoawt com.jogamp.opengl.test.junit.newt.TestScreenMode01NEWT #testnoawt com.jogamp.opengl.test.junit.newt.TestScreenMode02NEWT -testnoawt com.jogamp.opengl.test.junit.newt.ManualScreenMode03NEWT +#testnoawt com.jogamp.opengl.test.junit.newt.ManualScreenMode03NEWT #testawt com.jogamp.opengl.test.junit.newt.TestGLWindows01NEWT -time 1000000 #testawt -Djava.awt.headless=true com.jogamp.opengl.test.junit.newt.TestGLWindows01NEWT #testnoawt com.jogamp.opengl.test.junit.jogl.swt.TestSWT01GLn $* diff --git a/src/jogl/classes/com/jogamp/graph/curve/opengl/RenderState.java b/src/jogl/classes/com/jogamp/graph/curve/opengl/RenderState.java index e0d2490dc..eb07142a3 100644 --- a/src/jogl/classes/com/jogamp/graph/curve/opengl/RenderState.java +++ b/src/jogl/classes/com/jogamp/graph/curve/opengl/RenderState.java @@ -39,6 +39,7 @@ import com.jogamp.opengl.util.PMVMatrix; import com.jogamp.opengl.util.glsl.ShaderState; public abstract class RenderState { + private static final String thisKey = "jogamp.graph.curve.RenderState" ; public static RenderState createRenderState(ShaderState st, Vertex.Factory<? extends Vertex> pointFactory) { return new RenderStateImpl(st, pointFactory); @@ -48,6 +49,10 @@ public abstract class RenderState { return new RenderStateImpl(st, pointFactory, pmvMatrix); } + public static final RenderState getRenderState(GL2ES2 gl) { + return (RenderState) gl.getContext().getAttachedObject(thisKey); + } + protected final ShaderState st; protected final Vertex.Factory<? extends Vertex> vertexFactory; protected final PMVMatrix pmvMatrix; @@ -76,13 +81,13 @@ public abstract class RenderState { // public abstract GLUniformData getStrength(); public final RenderState attachTo(GL2ES2 gl) { - return (RenderState) gl.getContext().attachObject(RenderState.class.getName(), this); + return (RenderState) gl.getContext().attachObject(thisKey, this); } public final boolean detachFrom(GL2ES2 gl) { - RenderState _rs = (RenderState) gl.getContext().getAttachedObject(RenderState.class.getName()); + RenderState _rs = (RenderState) gl.getContext().getAttachedObject(thisKey); if(_rs == this) { - gl.getContext().detachObject(RenderState.class.getName()); + gl.getContext().detachObject(thisKey); return true; } return false; diff --git a/src/jogl/classes/com/jogamp/opengl/util/GLArrayDataClient.java b/src/jogl/classes/com/jogamp/opengl/util/GLArrayDataClient.java index 3600081bc..ee9a21095 100644 --- a/src/jogl/classes/com/jogamp/opengl/util/GLArrayDataClient.java +++ b/src/jogl/classes/com/jogamp/opengl/util/GLArrayDataClient.java @@ -11,6 +11,7 @@ import javax.media.opengl.GL; import javax.media.opengl.GLException; import javax.media.opengl.fixedfunc.GLPointerFuncUtil; +import jogamp.opengl.util.GLArrayHandler; import jogamp.opengl.util.GLFixedArrayHandler; import jogamp.opengl.util.glsl.GLSLArrayHandler; @@ -45,7 +46,7 @@ public class GLArrayDataClient extends GLArrayDataWrapper implements GLArrayData { GLArrayDataClient adc = new GLArrayDataClient(); GLArrayHandler glArrayHandler = new GLFixedArrayHandler(adc); - adc.init(null, index, comps, dataType, normalized, 0, null, initialSize, false, glArrayHandler, 0, 0, 0, 0); + adc.init(null, index, comps, dataType, normalized, 0, null, initialSize, false, glArrayHandler, 0, 0, 0, 0, false); return adc; } @@ -76,36 +77,32 @@ public class GLArrayDataClient extends GLArrayDataWrapper implements GLArrayData { GLArrayDataClient adc = new GLArrayDataClient(); GLArrayHandler glArrayHandler = new GLFixedArrayHandler(adc); - adc.init(null, index, comps, dataType, normalized, stride, buffer, comps*comps, false, glArrayHandler, 0, 0, 0, 0); + adc.init(null, index, comps, dataType, normalized, stride, buffer, comps*comps, false, glArrayHandler, 0, 0, 0, 0, false); return adc; } /** * Create a client side buffer object, using a custom GLSL array attribute name * and starting with a new created Buffer object with initialSize size - * - * @param st The ShaderState managing the state of the used shader program, vertex attributes and uniforms * @param name The custom name for the GL attribute. * @param comps The array component number * @param dataType The array index GL data type * @param normalized Whether the data shall be normalized * @param initialSize */ - public static GLArrayDataClient createGLSL(ShaderState st, String name, - int comps, int dataType, boolean normalized, int initialSize) + public static GLArrayDataClient createGLSL(String name, int comps, + int dataType, boolean normalized, int initialSize) throws GLException { GLArrayDataClient adc = new GLArrayDataClient(); - GLArrayHandler glArrayHandler = new GLSLArrayHandler(st, adc); - adc.init(name, -1, comps, dataType, normalized, 0, null, initialSize, true, glArrayHandler, 0, 0, 0, 0); + GLArrayHandler glArrayHandler = new GLSLArrayHandler(adc); + adc.init(name, -1, comps, dataType, normalized, 0, null, initialSize, true, glArrayHandler, 0, 0, 0, 0, true); return adc; } /** * Create a client side buffer object, using a custom GLSL array attribute name * and starting with a given Buffer object incl it's stride - * - * @param st The ShaderState managing the state of the used shader program, vertex attributes and uniforms * @param name The custom name for the GL attribute. * @param comps The array component number * @param dataType The array index GL data type @@ -113,14 +110,13 @@ public class GLArrayDataClient extends GLArrayDataWrapper implements GLArrayData * @param stride * @param buffer the user define data */ - public static GLArrayDataClient createGLSL(ShaderState st, String name, - int comps, int dataType, boolean normalized, int stride, - Buffer buffer) + public static GLArrayDataClient createGLSL(String name, int comps, + int dataType, boolean normalized, int stride, Buffer buffer) throws GLException { GLArrayDataClient adc = new GLArrayDataClient(); - GLArrayHandler glArrayHandler = new GLSLArrayHandler(st, adc); - adc.init(name, -1, comps, dataType, normalized, stride, buffer, comps*comps, true, glArrayHandler, 0, 0, 0, 0); + GLArrayHandler glArrayHandler = new GLSLArrayHandler(adc); + adc.init(name, -1, comps, dataType, normalized, stride, buffer, comps*comps, true, glArrayHandler, 0, 0, 0, 0, true); return adc; } @@ -162,12 +158,13 @@ public class GLArrayDataClient extends GLArrayDataWrapper implements GLArrayData // init/generate VBO name if not done yet init_vbo(gl); } + final Object ext = usesGLSL ? ShaderState.getShaderState(gl) : null ; if(enable) { - glArrayHandler.syncData(gl, true); - glArrayHandler.enableState(gl, true); + glArrayHandler.syncData(gl, true, ext); + glArrayHandler.enableState(gl, true, ext); } else { - glArrayHandler.enableState(gl, false); - glArrayHandler.syncData(gl, false); + glArrayHandler.enableState(gl, false, ext); + glArrayHandler.syncData(gl, false, ext); } bufferEnabled = enable; } @@ -349,7 +346,7 @@ public class GLArrayDataClient extends GLArrayDataWrapper implements GLArrayData protected void init(String name, int index, int comps, int dataType, boolean normalized, int stride, Buffer data, int initialSize, boolean isVertexAttribute, GLArrayHandler handler, - int vboName, long vboOffset, int vboUsage, int vboTarget) + int vboName, long vboOffset, int vboUsage, int vboTarget, boolean usesGLSL) throws GLException { super.init(name, index, comps, dataType, normalized, stride, data, isVertexAttribute, @@ -357,6 +354,7 @@ public class GLArrayDataClient extends GLArrayDataWrapper implements GLArrayData this.initialSize = initialSize; this.glArrayHandler = handler; + this.usesGLSL = usesGLSL; this.sealed=false; this.bufferEnabled=false; this.enableBufferAlways=false; @@ -385,5 +383,6 @@ public class GLArrayDataClient extends GLArrayDataWrapper implements GLArrayData protected int initialSize; protected GLArrayHandler glArrayHandler; + protected boolean usesGLSL; } diff --git a/src/jogl/classes/com/jogamp/opengl/util/GLArrayDataServer.java b/src/jogl/classes/com/jogamp/opengl/util/GLArrayDataServer.java index 8b254a9c9..d3bb2e3fd 100644 --- a/src/jogl/classes/com/jogamp/opengl/util/GLArrayDataServer.java +++ b/src/jogl/classes/com/jogamp/opengl/util/GLArrayDataServer.java @@ -9,14 +9,14 @@ import javax.media.opengl.GLArrayData; import javax.media.opengl.GLException; import javax.media.opengl.fixedfunc.GLPointerFuncUtil; +import jogamp.opengl.util.GLArrayHandler; +import jogamp.opengl.util.GLArrayHandlerInterleaved; import jogamp.opengl.util.GLDataArrayHandler; import jogamp.opengl.util.GLFixedArrayHandler; import jogamp.opengl.util.GLFixedArrayHandlerFlat; -import jogamp.opengl.util.GLFixedArrayHandlerInterleaved; import jogamp.opengl.util.glsl.GLSLArrayHandler; import jogamp.opengl.util.glsl.GLSLArrayHandlerFlat; -import com.jogamp.opengl.util.glsl.ShaderState; public class GLArrayDataServer extends GLArrayDataClient implements GLArrayDataEditable { @@ -53,7 +53,7 @@ public class GLArrayDataServer extends GLArrayDataClient implements GLArrayDataE GLArrayDataServer ads = new GLArrayDataServer(); GLArrayHandler glArrayHandler = new GLFixedArrayHandler(ads); ads.init(null, index, comps, dataType, normalized, stride, buffer, buffer.limit(), false, glArrayHandler, - 0, 0, vboUsage, GL.GL_ARRAY_BUFFER); + 0, 0, vboUsage, GL.GL_ARRAY_BUFFER, false); return ads; } @@ -85,15 +85,13 @@ public class GLArrayDataServer extends GLArrayDataClient implements GLArrayDataE GLArrayDataServer ads = new GLArrayDataServer(); GLArrayHandler glArrayHandler = new GLFixedArrayHandler(ads); ads.init(null, index, comps, dataType, normalized, 0, null, initialSize, false, glArrayHandler, - 0, 0, vboUsage, GL.GL_ARRAY_BUFFER); + 0, 0, vboUsage, GL.GL_ARRAY_BUFFER, false); return ads; } /** * Create a VBO, using a custom GLSL array attribute name * and starting with a new created Buffer object with initialSize size - * - * @param st The ShaderState managing the state of the used shader program, vertex attributes and uniforms * @param name The custom name for the GL attribute * @param comps The array component number * @param dataType The array index GL data type @@ -101,23 +99,20 @@ public class GLArrayDataServer extends GLArrayDataClient implements GLArrayDataE * @param initialSize * @param vboUsage {@link GL2ES2#GL_STREAM_DRAW}, {@link GL#GL_STATIC_DRAW} or {@link GL#GL_DYNAMIC_DRAW} */ - public static GLArrayDataServer createGLSL(ShaderState st, String name, - int comps, int dataType, boolean normalized, int initialSize, - int vboUsage) + public static GLArrayDataServer createGLSL(String name, int comps, + int dataType, boolean normalized, int initialSize, int vboUsage) throws GLException { GLArrayDataServer ads = new GLArrayDataServer(); - GLArrayHandler glArrayHandler = new GLSLArrayHandler(st, ads); + GLArrayHandler glArrayHandler = new GLSLArrayHandler(ads); ads.init(name, -1, comps, dataType, normalized, 0, null, initialSize, - true, glArrayHandler, 0, 0, vboUsage, GL.GL_ARRAY_BUFFER); + true, glArrayHandler, 0, 0, vboUsage, GL.GL_ARRAY_BUFFER, true); return ads; } /** * Create a VBO, using a custom GLSL array attribute name * and starting with a given Buffer object incl it's stride - * - * @param st The ShaderState managing the state of the used shader program, vertex attributes and uniforms * @param name The custom name for the GL attribute * @param comps The array component number * @param dataType The array index GL data type @@ -126,15 +121,15 @@ public class GLArrayDataServer extends GLArrayDataClient implements GLArrayDataE * @param buffer the user define data * @param vboUsage {@link GL2ES2#GL_STREAM_DRAW}, {@link GL#GL_STATIC_DRAW} or {@link GL#GL_DYNAMIC_DRAW} */ - public static GLArrayDataServer createGLSL(ShaderState st, String name, - int comps, int dataType, boolean normalized, int stride, - Buffer buffer, int vboUsage) + public static GLArrayDataServer createGLSL(String name, int comps, + int dataType, boolean normalized, int stride, Buffer buffer, + int vboUsage) throws GLException { GLArrayDataServer ads = new GLArrayDataServer(); - GLArrayHandler glArrayHandler = new GLSLArrayHandler(st, ads); + GLArrayHandler glArrayHandler = new GLSLArrayHandler(ads); ads.init(name, -1, comps, dataType, normalized, stride, buffer, buffer.limit(), true, glArrayHandler, - 0, 0, vboUsage, GL.GL_ARRAY_BUFFER); + 0, 0, vboUsage, GL.GL_ARRAY_BUFFER, true); return ads; } @@ -158,7 +153,7 @@ public class GLArrayDataServer extends GLArrayDataClient implements GLArrayDataE GLArrayDataServer ads = new GLArrayDataServer(); GLArrayHandler glArrayHandler = new GLDataArrayHandler(ads); ads.init(null, -1, comps, dataType, false, stride, buffer, buffer.limit(), false, glArrayHandler, - 0, 0, vboUsage, vboTarget); + 0, 0, vboUsage, vboTarget, false); return ads; } @@ -180,17 +175,15 @@ public class GLArrayDataServer extends GLArrayDataClient implements GLArrayDataE GLArrayDataServer ads = new GLArrayDataServer(); GLArrayHandler glArrayHandler = new GLDataArrayHandler(ads); ads.init(null, -1, comps, dataType, false, 0, null, initialSize, false, glArrayHandler, - 0, 0, vboUsage, vboTarget); + 0, 0, vboUsage, vboTarget, false); return ads; } /** - * Create a VBO for interleaved array data + * Create a VBO for fixed function interleaved array data * starting with a new created Buffer object with initialSize size. - * <p>User needs to <i>configure</i> the interleaved segments via {@link #addFixedSubArray(int, int, int)} - * for fixed function arrays or via {@link #addGLSLSubArray(ShaderState, String, int, int)} for GLSL - * attributes.</p> + * <p>User needs to <i>configure</i> the interleaved segments via {@link #addFixedSubArray(int, int, int)}.</p> * * @param comps The total number of all interleaved components. * @param dataType The array index GL data type @@ -198,22 +191,19 @@ public class GLArrayDataServer extends GLArrayDataClient implements GLArrayDataE * @param initialSize * @param vboUsage {@link GL2ES2#GL_STREAM_DRAW}, {@link GL#GL_STATIC_DRAW} or {@link GL#GL_DYNAMIC_DRAW} */ - public static GLArrayDataServer createInterleaved(int comps, int dataType, boolean normalized, int initialSize, + public static GLArrayDataServer createFixedInterleaved(int comps, int dataType, boolean normalized, int initialSize, int vboUsage) throws GLException { GLArrayDataServer ads = new GLArrayDataServer(); - GLArrayHandler glArrayHandler = new GLFixedArrayHandlerInterleaved(ads); + GLArrayHandler glArrayHandler = new GLArrayHandlerInterleaved(ads); ads.init(GLPointerFuncUtil.mgl_InterleaveArray, -1, comps, dataType, false, 0, null, initialSize, false, glArrayHandler, - 0, 0, vboUsage, GL.GL_ARRAY_BUFFER); + 0, 0, vboUsage, GL.GL_ARRAY_BUFFER, false); return ads; } - int interleavedOffset = 0; - /** - * Configure a segment of this interleaved array (see {@link #createInterleaved(int, int, boolean, int, int)}) - * for fixed function usage. + * Configure a segment of this fixed function interleaved array (see {@link #createFixedInterleaved(int, int, boolean, int, int)}). * <p> * This method may be called several times as long the sum of interleaved components does not * exceed the total number of components of the created interleaved array.</p> @@ -231,6 +221,9 @@ public class GLArrayDataServer extends GLArrayDataClient implements GLArrayDataE final int iOffC = interleavedOffset / getComponentSizeInBytes(); throw new GLException("Interleaved offset > total components ("+iOffC+" > "+getComponentCount()+")"); } + if(usesGLSL) { + throw new GLException("buffer uses GLSL"); + } GLArrayDataWrapper ad = GLArrayDataWrapper.createFixed( index, comps, getComponentType(), getNormalized(), getStride(), getBuffer(), @@ -245,8 +238,29 @@ public class GLArrayDataServer extends GLArrayDataClient implements GLArrayDataE } /** - * Configure a segment of this interleaved array (see {@link #createInterleaved(int, int, boolean, int, int)}) - * for GLSL usage. + * Create a VBO for GLSL interleaved array data + * starting with a new created Buffer object with initialSize size. + * <p>User needs to <i>configure</i> the interleaved segments via {@link #addGLSLSubArray(int, int, int)}.</p> + * + * @param comps The total number of all interleaved components. + * @param dataType The array index GL data type + * @param normalized Whether the data shall be normalized + * @param initialSize + * @param vboUsage {@link GL2ES2#GL_STREAM_DRAW}, {@link GL#GL_STATIC_DRAW} or {@link GL#GL_DYNAMIC_DRAW} + */ + public static GLArrayDataServer createGLSLInterleaved(int comps, int dataType, boolean normalized, int initialSize, + int vboUsage) + throws GLException + { + GLArrayDataServer ads = new GLArrayDataServer(); + GLArrayHandler glArrayHandler = new GLArrayHandlerInterleaved(ads); + ads.init(GLPointerFuncUtil.mgl_InterleaveArray, -1, comps, dataType, false, 0, null, initialSize, false, glArrayHandler, + 0, 0, vboUsage, GL.GL_ARRAY_BUFFER, true); + return ads; + } + + /** + * Configure a segment of this GLSL interleaved array (see {@link #createGLSLInterleaved(int, int, boolean, int, int)}). * <p> * This method may be called several times as long the sum of interleaved components does not * exceed the total number of components of the created interleaved array.</p> @@ -254,17 +268,18 @@ public class GLArrayDataServer extends GLArrayDataClient implements GLArrayDataE * The memory of the the interleaved array is being used.</p> * <p> * Must be called before using the array, eg: {@link #seal(boolean)}, {@link #putf(float)}, .. </p> - * - * @param st The ShaderState managing the state of the used shader program, vertex attributes and uniforms * @param name The custom name for the GL attribute, maybe null if vboTarget is {@link GL#GL_ELEMENT_ARRAY_BUFFER} * @param comps This interleaved array segment's component number * @param vboTarget {@link GL#GL_ARRAY_BUFFER} or {@link GL#GL_ELEMENT_ARRAY_BUFFER} */ - public GLArrayData addGLSLSubArray(ShaderState st, String name, int comps, int vboTarget) { + public GLArrayData addGLSLSubArray(String name, int comps, int vboTarget) { if(interleavedOffset >= getComponentCount() * getComponentSizeInBytes()) { final int iOffC = interleavedOffset / getComponentSizeInBytes(); throw new GLException("Interleaved offset > total components ("+iOffC+" > "+getComponentCount()+")"); } + if(!usesGLSL) { + throw new GLException("buffer uses fixed function"); + } GLArrayDataWrapper ad = GLArrayDataWrapper.createGLSL( name, comps, getComponentType(), getNormalized(), getStride(), getBuffer(), @@ -272,7 +287,7 @@ public class GLArrayDataServer extends GLArrayDataClient implements GLArrayDataE ad.setVBOEnabled(isVBO()); interleavedOffset += comps * getComponentSizeInBytes(); if(GL.GL_ARRAY_BUFFER == vboTarget) { - GLArrayHandler handler = new GLSLArrayHandlerFlat(st, ad); + GLArrayHandler handler = new GLSLArrayHandlerFlat(ad); glArrayHandler.addSubHandler(handler); } return ad; @@ -341,11 +356,11 @@ public class GLArrayDataServer extends GLArrayDataClient implements GLArrayDataE protected void init(String name, int index, int comps, int dataType, boolean normalized, int stride, Buffer data, int initialSize, boolean isVertexAttribute, GLArrayHandler glArrayHandler, - int vboName, long vboOffset, int vboUsage, int vboTarget) + int vboName, long vboOffset, int vboUsage, int vboTarget, boolean usesGLSL) throws GLException { super.init(name, index, comps, dataType, normalized, stride, data, initialSize, isVertexAttribute, glArrayHandler, - vboName, vboOffset, vboUsage, vboTarget); + vboName, vboOffset, vboUsage, vboTarget, usesGLSL); vboEnabled=true; } @@ -358,5 +373,7 @@ public class GLArrayDataServer extends GLArrayDataClient implements GLArrayDataE vboName = tmp[0]; } } + + private int interleavedOffset = 0; } diff --git a/src/jogl/classes/com/jogamp/opengl/util/GLArrayHandler.java b/src/jogl/classes/com/jogamp/opengl/util/GLArrayHandler.java deleted file mode 100644 index b30e220bd..000000000 --- a/src/jogl/classes/com/jogamp/opengl/util/GLArrayHandler.java +++ /dev/null @@ -1,40 +0,0 @@ - -package com.jogamp.opengl.util; - -import javax.media.opengl.*; - -/** - * Handles consistency of buffer data and array state. - * Implementations shall consider buffer types (VBO, ..), interleaved, etc. - * They also need to consider array state types, i.e. fixed function or GLSL. - */ -public interface GLArrayHandler { - - /** - * Implementation shall associate the data with the array - * and synchronize the data with the GPU. - * - * @param gl current GL object - * @param enable true if array data shall be valid, otherwise false. - */ - public void syncData(GL gl, boolean enable); - - /** - * Implementation shall enable or disable the array state. - * - * @param gl current GL object - * @param enable true if array shall be enabled, otherwise false. - */ - public void enableState(GL gl, boolean enable); - - /** - * Supporting interleaved arrays, where sub handlers may handle - * the array state and the <i>master</i> handler the buffer consistency. - * - * @param handler the sub handler - * @throws UnsupportedOperationException if this array handler does not support interleaved arrays - */ - public void addSubHandler(GLArrayHandler handler) throws UnsupportedOperationException; - -} - diff --git a/src/jogl/classes/com/jogamp/opengl/util/glsl/ShaderState.java b/src/jogl/classes/com/jogamp/opengl/util/glsl/ShaderState.java index a2a012e08..36abd9d4d 100644 --- a/src/jogl/classes/com/jogamp/opengl/util/glsl/ShaderState.java +++ b/src/jogl/classes/com/jogamp/opengl/util/glsl/ShaderState.java @@ -49,7 +49,8 @@ import com.jogamp.opengl.util.GLArrayDataEditable; public class ShaderState { public static final boolean DEBUG = Debug.isPropertyDefined("jogl.debug.GLSLState", true, AccessController.getContext()); - + private static final String currentStateKey = "jogamp.opengl.glsl.ShaderState" ; + public ShaderState() { } @@ -78,7 +79,7 @@ public class ShaderState { * @see com.jogamp.opengl.util.glsl.ShaderState#getCurrentShaderState() */ public static synchronized ShaderState getShaderState(GL gl) { - return (ShaderState) gl.getContext().getAttachedObject(ShaderState.class.getName()); + return (ShaderState) gl.getContext().getAttachedObject(currentStateKey); } /** @@ -141,7 +142,7 @@ public class ShaderState { if(null==shaderProgram) { throw new GLException("No program is attached"); } if(on) { // update the current ShaderState to the TLS .. - gl.getContext().attachObject(ShaderState.class.getName(), this); + gl.getContext().attachObject(currentStateKey, this); if(shaderProgram.linked()) { shaderProgram.useProgram(gl, true); if(resetAllShaderData) { diff --git a/src/jogl/classes/com/jogamp/opengl/util/glsl/ShaderUtil.java b/src/jogl/classes/com/jogamp/opengl/util/glsl/ShaderUtil.java index c81e1f961..9ccd38bf1 100644 --- a/src/jogl/classes/com/jogamp/opengl/util/glsl/ShaderUtil.java +++ b/src/jogl/classes/com/jogamp/opengl/util/glsl/ShaderUtil.java @@ -461,11 +461,12 @@ public class ShaderUtil { private static Impl getImpl(GL _gl) { GL2ES2 gl = _gl.getGL2ES2(); GLContext context = gl.getContext(); - Impl impl = (Impl) context.getAttachedObject(ShaderUtil.class.getName()); + Impl impl = (Impl) context.getAttachedObject(implObjectKey); if (impl == null) { impl = new GL2ES2Impl(); - context.attachObject(ShaderUtil.class.getName(), impl); + context.attachObject(implObjectKey, impl); } return impl; } + private static final String implObjectKey = "jogamp.opengl.glsl.ShaderUtilImpl" ; } diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/RenderStateImpl.java b/src/jogl/classes/jogamp/graph/curve/opengl/RenderStateImpl.java index 996ab4c02..51356ca13 100644 --- a/src/jogl/classes/jogamp/graph/curve/opengl/RenderStateImpl.java +++ b/src/jogl/classes/jogamp/graph/curve/opengl/RenderStateImpl.java @@ -29,7 +29,6 @@ package jogamp.graph.curve.opengl; import java.nio.FloatBuffer; -import javax.media.opengl.GL2ES2; import javax.media.opengl.GLUniformData; import jogamp.graph.curve.opengl.shader.UniformNames; @@ -49,10 +48,6 @@ public class RenderStateImpl extends RenderState { private final GLUniformData gcu_Alpha; private final GLUniformData gcu_ColorStatic; - public static final RenderState getRenderState(GL2ES2 gl) { - return (RenderState) gl.getContext().getAttachedObject(RenderState.class.getName()); - } - public RenderStateImpl(ShaderState st, Vertex.Factory<? extends Vertex> pointFactory, PMVMatrix pmvMatrix) { super(st, pointFactory, pmvMatrix); diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PES2.java b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PES2.java index 2d13f5ba0..758d0e999 100644 --- a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PES2.java +++ b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PES2.java @@ -89,8 +89,8 @@ public class VBORegion2PES2 extends GLRegion { indicesFbo.puts((short) 1); indicesFbo.puts((short) 2); indicesFbo.puts((short) 3); indicesFbo.seal(true); - texCoordFboAttr = GLArrayDataServer.createGLSL(st, AttributeNames.TEXCOORD_ATTR_NAME, 2, - GL2ES2.GL_FLOAT, false, initialSize, GL.GL_STATIC_DRAW); + texCoordFboAttr = GLArrayDataServer.createGLSL(AttributeNames.TEXCOORD_ATTR_NAME, 2, GL2ES2.GL_FLOAT, + false, initialSize, GL.GL_STATIC_DRAW); st.ownAttribute(texCoordFboAttr, true); texCoordFboAttr.putf(5); texCoordFboAttr.putf(5); texCoordFboAttr.putf(5); texCoordFboAttr.putf(6); @@ -98,19 +98,19 @@ public class VBORegion2PES2 extends GLRegion { texCoordFboAttr.putf(6); texCoordFboAttr.putf(5); texCoordFboAttr.seal(true); - verticeFboAttr = GLArrayDataServer.createGLSL(st, AttributeNames.VERTEX_ATTR_NAME, 3, - GL2ES2.GL_FLOAT, false, initialSize, GL.GL_STATIC_DRAW); + verticeFboAttr = GLArrayDataServer.createGLSL(AttributeNames.VERTEX_ATTR_NAME, 3, GL2ES2.GL_FLOAT, + false, initialSize, GL.GL_STATIC_DRAW); st.ownAttribute(verticeFboAttr, true); indicesTxt = GLArrayDataServer.createData(3, GL2ES2.GL_SHORT, initialSize, GL.GL_STATIC_DRAW, GL.GL_ELEMENT_ARRAY_BUFFER); - verticeTxtAttr = GLArrayDataServer.createGLSL(st, AttributeNames.VERTEX_ATTR_NAME, 3, - GL2ES2.GL_FLOAT, false, initialSize, GL.GL_STATIC_DRAW); + verticeTxtAttr = GLArrayDataServer.createGLSL(AttributeNames.VERTEX_ATTR_NAME, 3, GL2ES2.GL_FLOAT, + false, initialSize, GL.GL_STATIC_DRAW); st.ownAttribute(verticeTxtAttr, true); - texCoordTxtAttr = GLArrayDataServer.createGLSL(st, AttributeNames.TEXCOORD_ATTR_NAME, 2, - GL2ES2.GL_FLOAT, false, initialSize, GL.GL_STATIC_DRAW); + texCoordTxtAttr = GLArrayDataServer.createGLSL(AttributeNames.TEXCOORD_ATTR_NAME, 2, GL2ES2.GL_FLOAT, + false, initialSize, GL.GL_STATIC_DRAW); st.ownAttribute(texCoordTxtAttr, true); if(DEBUG_INSTANCE) { diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java index 83cd6fab9..21671386c 100644 --- a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java +++ b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java @@ -59,12 +59,12 @@ public class VBORegionSPES2 extends GLRegion { indices = GLArrayDataServer.createData(3, GL2ES2.GL_SHORT, initialSize, GL.GL_STATIC_DRAW, GL.GL_ELEMENT_ARRAY_BUFFER); - verticeAttr = GLArrayDataServer.createGLSL(st, AttributeNames.VERTEX_ATTR_NAME, 3, - GL2ES2.GL_FLOAT, false, initialSize, GL.GL_STATIC_DRAW); + verticeAttr = GLArrayDataServer.createGLSL(AttributeNames.VERTEX_ATTR_NAME, 3, GL2ES2.GL_FLOAT, + false, initialSize, GL.GL_STATIC_DRAW); st.ownAttribute(verticeAttr, true); - texCoordAttr = GLArrayDataServer.createGLSL(st, AttributeNames.TEXCOORD_ATTR_NAME, 2, - GL2ES2.GL_FLOAT, false, initialSize, GL.GL_STATIC_DRAW); + texCoordAttr = GLArrayDataServer.createGLSL(AttributeNames.TEXCOORD_ATTR_NAME, 2, GL2ES2.GL_FLOAT, + false, initialSize, GL.GL_STATIC_DRAW); st.ownAttribute(texCoordAttr, true); if(DEBUG_INSTANCE) { diff --git a/src/jogl/classes/jogamp/opengl/util/GLArrayHandler.java b/src/jogl/classes/jogamp/opengl/util/GLArrayHandler.java new file mode 100644 index 000000000..4a570d3a7 --- /dev/null +++ b/src/jogl/classes/jogamp/opengl/util/GLArrayHandler.java @@ -0,0 +1,69 @@ +/** + * Copyright 2010 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 jogamp.opengl.util; + +import javax.media.opengl.*; + +/** + * Handles consistency of buffer data and array state. + * Implementations shall consider buffer types (VBO, ..), interleaved, etc. + * They also need to consider array state types, i.e. fixed function or GLSL. + */ +public interface GLArrayHandler { + + /** + * Implementation shall associate the data with the array + * and synchronize the data with the GPU. + * + * @param gl current GL object + * @param enable true if array data shall be valid, otherwise false. + * @param ext extension object allowing passing of an implementation detail + */ + public void syncData(GL gl, boolean enable, Object ext); + + /** + * Implementation shall enable or disable the array state. + * + * @param gl current GL object + * @param enable true if array shall be enabled, otherwise false. + * @param ext extension object allowing passing of an implementation detail + */ + public void enableState(GL gl, boolean enable, Object ext); + + /** + * Supporting interleaved arrays, where sub handlers may handle + * the array state and the <i>master</i> handler the buffer consistency. + * + * @param handler the sub handler + * @throws UnsupportedOperationException if this array handler does not support interleaved arrays + */ + public void addSubHandler(GLArrayHandler handler) throws UnsupportedOperationException; + +} + diff --git a/src/jogl/classes/jogamp/opengl/util/GLFixedArrayHandlerInterleaved.java b/src/jogl/classes/jogamp/opengl/util/GLArrayHandlerInterleaved.java index 4bac20217..8e813a79b 100644 --- a/src/jogl/classes/jogamp/opengl/util/GLFixedArrayHandlerInterleaved.java +++ b/src/jogl/classes/jogamp/opengl/util/GLArrayHandlerInterleaved.java @@ -28,25 +28,24 @@ package jogamp.opengl.util; -import javax.media.opengl.*; -import javax.media.opengl.fixedfunc.*; -import com.jogamp.opengl.util.GLArrayDataEditable; -import com.jogamp.opengl.util.GLArrayHandler; - -import java.nio.*; +import java.nio.Buffer; import java.util.ArrayList; import java.util.List; +import javax.media.opengl.GL; + +import com.jogamp.opengl.util.GLArrayDataEditable; + /** * Interleaved fixed function arrays, i.e. where this buffer data * represents many arrays. */ -public class GLFixedArrayHandlerInterleaved implements GLArrayHandler { +public class GLArrayHandlerInterleaved implements GLArrayHandler { private GLArrayDataEditable ad; private List<GLArrayHandler> subArrays = new ArrayList<GLArrayHandler>(); - public GLFixedArrayHandlerInterleaved(GLArrayDataEditable ad) { + public GLArrayHandlerInterleaved(GLArrayDataEditable ad) { this.ad = ad; } @@ -54,13 +53,13 @@ public class GLFixedArrayHandlerInterleaved implements GLArrayHandler { subArrays.add(handler); } - private final void syncSubData(GL gl, boolean enable) { + private final void syncSubData(GL gl, boolean enable, Object ext) { for(int i=0; i<subArrays.size(); i++) { - subArrays.get(i).syncData(gl, enable); + subArrays.get(i).syncData(gl, enable, ext); } - } + } - public final void syncData(GL gl, boolean enable) { + public final void syncData(GL gl, boolean enable, Object ext) { if(enable) { final Buffer buffer = ad.getBuffer(); @@ -75,18 +74,18 @@ public class GLFixedArrayHandlerInterleaved implements GLArrayHandler { ad.setVBOWritten(true); } } - syncSubData(gl, true); + syncSubData(gl, true, ext); } else { - syncSubData(gl, false); + syncSubData(gl, false, ext); if(ad.isVBO()) { gl.glBindBuffer(ad.getVBOTarget(), 0); } } } - public final void enableState(GL gl, boolean enable) { + public final void enableState(GL gl, boolean enable, Object ext) { for(int i=0; i<subArrays.size(); i++) { - subArrays.get(i).enableState(gl, enable); + subArrays.get(i).enableState(gl, enable, ext); } } } diff --git a/src/jogl/classes/jogamp/opengl/util/GLDataArrayHandler.java b/src/jogl/classes/jogamp/opengl/util/GLDataArrayHandler.java index d114abe4d..c91d6c93e 100644 --- a/src/jogl/classes/jogamp/opengl/util/GLDataArrayHandler.java +++ b/src/jogl/classes/jogamp/opengl/util/GLDataArrayHandler.java @@ -49,7 +49,7 @@ public class GLDataArrayHandler implements GLArrayHandler { throw new UnsupportedOperationException(); } - public final void syncData(GL gl, boolean enable) { + public final void syncData(GL gl, boolean enable, Object ext) { if(!ad.isVBO()) { // makes no sense otherwise throw new GLException("GLDataArrayHandler can only handle VBOs."); @@ -71,7 +71,7 @@ public class GLDataArrayHandler implements GLArrayHandler { } } - public final void enableState(GL gl, boolean enable) { + public final void enableState(GL gl, boolean enable, Object ext) { // no array association } } diff --git a/src/jogl/classes/jogamp/opengl/util/GLFixedArrayHandler.java b/src/jogl/classes/jogamp/opengl/util/GLFixedArrayHandler.java index 2cce72ff4..8963b7985 100644 --- a/src/jogl/classes/jogamp/opengl/util/GLFixedArrayHandler.java +++ b/src/jogl/classes/jogamp/opengl/util/GLFixedArrayHandler.java @@ -32,7 +32,6 @@ import javax.media.opengl.*; import javax.media.opengl.fixedfunc.*; import com.jogamp.opengl.util.GLArrayDataEditable; -import com.jogamp.opengl.util.GLArrayHandler; import java.nio.*; @@ -51,7 +50,7 @@ public class GLFixedArrayHandler implements GLArrayHandler { throw new UnsupportedOperationException(); } - public final void syncData(GL gl, boolean enable) { + public final void syncData(GL gl, boolean enable, Object ext) { if(enable) { final Buffer buffer = ad.getBuffer(); if(ad.isVBO()) { @@ -87,7 +86,7 @@ public class GLFixedArrayHandler implements GLArrayHandler { } } - public final void enableState(GL gl, boolean enable) { + public final void enableState(GL gl, boolean enable, Object ext) { final GLPointerFunc glp = gl.getGL2ES1(); if(enable) { glp.glEnableClientState(ad.getIndex()); diff --git a/src/jogl/classes/jogamp/opengl/util/GLFixedArrayHandlerFlat.java b/src/jogl/classes/jogamp/opengl/util/GLFixedArrayHandlerFlat.java index 4dda9c6a1..81c782dab 100644 --- a/src/jogl/classes/jogamp/opengl/util/GLFixedArrayHandlerFlat.java +++ b/src/jogl/classes/jogamp/opengl/util/GLFixedArrayHandlerFlat.java @@ -33,7 +33,6 @@ import javax.media.opengl.GLArrayData; import javax.media.opengl.GLException; import javax.media.opengl.fixedfunc.GLPointerFunc; -import com.jogamp.opengl.util.GLArrayHandler; /** * Used for interleaved fixed function arrays, i.e. where the buffer data itself is handled @@ -50,7 +49,7 @@ public class GLFixedArrayHandlerFlat implements GLArrayHandler { throw new UnsupportedOperationException(); } - public final void syncData(GL gl, boolean enable) { + public final void syncData(GL gl, boolean enable, Object ext) { if(enable) { final GLPointerFunc glp = gl.getGL2ES1(); switch(ad.getIndex()) { @@ -72,7 +71,7 @@ public class GLFixedArrayHandlerFlat implements GLArrayHandler { } } - public final void enableState(GL gl, boolean enable) { + public final void enableState(GL gl, boolean enable, Object ext) { final GLPointerFunc glp = gl.getGL2ES1(); if(enable) { glp.glEnableClientState(ad.getIndex()); diff --git a/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandler.java b/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandler.java index d2fc52d5c..96bb02b19 100644 --- a/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandler.java +++ b/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandler.java @@ -33,8 +33,9 @@ import java.nio.Buffer; import javax.media.opengl.GL; import javax.media.opengl.GL2ES2; +import jogamp.opengl.util.GLArrayHandler; + import com.jogamp.opengl.util.GLArrayDataEditable; -import com.jogamp.opengl.util.GLArrayHandler; import com.jogamp.opengl.util.glsl.ShaderState; /** @@ -43,10 +44,8 @@ import com.jogamp.opengl.util.glsl.ShaderState; */ public class GLSLArrayHandler implements GLArrayHandler { private GLArrayDataEditable ad; - private ShaderState st; - public GLSLArrayHandler(ShaderState st, GLArrayDataEditable ad) { - this.st = st; + public GLSLArrayHandler(GLArrayDataEditable ad) { this.ad = ad; } @@ -54,9 +53,10 @@ public class GLSLArrayHandler implements GLArrayHandler { throw new UnsupportedOperationException(); } - public final void syncData(GL gl, boolean enable) { + public final void syncData(GL gl, boolean enable, Object ext) { final GL2ES2 glsl = gl.getGL2ES2(); - + final ShaderState st = (ShaderState) ext; + if(enable) { final Buffer buffer = ad.getBuffer(); /* @@ -100,9 +100,10 @@ public class GLSLArrayHandler implements GLArrayHandler { } } - public final void enableState(GL gl, boolean enable) { + public final void enableState(GL gl, boolean enable, Object ext) { final GL2ES2 glsl = gl.getGL2ES2(); - + final ShaderState st = (ShaderState) ext; + if(enable) { st.enableVertexAttribArray(glsl, ad); } else { diff --git a/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandlerFlat.java b/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandlerFlat.java index 5c4aa718c..0d6da7ba4 100644 --- a/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandlerFlat.java +++ b/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandlerFlat.java @@ -31,7 +31,9 @@ package jogamp.opengl.util.glsl; import javax.media.opengl.GL; import javax.media.opengl.GL2ES2; import javax.media.opengl.GLArrayData; -import com.jogamp.opengl.util.GLArrayHandler; + +import jogamp.opengl.util.GLArrayHandler; + import com.jogamp.opengl.util.glsl.ShaderState; /** @@ -39,11 +41,9 @@ import com.jogamp.opengl.util.glsl.ShaderState; * separately and interleaves many arrays. */ public class GLSLArrayHandlerFlat implements GLArrayHandler { - private ShaderState st; private GLArrayData ad; - public GLSLArrayHandlerFlat(ShaderState st, GLArrayData ad) { - this.st = st; + public GLSLArrayHandlerFlat(GLArrayData ad) { this.ad = ad; } @@ -51,15 +51,17 @@ public class GLSLArrayHandlerFlat implements GLArrayHandler { throw new UnsupportedOperationException(); } - public final void syncData(GL gl, boolean enable) { + public final void syncData(GL gl, boolean enable, Object ext) { + final ShaderState st = (ShaderState) ext; if(enable) { st.vertexAttribPointer(gl.getGL2ES2(), ad); } } - public final void enableState(GL gl, boolean enable) { + public final void enableState(GL gl, boolean enable, Object ext) { final GL2ES2 glsl = gl.getGL2ES2(); - + final ShaderState st = (ShaderState) ext; + if(enable) { st.enableVertexAttribArray(glsl, ad); } else { diff --git a/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandlerInterleaved.java b/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandlerInterleaved.java deleted file mode 100644 index c662c13d2..000000000 --- a/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandlerInterleaved.java +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Copyright 2010 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 jogamp.opengl.util.glsl; - -import java.nio.Buffer; -import java.util.ArrayList; -import java.util.List; - -import javax.media.opengl.GL; -import javax.media.opengl.GL2ES2; -import javax.media.opengl.GLException; - -import jogamp.opengl.util.GLFixedArrayHandlerFlat; - -import com.jogamp.opengl.util.GLArrayDataEditable; -import com.jogamp.opengl.util.GLArrayHandler; -import com.jogamp.opengl.util.glsl.ShaderState; - -/** - * Interleaved GLSL arrays, i.e. where this buffer data - * represents many arrays. - */ -public class GLSLArrayHandlerInterleaved implements GLArrayHandler { - private GLArrayDataEditable ad; - private ShaderState st; - private List<GLArrayHandler> subArrays = new ArrayList<GLArrayHandler>(); - - public GLSLArrayHandlerInterleaved(ShaderState st, GLArrayDataEditable ad) { - this.st = st; - this.ad = ad; - } - - public final void addSubHandler(GLArrayHandler handler) { - subArrays.add(handler); - } - - private final void syncSubData(GL gl, boolean enable) { - for(int i=0; i<subArrays.size(); i++) { - subArrays.get(i).syncData(gl, enable); - } - } - - public final void syncData(GL gl, boolean enable) { - GL2ES2 glsl = gl.getGL2ES2(); - - if(enable) { - Buffer buffer = ad.getBuffer(); - - /* - * This would be the non optimized code path: - * - if(ad.isVBO()) { - glsl.glBindBuffer(ad.getVBOTarget(), ad.getVBOName()); - if(!ad.isVBOWritten()) { - if(null!=buffer) { - glsl.glBufferData(ad.getVBOTarget(), ad.getSizeInBytes(), buffer, ad.getVBOUsage()); - } - ad.setVBOWritten(true); - } - } - syncSubData(gl, true); - */ - if(ad.isVBO()) { - // bind and refresh the VBO / vertex-attr only if necessary - if(!ad.isVBOWritten()) { - glsl.glBindBuffer(ad.getVBOTarget(), ad.getVBOName()); - if(null!=buffer) { - glsl.glBufferData(ad.getVBOTarget(), ad.getSizeInBytes(), buffer, ad.getVBOUsage()); - } - ad.setVBOWritten(true); - syncSubData(gl, true); - } else if(st.getAttribLocation(glsl, ad) >= 0) { - // didn't experience a performance hit on this query .. - // (using ShaderState's location query above to validate the location) - final int[] qi = new int[1]; - glsl.glGetVertexAttribiv(ad.getLocation(), GL2ES2.GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, qi, 0); - if(ad.getVBOName() != qi[0]) { - glsl.glBindBuffer(ad.getVBOTarget(), ad.getVBOName()); - syncSubData(gl, true); - } - } - } else if(null!=buffer) { - syncSubData(gl, true); - } - } else { - syncSubData(gl, false); - if(ad.isVBO()) { - glsl.glBindBuffer(ad.getVBOTarget(), 0); - } - } - } - - public final void enableState(GL gl, boolean enable) { - for(int i=0; i<subArrays.size(); i++) { - subArrays.get(i).enableState(gl, enable); - } - } - -} - diff --git a/src/nativewindow/classes/jogamp/nativewindow/x11/X11Util.java b/src/nativewindow/classes/jogamp/nativewindow/x11/X11Util.java index 117184a71..37056d44d 100644 --- a/src/nativewindow/classes/jogamp/nativewindow/x11/X11Util.java +++ b/src/nativewindow/classes/jogamp/nativewindow/x11/X11Util.java @@ -51,15 +51,6 @@ import javax.media.nativewindow.util.Point; * Contains a thread safe X11 utility to retrieve display connections. */ public class X11Util { - /** - * 2011/06/14 libX11 1.4.2 and libxcb 1.7 bug 20708 - Multithreading Issues w/ OpenGL, .. - * https://bugs.freedesktop.org/show_bug.cgi?id=20708 - * https://jogamp.org/bugzilla/show_bug.cgi?id=502 - * Affects: Ubuntu 11.04, OpenSuSE 11, .. - * If the property <b>nativewindow.x11.mt-bug</b> is set to true, extensive X11 locking - * is being applied, avoiding X11 multithreading capabilities. - */ - public static final boolean MULTITHREADING_BUG = Debug.getBooleanProperty("nativewindow.x11.mt-bug", true, AccessController.getContext()); public static final boolean XINITTHREADS_ALWAYS_ENABLED = true; private static final boolean DEBUG = Debug.debug("X11Util"); @@ -84,12 +75,11 @@ public class X11Util { */ initialize0( XINITTHREADS_ALWAYS_ENABLED ? true : firstX11ActionOnProcess ); - requiresX11Lock = !firstX11ActionOnProcess || MULTITHREADING_BUG; + requiresX11Lock = !firstX11ActionOnProcess ; if(DEBUG) { System.out.println("X11Util firstX11ActionOnProcess: "+firstX11ActionOnProcess+ ", XINITTHREADS_ALWAYS_ENABLED "+XINITTHREADS_ALWAYS_ENABLED+ - ", MULTITHREADING_BUG "+MULTITHREADING_BUG+ ", requiresX11Lock "+requiresX11Lock); } isInit = true; @@ -160,8 +150,8 @@ public class X11Util { // which is to tag a NamedDisplay uncloseable after creation. private static Object globalLock = new Object(); private static LongObjectHashMap globalNamedDisplayMap = new LongObjectHashMap(); - private static List openDisplayList = new ArrayList(); - private static List pendingDisplayList = new ArrayList(); + private static List<NamedDisplay> openDisplayList = new ArrayList<NamedDisplay>(); + private static List<NamedDisplay> pendingDisplayList = new ArrayList<NamedDisplay>(); public static class NamedDisplay { String name; @@ -269,7 +259,7 @@ public class X11Util { synchronized(globalLock) { System.err.println("X11Util: Open X11 Display Connections: "+openDisplayList.size()); for(int i=0; i<pendingDisplayList.size(); i++) { - NamedDisplay ndpy = (NamedDisplay) openDisplayList.get(i); + NamedDisplay ndpy = openDisplayList.get(i); System.err.println("X11Util: ["+i+"]: "+ndpy); if(null!=ndpy) { Throwable t = ndpy.getCreationStack(); diff --git a/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java b/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java index f477cd3fc..e0776f58d 100644 --- a/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java +++ b/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java @@ -124,6 +124,8 @@ public class GLWindow implements GLAutoDrawable, Window, NEWTEventConsumer, FPSC * with the given GLCapabilities. * <P> * The resulting GLWindow owns the Window, Screen and Device, ie it will be destructed. + * <P> + * The default display connection will be used and reused if already in process. */ public static GLWindow create(GLCapabilitiesImmutable caps) { return new GLWindow(NewtFactory.createWindow(caps)); diff --git a/src/newt/classes/jogamp/newt/DisplayImpl.java b/src/newt/classes/jogamp/newt/DisplayImpl.java index dc07bd180..4154059e2 100644 --- a/src/newt/classes/jogamp/newt/DisplayImpl.java +++ b/src/newt/classes/jogamp/newt/DisplayImpl.java @@ -51,10 +51,10 @@ public abstract class DisplayImpl extends Display { private static int serialno = 1; - private static Class getDisplayClass(String type) + private static Class<?> getDisplayClass(String type) throws ClassNotFoundException { - Class displayClass = NewtFactory.getCustomClass(type, "Display"); + Class<?> displayClass = NewtFactory.getCustomClass(type, "Display"); if(null==displayClass) { if (NativeWindowFactory.TYPE_ANDROID.equals(type)) { displayClass = Class.forName("jogamp.newt.driver.android.AndroidDisplay"); @@ -78,7 +78,7 @@ public abstract class DisplayImpl extends Display { /** Make sure to reuse a Display with the same name */ public static Display create(String type, String name, final long handle, boolean reuse) { try { - Class displayClass = getDisplayClass(type); + Class<?> displayClass = getDisplayClass(type); DisplayImpl display = (DisplayImpl) displayClass.newInstance(); name = display.validateDisplayName(name, handle); synchronized(displayList) { @@ -354,7 +354,7 @@ public abstract class DisplayImpl extends Display { protected abstract void dispatchMessagesNative(); private Object eventsLock = new Object(); - private ArrayList/*<NEWTEvent>*/ events = new ArrayList(); + private ArrayList<NEWTEventTask> events = new ArrayList<NEWTEventTask>(); private volatile boolean haveEvents = false; class DispatchMessagesRunnable implements Runnable { @@ -384,21 +384,21 @@ public abstract class DisplayImpl extends Display { if(0==refCount) return; // no screens if(null==getGraphicsDevice()) return; // no native device - ArrayList/*<NEWTEvent>*/ _events = null; + ArrayList<NEWTEventTask> _events = null; if(haveEvents) { // volatile: ok synchronized(eventsLock) { if(haveEvents) { // swap events list to free ASAP _events = events; - events = new ArrayList(); + events = new ArrayList<NEWTEventTask>(); haveEvents = false; } eventsLock.notifyAll(); } if( null != _events ) { for (int i=0; i < _events.size(); i++) { - dispatchMessage((NEWTEventTask) _events.get(i)); + dispatchMessage(_events.get(i)); } } } diff --git a/src/newt/classes/jogamp/newt/driver/x11/X11Display.java b/src/newt/classes/jogamp/newt/driver/x11/X11Display.java index 483556f82..94e5a0bcc 100644 --- a/src/newt/classes/jogamp/newt/driver/x11/X11Display.java +++ b/src/newt/classes/jogamp/newt/driver/x11/X11Display.java @@ -69,14 +69,23 @@ public class X11Display extends DisplayImpl { if( 0 == handle ) { throw new RuntimeException("Error creating display: "+name); } + if(USE_SEPARATE_DISPLAY_FOR_EDT) { + edtDisplayHandle = X11Util.createDisplay(name); + if( 0 == edtDisplayHandle ) { + X11Util.closeDisplay(handle); + throw new RuntimeException("Error creating display(EDT): "+name); + } + } else { + edtDisplayHandle = handle; + } try { - CompleteDisplay0(handle); + CompleteDisplay0(edtDisplayHandle); } catch(RuntimeException e) { - X11Util.closeDisplay(handle); + closeNativeImpl(); throw e; } - if(X11Util.XINITTHREADS_ALWAYS_ENABLED && !X11Util.MULTITHREADING_BUG) { + if(X11Util.XINITTHREADS_ALWAYS_ENABLED) { // Hack: Force non X11Display locking, even w/ AWT and w/o isFirstUIActionOnProcess() aDevice = new X11GraphicsDevice(handle, AbstractGraphicsDevice.DEFAULT_UNIT, NativeWindowFactory.getNullToolkitLock()); } else { @@ -86,25 +95,29 @@ public class X11Display extends DisplayImpl { } protected void closeNativeImpl() { - X11Util.closeDisplay(getHandle()); + final long handle = getHandle(); + if(handle != edtDisplayHandle) { + X11Util.closeDisplay(edtDisplayHandle); + } + X11Util.closeDisplay(handle); } protected void dispatchMessagesNative() { - long dpy = getHandle(); - if(0!=dpy) { - DispatchMessages0(dpy, javaObjectAtom, windowDeleteAtom); + if(0 != edtDisplayHandle) { + DispatchMessages0(edtDisplayHandle, javaObjectAtom, windowDeleteAtom); } } + protected long getEDTHandle() { return edtDisplayHandle; } protected long getJavaObjectAtom() { return javaObjectAtom; } protected long getWindowDeleteAtom() { return windowDeleteAtom; } - + //---------------------------------------------------------------------- // Internals only // private static native boolean initIDs0(); - private native void CompleteDisplay0(long handle); + private native void CompleteDisplay0(long handleEDT); private native void DispatchMessages0(long display, long javaObjectAtom, long windowDeleteAtom); @@ -113,7 +126,21 @@ public class X11Display extends DisplayImpl { this.windowDeleteAtom=windowDeleteAtom; } + /** + * 2011/06/14 libX11 1.4.2 and libxcb 1.7 bug 20708 - Multithreading Issues w/ OpenGL, .. + * https://bugs.freedesktop.org/show_bug.cgi?id=20708 + * https://jogamp.org/bugzilla/show_bug.cgi?id=502 + * Affects: Ubuntu 11.04, OpenSuSE 11, .. + * Workaround: Using a separate X11 Display connection for event dispatching (EDT) + */ + private final boolean USE_SEPARATE_DISPLAY_FOR_EDT = true; + + private long edtDisplayHandle; + + /** X11 Window delete atom marker used on EDT */ private long windowDeleteAtom; + + /** X11 Window java object property used on EDT */ private long javaObjectAtom; } diff --git a/src/newt/classes/jogamp/newt/driver/x11/X11Window.java b/src/newt/classes/jogamp/newt/driver/x11/X11Window.java index 19a0c7626..cbb43934b 100644 --- a/src/newt/classes/jogamp/newt/driver/x11/X11Window.java +++ b/src/newt/classes/jogamp/newt/driver/x11/X11Window.java @@ -64,7 +64,7 @@ public class X11Window extends WindowImpl { X11GraphicsConfiguration x11config = (X11GraphicsConfiguration) config; long visualID = x11config.getVisualID(); long w = CreateWindow0(getParentWindowHandle(), - display.getHandle(), screen.getIndex(), visualID, + display.getHandle(), display.getEDTHandle(), screen.getIndex(), visualID, display.getJavaObjectAtom(), display.getWindowDeleteAtom(), x, y, width, height, isUndecorated()); if (w == 0) { @@ -78,7 +78,7 @@ public class X11Window extends WindowImpl { if(0!=windowHandleClose && null!=getScreen() ) { X11Display display = (X11Display) getScreen().getDisplay(); try { - CloseWindow0(display.getHandle(), windowHandleClose, + CloseWindow0(display.getHandle(), display.getEDTHandle(), windowHandleClose, display.getJavaObjectAtom(), display.getWindowDeleteAtom()); } catch (Throwable t) { if(DEBUG_IMPLEMENTATION) { @@ -124,10 +124,10 @@ public class X11Window extends WindowImpl { // protected static native boolean initIDs0(); - private native long CreateWindow0(long parentWindowHandle, long display, int screen_index, + private native long CreateWindow0(long parentWindowHandle, long display, long displayEDT, int screen_index, long visualID, long javaObjectAtom, long windowDeleteAtom, int x, int y, int width, int height, boolean undecorated); - private native void CloseWindow0(long display, long windowHandle, long javaObjectAtom, long windowDeleteAtom); + private native void CloseWindow0(long display, long displayEDT, long windowHandle, long javaObjectAtom, long windowDeleteAtom); private native void setVisible0(long display, long windowHandle, boolean visible, int x, int y, int width, int height); private native void reconfigureWindow0(long display, int screen_index, long parentWindowHandle, long windowHandle, int x, int y, int width, int height, boolean isVisible, diff --git a/src/newt/native/X11Window.c b/src/newt/native/X11Window.c index e0efac6e5..fc949b318 100644 --- a/src/newt/native/X11Window.c +++ b/src/newt/native/X11Window.c @@ -301,7 +301,7 @@ JNIEXPORT void JNICALL Java_jogamp_newt_driver_x11_X11Display_CompleteDisplay0 NewtCommon_FatalError(env, "invalid display connection.."); } - javaObjectAtom = (jlong) XInternAtom(dpy, "JOGL_JAVA_OBJECT", False); + javaObjectAtom = (jlong) XInternAtom(dpy, "NEWT_JAVA_OBJECT", False); if(None==javaObjectAtom) { NewtCommon_throwNewRuntimeException(env, "could not create Atom JOGL_JAVA_OBJECT, bail out!"); return; @@ -559,7 +559,7 @@ JNIEXPORT void JNICALL Java_jogamp_newt_driver_x11_X11Display_DispatchMessages0 return ; } - // DBG_PRINT( "X11: DispatchMessages dpy %p, win %p, Event %d\n", (void*)dpy, (void*)evt.xany.window, evt.type); + DBG_PRINT( "X11: DispatchMessages dpy %p, win %p, Event %d\n", (void*)dpy, (void*)evt.xany.window, evt.type); displayDispatchErrorHandlerEnable(1, env); @@ -1270,13 +1270,15 @@ JNIEXPORT jboolean JNICALL Java_jogamp_newt_driver_x11_X11Window_initIDs0 * Signature: (JJIJIIII)J */ JNIEXPORT jlong JNICALL Java_jogamp_newt_driver_x11_X11Window_CreateWindow0 - (JNIEnv *env, jobject obj, jlong parent, jlong display, jint screen_index, + (JNIEnv *env, jobject obj, jlong parent, jlong display, jlong displayEDT, jint screen_index, jlong visualID, jlong javaObjectAtom, jlong windowDeleteAtom, jint x, jint y, jint width, jint height, jboolean undecorated) { Display * dpy = (Display *)(intptr_t)display; + Display * dpyEDT = (Display *)(intptr_t)displayEDT; + Atom wm_delete_atom = (Atom)windowDeleteAtom; int scrn_idx = (int)screen_index; Window windowParent = (Window) parent; Window window = 0; @@ -1291,7 +1293,6 @@ JNIEXPORT jlong JNICALL Java_jogamp_newt_driver_x11_X11Window_CreateWindow0 int n; Screen* scrn; - Atom wm_delete_atom; if(dpy==NULL) { NewtCommon_FatalError(env, "invalid display connection.."); @@ -1342,7 +1343,7 @@ JNIEXPORT jlong JNICALL Java_jogamp_newt_driver_x11_X11Window_CreateWindow0 } attrMask = ( CWBackingStore | CWBackingPlanes | CWBackingPixel | CWBackPixmap | - CWBorderPixel | CWColormap | CWOverrideRedirect | CWEventMask ) ; + CWBorderPixel | CWColormap | CWOverrideRedirect /* | CWEventMask */ ) ; memset(&xswa, 0, sizeof(xswa)); xswa.override_redirect = False; // use the window manager, always @@ -1351,9 +1352,7 @@ JNIEXPORT jlong JNICALL Java_jogamp_newt_driver_x11_X11Window_CreateWindow0 xswa.backing_store=NotUseful; /* NotUseful, WhenMapped, Always */ xswa.backing_planes=0; /* planes to be preserved if possible */ xswa.backing_pixel=0; /* value to use in restoring planes */ - xswa.event_mask = ButtonPressMask | ButtonReleaseMask | PointerMotionMask ; - xswa.event_mask |= KeyPressMask | KeyReleaseMask ; - xswa.event_mask |= FocusChangeMask | SubstructureNotifyMask | StructureNotifyMask | ExposureMask ; + xswa.event_mask = 0; /* using XSelectInput on EDT below */ xswa.colormap = XCreateColormap(dpy, windowParent, @@ -1376,14 +1375,22 @@ JNIEXPORT jlong JNICALL Java_jogamp_newt_driver_x11_X11Window_CreateWindow0 return 0; } - wm_delete_atom = (Atom)windowDeleteAtom; - XSetWMProtocols(dpy, window, &wm_delete_atom, 1); - - setJavaWindowProperty(env, dpy, window, javaObjectAtom, (*env)->NewGlobalRef(env, obj)); - NewtWindows_setDecorations(dpy, window, ( JNI_TRUE == undecorated ) ? False : True ); XSync(dpy, False); + XSetWMProtocols(dpyEDT, window, &wm_delete_atom, 1); + setJavaWindowProperty(env, dpyEDT, window, javaObjectAtom, (*env)->NewGlobalRef(env, obj)); + + { + long xevent_mask = 0; + xevent_mask |= ButtonPressMask | ButtonReleaseMask | PointerMotionMask ; + xevent_mask |= KeyPressMask | KeyReleaseMask ; + xevent_mask |= FocusChangeMask | SubstructureNotifyMask | StructureNotifyMask | ExposureMask ; + + XSelectInput(dpyEDT, window, xevent_mask); + } + XSync(dpyEDT, False); + DBG_PRINT( "X11: [CreateWindow] created window %p on display %p\n", (void*)window, dpy); return (jlong) window; } @@ -1394,9 +1401,10 @@ JNIEXPORT jlong JNICALL Java_jogamp_newt_driver_x11_X11Window_CreateWindow0 * Signature: (JJ)V */ JNIEXPORT void JNICALL Java_jogamp_newt_driver_x11_X11Window_CloseWindow0 - (JNIEnv *env, jobject obj, jlong display, jlong window, jlong javaObjectAtom, jlong wmDeleteAtom) + (JNIEnv *env, jobject obj, jlong display, jlong displayEDT, jlong window, jlong javaObjectAtom, jlong wmDeleteAtom) { Display * dpy = (Display *) (intptr_t) display; + Display * dpyEDT = (Display *) (intptr_t) displayEDT; Window w = (Window)window; jobject jwindow; @@ -1406,7 +1414,7 @@ JNIEXPORT void JNICALL Java_jogamp_newt_driver_x11_X11Window_CloseWindow0 DBG_PRINT( "X11: CloseWindow START dpy %p, win %p\n", (void*)dpy, (void*)w); - jwindow = getJavaWindowProperty(env, dpy, w, javaObjectAtom, True); + jwindow = getJavaWindowProperty(env, dpyEDT, w, javaObjectAtom, True); if(NULL==jwindow) { NewtCommon_throwNewRuntimeException(env, "could not fetch Java Window object, bail out!"); return; @@ -1417,11 +1425,11 @@ JNIEXPORT void JNICALL Java_jogamp_newt_driver_x11_X11Window_CloseWindow0 } XSync(dpy, False); - XSelectInput(dpy, w, 0); + XSelectInput(dpyEDT, w, 0); XUnmapWindow(dpy, w); // Drain all events related to this window .. - Java_jogamp_newt_driver_x11_X11Display_DispatchMessages0(env, obj, display, javaObjectAtom, wmDeleteAtom); + Java_jogamp_newt_driver_x11_X11Display_DispatchMessages0(env, obj, displayEDT, javaObjectAtom, wmDeleteAtom); XDestroyWindow(dpy, w); XSync(dpy, False); diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextListAWT.java b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextListAWT.java index f46b4150e..fe7475448 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextListAWT.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextListAWT.java @@ -83,7 +83,7 @@ public class TestSharedContextListAWT extends UITestCase { return new Frame("Shared Gears AWT Test: "+x+"/"+y+" shared "+useShared); } - protected GLCanvas runTestGL(final Frame frame, final Animator animator, final int x, final int y, final boolean useShared) + protected GLCanvas runTestGL(final Frame frame, final Animator animator, final int x, final int y, final boolean useShared, final boolean vsync) throws InterruptedException { final GLCanvas glCanvas = new GLCanvas(caps, useShared ? sharedDrawable.getContext() : null); @@ -92,7 +92,7 @@ public class TestSharedContextListAWT extends UITestCase { frame.setLocation(x, y); frame.setSize(width, height); - Gears gears = new Gears(); + Gears gears = new Gears(vsync ? 1 : 0); if(useShared) { gears.setGears(sharedGears.getGear1(), sharedGears.getGear2(), sharedGears.getGear3()); } @@ -116,9 +116,9 @@ public class TestSharedContextListAWT extends UITestCase { Animator animator = new Animator(); - GLCanvas glc1 = runTestGL(f1, animator, 0, 0, true); - GLCanvas glc2 = runTestGL(f2, animator, width, 0, true); - GLCanvas glc3 = runTestGL(f3, animator, 0, height, false); + GLCanvas glc1 = runTestGL(f1, animator, 0, 0, true, false); + GLCanvas glc2 = runTestGL(f2, animator, width, 0, true, false); + GLCanvas glc3 = runTestGL(f3, animator, 0, height, false, true); animator.setUpdateFPSFrames(1, null); animator.start(); diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextListNEWT.java b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextListNEWT.java index ede06b526..231a45ca0 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextListNEWT.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextListNEWT.java @@ -77,7 +77,7 @@ public class TestSharedContextListNEWT extends UITestCase { sharedDrawable.destroy(); } - protected GLWindow runTestGL(Animator animator, int x, int y, boolean useShared) { + protected GLWindow runTestGL(Animator animator, int x, int y, boolean useShared, boolean vsync) { GLWindow glWindow = GLWindow.create(caps); Assert.assertNotNull(glWindow); glWindow.setTitle("Shared Gears NEWT Test: "+x+"/"+y+" shared "+useShared); @@ -88,7 +88,7 @@ public class TestSharedContextListNEWT extends UITestCase { glWindow.setSize(width, height); glWindow.setPosition(x, y); - Gears gears = new Gears(); + Gears gears = new Gears(vsync ? 1 : 0); if(useShared) { gears.setGears(sharedGears.getGear1(), sharedGears.getGear2(), sharedGears.getGear3()); } @@ -105,9 +105,9 @@ public class TestSharedContextListNEWT extends UITestCase { public void test01() throws InterruptedException { initShared(); Animator animator = new Animator(); - GLWindow f1 = runTestGL(animator, 0, 0, true); - GLWindow f2 = runTestGL(animator, width, 0, true); - GLWindow f3 = runTestGL(animator, 0, height, false); + GLWindow f1 = runTestGL(animator, 0, 0, true, false); + GLWindow f2 = runTestGL(animator, width, 0, true, false); + GLWindow f3 = runTestGL(animator, 0, height, false, true); animator.setUpdateFPSFrames(1, null); animator.start(); while(animator.isAnimating() && animator.getTotalFPSDuration()<duration) { diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES1NEWT.java b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES1NEWT.java new file mode 100644 index 000000000..c230ffd6d --- /dev/null +++ b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES1NEWT.java @@ -0,0 +1,142 @@ +/** + * Copyright 2010 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 com.jogamp.newt.opengl.GLWindow; + +import javax.media.opengl.GLCapabilities; +import javax.media.opengl.GLDrawableFactory; +import javax.media.opengl.GLPbuffer; +import javax.media.opengl.GLProfile; +import com.jogamp.opengl.util.Animator; + +import com.jogamp.opengl.test.junit.util.UITestCase; +import com.jogamp.opengl.test.junit.jogl.demos.es1.GearsES1; + +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class TestSharedContextVBOES1NEWT extends UITestCase { + static GLProfile glp; + static GLCapabilities caps; + static int width, height; + GLPbuffer sharedDrawable; + GearsES1 sharedGears; + + @BeforeClass + public static void initClass() { + GLProfile.initSingleton(true); + glp = GLProfile.getDefault(); + Assert.assertNotNull(glp); + caps = new GLCapabilities(glp); + Assert.assertNotNull(caps); + width = 512; + height = 512; + } + + private void initShared() { + sharedDrawable = GLDrawableFactory.getFactory(glp).createGLPbuffer(null, caps, null, width, height, null); + Assert.assertNotNull(sharedDrawable); + sharedGears = new GearsES1(); + Assert.assertNotNull(sharedGears); + sharedDrawable.addGLEventListener(sharedGears); + // init and render one frame, which will setup the Gears display lists + sharedDrawable.display(); + } + + private void releaseShared() { + Assert.assertNotNull(sharedDrawable); + sharedDrawable.destroy(); + } + + protected GLWindow runTestGL(Animator animator, int x, int y, boolean useShared, boolean vsync) { + GLWindow glWindow = GLWindow.create(caps); + Assert.assertNotNull(glWindow); + glWindow.setTitle("Shared Gears NEWT Test: "+x+"/"+y+" shared "+useShared); + if(useShared) { + glWindow.setSharedContext(sharedDrawable.getContext()); + } + + glWindow.setSize(width, height); + glWindow.setPosition(x, y); + + GearsES1 gears = new GearsES1(vsync ? 1 : 0); + if(useShared) { + gears.setGears(sharedGears.getGear1(), sharedGears.getGear2(), sharedGears.getGear3()); + } + glWindow.addGLEventListener(gears); + + animator.add(glWindow); + + glWindow.setVisible(true); + + return glWindow; + } + + @Test + public void test01() throws InterruptedException { + initShared(); + Animator animator = new Animator(); + GLWindow f1 = runTestGL(animator, 0, 0, true, false); + GLWindow f2 = runTestGL(animator, width, 0, true, false); + GLWindow f3 = runTestGL(animator, 0, height, false, true); + animator.setUpdateFPSFrames(1, null); + animator.start(); + while(animator.isAnimating() && animator.getTotalFPSDuration()<duration) { + Thread.sleep(100); + } + animator.stop(); + + // here we go again: On AMD/X11 the create/destroy sequence must be the same + // even though this is agains the chicken/egg logic here .. + releaseShared(); + + f1.destroy(); + f2.destroy(); + f3.destroy(); + + // see above .. + // releaseShared(); + } + + static long duration = 500; // ms + + public static void main(String args[]) { + for(int i=0; i<args.length; i++) { + if(args[i].equals("-time")) { + i++; + try { + duration = Integer.parseInt(args[i]); + } catch (Exception ex) { ex.printStackTrace(); } + } + } + org.junit.runner.JUnitCore.main(TestSharedContextVBOES1NEWT.class.getName()); + } +} 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 new file mode 100644 index 000000000..602f5c3b5 --- /dev/null +++ b/src/test/com/jogamp/opengl/test/junit/jogl/acore/TestSharedContextVBOES2NEWT.java @@ -0,0 +1,142 @@ +/** + * Copyright 2010 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 com.jogamp.newt.opengl.GLWindow; + +import javax.media.opengl.GLCapabilities; +import javax.media.opengl.GLDrawableFactory; +import javax.media.opengl.GLPbuffer; +import javax.media.opengl.GLProfile; +import com.jogamp.opengl.util.Animator; + +import com.jogamp.opengl.test.junit.util.UITestCase; +import com.jogamp.opengl.test.junit.jogl.demos.es2.GearsES2; + +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class TestSharedContextVBOES2NEWT extends UITestCase { + static GLProfile glp; + static GLCapabilities caps; + static int width, height; + GLPbuffer sharedDrawable; + GearsES2 sharedGears; + + @BeforeClass + public static void initClass() { + GLProfile.initSingleton(true); + glp = GLProfile.getDefault(); + Assert.assertNotNull(glp); + caps = new GLCapabilities(glp); + Assert.assertNotNull(caps); + width = 512; + height = 512; + } + + private void initShared() { + sharedDrawable = GLDrawableFactory.getFactory(glp).createGLPbuffer(null, caps, null, width, height, null); + Assert.assertNotNull(sharedDrawable); + sharedGears = new GearsES2(); + Assert.assertNotNull(sharedGears); + sharedDrawable.addGLEventListener(sharedGears); + // init and render one frame, which will setup the Gears display lists + sharedDrawable.display(); + } + + private void releaseShared() { + Assert.assertNotNull(sharedDrawable); + sharedDrawable.destroy(); + } + + protected GLWindow runTestGL(Animator animator, int x, int y, boolean useShared, boolean vsync) { + GLWindow glWindow = GLWindow.create(caps); + Assert.assertNotNull(glWindow); + glWindow.setTitle("Shared Gears NEWT Test: "+x+"/"+y+" shared "+useShared); + if(useShared) { + glWindow.setSharedContext(sharedDrawable.getContext()); + } + + glWindow.setSize(width, height); + glWindow.setPosition(x, y); + + GearsES2 gears = new GearsES2(vsync ? 1 : 0); + if(useShared) { + gears.setGears(sharedGears.getGear1(), sharedGears.getGear2(), sharedGears.getGear3()); + } + glWindow.addGLEventListener(gears); + + animator.add(glWindow); + + glWindow.setVisible(true); + + return glWindow; + } + + @Test + public void test01() throws InterruptedException { + initShared(); + Animator animator = new Animator(); + GLWindow f1 = runTestGL(animator, 0, 0, true, false); + GLWindow f2 = runTestGL(animator, width, 0, true, false); + GLWindow f3 = runTestGL(animator, 0, height, false, true); + animator.setUpdateFPSFrames(1, null); + animator.start(); + while(animator.isAnimating() && animator.getTotalFPSDuration()<duration) { + Thread.sleep(100); + } + animator.stop(); + + // here we go again: On AMD/X11 the create/destroy sequence must be the same + // even though this is agains the chicken/egg logic here .. + releaseShared(); + + f1.destroy(); + f2.destroy(); + f3.destroy(); + + // see above .. + // releaseShared(); + } + + static long duration = 500; // ms + + public static void main(String args[]) { + for(int i=0; i<args.length; i++) { + if(args[i].equals("-time")) { + i++; + try { + duration = Integer.parseInt(args[i]); + } catch (Exception ex) { ex.printStackTrace(); } + } + } + org.junit.runner.JUnitCore.main(TestSharedContextVBOES2NEWT.class.getName()); + } +} diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/demos/GearsObject.java b/src/test/com/jogamp/opengl/test/junit/jogl/demos/GearsObject.java index 19c207f80..5ad3b3894 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/demos/GearsObject.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/demos/GearsObject.java @@ -44,9 +44,19 @@ public abstract class GearsObject { public final GLArrayDataServer outwardFace; public final GLArrayDataServer insideRadiusCyl; + public abstract GLArrayDataServer createInterleaved(int comps, int dataType, boolean normalized, int initialSize, int vboUsage); public abstract void addInterleavedVertexAndNormalArrays(GLArrayDataServer array, int components); public abstract void draw(GL gl, float x, float y, float angle, FloatBuffer color); + public GearsObject ( GearsObject shared ) { + frontFace = shared.frontFace; + frontSide = shared.frontSide; + backFace = shared.backFace; + backSide = shared.backSide; + outwardFace = shared.outwardFace; + insideRadiusCyl = shared.insideRadiusCyl; + } + public GearsObject ( float inner_radius, float outer_radius, @@ -73,19 +83,17 @@ public abstract class GearsObject { s[4] = 0; // sin(0f) c[4] = 1; // cos(0f) - System.err.println("teeth: "+teeth); - - frontFace = GLArrayDataServer.createInterleaved(6, GL.GL_FLOAT, false, 4*teeth+2, GL.GL_STATIC_DRAW); + frontFace = createInterleaved(6, GL.GL_FLOAT, false, 4*teeth+2, GL.GL_STATIC_DRAW); addInterleavedVertexAndNormalArrays(frontFace, 3); - backFace = GLArrayDataServer.createInterleaved(6, GL.GL_FLOAT, false, 4*teeth+2, GL.GL_STATIC_DRAW); + backFace = createInterleaved(6, GL.GL_FLOAT, false, 4*teeth+2, GL.GL_STATIC_DRAW); addInterleavedVertexAndNormalArrays(backFace, 3); - frontSide = GLArrayDataServer.createInterleaved(6, GL.GL_FLOAT, false, 6*teeth, GL.GL_STATIC_DRAW); + frontSide = createInterleaved(6, GL.GL_FLOAT, false, 6*teeth, GL.GL_STATIC_DRAW); addInterleavedVertexAndNormalArrays(frontSide, 3); - backSide = GLArrayDataServer.createInterleaved(6, GL.GL_FLOAT, false, 6*teeth, GL.GL_STATIC_DRAW); + backSide = createInterleaved(6, GL.GL_FLOAT, false, 6*teeth, GL.GL_STATIC_DRAW); addInterleavedVertexAndNormalArrays(backSide, 3); - outwardFace = GLArrayDataServer.createInterleaved(6, GL.GL_FLOAT, false, 4*4*teeth+2, GL.GL_STATIC_DRAW); + outwardFace = createInterleaved(6, GL.GL_FLOAT, false, 4*4*teeth+2, GL.GL_STATIC_DRAW); addInterleavedVertexAndNormalArrays(outwardFace, 3); - insideRadiusCyl = GLArrayDataServer.createInterleaved(6, GL.GL_FLOAT, false, 2*teeth+2, GL.GL_STATIC_DRAW); + insideRadiusCyl = createInterleaved(6, GL.GL_FLOAT, false, 2*teeth+2, GL.GL_STATIC_DRAW); addInterleavedVertexAndNormalArrays(insideRadiusCyl, 3); for (i = 0; i < teeth; i++) { diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/demos/es1/GearsES1.java b/src/test/com/jogamp/opengl/test/junit/jogl/demos/es1/GearsES1.java index dfac46482..07b2df813 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/demos/es1/GearsES1.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/demos/es1/GearsES1.java @@ -34,8 +34,6 @@ import com.jogamp.newt.event.KeyListener; import com.jogamp.newt.event.MouseAdapter; import com.jogamp.newt.event.MouseEvent; import com.jogamp.newt.event.MouseListener; -import com.jogamp.newt.event.awt.AWTKeyAdapter; -import com.jogamp.newt.event.awt.AWTMouseAdapter; import com.jogamp.opengl.test.junit.jogl.demos.GearsObject; /** @@ -60,6 +58,27 @@ public class GearsES1 implements GLEventListener { this.swapInterval = 1; } + public void setGears(GearsObject g1, GearsObject g2, GearsObject g3) { + gear1 = g1; + gear2 = g2; + gear3 = g3; + } + + /** + * @return gear1 + */ + public GearsObject getGear1() { return gear1; } + + /** + * @return gear2 + */ + public GearsObject getGear2() { return gear2; } + + /** + * @return gear3 + */ + public GearsObject getGear3() { return gear3; } + public void init(GLAutoDrawable drawable) { System.err.println("Gears: Init: "+drawable); // Use debug pipeline @@ -115,8 +134,8 @@ public class GearsES1 implements GLEventListener { window.addKeyListener(gearsKeys); } else if (GLProfile.isAWTAvailable() && drawable instanceof java.awt.Component) { java.awt.Component comp = (java.awt.Component) drawable; - new AWTMouseAdapter(gearsMouse).addTo(comp); - new AWTKeyAdapter(gearsKeys).addTo(comp); + new com.jogamp.newt.event.awt.AWTMouseAdapter(gearsMouse).addTo(comp); + new com.jogamp.newt.event.awt.AWTKeyAdapter(gearsKeys).addTo(comp); } } @@ -150,7 +169,16 @@ public class GearsES1 implements GLEventListener { gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - gl.glClear(GL2ES1.GL_COLOR_BUFFER_BIT | GL2ES1.GL_DEPTH_BUFFER_BIT); + // Special handling for the case where the GLJPanel is translucent + // and wants to be composited with other Java 2D content + if (GLProfile.isAWTAvailable() && + (drawable instanceof javax.media.opengl.awt.GLJPanel) && + !((javax.media.opengl.awt.GLJPanel) drawable).isOpaque() && + ((javax.media.opengl.awt.GLJPanel) drawable).shouldPreserveColorBufferIfTranslucent()) { + gl.glClear(GL.GL_DEPTH_BUFFER_BIT); + } else { + gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); + } gl.glNormal3f(0.0f, 0.0f, 1.0f); 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 3d93edbaf..2409ecdcb 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 @@ -42,6 +42,11 @@ public class GearsObjectES1 extends GearsObject { } @Override + public GLArrayDataServer createInterleaved(int comps, int dataType, boolean normalized, int initialSize, int vboUsage) { + return GLArrayDataServer.createFixedInterleaved(comps, dataType, normalized, initialSize, vboUsage); + } + + @Override public void addInterleavedVertexAndNormalArrays(GLArrayDataServer array, int components) { array.addFixedSubArray(GLPointerFunc.GL_VERTEX_ARRAY, 3, GL.GL_ARRAY_BUFFER); diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/demos/es2/ElektronenMultiplizierer.java b/src/test/com/jogamp/opengl/test/junit/jogl/demos/es2/ElektronenMultiplizierer.java index f484dbf72..a1233b2a6 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/demos/es2/ElektronenMultiplizierer.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/demos/es2/ElektronenMultiplizierer.java @@ -194,7 +194,7 @@ public class ElektronenMultiplizierer implements GLEventListener { st.ownUniform(pmvMatrixUniform); st.uniform(gl, pmvMatrixUniform); - vertices0 = GLArrayDataServer.createGLSL(st, "gca_Vertices", 2, GL.GL_FLOAT, false, 4, GL.GL_STATIC_DRAW); + vertices0 = GLArrayDataServer.createGLSL("gca_Vertices", 2, GL.GL_FLOAT, false, 4, GL.GL_STATIC_DRAW); vertices0.putf(0); vertices0.putf(YRESf); vertices0.putf(XRESf); vertices0.putf(YRESf); vertices0.putf(0); vertices0.putf(0); @@ -203,7 +203,7 @@ public class ElektronenMultiplizierer implements GLEventListener { st.ownAttribute(vertices0, true); vertices0.enableBuffer(gl, false); - texCoords0 = GLArrayDataServer.createGLSL(st, "gca_TexCoords", 2, GL.GL_FLOAT, false, 4, GL.GL_STATIC_DRAW); + texCoords0 = GLArrayDataServer.createGLSL("gca_TexCoords", 2, GL.GL_FLOAT, false, 4, GL.GL_STATIC_DRAW); texCoords0.putf(0f); texCoords0.putf(1f); texCoords0.putf(1f); texCoords0.putf(1f); texCoords0.putf(0f); texCoords0.putf(0f); diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/demos/es2/GearsES2.java b/src/test/com/jogamp/opengl/test/junit/jogl/demos/es2/GearsES2.java index 6d551144e..72977fb57 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/demos/es2/GearsES2.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/demos/es2/GearsES2.java @@ -48,10 +48,14 @@ import javax.media.opengl.GLUniformData; public class GearsES2 implements GLEventListener { private final FloatBuffer lightPos = Buffers.newDirectFloatBuffer( new float[] { 5.0f, 5.0f, 10.0f } ); + private ShaderState st = null; + private PMVMatrix pmvMatrix = null; + private GLUniformData pmvMatrixUniform = null; + private GLUniformData colorU = null; private float view_rotx = 20.0f, view_roty = 30.0f, view_rotz = 0.0f; - private GearsObject gear1=null, gear2=null, gear3=null; + private GearsObjectES2 gear1=null, gear2=null, gear3=null; private float angle = 0.0f; - private int swapInterval; + private int swapInterval = 0; private int prevMouseX, prevMouseY; @@ -63,10 +67,27 @@ public class GearsES2 implements GLEventListener { this.swapInterval = 1; } - ShaderState st; - PMVMatrix pmvMatrix; - GLUniformData pmvMatrixUniform; - GLUniformData colorU; + public void setGears(GearsObjectES2 g1, GearsObjectES2 g2, GearsObjectES2 g3) { + gear1 = g1; + gear2 = g2; + gear3 = g3; + } + + /** + * @return gear1 + */ + public GearsObjectES2 getGear1() { return gear1; } + + /** + * @return gear2 + */ + public GearsObjectES2 getGear2() { return gear2; } + + /** + * @return gear3 + */ + public GearsObjectES2 getGear3() { return gear3; } + public void init(GLAutoDrawable drawable) { System.err.println("Gears: Init: "+drawable); @@ -96,6 +117,7 @@ public class GearsES2 implements GLEventListener { // drawable.setGL(new DebugGL(drawable.getGL())); pmvMatrix = new PMVMatrix(); + st.attachObject("pmvMatrix", pmvMatrix); pmvMatrixUniform = new GLUniformData("pmvMatrix", 4, 4, pmvMatrix.glGetPMvMvitMatrixf()); // P, Mv, Mvi and Mvit st.ownUniform(pmvMatrixUniform); st.uniform(gl, pmvMatrixUniform); @@ -107,10 +129,31 @@ public class GearsES2 implements GLEventListener { colorU = new GLUniformData("color", 4, GearsObject.red); st.ownUniform(colorU); st.uniform(gl, colorU); - gear1 = new GearsObjectES2(1.0f, 4.0f, 1.0f, 20, 0.7f, pmvMatrix, pmvMatrixUniform, colorU); - gear2 = new GearsObjectES2(0.5f, 2.0f, 2.0f, 10, 0.7f, pmvMatrix, pmvMatrixUniform, colorU); - gear3 = new GearsObjectES2(1.3f, 2.0f, 0.5f, 10, 0.7f, pmvMatrix, pmvMatrixUniform, colorU); + if(null == gear1) { + gear1 = new GearsObjectES2(1.0f, 4.0f, 1.0f, 20, 0.7f, pmvMatrix, pmvMatrixUniform, colorU); + System.err.println("gear1 created: "+gear1); + } else { + gear1 = new GearsObjectES2(gear1, pmvMatrix, pmvMatrixUniform, colorU); + System.err.println("gear1 reused: "+gear1); + } + + if(null == gear2) { + gear2 = new GearsObjectES2(0.5f, 2.0f, 2.0f, 10, 0.7f, pmvMatrix, pmvMatrixUniform, colorU); + System.err.println("gear2 created: "+gear2); + } else { + gear2 = new GearsObjectES2(gear2, pmvMatrix, pmvMatrixUniform, colorU); + System.err.println("gear2 reused: "+gear2); + } + + if(null == gear3) { + gear3 = new GearsObjectES2(1.3f, 2.0f, 0.5f, 10, 0.7f, pmvMatrix, pmvMatrixUniform, colorU); + System.err.println("gear3 created: "+gear3); + } else { + gear3 = new GearsObjectES2(gear3, pmvMatrix, pmvMatrixUniform, colorU); + System.err.println("gear3 reused: "+gear3); + } + // MouseListener gearsMouse = new TraceMouseAdapter(new GearsMouseAdapter()); MouseListener gearsMouse = new GearsMouseAdapter(); KeyListener gearsKeys = new GearsKeyAdapter(); @@ -119,15 +162,15 @@ public class GearsES2 implements GLEventListener { Window window = (Window) drawable; window.addMouseListener(gearsMouse); window.addKeyListener(gearsKeys); - } /* else if (GLProfile.isAWTAvailable() && drawable instanceof java.awt.Component) { + } else if (GLProfile.isAWTAvailable() && drawable instanceof java.awt.Component) { java.awt.Component comp = (java.awt.Component) drawable; - new AWTMouseAdapter(gearsMouse).addTo(comp); - new AWTKeyAdapter(gearsKeys).addTo(comp); - } */ + new com.jogamp.newt.event.awt.AWTMouseAdapter(gearsMouse).addTo(comp); + new com.jogamp.newt.event.awt.AWTKeyAdapter(gearsKeys).addTo(comp); + } } public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { - System.err.println("Gears: Reshape "+x+"/"+y+" "+width+"x"+height); + System.err.println("Gears: Reshape "+x+"/"+y+" "+width+"x"+height+", swapInterval "+swapInterval); GL2ES2 gl = drawable.getGL().getGL2ES2(); gl.setSwapInterval(swapInterval); @@ -140,11 +183,14 @@ public class GearsES2 implements GLEventListener { pmvMatrix.glMatrixMode(PMVMatrix.GL_MODELVIEW); pmvMatrix.glLoadIdentity(); pmvMatrix.glTranslatef(0.0f, 0.0f, -40.0f); - st.uniform(gl, pmvMatrixUniform); + st.uniform(gl, pmvMatrixUniform); } public void dispose(GLAutoDrawable drawable) { System.err.println("Gears: Dispose"); + // GL2ES2 gl = drawable.getGL().getGL2ES2(); + // st.useProgram(gl, false); + // st.destroy(gl); } public void display(GLAutoDrawable drawable) { @@ -156,7 +202,16 @@ public class GearsES2 implements GLEventListener { gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - gl.glClear(GL2ES2.GL_COLOR_BUFFER_BIT | GL2ES2.GL_DEPTH_BUFFER_BIT); + // Special handling for the case where the GLJPanel is translucent + // and wants to be composited with other Java 2D content + if (GLProfile.isAWTAvailable() && + (drawable instanceof javax.media.opengl.awt.GLJPanel) && + !((javax.media.opengl.awt.GLJPanel) drawable).isOpaque() && + ((javax.media.opengl.awt.GLJPanel) drawable).shouldPreserveColorBufferIfTranslucent()) { + gl.glClear(GL.GL_DEPTH_BUFFER_BIT); + } else { + gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); + } pmvMatrix.glPushMatrix(); pmvMatrix.glRotatef(view_rotx, 1.0f, 0.0f, 0.0f); 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 9e9fd1379..1ce0dd5dc 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 @@ -37,10 +37,9 @@ import com.jogamp.opengl.util.glsl.ShaderState; * author: Brian Paul (converted to Java by Sven Gothel) <P> */ public class GearsObjectES2 extends GearsObject { - final ShaderState st; - final PMVMatrix pmvMatrix; - final GLUniformData pmvMatrixUniform; - final GLUniformData colorUniform; + PMVMatrix pmvMatrix; + GLUniformData pmvMatrixUniform; + GLUniformData colorUniform; public GearsObjectES2(float inner_radius, float outer_radius, float width, int teeth, float tooth_depth, @@ -49,18 +48,32 @@ public class GearsObjectES2 extends GearsObject { GLUniformData colorUniform) { super(inner_radius, outer_radius, width, teeth, tooth_depth); - this.st = ShaderState.getCurrentShaderState(); this.pmvMatrix = pmvMatrix; this.pmvMatrixUniform = pmvMatrixUniform; this.colorUniform = colorUniform; } + public GearsObjectES2(GearsObject shared, + PMVMatrix pmvMatrix, + GLUniformData pmvMatrixUniform, + GLUniformData colorUniform) + { + super(shared); + this.pmvMatrix = pmvMatrix; + this.pmvMatrixUniform = pmvMatrixUniform; + this.colorUniform = colorUniform; + } + + @Override + public GLArrayDataServer createInterleaved(int comps, int dataType, boolean normalized, int initialSize, int vboUsage) { + return GLArrayDataServer.createGLSLInterleaved(comps, dataType, normalized, initialSize, vboUsage); + } + @Override public void addInterleavedVertexAndNormalArrays(GLArrayDataServer array, int components) { - final ShaderState st = ShaderState.getCurrentShaderState(); - array.addGLSLSubArray(st, "vertices", 3, GL.GL_ARRAY_BUFFER); - array.addGLSLSubArray(st, "normals", 3, GL.GL_ARRAY_BUFFER); + array.addGLSLSubArray("vertices", 3, GL.GL_ARRAY_BUFFER); + array.addGLSLSubArray("normals", 3, GL.GL_ARRAY_BUFFER); } private void draw(GL2ES2 gl, GLArrayDataServer array, int mode) { @@ -71,7 +84,8 @@ public class GearsObjectES2 extends GearsObject { @Override public void draw(GL _gl, float x, float y, float angle, FloatBuffer color) { - GL2ES2 gl = _gl.getGL2ES2(); + final GL2ES2 gl = _gl.getGL2ES2(); + final ShaderState st = ShaderState.getShaderState(gl); pmvMatrix.glPushMatrix(); pmvMatrix.glTranslatef(x, y, 0f); pmvMatrix.glRotatef(angle, 0f, 0f, 1f); diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/demos/gl2/Gears.java b/src/test/com/jogamp/opengl/test/junit/jogl/demos/gl2/Gears.java index 2ead440fd..b4881ab51 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/demos/gl2/Gears.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/demos/gl2/Gears.java @@ -5,9 +5,9 @@ import javax.media.opengl.GL2; import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLEventListener; import javax.media.opengl.GLProfile; -import com.jogamp.opengl.util.Animator; import com.jogamp.newt.Window; +import com.jogamp.newt.event.InputEvent; import com.jogamp.newt.event.KeyAdapter; import com.jogamp.newt.event.KeyEvent; import com.jogamp.newt.event.KeyListener; @@ -30,7 +30,7 @@ public class Gears implements GLEventListener { private float angle = 0.0f; private int swapInterval; - private boolean mouseRButtonDown = false; + // private boolean mouseRButtonDown = false; private int prevMouseX, prevMouseY; public Gears(int swapInterval) { @@ -347,14 +347,14 @@ public class Gears implements GLEventListener { public void mousePressed(MouseEvent e) { prevMouseX = e.getX(); prevMouseY = e.getY(); - if ((e.getModifiers() & e.BUTTON3_MASK) != 0) { - mouseRButtonDown = true; + if ((e.getModifiers() & InputEvent.BUTTON3_MASK) != 0) { + // mouseRButtonDown = true; } } public void mouseReleased(MouseEvent e) { - if ((e.getModifiers() & e.BUTTON3_MASK) != 0) { - mouseRButtonDown = false; + if ((e.getModifiers() & InputEvent.BUTTON3_MASK) != 0) { + // mouseRButtonDown = false; } } diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/glsl/GLSLMiscHelper.java b/src/test/com/jogamp/opengl/test/junit/jogl/glsl/GLSLMiscHelper.java index 7b30dedcc..c83af4362 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/glsl/GLSLMiscHelper.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/glsl/GLSLMiscHelper.java @@ -112,7 +112,7 @@ public class GLSLMiscHelper { public static GLArrayDataServer createRSVertices0(GL2ES2 gl, ShaderState st, int location) { // Allocate Vertex Array0 - GLArrayDataServer vertices0 = GLArrayDataServer.createGLSL(st, "mgl_Vertex", 3, GL.GL_FLOAT, false, 4, GL.GL_STATIC_DRAW); + GLArrayDataServer vertices0 = GLArrayDataServer.createGLSL("mgl_Vertex", 3, GL.GL_FLOAT, false, 4, GL.GL_STATIC_DRAW); if(0<=location) { st.bindAttribLocation(gl, location, vertices0); } @@ -135,7 +135,7 @@ public class GLSLMiscHelper { } public static GLArrayDataServer createRSVertices1(GL2ES2 gl, ShaderState st) { - GLArrayDataServer vertices1 = GLArrayDataServer.createGLSL(st, "mgl_Vertex", 3, GL.GL_FLOAT, false, 4, GL.GL_STATIC_DRAW); + GLArrayDataServer vertices1 = GLArrayDataServer.createGLSL("mgl_Vertex", 3, GL.GL_FLOAT, false, 4, GL.GL_STATIC_DRAW); Assert.assertTrue(vertices1.isVBO()); Assert.assertTrue(vertices1.isVertexAttribute()); Assert.assertTrue(!vertices1.isVBOWritten()); @@ -155,7 +155,7 @@ public class GLSLMiscHelper { } public static GLArrayDataServer createRSColors0(GL2ES2 gl, ShaderState st, int location) { - GLArrayDataServer colors0 = GLArrayDataServer.createGLSL(st, "mgl_Color", 4, GL.GL_FLOAT, false, 4, GL.GL_STATIC_DRAW); + GLArrayDataServer colors0 = GLArrayDataServer.createGLSL("mgl_Color", 4, GL.GL_FLOAT, false, 4, GL.GL_STATIC_DRAW); if(0<=location) { st.bindAttribLocation(gl, location, colors0); } @@ -176,7 +176,7 @@ public class GLSLMiscHelper { public static GLArrayDataServer createRSColors1(GL2ES2 gl, ShaderState st) { // Allocate Color Array1 - GLArrayDataServer colors1 = GLArrayDataServer.createGLSL(st, "mgl_Color", 4, GL.GL_FLOAT, false, 4, GL.GL_STATIC_DRAW); + GLArrayDataServer colors1 = GLArrayDataServer.createGLSL("mgl_Color", 4, GL.GL_FLOAT, false, 4, GL.GL_STATIC_DRAW); colors1.putf(1); colors1.putf(0); colors1.putf(1); colors1.putf(1); colors1.putf(0); colors1.putf(1); colors1.putf(0); colors1.putf(1); colors1.putf(1); colors1.putf(0); colors1.putf(1); colors1.putf(1); diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestFBOMRTNEWT01.java b/src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestFBOMRTNEWT01.java index 2785a2701..05d9e0908 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestFBOMRTNEWT01.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestFBOMRTNEWT01.java @@ -102,7 +102,7 @@ public class TestFBOMRTNEWT01 extends UITestCase { st.uniform(gl, pmvMatrixUniform); Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError()); - final GLArrayDataServer vertices0 = GLArrayDataServer.createGLSL(st, "gca_Vertices", 3, GL.GL_FLOAT, false, 4, GL.GL_STATIC_DRAW); + final GLArrayDataServer vertices0 = GLArrayDataServer.createGLSL("gca_Vertices", 3, GL.GL_FLOAT, false, 4, GL.GL_STATIC_DRAW); // st.bindAttribLocation(gl, 0, vertices0); vertices0.putf(0); vertices0.putf(1); vertices0.putf(0); vertices0.putf(1); vertices0.putf(1); vertices0.putf(0); @@ -113,7 +113,7 @@ public class TestFBOMRTNEWT01 extends UITestCase { vertices0.enableBuffer(gl, false); Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError()); - final GLArrayDataServer colors0 = GLArrayDataServer.createGLSL(st, "gca_Colors", 4, GL.GL_FLOAT, false, 4, GL.GL_STATIC_DRAW); + final GLArrayDataServer colors0 = GLArrayDataServer.createGLSL("gca_Colors", 4, GL.GL_FLOAT, false, 4, GL.GL_STATIC_DRAW); // st.bindAttribLocation(gl, 1, colors0); colors0.putf(1); colors0.putf(0); colors0.putf(1); colors0.putf(1); colors0.putf(0); colors0.putf(0); colors0.putf(1); colors0.putf(1); @@ -131,7 +131,7 @@ public class TestFBOMRTNEWT01 extends UITestCase { st.ownUniform(texUnit1); st.uniform(gl, texUnit1); - final GLArrayDataServer texCoords0 = GLArrayDataServer.createGLSL(st, "gca_TexCoords", 2, GL.GL_FLOAT, false, 4, GL.GL_STATIC_DRAW); + final GLArrayDataServer texCoords0 = GLArrayDataServer.createGLSL("gca_TexCoords", 2, GL.GL_FLOAT, false, 4, GL.GL_STATIC_DRAW); // st.bindAttribLocation(gl, 2, texCoords0); texCoords0.putf(0f); texCoords0.putf(1f); texCoords0.putf(1f); texCoords0.putf(1f); diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestRulerNEWT01.java b/src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestRulerNEWT01.java index 1ea9c731a..465f55c42 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestRulerNEWT01.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/glsl/TestRulerNEWT01.java @@ -113,7 +113,7 @@ public class TestRulerNEWT01 extends UITestCase { System.err.println("Screen siz "+spix); System.err.println("Screen pixel/cm "+rulerPixFreqV.get(0)+", "+rulerPixFreqV.get(1)); - final GLArrayDataServer vertices0 = GLArrayDataServer.createGLSL(st, "gca_Vertices", 3, GL.GL_FLOAT, false, 4, GL.GL_STATIC_DRAW); + final GLArrayDataServer vertices0 = GLArrayDataServer.createGLSL("gca_Vertices", 3, GL.GL_FLOAT, false, 4, GL.GL_STATIC_DRAW); vertices0.putf(0); vertices0.putf(1); vertices0.putf(0); vertices0.putf(1); vertices0.putf(1); vertices0.putf(0); vertices0.putf(0); vertices0.putf(0); vertices0.putf(0); diff --git a/src/test/com/jogamp/opengl/test/junit/newt/TestGLWindows02NEWTAnimated.java b/src/test/com/jogamp/opengl/test/junit/newt/TestGLWindows02NEWTAnimated.java index 8b7952639..bfc3f43a7 100644 --- a/src/test/com/jogamp/opengl/test/junit/newt/TestGLWindows02NEWTAnimated.java +++ b/src/test/com/jogamp/opengl/test/junit/newt/TestGLWindows02NEWTAnimated.java @@ -43,7 +43,7 @@ import java.io.IOException; import com.jogamp.opengl.test.junit.util.UITestCase; import com.jogamp.opengl.test.junit.util.MiscUtils; -import com.jogamp.opengl.test.junit.jogl.demos.gl2.Gears; +import com.jogamp.opengl.test.junit.jogl.demos.es2.GearsES2; public class TestGLWindows02NEWTAnimated extends UITestCase { static GLProfile glp; @@ -58,7 +58,7 @@ public class TestGLWindows02NEWTAnimated extends UITestCase { glp = GLProfile.getDefault(); } - static GLWindow createWindow(Screen screen, GLCapabilities caps, int width, int height, boolean onscreen, boolean undecorated) { + static GLWindow createWindow(Screen screen, GLCapabilities caps, int width, int height, boolean onscreen, boolean undecorated, boolean vsync) { Assert.assertNotNull(caps); caps.setOnscreen(onscreen); // System.out.println("Requested: "+caps); @@ -78,7 +78,7 @@ public class TestGLWindows02NEWTAnimated extends UITestCase { Assert.assertNotNull(glWindow); glWindow.setUndecorated(onscreen && undecorated); - GLEventListener demo = new Gears(); + GLEventListener demo = new GearsES2(vsync ? 1 : 0); setDemoFields(demo, glWindow); glWindow.addGLEventListener(demo); glWindow.addWindowListener(new TraceWindowAdapter()); @@ -117,7 +117,7 @@ public class TestGLWindows02NEWTAnimated extends UITestCase { public void testWindowDecor01Simple() throws InterruptedException { GLCapabilities caps = new GLCapabilities(glp); Assert.assertNotNull(caps); - GLWindow window = createWindow(null, caps, width, height, true /* onscreen */, false /* undecorated */); + GLWindow window = createWindow(null, caps, width, height, true /* onscreen */, false /* undecorated */, true /* vsync */); Animator animator = new Animator(window); animator.setUpdateFPSFrames(1, null); Assert.assertTrue(animator.start()); @@ -135,7 +135,7 @@ public class TestGLWindows02NEWTAnimated extends UITestCase { public void testWindowDecor02DestroyWinTwiceA() throws InterruptedException { GLCapabilities caps = new GLCapabilities(glp); Assert.assertNotNull(caps); - GLWindow window = createWindow(null, caps, width, height, true /* onscreen */, false /* undecorated */); + GLWindow window = createWindow(null, caps, width, height, true /* onscreen */, false /* undecorated */, true /* vsync */); Animator animator = new Animator(window); animator.setUpdateFPSFrames(1, null); Assert.assertTrue(animator.start()); @@ -160,11 +160,11 @@ public class TestGLWindows02NEWTAnimated extends UITestCase { Screen screen = NewtFactory.createScreen(display, 0); // screen 0 Assert.assertNotNull(screen); - GLWindow window1 = createWindow(screen, caps, width, height, true /* onscreen */, false /* undecorated */); + GLWindow window1 = createWindow(screen, caps, width, height, true /* onscreen */, false /* undecorated */, false /* vsync */); Assert.assertNotNull(window1); window1.setPosition(0, 0); - GLWindow window2 = createWindow(screen, caps, width-10, height-10, true /* onscreen */, false /* undecorated */); + GLWindow window2 = createWindow(screen, caps, width-10, height-10, true /* onscreen */, false /* undecorated */, true /* vsync */); Assert.assertNotNull(window2); window2.setPosition(screen.getWidth()-width, 0); @@ -196,8 +196,8 @@ public class TestGLWindows02NEWTAnimated extends UITestCase { Assert.assertEquals(true, animator.isStarted()); Assert.assertEquals(true, animator.isAnimating()); Assert.assertEquals(false, animator.isPaused()); - - while(animator.isAnimating() && animator.getTotalFPSDuration()<2*durationPerTest) { + // animator.resetFPSCounter(); + while(animator.isAnimating() && animator.getTotalFPSDuration()<durationPerTest+durationPerTest/10) { Thread.sleep(100); } window2.destroy(); @@ -220,13 +220,13 @@ public class TestGLWindows02NEWTAnimated extends UITestCase { Screen screen1 = NewtFactory.createScreen(display1, 0); // screen 0 Assert.assertNotNull(screen1); - GLWindow window1 = createWindow(screen1, caps, width, height, true /* onscreen */, false /* undecorated */); + GLWindow window1 = createWindow(screen1, caps, width, height, true /* onscreen */, false /* undecorated */, false /* vsync */); Assert.assertNotNull(window1); window1.setPosition(0, 0); Screen screen2 = NewtFactory.createScreen(display2, 0); // screen 0 Assert.assertNotNull(screen2); - GLWindow window2 = createWindow(screen2, caps, width-10, height-10, true /* onscreen */, false /* undecorated */); + GLWindow window2 = createWindow(screen2, caps, width-10, height-10, true /* onscreen */, false /* undecorated */, true /* vsync */); Assert.assertNotNull(window2); window2.setPosition(screen2.getWidth()-width, 0); @@ -259,7 +259,7 @@ public class TestGLWindows02NEWTAnimated extends UITestCase { Assert.assertEquals(true, animator.isAnimating()); Assert.assertEquals(false, animator.isPaused()); - while(animator.isAnimating() && animator.getTotalFPSDuration()<2*durationPerTest) { + while(animator.isAnimating() && animator.getTotalFPSDuration()<durationPerTest+durationPerTest/10) { Thread.sleep(100); } destroyWindow(window2); |