diff options
Diffstat (limited to 'src')
38 files changed, 758 insertions, 416 deletions
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); |