From 7f2da7bb878813817efab0eb01bbf274065ef6c6 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Tue, 30 Aug 2011 03:41:38 +0200 Subject: GLSL DataArray/Handler: Remove ShaderState state and pass it through: ShaderState.getShaderState(gl) This removes the dependency of a GLSL GLDataArray object to a specific ShaderState and enables sharing of this VBO data, i.e. via a shared context. Test: TestSharedContextVBOES2NEWT --- .../classes/jogamp/opengl/util/GLArrayHandler.java | 69 +++++++++++ .../opengl/util/GLArrayHandlerInterleaved.java | 92 +++++++++++++++ .../jogamp/opengl/util/GLDataArrayHandler.java | 4 +- .../jogamp/opengl/util/GLFixedArrayHandler.java | 5 +- .../opengl/util/GLFixedArrayHandlerFlat.java | 5 +- .../util/GLFixedArrayHandlerInterleaved.java | 93 --------------- .../jogamp/opengl/util/glsl/GLSLArrayHandler.java | 17 +-- .../opengl/util/glsl/GLSLArrayHandlerFlat.java | 16 +-- .../util/glsl/GLSLArrayHandlerInterleaved.java | 126 --------------------- 9 files changed, 185 insertions(+), 242 deletions(-) create mode 100644 src/jogl/classes/jogamp/opengl/util/GLArrayHandler.java create mode 100644 src/jogl/classes/jogamp/opengl/util/GLArrayHandlerInterleaved.java delete mode 100644 src/jogl/classes/jogamp/opengl/util/GLFixedArrayHandlerInterleaved.java delete mode 100644 src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandlerInterleaved.java (limited to 'src/jogl/classes/jogamp/opengl') 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 master 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/GLArrayHandlerInterleaved.java b/src/jogl/classes/jogamp/opengl/util/GLArrayHandlerInterleaved.java new file mode 100644 index 000000000..8e813a79b --- /dev/null +++ b/src/jogl/classes/jogamp/opengl/util/GLArrayHandlerInterleaved.java @@ -0,0 +1,92 @@ +/** + * 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 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 GLArrayHandlerInterleaved implements GLArrayHandler { + private GLArrayDataEditable ad; + private List subArrays = new ArrayList(); + + public GLArrayHandlerInterleaved(GLArrayDataEditable ad) { + this.ad = ad; + } + + public final void addSubHandler(GLArrayHandler handler) { + subArrays.add(handler); + } + + private final void syncSubData(GL gl, boolean enable, Object ext) { + for(int i=0; i subArrays = new ArrayList(); - - public GLFixedArrayHandlerInterleaved(GLArrayDataEditable ad) { - 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 = new ArrayList(); - - 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= 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