From 8582ece7dc7f65271b3184261697a542766d9864 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Wed, 10 Oct 2012 17:37:38 +0200 Subject: Simplify GLArrayHandler and reduce VBO sideffects VBO: Always unbind VBO ASAP after data transfer (glBufferData()) and assignment (glVertexPointer(..), glVertexAttribPointer()). It's a bug to leave it bound .. due to redundancy and other calls which could have change the VBO binding. Removed syncData(..), now it's only issued at enable and hence migrated into the enable method. --- .../jogamp/opengl/util/glsl/GLSLArrayHandler.java | 17 +++------- .../opengl/util/glsl/GLSLArrayHandlerFlat.java | 36 ++++++++++------------ .../util/glsl/GLSLArrayHandlerInterleaved.java | 23 ++++++-------- 3 files changed, 31 insertions(+), 45 deletions(-) (limited to 'src/jogl/classes/jogamp/opengl/util/glsl') diff --git a/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandler.java b/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandler.java index 602d283d6..d7327a4e8 100644 --- a/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandler.java +++ b/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandler.java @@ -58,9 +58,9 @@ public class GLSLArrayHandler implements GLArrayHandler { throw new UnsupportedOperationException(); } - public final void syncData(GL gl, boolean enable, Object ext) { + public final void enableState(GL gl, boolean enable, Object ext) { final GL2ES2 glsl = gl.getGL2ES2(); - final ShaderState st = (ShaderState) ext; + final ShaderState st = (ShaderState) ext; if(enable) { final Buffer buffer = ad.getBuffer(); @@ -87,6 +87,7 @@ public class GLSLArrayHandler implements GLArrayHandler { } ad.setVBOWritten(true); st.vertexAttribPointer(glsl, ad); + glsl.glBindBuffer(ad.getVBOTarget(), 0); } 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) @@ -95,21 +96,13 @@ public class GLSLArrayHandler implements GLArrayHandler { if(ad.getVBOName() != qi[0]) { glsl.glBindBuffer(ad.getVBOTarget(), ad.getVBOName()); st.vertexAttribPointer(glsl, ad); + glsl.glBindBuffer(ad.getVBOTarget(), 0); } } } else if(null!=buffer) { st.vertexAttribPointer(glsl, ad); } - } else if(ad.isVBO()) { - glsl.glBindBuffer(ad.getVBOTarget(), 0); - } - } - - 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 { st.disableVertexAttribArray(glsl, ad); diff --git a/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandlerFlat.java b/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandlerFlat.java index c4b761b13..c5beb7dd0 100644 --- a/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandlerFlat.java +++ b/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandlerFlat.java @@ -51,28 +51,26 @@ public class GLSLArrayHandlerFlat implements GLArrayHandlerFlat { return ad; } - public final void syncData(GL gl, boolean enable, boolean force, Object ext) { - if(enable) { - final GL2ES2 glsl = gl.getGL2ES2(); - final ShaderState st = (ShaderState) ext; + public final void syncData(GL gl, Object ext) { + final GL2ES2 glsl = gl.getGL2ES2(); + final ShaderState st = (ShaderState) ext; + st.vertexAttribPointer(glsl, ad); + /** + * Due to probable application VBO switching, this might not make any sense .. + * + if(!written) { st.vertexAttribPointer(glsl, ad); - /** - * Due to probable application VBO switching, this might not make any sense .. - * - if(force) { + } else if(st.getAttribLocation(glsl, ad) >= 0) { + final int[] qi = new int[1]; + glsl.glGetVertexAttribiv(ad.getLocation(), GL2ES2.GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, qi, 0); + if(ad.getVBOName() != qi[0]) { + System.err.println("XXX1: "+ad.getName()+", vbo ad "+ad.getVBOName()+", gl "+qi[0]+", "+ad); st.vertexAttribPointer(glsl, ad); - } else if(st.getAttribLocation(glsl, ad) >= 0) { - final int[] qi = new int[1]; - glsl.glGetVertexAttribiv(ad.getLocation(), GL2ES2.GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, qi, 0); - if(ad.getVBOName() != qi[0]) { - System.err.println("XXX1: "+ad.getName()+", vbo ad "+ad.getVBOName()+", gl "+qi[0]+", "+ad); - st.vertexAttribPointer(glsl, ad); - } else { - System.err.println("XXX0: "+ad.getName()+", vbo ad "+ad.getVBOName()+", gl "+qi[0]+", "+ad); - } - }*/ - } + } else { + System.err.println("XXX0: "+ad.getName()+", vbo ad "+ad.getVBOName()+", gl "+qi[0]+", "+ad); + } + }*/ } public final void enableState(GL gl, boolean enable, Object ext) { diff --git a/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandlerInterleaved.java b/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandlerInterleaved.java index f50429623..6c80e31fa 100644 --- a/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandlerInterleaved.java +++ b/src/jogl/classes/jogamp/opengl/util/glsl/GLSLArrayHandlerInterleaved.java @@ -61,18 +61,18 @@ public class GLSLArrayHandlerInterleaved implements GLArrayHandler { subArrays.add(handler); } - private final void syncSubData(GL gl, boolean enable, boolean force, Object ext) { + private final void syncSubData(GL gl, Object ext) { for(int i=0; i